知识蒸馏(Distilling Knowledge )的核心思想

    我最近在阅读 ICCV 关于神经网络模型压缩与加速的文章,顺藤摸瓜阅读了 Hinton 等大佬们在这方面的开山巨作(Distilling the Knowledge in Neural Network)。文章很有创意,做点笔记。

    文章针对的是分类问题,其主要工作解决两个问题:

  1. 如何把大型网络压缩成小型网络?
  2. 如何训练多个网络后融合模型以提高网络表现能力又不占用过大内存?(解决了第一个问题,也就解决了第二个问题)

1 硬标签和软标签

    假设我们做个关于汽车的分类任务,需要识别奔驰,宝马,自行车。于是我们建立了一个以 softmax 为损失函数的神经网络进行识别。假设原标签是[0,1,0],这是硬标签(hard target)。练好的网络对于车辆识别后给出的概率值,很可能如下图所示:

                                                                     知识蒸馏(Distilling Knowledge )的核心思想_第1张图片

    如果采用软标签(soft target),练好的网络对于车辆识别后给出的概率值,则可能如下图所示:

                                                                     知识蒸馏(Distilling Knowledge )的核心思想_第2张图片

    诚然,一辆奔驰被识别成自行车的概率微乎其微,但是被识别成宝马还是有一定可能性的。那么,神经网络为什么要设计软标签呢,它对于模型的拟合以及泛化能力会产生什么样的影响?

    我的理解是,神经网络采用硬标签的时候,其实了损失了原始数据的信息,降低了模型对于数据的拟合难度,使得模型变得更加容易拟合,于是可能产生过拟合,导致模型的泛化能力下降。而采用软标签的时候,模型需要学习更多的知识,比如两个接近的概率之间的相似性和差异性,从而为模型的拟合能力带来挑战,增强模型的泛化能力。当然这部分我没有严格的数学证明。

    如何使用软标签呢?

    就是修改了下softmax,增加了温度系数T,如下所示:

                                                            

2 如何训练网络

    使用软标签是为了更好得让模型学习数据的分布。但是作者模型融合的方式不是传统的多个模型求均值,而是采用软硬标签加权结合的交叉熵损失函数来训练小型模型(另外简单讲下交叉熵函数和KL散度的关系:交叉熵= 真实熵 + KL散度。参数更新时,最小化交叉熵与最小化KL散度的效果是一样的)。如下图所示:

               知识蒸馏(Distilling Knowledge )的核心思想_第3张图片

    训练的过程采用以下的步骤:

  1. 先用硬标签训练大型复杂网络(Teacher Net);
  2. 采用值大的T,经训练好的 TN 进行前向传播获得软标签;
  3. 分别采用值大的 T 和 T=1 两种情况,让小型网络(Student Net)获得两种不同的输出,加权计算两种交叉熵损失,训练SN;
  4. 采用训练好的 SN 预测类别。

    综上,采用软标签的知识蒸馏方法,一方面压缩了模型,另一方面,增强了模型的泛化能力(因为 SN 在训练集上的效果肯定没 TN 好)

    如何采用合适的权重值、如何划分数据集、梯度的传递、t如何取得好的训练效果等问题,具体可看原文。如有描述不当的地方还请博友指正。

 

 

参考博文及资料:

https://www.cnblogs.com/liaohuiqiang/p/9170582.html

https://www.jianshu.com/p/4893122112fa

https://www.zhihu.com/question/50519680

https://arxiv.org/abs/1503.02531

 

 

 

    

 

 

    

   

你可能感兴趣的:(深度学习,模式识别,文献阅读)