往期文章:
第一次听说Label Smoothing Loss
,还是在一次询问chatGPT
时候,在他的回答中,提到了。其中下面的问题,和chatGPT
的回答,都展示在了下面的地方。
原本我是想到了在faster RCNN
目标检测算法中,对于目标框的位置回归部分,通常采用Smooth L1 Loss
。于是我就想到,Smooth L1 Loss
是否特能用于分类任务呢?当然,这里我就是脑洞一问,得知了用于分类任务中的Label Smoothing Loss
。
Label Smoothing Loss
和Smooth L1 Loss
里面,都有smooth
,光滑的,平坦的,平整的。从Smooth L1 Loss
,我们知道他是在L1 Loss
的基础上,引入了L2 loss
。在[1,1]的范围内,采用L2 loss
,其他段都是L1 loss
。
一是避免了L1 loss
在x
为0
的不可导,也使得在0附近的优化更加的平缓。具体的可以参考这里:【AI面试】L1 loss、L2 loss和Smooth L1 Loss,L1正则化和L2正则化
吸取Smooth L1 Loss
的思想,在分类任务中,也想要Smooth
一些。于是,Label Smoothing
运用而生。首席推荐阅读:
上完上面,理解的,再看下面的:
实现方式:label_smoothing_loss.py
通过上述两个文章,大概就对Label Smoothing Loss
有了大概的了解,也知道他为什么要改写one-hot
标签,而采用smooth
的形式,平滑标签,使得参与损失loss计算的值,不只是局限于目标为1的点。
文本分类和图像分类实际上在训练模式上是类似的,基本都遵循这样的一个流程:
这里使用cross-entropy loss(简称CE-loss)
基本上成了大家训练模型的默认方法,但它实际上存在一些问题。下面我举个例子:
比如有一个六个类别的分类任务,CE-loss是如何计算当前某个预测概率p相对于y的损失呢:
可以看出,根据CE-loss的公式,只有y中为1的那一维度参与了loss的计算,其他的都忽略了。这样就会造成一些后果:
总之,这都是由one-hot
的不合理表示造成的,因为one-hot只是对真实情况的一种简化,其他错误并不参与损失计算。面对one-hot可能带来的容易过拟合的问题,有研究提出了Label Smoothing
方法:
label smoothing
就是把原来的one-hot
表示,在每一维上都添加了一个随机噪音。这是一种简单粗暴,但又十分有效的方法,目前已经使用在很多的图像分类模型中了。
one-hot
劣势:
Label Smoothing
优势:
Label Smoothing
劣势:
从Smooth L1 Loss
中的Smooth
,引申到分类任务中,在label
部分引入Smooth
操作,平滑one hot
的标签,使得模型的优化目标不再是1,而是一个小于1的数值。避免了过分的追求完美,使得模型过拟合。
但是,经过自己的粗浅思考,这种方法对于分类目标类别之间的特征差异较小,分类较难的任务,应该是有比较好的改观的,主要的改观就体现在泛化性上面。
而对于分类目标类别之间的特征差异较大,比较好分开的分类任务中,就没有必要引入smooth
的操作了。因为这样会使得训练没有充分的挖掘模型的分类能力。模型能考100分,非要考90就可以,可能泛化性不够。
除此之外,发散开来。如果对于类别之间界限没有那么的清晰的分类任务场景,比如等级分类。同一事物,介于5级和6级之间,那往6上分也可以,往5上分也行的标签,是不是可以采用更加smooth
的方式,使得除去目标1外的标签,不是均等的。这种最终还是需要有一个最大的值,只是这个值的数可能会更小。
上述的内容,都还需要检验。先学习记录,待后续补充。