模型剪枝:给模型剪个头发
本文来自公众号“AI大道理”。
深度学习网络模型从卷积层到全连接层存在着大量冗余的参数,大量神经元激活值趋近于0,将这些神经元去除后可以表现出同样的模型表达能力,这种情况被称为过参数化,而对应的技术则被称为模型剪枝。
网络一般是over-parameterized参数过多的,有冗余的权重和神经元。
剪枝方法探索模型权重中的冗余, 并尝试删除/修剪冗余和非关键的权重。
减小模型大小并加速模型训练/推断,同时不会显着降低模型性能。
1、为什么要进行模型剪枝
CNN在实际应用中的部署主要受以下几个方面制约。
1)模型大小的限制
CNN强大的表示能力来自其数百万可训练参数。这些参数以及网络结构信息需要存储在磁盘上,并在推理期间加载到内存中。例如,在ImageNet上存储一个典型的CNN会消耗超过300MB的空间,这对嵌入式设备来说是一个巨大的资源负担。
2) 运行时内存
在推理期间,CNN的中间激活/响应甚至可能比存储模型参数占用更多内存空间,即使批量大小为1。这对于高端GPU来说不是问题,但对于许多计算能力较低的应用程序来说,这是负担不起的。
3) 计算操作数
卷积操作在高分辨率图像上计算量很大。大型CNN在移动设备上处理一张图像可能需要几分钟的时间,这使得在实际应用中采用它是不现实的。
因此有必要对模型进行压缩,而满足边缘设备的AI应用。
而剪枝就是模型压缩技术的一种。
(模型压缩技术:剪枝、蒸馏、量化、低秩分解等)
2、为什么可以进行模型剪枝
生物学启发:
生物研究发现人脑是高度稀疏的。
比如 2016 年早期经典的剪枝论文就曾提到,生理学上发现对于哺乳动物,婴儿期产生许多的突触连接,在后续的成长过程中,不怎么用的那些突触就会退化消失。突触修剪从出生时就开始了,一直持续到 20 多岁。
结合深度神经网络是模仿人类大脑结构,和该生理学现象,我们可以认为深度神经网络是存在稀疏性的。
过参数化:
深度学习网络模型从卷积层到全连接层存在着大量冗余的参数,大量神经元激活值趋近于0,将这些神经元去除后可以表现出同样的模型表达能力,这种情况被称为过参数化,而对应的技术则被称为模型剪枝。
尽管大型神经网络已经无数次证明了它们的学习能力,但事实证明,在训练过程结束后,并非它们的所有部分都仍然有用。
3、结构化剪枝与非结构化剪枝
非结构化剪枝:将每个单独的权重置为0。
结构化剪枝:移除一组规则的权重,如layer剪枝、filter剪枝、通道剪枝。
非结构化剪枝:
非结构化剪枝是指将神经网络中的一些权重设为0,但并不改变网络的整体结构。
这意味着网络中每个神经元和其他神经元之间的连接性不会发生变化,只是某些连接的权重为0,实际上这些连接已经被剪掉了。
这种剪枝方式的优点是剪枝操作可以非常精细,但缺点是可能不会显著减少实际的计算量和存储需求,因为0权重的连接仍需在存储和计算中被考虑(除非特别使用了针对稀疏矩阵的优化算法)。
1)权重修剪
将权重矩阵中的多个权重设置为 0,删除连接。
Dropout中随机的将一些神经元的输出置零,这就是神经元剪枝。
2)单元/神经元修剪
将权重矩阵中的多个整列设置为 0,从而删除对应的输出神经元。
DropConnect则随机的将一些神经元之间的连接置零,使得权重连接矩阵变得稀疏,这便是权重连接剪枝。
结构化剪枝:
结构化剪枝的重点,并不是在“剪枝”,而在于“结构”。
它更像是寻找一种优秀网络结构的方法,去让自己网络适配自己的数据集,而非“剪枝”方法。
结构化修剪方法在通道或层的层次上进行修剪,不需要专用的硬件/库来实现。
结构化剪枝则是指按照一定的结构进行剪枝。
这种方式会改变神经网络的结构,剪枝后的网络会比原来的网络更小,更简单。
1)layer-level
非神经网络里面的一层网络,而是规则的一行向量。
3*3的卷积核移除某层变成只有3*2。
理论上,一个3x2的卷积核也是合法的,可以用于卷积运算。
尽管使用非方形卷积核的情况相对较少,但在某些网络结构和特定任务中
确实可以应用。
以下是一些使用非方形卷积核的具体例子:
MobileNet V2 中使用了非方形的卷积核,如3x1和1x3的卷积核,
以增强网络对不同方向特征的感知能力。
Hourglass 网络:Hourglass 网络是一种用于人体姿态估计的卷积神经
网络结构。它使用了多个堆叠的 Hourglass 模块,其中包含了非方形的卷
积核(如3x3和3x2的卷积核),用于对人体姿态进行多尺度的特征提取。
2)channel-level
一个卷积核有3个通道,移除某个通道,变成只有2通道卷积核。
为了满足神经网络的计算特性,必须对前后的网络一起剪枝。
卷积核和特征图的卷积通道数必须一致,特征图是3通道的,卷积核也要是3通道,才能进行空间卷积。
因此,卷积核剪掉一个通道后,特征图也要剪掉一个通道。
经典的通道剪枝有network slimming剪枝。
3)filter-level
滤波器,也就是卷积核,卷积核有个数2个,移除某个卷积核,等于移除3通道,变成只有1个卷积核。
在神经网络的计算中,卷积核的个数就是卷积结果的通道数,移除一个卷积核,后面的特征图将减少一个通道,将会连锁反应,因此也要一起剪枝,以满足计算特性。
在滤波器剪枝中,有一种方法是使用滤波器的lp范数来评估每个滤波器的重要性。
p为1则使用L1范数,p为2则使用L2范数。
L范数较小的滤波器的卷积结果,导致较低的激活值,对模型最终预测具有较小的数值影响。
L范数较小的滤波器被剪掉。
5、静态剪枝与动态剪枝
静态剪枝:
静态剪枝在推理前离线执行所有剪枝步骤。即训练后,推理前进行剪枝。
采用相应的剪枝参数和剪枝方法进行剪枝后,进行微调或再训练,来提高修剪后网络的性能,以达到修剪前网络相当的精度。
这需要大量的时间和能耗。
大量的时间在于剪枝和再训练可以多次进行,具体进行多少次凭借经验或者根据具体训练的结果判断。
适用于资源有限的边缘设备。
问题:
通道的删除是永久性的,可能无法通过再训练达到很好的精度。
动态剪枝:
动态剪枝在运行时执行剪枝。
网络中有一些奇怪的权重,他们在某些迭代中作用不大,但在其他的迭代却很重要。动态剪枝通过动态的恢复权重来得到更好的网络性能。动态剪枝在运行时才决定哪些层、通道、滤波器不会参与进一步的活动。
动态剪枝通常不会进行微调或再训练。
优点:动态剪枝能显著提高模型的表达能力,精度会较好。
问题:
很多动态剪枝的方法是通过强化学习的方式来实现的。
通过强化学习来实现动态剪枝,在训练中消耗非常多的运算资源。
阈门的开关是不可微的,梯度下降法用不了。
(改变了学习方法,不用梯度下降法,而用强化学习)
存储成本高,不适合资源有限的边缘设备。
6、硬剪枝与软剪枝
硬剪枝:
在每个epoch后将某些卷积核直接永久剪掉。
这样可能降低模型性能,依赖预先训练的模型。
即使相乘参数为0,不把这一神经元/group/block从网络结构中拿掉,计算量也会不变。
软剪枝:
被剪枝的卷积核不是永久剪掉,而是将内部的参数设置为0。
在这次被设置为0后,下一次迭代依然参与计算和迭代。
在每轮迭代后,为每个加权层计算所有滤波器的L2范数,作为滤波器选择的标准,将部分滤波器权重设置为0,进行下一轮训练。
被设置为0的滤波器下一轮之后可能不再是0,具体数值根据L2范数再进行调整。
7、总结
模型剪枝的方法多种多样,仅仅将权重等赋值为0的,不改变网络结构的,称之为非结构化剪枝。
而直接剔除某些结构的则为结构化剪枝。
——————
浅谈则止,细致入微AI大道理
扫描下方“AI大道理”,选择“关注”公众号
—————————————————————
—————————————————————
|
萍水相逢逢萍水,浮萍之水水浮萍!