漫谈Deep Compression(二)剪枝
Index
- Architecture
- Train Connectivity
- L2 Regularization
- Dropout
- Prune Connections
- Sensitivity
- CSR
Architecture
PruningPruning部分主要分为以上三个步骤:
- 通过正常的训练得出权值. 与以往的训练不同的是, 我们并非得到最终的权值, 而是将结果看做得到相对重要以及不重要的权值
- 设立一个阈值, 将小于阈值的权值置零. 此时网络变成了稀疏连接的网络.
- 重新训练这个稀疏网络, 得到最终结果.
可以看出这个过程并不复杂. 但想要得到较好的结果还有许多细节上的问题.
Train Connectivity
1. Regularization and Dropout
正则化和Dropout的目的都是防止过拟合. 防止过拟合最直接的方式是扩大数据集和缩小网络结构. 但扩大数据集并不容易. 缩小网络结构可以有效减少参数, 看似是一个不错的方法, 但是通常来说我们认为网络越深, 其提取特征高维特征能力越强. 缩小网络结构意味着其能力下降, 这是我们不希望看到的. 因此有人提出了Regularization和Dropout, 来解决过拟合问题.
-
L2 Regularization
L2正则化是最常用的正则化方法. 它的表示为:
L2 Regularization
其中C为正则化后的cost function, C_0为原始cost function.
Lambda 是正则化因子, 为正.
所以常用的交叉熵cost function可以表示为:
Cross entropy cost funciton with L2 regularization
从上述L2正则化公式可以看出, 正则化是通过在cost function中加一项权值惩罚因子, 来使得cost增大, 从而减小权值. 而正则化因子的大小则可以调节正则化: Lambda大, 则更倾向于减小权值; Lambda小, 则更倾向于减小原始cost function.
理解了正则化之后, 为什么正则化对Deep Compression很有影响就很容易理解了. 在剪枝过程的第一次训练中, 我们希望学习到什么连接更重要, 什么连接不重要. 而正则化程度会影响权值大小, 从而影响我们剪什么枝.
-
Dropout
Dropout ref 与正则化不同: 正则化通过修改cost function减小权值从而解决过拟合, dropout则通过改变网络结构. Dropout是在训练时以一定的概率删减神经元间的连接, 即随机将一定的权值置零. 这与deep compression的pruning稍有不同, dropout并不直接设置阈值, 而是设定一个概率随机修建, 增加网络稀疏性, 加快收敛
由于re-train环节我们已经学习到了什么连接更重要, 如果在dropout环节我们用和第一次训练同样的keep probability, 很多重要的连接可能会被删掉. 因此我们需要在一定程度上降低dropout ratio.
dropout 的计算如下:
其中C_i代表第i层连接数, N_i为第i层神经元数目. C_io代表原本的连接数, C_ir代表再训练时的连接数, D_o代表原本的dropout.
2. Prune Connections
-
Sensitivity
在剪枝时, 不同的正则化方法以及不同类型的layers, 对剪枝的敏感性是不同的, 因此它们剪枝的阈值对准确度的影响也不同.
Regularization sensitivity
上图中, 可以看出L1正则化的准确度损失在剪枝后是比L2正则化小, 而在再训练后, L2正则化表现得更好. 用L1正则化作第一次训练, L2作再训练的整体表现也没有L2正则化好.
Layer Type Sensitivity上图中, 卷积层的敏感度明显高于全连接层;而卷积的第一层conv1又是最敏感的. 这是由于第一层一般情况下只有三个通道(RGB图), 在参数较少的情况下, 第一层相对不如其余卷积层冗杂.
根据以上敏感性分析, 我们可以得出以下的深度压缩剪枝技巧:
- 使用L2正则化,
- 可以实行局部剪枝, 而非全局剪枝. 即保持卷积层, 只对全连接层剪枝.
2. CSR or CSC
CSR(Compressed Sparse Row)和CSC(Compressed Sparse Column)是存储稀疏矩阵的格式. CSR通过: values, column indices, row offsets 来存储稀疏矩阵. CSC与CSR原理一致.
通过CSR或CSC存储, 能将一个m * n的稀疏矩阵存储数量减少至: 2a+m+1(CSR)或2a+n+1(CSC), 其中a为非零数值.
关于CSR及CSC可参照scipy:
scipy.sparse.csr_matrix