| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> 深度学习——卷积神经网络压缩方法总结(等待补充) -> 正文阅读 |
|
[人工智能]深度学习——卷积神经网络压缩方法总结(等待补充) |
卷积网络压缩方法总结卷积网络的压缩方法我们知道,在一定程度上,网络越深,参数越多,模型越复杂,其最终效果越好。神经网络的压缩算法是,旨在将一个庞大而复杂的预训练模型(pre-trained model)转化为一个精简的小模型。
总结:前端压缩几乎不改变原有网络结构(仅仅只是在原模型基础上减少了网络的层数或者滤波器个数),后端压缩对网络结构有不可逆的大幅度改变,造成原有深度学习库、甚至硬件设备不兼容改变之后的网络。其维护成本很高。 一,低秩近似简单理解就是,卷积神经网络的权重矩阵往往稠密且巨大,从而计算开销大,有一种办法是采用低秩近似的技术将该稠密矩阵由若干个小规模矩阵近似重构出来,这种方法归类为低秩近似算法。
低秩近似算法能减小计算开销的原理如下: 给定权重矩阵 W ∈ R m × n W\in \mathbb{R}^{m\times n} W∈Rm×n , 若能将其表示为若干个低秩矩阵的组合,即 W = ∑ i = 1 n α i M i W=\sum_{i=1}^{n}\alpha_{i}M_{i} W=∑i=1n?αi?Mi? , 其中 M i ∈ R m × n M_{i}\in \mathbb{R}^{m\times n} Mi?∈Rm×n 为低秩矩阵,其秩为 r i r_{i} ri? , 并满足 r i ? m i n ( m , n ) r_{i}\ll min(m,n) ri??min(m,n) ,则其每一个低秩矩阵都可分解为小规模矩阵的乘积, M i = G i H i T M_{i}=G_{i}H_{i}^{T} Mi?=Gi?HiT? ,其中 G i ∈ R m × r i G_{i}\in \mathbb{R}^{m\times r_{i}} Gi?∈Rm×ri? , H i ∈ R m × r i H_{i}\in \mathbb{R}^{m \times r_{i}} Hi?∈Rm×ri?。当 r i r_{i} ri? 取值很小时,便能大幅降低总体的存储和计算开销。 基于以上想法, 1.1,总结低秩近似算法在中小型网络模型上,取得了很不错的效果,但其超参数量与网络层数呈线性变化趋势,随着网络层数的增加与模型复杂度的提升,其搜索空间会急剧增大,目前主要是学术界在研究,工业界应用不多。 二,剪枝与稀疏约束给定一个预训练好的网络模型,常用的剪枝算法一般都遵从如下操作:
基于以上循环剪枝框架,不同学者提出了不同的方法,Han等人提出首先将低于某个阈值的权重连接全部剪除,之后对剪枝后的网络进行微调以完成参数更新的方法,这种方法的不足之处在于,剪枝后的网络是非结构化的,即被剪除的网络连接在分布上,没有任何连续性,这种稀疏的结构,导致CPU高速缓冲与内存频繁切换,从而限制了实际的加速效果。 基于此方法,有学者尝试将剪枝的粒度提升到整个滤波器级别,即丢弃整个滤波器,但是如何衡量滤波器的重要程度是一个问题,其中一种策略是基于滤波器权重本身的统计量,如分别计算每个滤波器的 L1 或 L2 值,将相应数值大小作为衡量重要程度标准。 利用稀疏约束来对网络进行剪枝也是一个研究方向,其思路是在网络的优化目标中加入权重的稀疏正则项,使得训练时网络的部分权重趋向于 0 ,而这些 0 值就是剪枝的对象。 2.1,总结总体而言,剪枝是一项有效减小模型复杂度的通用压缩技术,其关键之处在于 三,参数量化相比于剪枝操作,参数量化则是一种常用的后端压缩技术。所谓“量化”,是指从权重中归纳出若干“代表”,由这些“代表”来表示某一类权重的具体数值。“代表”被存储在码本(codebook)之中,而原权重矩阵只需记录各自“代表”的索引即可,从而极大地降低了存储开销。这种思想可类比于经典的词包模型(bag-of-words model)。常用量化算法如下:
标量量化算法基本思路是,对于每一个权重矩阵
W
∈
R
m
×
n
W\in \mathbb{R}^{m\times n}
W∈Rm×n,首先将其转化为向量形式:
w
∈
R
1
×
m
n
w\in \mathbb{R}^{1\times mn}
w∈R1×mn。之后对该权重向量的元素进行
k
k
k 个簇的聚类,这可借助于经典的 a r g m i n c ∑ i m n ∑ j k ∥ w i ? c j ∥ 2 2 \underset{c}{arg min}\sum_{i}^{mn}\sum_{j}^{k}\begin{Vmatrix}w_{i}-c_{j}\end{Vmatrix}_{2}^{2} cargmin?i∑mn?j∑k?∥ ∥?wi??cj??∥ ∥?22? 这样,只需将 k k k 个聚类中心( c j c_{j} cj?,标量)存储在码本中,而原权重矩阵则只负责记录各自聚类中心在码本中索引。如果不考虑码本的存储开销,该算法能将存储空间减少为原来的 l o g 2 ( k ) / 32 log_{2}(k)/32 log2?(k)/32。基于 k k k 均值算法的标量量化在很多应用中非常有效。参数量化与码本微调过程图如下: 这三类基于聚类的参数量化算法,其本质思想在于将多个权重映射到同一个数值,从而实现权重共享,降低存储开销的目的。 3.1,总结参数量化是一种常用的后端压缩技术,能够以很小的性能损失实现模型体积的大幅下降,不足之处在于,量化的网络是“固定”的,很难对其做任何改变,同时这种方法通用性差,需要配套专门的深度学习库来运行网络。 这里,权重参数从浮点转定点、二值化等方法都是是试图避免浮点计算耗时而引入的方法,这些方法能加快运算速率,同时减少内存和存储空间的占用,并保证模型的精度损失在可接受的范围内,因此这些方法的应用是有其现实价值的。更多参数量化知识,请参考此 github仓库。 四,二值化网络
4.1,二值网络的梯度下降现在的神经网络几乎都是基于梯度下降算法来训练的,但是二值网络的权重只有 ± 1 \pm 1 ±1,无法直接计算梯度信息,也无法进行权重更新。为解决这个问题,Courbariaux 等人提出二值连接(binary connect)算法,该算法采取单精度与二值结合的方式来训练二值神经网络,这是第一次给出了关于如何对网络进行二值化和如何训练二值化神经网络的方法。过程如下:
4.1,两个问题网络二值化需要解决两个问题:如何对权重进行二值化和如何计算二值权重的梯度。 1,如何对权重进行二值化? 权重二值化一般有两种选择:
s i g n ( x ) = { ? 1 x < 0 0 x = 0 1 x > 0 sign(x) = \left\{\begin{matrix} -1 & x < 0 \\ 0 & x = 0 \\ 1 & x > 0 \end{matrix}\right. sign(x)=? ? ???101?x<0x=0x>0?
2,如何计算二值权重的梯度? 二值权重的梯度为0,无法进行参数更新。为解决这个问题,需要对符号函数进行放松,即用 H t a n h ( x ) = m a x ( ? 1 , m i n ( 1 , x ) ) Htanh(x) = max(-1, min(1,x)) Htanh(x)=max(?1,min(1,x)) 来代替 s i n x ( x ) sinx(x) sinx(x)。当 x 在区间 [-1,1] 时,存在梯度值 1,否则梯度为 0 。 4.3,二值连接算法改进之前的二值连接算法只对权重进行了二值化,但是网络的中间输出值依然是单精度的,于是 Rastegari 等人对此进行了改进,提出用单精度对角阵与二值矩阵之积来近似表示原矩阵的算法,以提升二值网络的分类性能,弥补二值网络在精度上弱势。该算法将原卷积运算分解为如下过程: I × W ≈ ( I × B ) α I \times W\approx (I \times B)\alpha I×W≈(I×B)α 其中 I ∈ R c × w i n × h i n I\in \mathbb{R}^{c\times w_{in}\times h_{in}} I∈Rc×win?×hin? 为该层的输入张量, I ∈ R c × w × h I\in \mathbb{R}^{c\times w\times h} I∈Rc×w×h 为该层的一个滤波器, B = s i g n ( W ) ∈ { + 1 , ? 1 } c × w × h B=sign(W)\in \{+1, -1\}^{c \times w\times h} B=sign(W)∈{+1,?1}c×w×h为该滤波器所对应的二值权重。 这里,Rastegari 等人认为单靠二值运算,很难达到原单精度卷积元素的结果,于是他们使用了一个单精度放缩因子 α ∈ R + \alpha \in \mathbb{R}^{+} α∈R+ 来对二值滤波器卷积后的结果进行放缩。而 α \alpha α 的取值,则可根据优化目标: m i n ∥ W ? α B ∥ 2 min \left \| W -\alpha B \right \|^{2} min∥W?αB∥2 得到 α = 1 n ∣ W ∣ ? 1 \alpha = \frac{1}{n}\left |W \right |\ell{1} α=n1?∣W∣?1。二值连接改进的算法训练过程与之前的算法大致相同,不同的地方在于梯度的计算过程还考虑了 α \alpha α 的影响。由于 α \alpha α 这个单精度的缩放因子的存在,有效降低了重构误差,并首次在 ImageNet 数据集上取得了与 Alex-Net 相当的精度。如下图所示: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hsXHYUBf-1662647144051)(…/images/二值化算法精度.png)]
更多内容,可以看这两篇文章:
4.4,二值网络设计注意事项
五,知识蒸馏
知识蒸馏(knowledge distillation),是迁移学习(transfer learning)的一种,简单来说就是训练一个大模型(teacher)和一个小模型(student),将庞大而复杂的大模型学习到的知识,通过一定技术手段迁移到精简的小模型上,从而使小模型能够获得与大模型相近的性能。 在知识蒸馏的实验中,我们先训练好一个 但是,直接使用 这里
q
i
q_i
qi? 是
s
t
u
d
e
n
t
student
student 网络学习的对象(soft targets),
z
i
z_i
zi? 是 所以,可以知道
这两个损失函数的重要程度可通过一定的权重进行调节,在实际应用中, [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vjz0Jm9R-1662647144051)(…/images/知识蒸馏模型过程.png)]
六,浅层/轻量网络浅层网络:通过设计一个更浅(层数较少)结构更紧凑的网络来实现对复杂模型效果的逼近, 但是浅层网络的表达能力很难与深层网络相匹敌。因此,这种设计方法的局限性在于只能应用解决在较为简单问题上。如分类问题中类别数较少的 轻量网络:使用如 参考资料 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 22:48:57- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |