【模型压缩】模型剪枝,知识蒸馏,ShuffleNet知识与实战小结

【模型压缩】模型剪枝,知识蒸馏,ShuffleNet知识与实战小结

什么是知识蒸馏: 根据Hinton15年的文章,Distilling the knowledge in aneural network来看,模型蒸馏的设计思路,和物理变化上的蒸馏确实是很像的,而论文中涉及到的一些关键词,也是用相应的物理词汇进行描述。最具有代表性的就是关于温度变化的超参数T,通过T来改变建立的soft target的,使得蒸馏后的模型更具有特定数据集下的表现力,直观地表达就是在这种‘温度’,这种数据集的情况下,模型表现力更加强,‘纯度’更高。
说回本质上,可以说是一种迁移学习,使得模型对特定的数据集更加具有针对性,相应的蒸馏出来的模型也会具有对某个数据集的特异性。

知识蒸馏的基本原理: 用一个已训练的teacher网络,去教会一个student网络
知识蒸馏和模型剪枝的异同: 模型剪枝是剪裁去掉一些不影响表现力的参数,从而达到模型的缩小,相应地,多多少少都会失去对于一些数据的表达信息,从而体现出对于当前数据的特异性,这与知识蒸馏在直接表现上是一致的,而知识蒸馏是通过fine tune更小的数据集来实现这个目的。

开源的压缩工具包:

  • Intel 开源了一个用于神经网络压缩的开源 Python 软件包Distiller,它可以减少深度神经网络的内存占用、加快推断速度及节省能耗。Distiller 为 PyTorch环境提供原型和分析压缩算法,例如产生稀疏性张量的方法和低精度运算等。

【模型压缩】蒸馏算法小结

知识蒸馏:

  • Rocket Launching: A Universal and Efficient Framework for Training Well-performing Light Net:其中简单的网络称为轻量网络(lightnet),复杂的网络称为助推器网络(booster net),相比前者,有更强的学习能力。两个网络共享部分参数和层次,分别学习类别标记,此外,轻量网络通过学习助推器的soft target来模仿助推器的学习过程,从而得到更好的训练效果。测试阶段,仅采用轻量网络进行预测。()
    || 关于loss : 第一项是交叉熵函,第二项是logits 的平方差(hint loss),通过hint loss在两个网络间共享学习信息,论文中给出了三种方案,具体看这里,多数其他人后续的实验证明是加了T超参数的loss的效果最好。
    || 通过Gradient block防止Booster Net性能受Light Net牵连 :本文由于采用同时训练两个网络,因此两个网络的性能会接近,这会妨碍Booster Net直接从Ground Truth的学习,Booster Net不能达到更有,使得两个网络的性能都下降。文章设计了Gradient block模块:在训练的反向传播hint loss项阶段,固定Booster Net的Wb权重参数来实现,即该参数仅通过H(y,q(x))的反向传播更新。

模型剪枝:

  • 基于幅值的剪枝
    主要思想: 将小于一定阈值的权重抛弃。该阈值可根据剪枝率确定。
    方法: 设置一个跟权重形状相同的mask(其值为二值张量,0或者1),用来与权重相乘,从而决定哪些权重要被剪掉(剪枝掉的权重不会再接收梯度,不可逆)。而mask中值的设置,可将权重排序,将低于阈值的权重对应的掩码设置为0.
    实验过程包括三步:第一,训练原始模型;第二,对训练得到的模型,进行剪枝;第三,删除训练图中的剪枝结点(这一步必须要做,否则的话会导致模型变大)
  • 基于通道的剪枝
    主要思想: 该方法是将不重要的整个权重通道剪掉,从而将模型变小
    方法: 对已经训练好的模型,选择要剪枝的不重要(或不太重要)的通道,删除这些通道,构造新的模型图;重新训练,恢复准确率

部分内容出处:
https://blog.csdn.net/firsttimett/article/details/85597506
https://blog.csdn.net/m0_37665984/article/details/103344743

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章