Distilling the Knowledge in a Neural Network最重要的思想是提出用soft target辅助hard target组成loss,一起训练student model。
那soft target与hard target到底指的是什么?
它们之间有什么不同呢?
hard target:
hard target其实就是数据的标签,比如分类驴和马,识别马时,hard target只有马的index处的值为1,驴的标签则为0.
soft target:
soft target是来自于teacher model的检测结果。hard target包含的信息熵很低,同时,hard target容易引起过拟合。可以这么理解,假设model 推测该类别的置信度为0.6,而label是1,那么相较于软化后的label如0.8,硬标签计算出的loss就会更大,使得bp的幅度变大,这样容易引起模型对某些特征的偏好,从而降低泛化能力。为了让student model学习更多有价值的信息,作者软化了标签,如下式,增加温度参数T软化了label。
loss是两者的结合。代码如下,soft target部分是KL散度,hard target是交叉熵。
def distillation(y, teacher_scores, labels, T, alpha):
p = F.log_softmax(y/T, dim=1)
q = F.softmax(teacher_scores/T, dim=1)
l_kl = F.kl_div(p, q, size_average=False) * (T**2) / y.shape[0]
l_ce = F.cross_entropy(y, labels)
return l_kl * alpha + l_ce * (1. - alpha)
这里想解释一下,为什么会用KL散度来衡量p,q的距离。
首先,熵被定义为:
对于离散事件我们定义事件A和B的差别为,即A,B的KL散度:
事实上交叉熵和KL散度的公式非常相近,其实就是KL散度的后半部分:A和B的交叉熵 = A与B的KL散度 - A的熵。
重点:当S(A)是常量时,
D
K
L
(
A
∣
∣
B
)
=
H
(
A
,
B
)
D_{KL}(A||B)=H(A,B)
DKL(A∣∣B)=H(A,B),也就是说KL散度和交叉熵在特定条件下等价。
所以在我们做分类时,label是固定的,S(A)是常数顾可以省略,直接用交叉熵做cost loss,但是在蒸馏时,soft label是由teacher model产生的,所以要用KL散度来衡量距离。当然平方差,交叉熵也同样work。