知识蒸馏是一种模型压缩技术,它通过从一个大模型(教师模型)中传输知识到一个小模型(学生模型)中来提高学生模型的性能,知识蒸馏也要用到真实的数据集标签。
软损失soft loss就是拿教师模型在蒸馏温度为T的情况下输出的预测标签和学生模型也在蒸馏温度为T的情况下输出的预测标签的交叉熵损失;
硬损失hard loss顾名思义就是很硬和,不太软柔放松,就是直接在蒸馏温度为1(也就是原生的softmax了)下,直接拿真实标签(one-hot编码,[0, 1, 0],是第二个种类)和学生模型也在蒸馏温度为1的情况下输出的预测标签的交叉熵损失。
总损失就是一个软损失和硬损失的加权求和。
一开始有点疑惑,知识蒸馏,大模型训练小模型,可是两者参数都不是一个级别的,为什么结果小模型,也就是student模型还是可以这么厉害?
后面想想我感觉是和大模型,也就是教师模型在蒸馏温度为T下输出的软标签有很大关系。
①:在知识蒸馏中,大模型的输出被视为“软目标”或概率分布,而不是硬标签。这意味着学生模型学习到如何模拟教师模型的不确定性和决策过程,而不仅仅是复制教师模型的硬标签。这种软目标训练可以帮助学生模型更好地泛化。很好理解,不输出真实标签,硬标签one-hot编码,比如:[0, 1, 0],是第二个种类,而输出[0.1, 0.8, 0.1]这样的软标签,这样可以说我结果是第二个种类概率最大,但是也有可能是第一或者第三。
②:并且我认为大模型是有很多无用的冗余参数的,而知识蒸馏可以使学生模型变得更加紧凑,去除一些冗余参数,从而提高模型的计算效率和泛化性能。这种模型简化应该可以弥补参数规模不同的差距。刚好对应了知识蒸馏里的蒸馏二字,类比到化学就是能从很多东西里蒸馏提取出最精华的“蒸馏水”的感觉(感觉比喻有点怪,不过是那个意思)。
下图是蒸馏温度T和softmax的关系。
下图是知识蒸馏的计算流程,一目了然。
下面两图中的教师模型是已经训练好的拥有庞大参数的大模型,见识过很多很多东西。
开始知识蒸馏,训练学生模型。可能会发生神奇的事情:明明训练学生模型的时候,没有让学生模型见过的样本数据(也就是给学生模型中的训练集没有某些样本数据)。通过下面的一通训练操作下来,学生模型这个小模型竟然也可能学习到了原先没有见识过的样本的标签。原因其实是有教师模型在教它嘛,可以理解。
下图是知识蒸馏的架构图。