目录
一、Network Pruning(网络剪枝)
1.Network Pruning
2.Practical Issue
2.1 weight pruning
2.2 neuron pruning
3.Why Pruning?
二、Knowledge Distillation(知识蒸馏)
1.Knowledge Distillation
2.Temperature for softmax
三、Parameter Quantization(参数量化)
1.Parameter Quantization
2.Binary Weights
四、Architecture Design(Network架构设计)
1.Review:Standard CNN
2.Depthwise Separable Convolution
2.1Depthwise Convolution
2.2Pointwise Convolution
3.Low rank approximation
五、Dynamic Computation(动态计算)
1.Dynamic Computation
2.Dynamic Depth
3.Dynamic Width
4.Computation based on Sample Difficulty
一、Network Pruning(网络剪枝)
1.Network Pruning
神经网络的参数有很多,但其中有些参数对最终的输出结果贡献并不大,相反就显得冗余,将这些冗余的参数剪掉的技术称为剪枝。剪枝可以减小模型大小、提升运行速度,同时还可以防止过拟合。简单来说,network有多余的参数,将这些多余的参数减掉,实现network的compression。
那怎么评估weight或者neuron是冗余或者不重要的呢?
对权重而言,我们可以通过计算它的绝对值来判断重要程度。
对神经元而言,我们可以给出一定的数据集,然后查看在计算这些数据集的过程中neuron参数为0的次数,如果次数过多,则说明该neuron对数据的预测结果并没有起到什么作用,因此可以去除。
2.Practical Issue
之前的模型pruning剪枝可以从weight和neuron两个角度进行,下面就分别介绍实际可操作性。
2.1 weight pruning
如果我们现在进行weight pruning,进行weight pruning之后的network会变得不规则,这样的network是不好implement出来的。还有一个问题是,并没有把Network缩小。
2.2 neuron pruning
如图所示,删减neuron之后网络结构能够保持一定的规则,实现起来方便,而且也能起到一定的加速作用。通过上述可知,实际上做weight pruning是很麻烦的,通常我们都进行neuron pruning,可以更好地进行implement,也很容易进行speed up。
3.Why Pruning?
既然最后要得到一个小的network,那为什么不直接在数据集上训练小的模型,而是先训练大模型
一个比较普遍接受的解释是因为模型越大,越容易在数据集上找到一个局部最优解,而小模型比较难训练,有时甚至无法收敛。
另外一个说法是大乐透假设(Lottery Ticket Hypothesis)
首先我们对一个大模型随机初始化它权重参数(红色)。然后我们训练这个大模型得到训练后的模型以及权重参数(紫色)。最后我们对训练好的大模型做pruning得到小模型。
如果我们使用pruned network的结构,再进行随机初始化random init(绿色),会发现这个network不能train下去。
如果我们使用pruned network的结构,再使用原始随机初始化original random init(红色),会发现network可以得到很好的结果。
二、Knowledge Distillation(知识蒸馏)
1.Knowledge Distillation
整个知识蒸馏过程中会用到两个模型:大模型 Teacher Net 模型和小模型Student Net模型。
用小的network去模拟大的network:
训练一个大网络,用小网络学习大网络。并计算两者之间的cross-entropy,使其最小化,从而可以使两者的输出分布相近。
2.Temperature for softmax
一个小技巧:同除一个参数T
三、Parameter Quantization(参数量化)
1.Parameter Quantization
less bits:使用更少bit来存储数据,例如一般默认是64位或者32位,那我们可以用16或者8位来存数据。
weight clustering:如图所示,最左边表示网络中正常权重矩阵,之后我们对这个权重参数做聚类,比如将16个参数做聚类,最后得到了4个聚类,那么为了表示这4个聚类我们只需要2个bit,即用00,01,10,11来表示不同聚类。之后每个聚类的值就用均值来表示。这样的一个缺点就是误差可能会比较大。
huffman encding:对于常出现的聚类用少一点的bit来表示,而那些很少出现的聚类就用多一点的bit来表示。
2.Binary Weights
Binary Weights是以一种更加极致的思路来对模型进行压缩,即每个节点只用1或-1来表示,即只用+1,-1表示一个Weight。
下面简单介绍一下Binary Connect的思路,如下图示,灰色节点表示使用binary weight的神经元,蓝色节点可以是随机初始化的参数,也可以是真实的权重参数。
第一步我们先计算出和蓝色节点最接近的二元节点,并计算出其梯度方向
第二步,蓝色节点的更新方向则是按照红色箭头方向更新,而不是按照他自身的梯度方向更新。
最后在满足一定条件后,用离得最近的Binary Weight作为结果即可。
四、Architecture Design(Network架构设计)
1.Review:Standard CNN
每个filter要处理所有的channel。从标准卷积CNN中看所需要的参数量。如上图示,输入数据由两个6*6的feature map组成,之后用4个大小为3*3的卷积核做卷积,最后的输出特征图大小为4个4*4的矩阵。每个卷积核参数数量为233=18,所以总共用到的参数数量为4*18=72个
2.Depthwise Separable Convolution
2.1Depthwise Convolution
将立体的,深度为2的filter分成两个平面的,不考虑之间的联系,然后分别对一个feature map进行卷积,得到下图结果。由于第一步得到的输出特征图是用不同卷积核计算得到的,所以不同通道之间是独立的,因此我们还需要对不同通道之间进行关联。
2.2Pointwise Convolution
为了实现关联,在第二步中使用了1*1大小的卷积核,并且通道数量等于输入数据的通道数量,然后按照正常的CNN做法,得到结果4个4*4的矩阵,并且做深度可分离卷积的过程参数数量比标准的CNN更少。
3.Low rank approximation
中间插入一个linear层,大小为K,那么也可以减少需要训练的参数。
五、Dynamic Computation(动态计算)
1.Dynamic Computation
该方法的主要思路是如果目前的资源充足,那么算法就尽量做到最好,比如训练更久,或者训练更多模型等;反之,如果当前资源不够,那么就先算出一个过得去的结果。
一个Network可以自由的调整它的运算量。
2.Dynamic Depth
让Network自由调整它的深度。训练一个很深的Network,在layer和layer中间添加一个额外的layer。如果运算资源比较充足,就跑过所有的layer;如果资源不充足,就选择部分的layer做输出。
3.Dynamic Width
让Network自由设定它的宽度。先设定几个不同的宽度,把同一个图片input进去,不同的宽度的output都不同,但我们希望和我们想要的输出越接近越好。
4.Computation based on Sample Difficulty
对简单的问题,一个layer可能就可以解决;对困难的问题。可能要很多个layer才能解决。所以我们希望让Network可以依据情况自己决定深度和宽度。