转帖请注明出处www.wangqingbaidu.cn
☛组会PPT☚
这篇论文使用Group Lasso(一种类似于L1的正则化方式,可以看成是把weights当成组来对待,以此将成组的weights规约到0附近,实现学习出来的参数的尽可能地结构化稀疏),依次实现网络预测的加速。
论文的解读分三个部分,
第一部分:为什么网络学习出来的参数是稠密的,但是对于模型来说这么多的参数其实是冗余的,其次看看学术圈弄矩阵稀疏化的人主要的目标是什么,然后再介绍一下他们经常用到的方法,
第二部分:针对他们的不足,SSL提出的一些改进方法
第三部分:实验结果,最后回归到哒溜君的老本行就是模型加速的工作,简单地介绍一下模型加速的方法。
这个问题在Gong Y.[1]的论文中有了一个定性的解释:For a typical network described in (Zeiler & Fergus, 2013), about 90% of the storage is taken up by the dense connected layers; more than 90% of the running time is taken by the convolutional layers.
这个model 90%的参数量集中在FC层,可以说FC的参数存在一定的冗余。
从表格可[2]以看出,VGG-16与Darknet19的准确率是相差不多,他们的输入数据的大小相同,但是模型的大小确实有着很大的差别,随着模型的参数越多,拟合能力越强,但是在同等准确率的情况下,可见VGG-16模型中的参数有很大程度上是存在冗余的,所以需要一种方法将这些冗余的参数去掉,减小模型的体积。
进行模型压缩,或者稀疏化权重矩阵的目标不外乎这几个目标
a.)证明模型的参数存在冗余,减少冗余之后准确率没有明显下降。
b.)减少模型的参数,对模型进行压缩,像一些移动应用不可能放一个vgg模型上去,肯定是要进行压缩才能使用的。
c.)模型压缩或者稀疏化之后就有了减少模型乘加操作的基础,在这个基础上可以进一步实现模型预测的加速。
再看看针对不同的目标,大家常用的伎俩或者方法。
a.) Redundancy
卡一个阈值,然后小于这个阈值的weights全部归0[3]
这样的话可以很方便地实现模型的压缩,简单粗暴,其实深度学习在每层之间的卷积算子,可以看成对于输入数据的加权,也就是说如果权值越少,就认为经过激活之后所产生的影响几乎可以忽略不计,而且权重在空间内基本上是处于一个正态分布的,也就是说一般有100个正的weights,就有100个负的weights,PVANet前面几层就是基于这个特点实现的加速(前几层最耗时)。
b.) Storage
要达到这个目标是比较简单的,主要是看大家的压缩率,常用的方法包括矩阵分解,像SVD,UV分解之类;模型量化,权重从
float
到short
或者若干bits[4],这样存储空间就由32bits -> 若干(一般小于8)bits;对weights做聚类,也就是然后再进行索引。i. 矩阵分解
这个方法其实很好理解,CNN其实就是矩阵乘法,A × B,这里假设B是100×100的矩阵,如果采用UV分解对B进行逼近,分解成两个矩阵分别是 100×25 和 25×100,这样存储空间就从原来的10000降到了5000,相当于起到了一倍的压缩比。
ii. 参数量化
这个量化是很明显的,float是32bits, 就算量化到short(8bits)都有4倍的压缩比,哒溜君曾经做过实验,就是给定的一张图片,在经过CNN所有网络,统计feature map的值分布在(-3, 61),所以通常我们可以压缩的更狠一点可以压缩到3bits左右[4], 但是这个压缩所带来性能损失就比较大了,想XNORNet就是把feature map 以及weights全都量化到了-1, 1,这虽然速度上提升了,但是准确率下降确实十分明显,而且模型很容易不收敛。
iii. kmeans参数聚类[1]
这个也是很容易理解的,参数聚类,假如现在有100个参数,聚类成10类,用这10个聚类中心表示这些参数是再用一个索引表去索引,也是可以实现模型压缩的,但是这样做要付出一个索引表的带价,所以一般是聚类中心个数和索引表体积的一个trade off。 在这个聚类上,还有
group kmeans
,对于4维的filter可以从不同维度开始聚类等,residual kmeans
聚类肯定会带来损失,可以使用第一次聚类之后原矩阵与聚类矩阵的残差继续聚类,以此类推得到一个残差链。
c.) MAC(Multiplication Add Computation)
提高模型预测的速度可能是做工程人的终极目标了,但是这个目标并不是很容易实现,前面介绍的矩阵分解可以减少乘加操作,像更明显的降低模型深度,使用更小的filter,当然使用Binary的方式,总是实现方式不一而足。
但是现在存在一个学术界与工业界的gap就是,学术理论是一套,工业实现又是另外一套,学术实现想Binary Connect以及其他的量化方式就是使用的Mask的方式,这个在实际应用的时候并不会降低运算量反而会有所上升。
在介绍具体算法之前,有两点需要大家明白,就是l1和Group Lasso的作用
l1产生稀疏化,Group Lasso产生结构稀疏化。具体算法大家可以参考各种博客
这篇论文主要的工作就是集中在了loss function上面。 所有稀疏化的操作都是基于下面的loss func进行的
ED(W): Loss function
R(W): Non-structured regularization, l2-norm
Rg(W(l)): Group lasso
总体来说就是想结构化稀疏那一块的内容,那么就去按照那个部分的进行分组,然后进行Group Lasso
a.) Channel Wise
>
E(W)=ED(W)+λn⋅∑i=1L(∑nl=1Nl∥∥W(l)nl,:,:,:∥∥g)+λc⋅∑i=1L(∑cl=1Cl∥∥W(l)cl,:,:,:∥∥g)b.) Shape Wise
E(W)=ED(W)+λs⋅∑i=1L(∑cl=1Cl∑ml=1Ml∑kl=1Kl∥∥W(l):cl,:ml,:kl∥∥g)c.) Deepth Wise
E(W)=ED(W)+λd⋅∑i=1∥∥W(l)∥∥g
1.在minist上的加速效果
2.ImageNet上的加速效果
可以看到上面你的加速效果在mnist数据集上加速效果明显,但是在ImageNet就没有这么高的加速比,所以具体的效果还是需要依赖于数据集的。
最后还是回到加速这个事情,其实并不是很easy的,在论文的slide中也有说明就是理论的加速比≠实际加速比,这里面有很多programing的东西在里面,就拿简单的float到short的量化来说,哒溜君做实验发现麻蛋,根本没效果,原因很简单就是现在的CPU都是32或者64bits的机器,也就是SIMD,一次能够取到所有的float bits,而short也会,所以没有太大性能上的差别。
后面哒溜君会继续在指令集的角度研究加速这个事情,到时候会跟大家继续分享。
[1] Gong Y, Liu L, Yang M, et al. Compressing Deep Convolutional Networks using Vector Quantization[J]. Computer Science, 2014.
[2] https://pjreddie.com/darknet/imagenet/
[3] Han S, Pool J, Narang S, et al. DSD: Regularizing Deep Neural Networks with Dense-Sparse-Dense Training Flow[J].
[4] Anwar S, Hwang K, Sung W. Fixed point optimization of deep convolutional neural networks for object recognition[J]. 2015:1131-1135