LabelSmoothing
????????以图像分类为例,网络模型的最后一层的输出维度等于总的类别数,然后使用softmax将网络预测输出转换为对应类别的概率分布,表示如下:
????????然后使用交叉熵损失函数来衡量网络预测输出的概率分布和真实的样本标签(one-hot编码)之间的分布差异,计算损失,训练模型。
????????由于样本的真是标签通常采用one-hot编码,导致在模型训练时,强行将正类的预测结果zi 推向无穷大,这样导致模型的学习结果过于极端(过于自信),导致模型的泛化性能下降。
????????为了缓解模型这种过于自信的表现,Label Smoothing对one-hot编码过程进行改进,Label Smoothing表示如下:
????????ε 通常取值为0.1,这样在模型训练时,正样本的概率就不再是1.0了,而是0.9,负样本的概率也不再是0.0了,而是一个很小的但是不为0的值,以此来缓解模型训练过程中出现的过度自信问题。
MixUp
参考:数据增强之MixUp_胖胖大海的博客-CSDN博客_数据增强mixup代码
????????MixUp用在输入端进行数据增强,Mixup的本意是将任意两个有标签的训练数据进行融合,得到一个新的数据,新数据对应的标签就是两个数据标签的融合,表示如下:
????????这样,在模型训练阶段,因为融合是随机的,所以起到了数据增强的作用,同时由于融合将两个one-hot的标签融合之后得到的新标签不再是one-hot的形式,也起到了一定的LabelSmoothing的作用。
LabelSmoothing与MixUp共用
????????通过上面的介绍,我们知道了LabelSmoothing和MixUp的作用,以及实现原理,那如何将LabelSmoothing和MixUp联合使用呢?以下是个人理解:
????????MixUp之后输出的结果不再是one-hot的形式,而LabelSmoothing的输入要求是one-hot形式,所以我们要保持MixUp之后的结果依然是one-hot的形式,在MixUp的pytorch官方实现版本中,同时返回了两个标签融合之前的one-hot编码,然后再损失函数阶段再进行融合,如下:
????????这样,经过MixUp之后得到的还是one-hot编码的label,然后再这个label之上就可以使用LabelSmoothing了。
代码地址:mixup-cifar10/train.py at main · facebookresearch/mixup-cifar10 · GitHub
Cifar100训练对比
训练方式 | 验证集准确率 | CrossEntropy + StepLR | 0.8055 | CrossEntropy + CosineLR | 0.8096 | CrossEntropy + CosineLR + MixUp | | CrossEntropy + CosineLR + LabelSmoothing | | CrossEntropy + CosineLR + LabelSmoothing + MixUp | 0.8393 |
代码地址:?https://github.com/xxcheng0708/Pytorch_Image_Classifier_Template/blob/master/train_cifar100_model.py
|