为什么要对卷积神经网络进行压缩?
因为卷积神经网络需要的参数个数非常多,计算所需的次数和代价都非常大,因此需要进行压缩。
两种压缩策略不存在绝对的好坏,各种方法均有其各自的适应场景。并且,两种压缩技术可以相互结合,将“前端压缩”的输出作为“后端压缩”的输入,能够在最大程度上减少模型的复杂度。
低秩近似
低秩近似属于后端压缩技术中的一种。
卷积神经网络中的基本计算模式是进行卷积运算。具体实现中,卷积操作由矩阵相乘完成。但是,通常权重矩阵旺旺稠密并且巨大,从而带来计算和存储上的巨大开销。为解决这种情况的一种直观想法是,如果能将该稠密矩阵由若干个小规模矩阵近似重构出来,那么便能有效降低存储和计算开销。这类算法大多采用低秩近似的技术来重构权重矩阵,因此将其归类为低秩近似算法。
使用结构化矩阵来进行低秩分解
结构化矩阵是一系列拥有特殊结构的矩阵,例如Toeplitz矩阵,该矩阵的特点是任意一条平行于主对角线的直线上的元素都相同。
使用Toeplitz矩阵来近似重构原权重矩阵:
W
=
α
1
T
1
T
2
−
1
+
α
2
T
3
T
4
−
1
T
5
\boldsymbol{W}=\alpha_1\boldsymbol{T}_1\boldsymbol{T}_2^{-1}+\alpha_2\boldsymbol{T}_3\boldsymbol{T}_4^{-1}\boldsymbol{T}_5
W=α1T1T2−1+α2T3T4−1T5;
W
\boldsymbol{W}
W和
T
\boldsymbol{T}
T都是方阵。每个Toeplitz矩阵都可以通过置换操作转化为一个非常非常低秩的矩阵。
但是该低秩矩阵和原矩阵并不存在直接的等价性,为了保证两者之间的等价性,还需要截止一定的数学工具来达到使用低秩矩阵来重构原结构化矩阵的目的,从而减少了存储开销。
使用矩阵分解来降低权重矩阵的参数
剪枝
剪枝属于后端压缩。
给定一个预训练好的网络模型,常用的剪枝算法一般都遵从如下的操作流程:
- 衡量神经元的重要程度:剪枝算法中最重要的核心步骤。根据剪枝粒度的不同,神经元的定义可以是一个权重连接,也可以是整个滤波器。衡量其重要程度的方法从一些基本的启发式算法到基于梯度的方法,各有千秋。
- 移除掉一部分不重要的神经元:可以根据某个阈值或者按照重要程度排序来判断神经元是否被剪除。
- 对网络进行微调:剪枝操作会不可避免地影响网络的精度,为了防止对分类性能造成过大的破坏,需要对剪枝后的模型进行微调。
- 进行下一轮剪枝:反复迭代上述步骤,直到在性能和规模上达到一个较好的平衡。
参数量化
参数量化是一种常用的后端压缩技术。
量化是指从权重中归纳出若干“代表”,由这些“代表”来表示某一类权重的具体数值。“代表”被存储在码本之中,而原权重矩阵只需记录各自“代表”的索引即可,从而极大地降低了存储开销。
最简单也是最基本的一种量化算法便是标量量化。
基于k-均值算法的标量量化尽管简单,但是在很多应用中非常有效。
为了避免标量量化能力有限的弊端,也有很多算法考虑结构化的向量量化方法。其中最常用的一种算法是乘积量化。该算法的基本思路是**先将向量空间划分成若干个不相交的子空间,之后一次对每个子空间执行量化操作。
知识蒸馏
思想:不改变模型复杂度的情况下,通过增加监督信息的丰富程度,可以带来性能上的提升。
“知识蒸馏”是迁移学习的一种,最终目的是将一个庞大而复杂的模型所学到的知识,通过一定的技术手段迁移到精简的小模型上,使得小模型能够获得与大模型相近的性能。
知识蒸馏中两个基本要素起着决定性作用:
- 如何提取模型中的知识
- 如何完成知识转移的任务