现在深度学习模型的应用仍存在许多瓶颈,模型速度,内存占用,能耗等。
我们的追求就是在保证模型效果的前提之下,保证速度更快,占用内存更少,能耗更少。
接下来介绍几种提升模型效率的方法。
Factorization
low-rank 矩阵分解(2D)
low-rank 张量分解(3D)
canonical polyadic分解(4D)
有效性?
局限性:在原来已训练好的模型上进行改进,减少计算量,但模型体积仍然较大。
Knowledge transfer
distillation network: soft label for teaching.
transfer mid-level information: gram matrix to transfer knowledge。
Pruning
对某些重要性不强的kernel或者fc神经元进行剔除,然后重新进行训练。
通道剪枝:剔除每一层中不太重要的特征通道。可以通过一个缩放因子来决定整个特征图的重要性。
局限性 :减少模型参数量,模型体积小,但是加速不明显,可并行性较低。
Quantization
XNOR-Net
对卷积核和输入进行量化(如二值化),比如浮点数转为0,1,-1这些存储空间小,运算速度快的数值。实现缩小模型体积的同时加快运算。
不过这一 量化过程都是发生在推断的过程,或者说前向传播的过程,但是更新模型参数的时候,反向传播时不能进行二值化,但是在训练时加速不明显,没有对梯度进行量化。
DoReFa-net
对feature map,kernel size,grad进行量化 。但是这三种量化策略不同,不是简单的二值量化。
量化时会导致产生必要的noise,如果在量化之前添加一些noise的话,可能提升性能。
New model design
SqueezeNet
使用 1 * 1 卷积 + skip connection减少模型通道数。
MobileNet
depth-wise / 1* 1 point-wise 卷积减少feature map计算量和参数量。
MobileNet v2:
使用了1*1 conv/ relu6 / dwise residual block
ShuffleNet:
channel shuffle / group conv / dw conv
shuffle 策略??