0. 前言
神经网络的压缩,既能够保证模型的精度不会显著性地受到损失,又能够大大减少模型的参数,除了直接设计更精细的模型外,目前主要分为近似、量化和剪枝三类方法。
- 更精细的模型
- MobileNets
借鉴factorized convolution的思想,将普通卷积操作分成两部分 - ShuffleNet
基于MobileNet的group思想,将卷积操作限制到特定的输入通道。
2. 近似/网络分解/张量分解
近似类方法是利用张量分解的思想,通过少量参数重构原始网络参数张量。
- CP分解
- SVD分解
- Tucker分解
3. 权重共享和量化
权重共享顾名思义,量化方法是将网络参数用更少的比特数来表示,以达到减少网络存储开销的目的。
- 权重共享: 结构化矩阵、哈希
- 量化: 定点运算、二值化/三值化
4. 模型裁剪/剪枝(Pruning)
剪枝会直接改变网络的结构,在降低网络模型复杂度的同时还能解决过度拟合问题,早期的修剪方法是通过权重衰减来实现剪枝,之后是基于损失函数去减少网络中的连接数。
- 非结构化剪枝
非结构化剪枝就是把单个权重/神经元剪掉,会导致连接不规整,需要稀疏表达,很不友好。 - 核的稀疏化 - 结构化稀疏
对权重的更新加以正则项进行限制,使其更加稀疏,使大部分的权值都为0。
- Regularization(正则化)
范数(norm)定义
0-范数:向量中非零元素的个数。
1-范数:为绝对值之和。
2-范数:绝对值的平方和再开方,Euclid范数(欧几里得范数,常用计算向量长度),就是通常意义上的模。
p-范数:元素绝对值的p次方和的1/p次幂
参数约束
L0范数和L1范数对非零参数进行惩罚,使更多非零参数等于零,实现稀疏。
L2范数是指向量各元素的平方和然后求平方根,让L2范数的正则项||W||2最小,可以使得W的每个元素都很小,都接近于0,但与L1范数不同,它不会让它等于0,而是接近于0。
在实际应用中,数据的维度中是存在噪音和冗余的,所以需要稀疏约束,稀疏约束最直观的形式是0-范数,不过0范式不连续且非凸,在求解过程中就变成了组合优化问题。不过1-范数也可以达到稀疏的效果,是0范数的最优凸近似,更重要的是1范式容易求解。 - The Least Absolute Shrinkage and Selection Operator(Lasso) 稀疏约束
LASSO是另一种缩减方法,将系数收缩在一定的区域内。LASSO的主要思想是构造一个一阶惩罚函数获得一个精炼的模型, 通过最终确定一些变量的系数为0进行特征筛选。 - Group Lasso 分组最小角回归算法
lasso方法推广到group上面,诞生了group lasso。将所有变量分组,然后在目标函数中惩罚每一组的L2范数,这样达到的效果就是可以将一整组的系数同时消成零,即抹掉一整组的变量,这种手法叫做Group Lasso 分组最小角回归算法。如果每个组的特征个数都是1,则group lasso就回归到原始的lasso。
- 结构化剪枝
减去第i层的filter,进而减去第i层产生的部分特征图和第i+1层的部分kernel。
5. 其他
除上述的方法外还有迁移学习、网络精馏、计算加速等方法。
6. …
受限于边缘设备的硬件,神经网络压缩是必然的研究趋势,可谓花样百出,各有千秋啊。
在神经网络的压缩方法中,结构化稀疏剪枝通过分析神经网络的权重分布,修改损失函数引导稀疏,在神经网络未得到更多理论支撑的情况下显得更有意义。