天天看点

《卷积神经网络的压缩与加速》概述

  1. 有四种常用方法:网络剪枝,模型量化,低秩估计,模型蒸馏。
  2. 网络剪枝主要有下列几种方法:filter-level剪枝(通过删除filter来减少通道数量),group-level剪枝即kernel-size缩小(如将33变成32,或者3*3变成固定形状包含若干个0的新核),稀疏卷积的方法(fine-grained,vector-level,kernel-level,稀疏矩阵乘法相比于稠密矩阵乘法,可以显著减少存储空间和计算开销)。以上三种方法都面对同一个问题,怎么选择裁剪掉哪些参数。一般有两种方法来识别:损失函数对参数的二阶导数最小(二阶导数越小,代表这个参数的更新对损失函数的下降贡献越小,可保证损失函数不变,???),参数绝对值最小(表示输出特征图与该参数几乎无关,可保证输出特征图不变)。
  3. 低秩估计:将原来的卷积过程,先用11的核降维,做完卷积运算,再用11的核升维。所谓的秩我理解代表的就是降维的程度。低秩估计方法存在一个待解决的问题,就是保留多少秩是不明确的。保留太多的秩可以保证准确率,但加速压缩效果不好;保留秩太少,加速压缩效果好,但准确率很难保证。曾经有工作提出先训练低秩的参数矩阵,即在损失函数中加入对参数矩阵秩的考虑,然后再对训练好的低秩网络做低秩估计,由于本身参数矩阵中很多列向量都是线性相关的,所以可以保留很少的秩进行分解。
  4. 模型量化:通常指的是模型的定点化,比如将float32转换成int8的运算,首先会有一个根据参数的最大值和最小值进行的浮点转定点的运算,然后对定点后的数据进行加乘运算,运算结果再复原为float值。这个过程中输入和权值都得量化。
  5. 模型蒸馏:不是对现有的网络进行改进,而是直接设计一个小网络。怎么保证小网络的准确率呢?首先训练一个大网络,然后用大网络来指导小网络。具体的做法是,小网络的结构和大网络是一样的(blob结构相同),然后给小网络设计了一个联合的损失函数,一部分是正常的任务损失函数,另一部分是指导损失函数(是各个blob的大小网络输出特征图的均方误差)。这个联合损失函数可以引导小网络尽可能学习大网络的参数,并且达到很好的任务准确率。有实验经验表明,如果先单独对指导损失函数进行训练,然后再加入任务损失函数联合训练,得到的模型效果将会比直接联合训练得到的模型好很多。

继续阅读