非结构化剪枝
减去某个权重或者神经元
权重剪枝(Weight pruning)
- 非结构化剪枝,任意的权重和神经元都有可能被修剪。
- 矩阵存储时压缩数据
- 卷积层限制权重剪枝率
- 使用索引的方式存储稀疏矩阵
CSR(Compressed Sparse Row)
第一行:所有非0数据
第二行:第一行每个数字所在的列数
第三行:上面数据中 第 [1,4)为一行,[4,6)为第二行,[6,8)为第三行。
权重量化(Weight quantization)
权重量化包括二值化权重 (binarized weights),三元权重(ternary weights),2-能量 权重,固定长度权重
结构化矩阵(Structured matrices )
分块循环矩阵
可以只进行权值量化不进行剪枝吗?
不可以。权值量化是减少冗余的位数而权值剪枝是减少权值的个数,这两者需要在压缩时结合。
交替方向乘子法(ADMM)
权值的剪枝量化本质上是权值的聚类问题,所以可以用ADMM解决。ADMM本质上是一种正则化。
ADMM原理
ADMM是一种通过将一个原始问题分解为两个问题分别解决的数学优化算法。
这个问题一开始可以写成
上面的问题就可以分解为关于x和z的两个问题,第一个子问题就是
第二个子问题是
q1(z|x) 和 q2(z|x) 都是二次方程。这两个问题在DNN训练中有相同的复杂度。ADMM是类簇问题的最优解。
ADMM-NN: 联合权重剪枝&量化
考虑一般的N层的DNN,损失函数为
联合DNN权重剪枝和量化就是
集合si反应了剪枝的约束(Si代表所有权重的集合)
ADMM-NN: ADMM正则化
ADMM正则化迭代着解决三个子问题直到收敛。
-
第一个子问题
第二项和第三项是二次的
这个子问题可以通过经典DNN训练时的的随机梯度下降算法解决。 -
第二个子问题
最优解是将ai元素保留在Wi+Ui的最大量级中,然后将剩余的置为0. -
第三个子问题
最优解是将Wi+Vi的每一个元素映射到最接近该元素的量化水平
将第二个和第三个子问题的解带入到第一个问题中,就变成了一个动态的正则化过程。
结构化剪枝
剪去整个filter或者 channel
结构化剪枝很适合硬件平台使用
在卷积核、通道、形状方面使其稀疏化
和ADMM结合:第一个问题不变,而改变第二个约束和映射,不同的结构化剪枝的结果减小的矩阵的大小,但是它仍然是一个矩阵,因此硬件平台就可以实现。
不建议对于任何硬件平台的神经 网络进行非结构化修剪( gpu、多核CPU、嵌入式平台、FPGA、ASIC、新兴硬件设备等)
其实结构化剪枝对于硬件平台也是不太好的,因为 1.输入输出的特征矩阵有冗余 2.和加速Winograd算法不相适应。