概念:
机器学习的样本中通常会存在少量错误标签,这些错误标签会影响到预测的效果。标签平滑采用如下思路解决这个问题:在训练时即假设标签可能存在错误,避免“过分”相信训练样本的标签。当目标函数为交叉熵时,这一思想有非常简单的实现,称为标签平滑(Label Smoothing)。
以2类分类问题为例,此时训练样本为(xi,yi),其中yi是样本标签,为0或1。在训练样本中,我们并不能保证所有的样本标签都标注正确,如果某个样本的标注是错误的,那么在训练时,该样本就有可能对训练结果产生负面影响。一个很自然的想法是,如果我们有办法“告诉”模型,样本的标签不一定正确,那么训练出来的模型对于少量的样本错误就会有“免疫力”。
实现方法:
在每次迭代时,并不直接将放入训练集,而是设置一个错误率,以的概率将代入训练,以的概率将代入训练。这样,模型在训练时,既有正确标签输入,又有错误标签输入,可以想象,如此训练出来的模型不会“全力匹配”每一个标签,而只是在一定程度上匹配。这样,如果真的出现错误标签,模型受到的影响就会更小,这样训练出来的模型泛化能力会更强。
采用交叉熵来描述损失函数时,对于每一个样本i,损失函数为:
经过随机化之后,新的标签有的概率与相同,有的概率不同(即)。所以,采用随机化的标签作为训练数据时,损失函数有的概率与上面的式子相同,有的概率为:
把上面两个式子按概率加权平均,就可以得到:
为了简化上面的式子,我们yi'=ε(1-yi)+(1-ε)yi,可以得到:
这个式子和原先的交叉熵表达式相比,只有被替换成了,其他的内容全部都没有变。这实际上等价于:把每个标签替换成,再进行常规的训练过程。因此,我们并不需要在训练前进行随机化处理,只需要把每个标签替换一下即可。
为什么这个过程被成为标签平滑呢?我们可以从下面的式子看出来:
也就是说,当标签为0时,我们并不把0直接放入训练,而是将其替换为一个比较小的数. 同样地,如果标签为1,我们也将其替换为较接近的数。为了方便看出效果,我们可以给出交叉熵模型的表达式:
由此可见,在交叉熵模型中,模型输出永远不可能达到0和1,因此模型会不断增大w,使得预测输出尽可能逼近0或1,而这个过程与正则化是矛盾的,或者说,有可能出现过拟合。如果我们把标签0和1分别替换成ε和1-ε,模型的输出在达到这个值之后,就不会继续优化。因此,所谓平滑,指的就是把两个极端值0和1变成两个不那么极端的值。
当然,标签平滑也可以用在多类分类问题中,仍然是假设标签值在一定概率下不变,以一定概率变为其他值。只不过此时有多个其他值,我们可以假设均匀分布,也可以按一定的先验分布处理。如果假设均匀分布,那么标签平滑只需要把所有的标签1变为,把所有的标签0变为)即可,其中k是类别的数量。
标签平滑的效果:
在几乎所有的情况下,使用标签平滑训练可以产生更好的校准网络,从而更好地去泛化网络,最终对不可见的生产数据产生更准确的预测。因此,标签平滑应该是大多数深度学习训练的一部分。
深度学习中的损失函数Loss实际上就是鼓励模型去接近对应的label,越接近loss越小,但是loss越小是否就越好呢?针对像交叉熵这类loss,一旦output有些偏差,loss值就往无穷大走了,就逼迫模型去接近真实的label。
如果说好不容易接近label了,结果这条training data还是错的(是很有可能的),或者training data并没有完整覆盖所有类型,那就必须过拟合了,所以,适当调整label,让两端的极值往中间凑凑,可以增加泛化性能。
参考:
https://juejin.cn/post/6844903520089407502
网友评论