【研一小白白话理解】各种小知识

知识蒸馏

softmax的输出一定是正数,且每个元素和加起来为1。而llog_softmax全部都是负数。
交叉熵=熵+相对熵(KL散度)
蒸馏:通过温度T将softmax激活函数变得更加平滑,从而软标签通过蒸馏得到暗知识。本质上就是修改损失函数。
经过softmax才能叫做软标签的概率分布。经过了softmax才能null_loss,没经过softmax就直接交叉熵就行。
NLLLoss(log_softmax)==交叉熵
假如没有老师模型,单独训练学生模型的话,没办法只能拿硬标签去训练学生模型,会得到硬损失。但是如果有老师模型的话,损失就是由学生模型硬损失和老师模型的软损失两个部分组成。软损失是要经过温度平滑后的。
硬标签:独热编码。
硬输出:硬标签传入学生模型得到的输出。
软标签:硬标签输入教师网络得到的软输出。
软标签=软输出
软损失:传入暗知识和硬输出。
硬损失:传入硬输出和硬标签。
所以知识蒸馏最关键的地方就是定义loss。定义好了之后,训练有老师.detch的学生模型会比单独训练学生模型会好很多。
训练学生模型:首先教师模型必须加上detach,不加的话就是协同训练,起不到作用。

【研一小白白话理解】各种小知识_第1张图片

##关键,定义kd的loss
def distillation(hard_output,hard_labels,soft_output,t,alpha):
    return nn.KLDivLoss()(F.log_softmax(hard_output/t,dim=1),F.softmax(soft_output/temp,dim=1))*(t*t*2.0*alpha)+F.cross_entropy(hard_output,hard_labels)*(1. - alpha)

知识蒸馏的目的不是缩小学生模型所占空间尽可能达到教师的acc,其实不太可能。真正的目的是在已经有了教室模型的前提下,找一个简单网络训练得更快一点,仅此而已。

对比学习

对比学习的本质是构造正负样本,并构造计算正正、负负、正负样本之间的距离。

你可能感兴趣的:(学习理解人工智能,深度学习,机器学习,python)