模型压缩——将模型复杂度加入loss function

这里介绍2017ICLR OpenReview中的一篇有关网络压缩的文章《Training Compressed Fully-Connected Networks with a Density-Diversity Penalty》。

看文章标题就知道主要是针对全连接层的,由此我的好感就下降了一半。

———————— 引言 ————————

作者拿VGG说全连接层会占很多资源,压缩这个最重要。好像哪里不对T_T(能压卷积层的才是厉害)。

文章提出了两个名词,我觉得很有意思: “Density”“Diversity”。 这两个名词基本引出了现有的绝大部分深度模型的压缩方法。

“Density” 引出的方法比较有代表性的就是剪枝、矩阵分解等,即降低网络的稀疏度(冗余度),这样模型就被压缩了。

“Diversity”引出的方法比较有代表性的就是量化方法,用少量码字表示一个大的权重矩阵,即降低网络参数的多样性,这样就可以只存储这些不一样的码字,从而压缩模型。

于是,文章将全连接层的密度和多样性也加入loss中进行惩罚,意图使得网络变得更稀疏多样性更差

而这也是我对这篇文章比较喜欢的一点解释: 作者将全连接层的密度和多样性加入loss中进行惩罚并不是为了直接得到一个小的模型,而是为了在此基础上更好使用剪枝和量化的方法(参考链接)。这是因为网络越稀疏,我们便可以剪去更多的枝;参数多样性越少,我们便可以使用更少的码字来量化。

PS. 之前看到过好几篇文章将网络的宽度和深度等也加入loss中,意图训练得到性能好同时体积又小的模型。我对这类的文章很不感冒,因为复杂度高,同时还会带来非常大的训练困难。我们可以比较轻松的压缩得到一个小的模型,但上来就直接训练一个小的模型其难度非常高。

———————— 方法:Loss Function ————————

方法其实分两步:首先,通过下面的Loss Function训练出一个稀疏的低多样性的网络; 然后,运用剪枝和量化方法压缩网络。

模型压缩——将模型复杂度加入loss function_第1张图片

由上式可知,现在的loss包含三部分:\(L(\hat y,y)\)表示预测误差; \(\Vert W_j\Vert_p\) 为权重矩阵的p范数,用来描述密度; \(|W_j(a,b)-W_j(a’,b’)|\)用来描述权重矩阵的多样性。此外,\(\lambda_j\)用来调节每一层密度和多样性loss的权重,主要是为了平衡每一层参数数量不一样导致的loss的数量级变化。

反向求导方面,多样性loss \(|W_j(a,b)-W_j(a’,b’)|\)的求导计算量太大了,作者提出了一种快捷的方法,这里就不再赘述,有兴趣可以看原文。

训练方面, 作者也说明了这种loss会导致模型性能很差,因此作者采取了分步迭代的方法。如下图,先把密度和多样性loss加入(最终模型准确率会很差),然后去掉该loss并保持全连接层模板不变然后训练其它层,重复该步骤。

模型压缩——将模型复杂度加入loss function_第2张图片

你可能感兴趣的:(神经网络压缩与加速)