前言
本文主要包括卷积神经网络的网络压缩的相关知识。主要致力于减小模型复杂度,减少模型存储所需的空间,加速模型的训练与推理。
模型的压缩又分为前端压缩(不怎么改变网络结构)和后端压缩(追求极致的压缩,极大地改造网络结构,操作不可逆),接下来将分别介绍它们。
提示:以下是本篇文章正文内容,仅供参考
一、前端压缩
1、知识蒸馏
采用迁移学习的思想,通过预训练好的teacher model(大and强)的输出作为监督信号去训练另外一个轻量化的网络student model(小 and快)。
teacher model可以监督的信息包括:
- 概率分布
- 输出的特征
- 中间层的feature map
- attention map
- 中间过程
其中针对概率分布的蒸馏可以使用KL。KL散度是描述两个概率分布差异的一种方法。我的理解是通过KL告诉student model自己的prediction和teacher model的差异,从而纠正其可能的错误(因为teacher model的预测更准确)。具体做法是计算两个pre的KL散度得到一个KL loss,训练student model时将其自己计算的loss和KL loss相加后再做反向传播。
针对feature map做知识蒸馏。我们希望student model得到的feature map和teacher model得到feature map尽可能像,但是如果直接用L2 loss计算可能太暴力,可能导致过拟合,所以这里通常使用MMD loss(maximum mean discrepancy,可以评价两个域的相似性),它是将两个model 的feature map的分布域拉近而不是直接针对每个feature map(这里假设我们有一系列的feature map)。
2、紧致网络设计
直接在设计网络时设计又小又好又的网络,如SqueezeNet、MobileNet、ShuffleNet等,这里不赘述。
二、后端压缩
1、低秩近似
PCA的思想中,大的矩阵可以用低秩的矩阵来表示其大部分的信息,丢弃少量信息来消除大量的冗余。这就和低秩近似的思想比较相近。
常见的方法有:
- 卷积分解:将d×d的卷积核分解为d×1和1×d的卷积核(感受野没有变化),精度损失<1%
- SVD分解:对卷积和和卷积运算进行SVD分解,对特征吃进行排序,保留比较大的几项
2、剪枝
原本神经网络是全连接的,在训练完成后,并不是每个神经元都对预测结果有着重要影响,有些神经元是没什么用的。剪枝就是在网络训练完成后,裁剪掉贡献信息量不大的网络参数。如果权值越少,就认为经过激活之后所产生的影响几乎可以忽略不计。去除权重比较小的连接,使得网络稀疏。
剪枝的基本流程:
- 衡量所有神经元的重要程度
- 移除一部分不重要的神经元
- 对网络进行fine-tune(因为网络结构变了所以需要微调)
- 返回1进行下一轮剪枝直到满足某些条件
剪枝方法分类:
3、量化
一般而言,神经网络的参数是用32bit长度的浮点型表示,可以通过牺牲精度来降低储存参数所需的空间。
可以量化的对象包括:
- 网络权重
- 网络特征
- 网络梯度