定义
模型剪枝(模型稀疏化)原理:通过剔除模型中“不重要”的权重,使得模型减少参数量和计算量,同时尽量保证模型的精度不受影响。
深度神经网络的稀疏性
生物研究发现人脑是高度稀疏的。早期经典的剪枝论文曾提到,生理学上发现对于哺乳动物,婴儿期产生许多的突触接触,在后续的成长过程中,不怎么用的那些突出会退化消失。而深度神经网络是模仿人类大脑的结构,所以说其也是存在稀疏的,这也是作者提出的模型剪枝方法的生理学上的依据。因此可以认为深度神经网络存在稀疏性。
深度神经网络中的稀疏性主要包括:权重稀疏、激活稀疏、梯度稀疏
权重稀疏
在大多数神经网络中,通过对网络层(卷积层或者全连接层)对权重数值进行直方图统计,可以发现,权重(训练前/后)的数值分布很像正态分布,越接近于0,权重越多,这句是权重稀疏的现象。
有论文认为权重值代表权重的重要性,权重值越大代表越重要,反之则不重要。但是影响较小不等于没影响。
不同类型、不同顺序的网络层,在权重剪枝后影响也各不相同。
AlexNet的卷积层和全连接层的剪枝敏感性实验,结果如下图所示。
可看出卷积层的剪枝敏感性大于全连接层,且第一个卷积层对剪枝最为敏感。论文作者推测这是因为全连接层本身参数冗余性更大,第一个卷积层的输入只有3个通道所以比其他卷积层冗余性更少。
就算移除绝对值接近于0的权重也会带来推理精度的损失,因此为了恢复模型精度,通常在剪枝后再训练模型。剪枝流程及前后变化如图。
剪枝算法常用的迭代计算流程:训练、剪枝、微调
剪枝Three-Step Training Pipeline 中三个阶段权重数值分布如下图所示。微调之后的模型权重分布将部分地恢复正太分布的特性。
激活稀疏
ReLU激活函数的定义为:ReLU(x)=max(0,x)
该函数使得负半轴的输入都产生 0 值的输出,这可以认为激活函数给网络带了另一种类型的稀疏性;另外 max_pooling 池化操作也会产生类似稀疏的效果。即无论网络接收到什么输入,大型网络中很大一部分神经元的输出大多为零。激活和池化稀疏效果如下图所示。
发现无论输入什么样图像数据,CNN 中的许多神经元都具有非常低的激活。作者认为零神经元很可能是冗余的(redundant),可以在不影响网络整体精度的情况下将其移除。 因为它们的存在只会增加过度拟合的机会和优化难度,这两者都对网络有害。
——由于神经网络具有乘法-加法-激活计算过程,因此其输出大部分为零的神经元对后续层的输出以及最终结果的贡献很小。
由此,提出了一种神经元剪枝算法。首先,定义了 APoZ (Average Percentage of Zeros)指标来衡量经过 ReLU 映射后神经元零激活的百分比。假设 Oc(i)表示网络第 i 层中第 c 个通道(特征图),那么第 i 层中第 c 个的滤波器(论文中用神经元 neuron)的 APoZ 定义如下:
APoZc(i)=APoZ(Oc(i))=∑kN∑jMf(Oc,j(i)(k=0))N×M
激活函数的引入反映出 VGG 网络存在着大量的稀疏与冗余性,且大部分冗余都发生在更高的卷积层和全连接层。
梯度稀疏
在分布式训练的时候,随着参与训练任务节点数目的增多,网络上传输的模型梯度数据量也急剧增加,网络通信所占据的资源开销将逐渐超过梯度计算本身所消耗的资源,从而严重影响大规模分布式训练的效率。大多数深度神经网络模型参数的梯度其实也是高度稀疏的,随着训练周期的增加,参数梯度的稀疏度显著增大。
因为梯度交换成本很高,由此导致了网络带宽成为了分布式训练的瓶颈,为了克服分布式训练中的通信瓶颈,梯度稀疏(Gradient Sparsification)得到了广泛的研究,其实现的途径:
1、选择固定比例的正负梯度更新:在网络上传输根据一定比例选出的一部分正、负梯度更新值。
2、预设阈值:在网络上仅仅传输那些绝对值幅度超过预设阈值的梯度。
深度梯度压缩(DGC)[5],在梯度稀疏化基础上采用动量修正、本地梯度剪裁、动量因子遮蔽和 warm-up训练 4 种方法来做梯度压缩,从而减少分布式训练中的通信带宽。