本文参考:
ChatGPT 温度系数t与top-p, 超参怎么设置最优? - 知乎
知识蒸馏系列(一):三类基础蒸馏算法_OpenMMLab的博客-CSDN博客
知识蒸馏算法汇总 - 知乎
知识蒸馏__Old_Summer的博客-CSDN博客
目录
1、 ChatGPT温度系数temperature
2、蒸馏概述
3、Response-based KD
4、为什么要“平滑标签”
1、 ChatGPT温度系数temperature
chatgpt生成文字序列是随机的。在模型生成最终序列的过程中,总过涉及到两个环节,分别是模型预测以及解码策略。
举个例子:
假设输入为"汤姆猫喜欢",模型预测后续的字,根据语言模型P(y | x= 汤姆猫喜欢),先由模型预测下一个字是什么,且对应概率为多少,会产生N个候选序列,最后根据不同的解码策略(如贪心策略、BeamSearch等)解码出最优的序列进行输出。
这其中温度系数temperature影响的就是模型预测的字符概率。
以Softmax函数说明,添加温度系数T的形式如下:
当T趋于无穷大时,将趋于1,输出概率分布将趋于均匀分布,概率为1/K,此时信息不确定非常大,即信息量很大,即信息熵是最大的。
反过来,T趋于0时, 假如m为正确的序号,j为非正常的序号,则zj - zm小于0,此时当T趋近于0时,趋于0-。那么正确类别的概率接近1,输出结果就是确定的,信息熵为0,softmax的效果与argmax差不多。
所以,温度系数T越大则输出越平滑,结果越不确定;T越小则越确定。
2、蒸馏概述
知识蒸馏(Knowledge Distillation,简称KD)是一种经典的模型压缩方法,核心思想是通过引导轻量化的学生模型“模仿”性能更好、结构更复杂的教师模型,在不改变学生模型结构的情况下提高其性能。
简单来说就是:轻量化模型达到复杂模型的一种压缩优化方案。
对比其他的模型压缩方法,参数裁剪、精度转换、神经网络结构搜索这些模型压缩方法会破坏原模型的结构,也就是会损坏原模型从数据中学习到的知识,而知识蒸馏通过蒸馏的手段保护原模型中学习到的知识,然后将这些知识迁移到压缩模型中,使压缩模型虽然相比原模型体积要小的多,但是也可以学习到相同的知识。
目前比较流行的三类蒸馏方法:
relation-based knowledge
feature-based knowledge
response-based knowledge
3、Response-based KD
如上图所示,Response-based KD算法以教师模型的分类预测结果为“目标知识”,这里的分类预测结果指的是分类器最后一个全连接层的输出(称为logits,而非softmax之后的输出)。
与模型的最终输出相比,logits没有经过softmax进行归一化,非目标类别对应的输出值尚未被抑制。
在得到教师和学生的logits后,使用温度系数T分别对教师和学生的logits进行“平滑”,进而计算两个softmax之间的差异,具体的loss计算公式为:
其中z为logits,zi为logits中第i个类别的对应值,损失函数L一般使用KL散度计算差异。T一般取大于1的整数值,此时目标类与非目标类的预测值差异减小,logits被“平滑”。相反地,T小于1时会进一步拉大目标类与非目标类的数值差异,logits趋向于argmax(onehot)。
4、为什么要“平滑标签”
假设我们现在的任务是利用神经网络识别1~5的手写体数字图片,也就是将一张手写体数字图片输入到神经网络中,神经网络要判断出这张图片中的数字究竟是几。
假设我们将数字2的手写体图片输入到神经网络中,神经网络输出了A=,我们称A为Logits,然后我们会将Logits输入到SoftMax层,将Logits中的数字都转换为概率。
假设转换完后的值为B=[0.0001, 0.8, 0.1, 0.0002, 0.0997],然后我们一般的做法是取概率值最大的那个类别作为识别的结果,也就是我们取0.8对应的类别'2'作为识别的结果输出。
但是如果我们仔细思考,其实虽然0.0001这个概率值小到可以忽略,但是它也传递着神经网络学习到的知识:数字2以0.0001的概率和数字1很像。所以我们应该利用这些知识。
但是这些数字的大小相差太大,得先想办法在不改变它们原有分布得情况下,改变这些数值得大小,使其具有可比性。Hinton在这里引入了一个称为"温度"的参数,对Logits进行平滑处理,知识蒸馏这个词语也是来自于这个过程。
当T趋于很大时,所有的概率值也会趋向于相等,也就是高温会抹掉原先因为数值大小不同而产生的差别。