模型剪枝
模型压缩技术的 “网络剪枝”?
- 利用深度学习模型的稀疏性 ,将模型结构中对预测结果不重要的网络结构剪裁掉,使网络结构变得更加 ” 瘦身 “。比如,在每层网络,有些神经元节点的权重非常小,对模型加载信息的影响微乎其微。如果将这些权重较小的神经元删除,则既能保证模型精度不受大影响,又能减小模型大小
- 具体包括结构性剪枝与非结构性剪枝
为什么模型可以压缩?
- 虽然一般的神经网络都有上百万的参数, 但是并不是所有的参数都在模型中发挥作用,部分参数作用有限、表达冗余,甚至会降低模型的性能。
- 论文《Predicting parameters in deep learning》提出,很多的深度神经网络仅仅使用很少一部分(5%)权值就足以预测剩余的权值。该论文还提出这些剩下的权值甚至可以直接不用被学习。也就是说,仅仅训练一小部分原来的权值参数就有可能达到和原来网络相近甚至超过原来网络的性能
模型压缩技术的 “结构性剪枝”?
- 是 filter 级或 layer 级、粗粒度的剪枝方法,精度相对较低,但剪枝策略更为有效,不需要特定算法库或硬件平台的支持,能够直接在成熟深度学习框架上运行
模型压缩技术的 “非结构性剪枝”?
- 通常是连接级、细粒度的剪枝方法,精度相对较高,但依赖于特定算法库或硬件平台的支持
模型压缩技术的 “紧凑的模型结构设计 “?
- 紧凑的模型结构设计主要是对神经网络卷积的方式进行改进,比如使用两个 3x3 的卷积替换一个 5x5 的卷积、使用深度可分离卷积等等方式降低计算参数量
- 目前很多网络基于模块化设计思想,在深度和宽度两个维度上都很大,导致参数冗余。因此有很多关于模型设计的研究,如 SqueezeNet、MobileNet 等,使用更加细致、高效的模型设计,能够很大程度的减少模型尺寸,并且也具有不错的性能
模型压缩技术的 “滤波器层面的剪枝 "?
- 滤波器层面的剪枝属于非结构性剪枝,主要是对较小的权重矩阵整个剔除,然后对整个神经网络进行微调
- 此方式由于剪枝过于粗放,容易导致精度损失较大,而且部分权重矩阵中会存留一些较小的权重造成冗余,剪枝不彻底。 具体操作是在训练时使用稀疏约束(加入权重的稀疏正则项,引导模型的大部分权重趋向于 0)。完成训练后,剪去滤波器上的这些 0
模型压缩技术的 “参数量化”?
- 神经网络参数一般是 FP32,使用较小的精度 (如 int8) 代替,则可以牺牲一点模型精度来换取更快的计算速度
- 与典型的 FP32 型号相比,PyTorch 支持 INT8 量化,从而可将模型大小减少 4 倍,并将内存带宽要求减少 4 倍。与 FP32 计算相比,对 INT8 计算的硬件支持通常快 2 到 4 倍
- 量化主要是一种加速推理的技术,并且量化算子仅支持前向操作,只有在进行 forward 的时候才可以采用量化操作进行加速,在进行 backward 时不可以进行使用量化操作来进行加速
- 模型性能损失很小,但压缩率大时,性能显著下降
模型压缩技术的 “二值网络”?
- 相对参数量化更为极致,对于 32bit 浮点型数用 1bit 二进制数 - 1 或者 1 表示,可大大减小模型尺寸
- 网络体积小,运算速度快,有时可避免部分网络的 overfitting,但是二值神经网络损失的信息相对于浮点精度是非常大
模型压缩技术的 “三值网络”?
- 相对于二值神经网络,三值神经网络在同样的模型结构下可以达到成百上千倍的表达能力提升;并且,在计算时间复杂度上,三元网络和二元网络的计算复杂度是一样的
- 例如,对于 ResNet-18 层网络中最常出现的卷积核 (3x3 大小),二值神经网络模型最多可以表达 2 的 3x3 次方 (=512) 种结构,而三元神经网络则可以表达 3 的 3x3 次方 (=19683) 种卷积核结构。在表达能力上,三元神经网络相对要高 19683/512 = 38 倍。因此,三元神经网络模型能够在保证计算复杂度很低的情况下大幅的提高网络的表达能力,进而可以在精度上相对于二值神经网络有质的飞跃。另外,由于对中间信息的保存更多,三元神经网络可以极大的加快网络训练时的收敛速度,从而更快、更稳定的达到最优的结果
模型压缩技术的 “低秩分解 "?
- 利用矩阵或张量分解技术估计并分解深度模型中的原始卷积核,卷积计算是整个卷积神经网络中计算复杂度最高的计算操作,通过分解4D 卷积核张量,可以有效地减少模型内部的冗余性.此外对于2D的全连接层矩阵参数,同样可以利用低秩分解技术进行处理
模型压缩技术的 “未加限制的剪枝 "?
- 完成训练后,不加限制地剪去那些冗余参数,可以保持模型性能不损失的情况下,减少参数量 9-11 倍
- 极度依赖专门的运行库和特殊的运行平台,不具有通用性