本文讲的是神经网络中提取知识,也就是我们熟知的 知识蒸馏 。
传统方法:使用不同的网络模型对数据集进行学习,然后将预测结果取平均,得到最终的预测结果。
传统方法的缺点:计算密集
本文贡献:①将一堆模型的知识蒸馏到一个模型中;②实现快速并行训练。
背景:在大规模学习(语音、目标检测等)中,需要大量、冗余的数据集,不要求实时,但对计算量要求大;在部署阶段,则对计算资源的要求严格许多。
大体的思路:先训练一个很强大的模型,再从中“蒸馏”出一个小模型出来。
文章提出了一种错误认识: 我们倾向于使用模型学习到的参数值来识别模型中的知识,这使得我们很难看到如何在保持输出不变的情况下改变模型结构。 从宏观角度来看,神经网络就是一个函数,将输入x映射到函数f(x)上。训练的目标应该是最大化正确类别的概率,但(side-effect)同时也会给所有错误类别分配一个概率。文章举例说,一辆宝马的图像很难被识别为垃圾车,但是垃圾车的概率仍然比识别为胡萝卜的概率高得多。
为什么说这是一个side-effect呢?因为我们训练模型的最直接目标就是最大化正确答案的概率,但是由于模型还要区分正确和错误答案,从而产生了附加的潜在目标,模型不得不为包括错误答案在内的所有可能答案分配一个概率。
但是从某种角度来看,有这种副作用的产生也是模型泛化能力的体现。通过观察错误答案的相对概率,我们可以了解模型在泛化到新情况时可能的决策趋势和可能性。对错误答案进行概率分配不是直接的目标,但它提供了关于模型如何泛化的有用信息,这是一种附加的、有意义的效果。
较为常见的方法是将较大模型的输出作为小模型的“软目标”(模型群的平均值),相比硬目标具有更大的熵(不确定度),能够提供更多信息,因此小模型通常可以在比原始的繁琐模型少得多的数据上进行训练,并使用更高的学习率。
Softmax函数的公式如下,其中$\tau$代表温度(temperature),能够决定分布的平滑程度,$\tau$越高,输出越平滑和均匀,越低则分布更加尖锐。
$$ \text{Softmax}(z)_i = \frac{e^{z_i / \tau}}{\sum_{j} e^{z_j / \tau}} $$
先咕一会