在一篇新论文“Towards Understanding Ensemble, Knowledge Distillation, and Self-Distillation in Deep Learning“中,我们专注于研究神经网络在训练过程中纯粹由于随机化产生的差异。我们提出了以下问题:除了测试准确性上的微小偏差外,从不同随机初始化中训练出来的神经网络是否学习了非常不同的函数?如果是这样,差异从何而来?我们如何减少这种差异,使神经网络更稳定,甚至更好?这些问题并非微不足道,它们与深度学习中广泛使用的三种技术有关。
深度学习中的三个神秘之处
神秘之处1:集成使用不同随机种子的学习网络F1,…F10 —— 尽管具有非常相似的测试性能 —— 被观察到与非常不同的函数相关联。实际上,使用一种著名的技术叫做集成(ensemble),只需对这些独立训练的网络的输出进行无加权的平均,就可以在许多深度学习应用中获得测试时性能的巨大提升。(参见下面的图1。)这意味着单个函数F1,…F10必须是不同的。然而,为什么集成的效果会突然提高呢?另外,如果一个人直接训练(F1+⋯+F10)/10,为什么性能提升会消失?图1:在深度学习应用中,集成可以提高测试精度的性能,但这种精度的提高无法通过直接训练模型的平均值来实现。神秘之处2:知识蒸馏尽管集成在提高测试时性能方面非常出色,但在推理时间(即测试时间)上,它的速度会慢10倍:我们需要计算10个神经网络的输出,而不是一个。当我们在低能耗、移动环境中部署这样的模型时,这是一个问题。为了解决这个问题,提出了一种叫做知识蒸馏的开创性技术。也就是说,知识蒸馏只需要训练另一个单独的模型就可以匹配集成的输出。在这里,对猫图像的集成输出(也称为“dark knowledge”)可能是类似“80% cat + 10% dog + 10% car”,而真正的训练标签是“100% cat”。(参见下面的图2。)事实证明,经过训练的单个模型,在很大程度上,可以匹配10倍大的集成测试时的表现。然而,这导致了更多的问题。为什么与真实的标签相比,匹配集成的输出能给我们更好的测试精度?此外,我们是否可以对知识蒸馏后的模型进行集成学习以进一步提高测试精度?图2:知识蒸馏和自蒸馏也提高了深度学习的性能。 神秘之处3:自蒸馏注意,知识蒸馏至少直观上是有意义的:教师集成模型的测试准确率为84.8%,所以单个学生模型的测试准确率可以达到83.8%。下面的现象,被称为自蒸馏(或“Be Your Own Teacher”),是完全令人惊讶的 ——通过对同一架构的单个模型执行知识蒸馏,测试的准确性也可以得到提高。(请参见上面的图2。) 考虑一下这个问题:如果训练一个单独的模型只能得到81.5%的测试准确率,那么为什么“再次训练同一个模型把自己当作老师”突然可以把测试准确率提高到83.5%呢?
即使人们希望接受理想主义的信念即(1)不会发生,所有的ξi都是有偏的,用符号表示的话,Fi(x)=y+ξ+ξi‘,其中ξ是一般性偏差,ξi '是独立偏差。那么为什么知识蒸馏能工作呢?在集成之后,我们期望输出可以接近y+ξ ,也就是具有一般性的偏差ξ。那么,为什么使用具有误差ξ的输出(也称为 dark knowledge)比原来训练的真实标记更好呢?