问什么要做模型压缩,而不是直接训练一个小的cnn模型

更新时间:02-09 教程 由 情殇 分享

深度学习模型一般来说是越深越好(深度学习的本质是不同层级的特征抽取),当然前提是能用各种技巧训练好这个深度模型。当前的深度模型压缩基本是无损压缩,或者付出较少的精度代价,所以压缩的深度模型一般来说会比直接训练的浅层模型会有更好的预测精度。本质上,深度模型的压缩是通过训练的方法设计一个精度较高的稀疏模型,和自动化机器学习类似,最终的模型架构由数据决定,而不是完全由人工设计。另外,由于当前的主流机器学习框架都是基于张量(tensor)化的优化,而压缩后的模型每层参数是稀疏矩阵,其存储和计算都需要重新设计,比如用链表来存储参数等等,否则无法享受模型压缩带来的好处。模型压缩也给人工设计深度模型带来一些灵感,比如使用更小的卷积核(1X1),量化权值共享等等。

我们可以从几种常见的方法来讨论当前较为常见的模型压缩方法:

1.模型压缩最常见的方法是剪枝。对于已训练好的模型网络,可以寻找一种有效的评判手段,将不重要的连接进行裁剪来减少模型的冗余。另外,也可以在在训练过程中,对权重的更新加L1正则项进行诱导,使其更加稀疏,使大部分的权值都为0。也可以在训练中动态进行剪枝,具体做法就是在训练过程中将认为不重要的连接剪枝,但是往往无法直观的判断哪些连接是否重要,因此在这里增加了一个嫁接的过程,将哪些重要的被裁掉的连接再恢复回来。通过网络嫁接操作的引入,避免了错误剪枝所造成的性能损失。

2.从信息压缩的角度来压缩模型。常见的方法可以对参数矩阵进行低秩压缩(如svd),可以将参数矩阵存储的连续变量转化成分类变量(浮点数转成整数),然后通过权值共享进一步压缩矩阵。最后在保存网络的时候还可以使用哈夫曼编码进行进一步的压缩。

3.知识蒸馏也可以看成模型压缩的一种方法。知识蒸馏属于迁移学习的一种,也就是将一个模型的性能迁移到另一个模型上。如果训练好的复杂模型已经具有非常好的性能和泛化能力,可以用这个复杂模型来作为一个softtarget来指导另外一个简单模型来学习,使简单模型具有和复杂模型相近的性能。训练时,简单模型有两个目标:一个是hardtarget,即原始的目标函数,为简单模型的类别概率输出与label真值的交叉熵;另一个为softtarget,为简单模型的类别概率输出与复杂模型的类别概率输出的交叉熵,由于softtarget具有更高的熵,它能比hardtarget提供更加多的信息,事实上,复杂模型的作用是为了提高label包含的信息量。通过这种方法,可以把模型压缩到一个非常小的规模。模型压缩对模型的准确率没有造成太大影响,而且还可以应付部分信息缺失的情况。

声明:关于《问什么要做模型压缩,而不是直接训练一个小的cnn模型》以上内容仅供参考,若您的权利被侵害,请联系13825271@qq.com
本文网址:http://www.25820.com/tutorial/14_2168037.html