背景
标签平滑产生的背景是当我们的标注数据不能保证100%的准确性的时候,导致训练过程中过度的信赖标注,对训练效果产生比较大的影响。这个时候我们一般选用标签平滑的方式缓解这种问题。
详细介绍
首先我们以交叉熵损失函数作为切入点。
L=−ylog(p)−(1−y)log(1−p)(1.1)
y表示的真实的标注, 而p表示预测的值。对于交叉熵十分好用, 因为它拉大了是与不是某个类别的概率。
当模型训练过程中求梯度的过程中,最后一层一般使用softmax进行概率散列。
pi=∑jKexp(zj)exp(zi)(1.2)
其中K为类别总数,pi表示第i类的概率。
传统one-hot编码标签的网络学习过程中,鼓励模型预测为正确的类别的概率趋近1,非正确类别的概率趋近0,zi会趋近于无穷大。模型也会不断鼓励往这个方向学习。而过大的分类间差值会使模型缺乏适应性,对它的预测过于自信。在训练数据不足以覆盖所有情况下,这就会导致网络过拟合,泛化能力差,而且实际上有些标注数据不一定准确,这时候使用交叉熵损失函数作为目标函数也不一定是最优的了。
实践标签平滑
对于上面这个问题,其实在落地实践的时候十分简单,重新定义标签后表达为。
yˉ=yone_hot(1−α)+Kα(2.1)
其中α是一个很小的超参数, 这样就能得到新的标注形式。标签平滑后的分布就相当于往真实分布中加入了噪声,避免模型对于正确标签过于自信,使得预测正负样本的输出值差别不那么大,从而避免过拟合,提高模型的泛化能力。
上图就是一个表情平滑的小例子。
上面公式2.1就是修正后的交叉熵函数。
这种方法避免了最大的概率分类 比其他 概率分类太过于大,相当于给模型增加了正则化,提升了模型的泛化能力;
这里可以给一个更加直观的解释,当模型已经训练了鸟的分类等于0.9啦,当时因为标注是1,还会继续投入精力把标签预测成1,这个时候就十分容易发生过拟合。
这里可以再举一个例子。
[0,1]×(1−0.1)+0.1/2=[0.05,0.95]
0.1是α, 原来分类准确的时候p-1, 不准确为p = 0,假设为Label Smoothing的平滑参数为α, 分类准确的时候交叉熵的计算,p=1−0.5α,分类不准确的时候, p=0.5α,也就是说对分类准确做了一点惩罚,这实际上是一种正则化策略,减少了真实样本标签的类别在计算损失函数时的权重,最终起到抑制过拟合的效果。
需要注意
需要注意一点的是,并不是所有的场景都可以使用标签平滑。
标签平滑的泛化有利于教师网络的性能,但是它传递给学生网络的信息更少。
尽管使用标签平滑化训练提高了教师的最终准确性,但与使用“硬”目标训练的教师相比,它未能向学生网络传递足够多的知识(没有标签平滑化)。标签平滑“擦除”了在hard目标训练中保留的一些细节。
标签平滑产生的模型是不好的教师模型的原因可以通过初始的可视化或多或少的表现出来。通过强制将最终的分类划分为更紧密的集群,该网络删除了更多的细节,将重点放在类之间的核心区别上。这种“舍入”有助于网络更好地处理不可见数据。然而,丢失的信息最终会对它教授新学生模型的能力产生负面影响。因此,准确性更高的老师并不能更好地向学生提炼信息。
反之比较合适的场景就是
- 真实场景下,尤其数据量大的时候 数据里是会有噪音的(当然如果你非要说我100%确定数据都是完全正确的, 那就无所谓了啊),为了避免模型错误的学到这些噪音可以加入label smoothing
- 避免模型太自信了,有时候我们训练一个模型会发现给出相当高的confidence,但有时候我们不希望模型太自信了(可能会导致over-fit 等别的问题),希望提高模型的学习难度,也会引入label smoothing
- 分类的中会有一些模糊的case,比如图片分类,有些图片即像猫又像狗, 利用soft-target可以给两类都提供监督效果