label smooth的理解

0. label smoothing的选择

github实现地址:https://github.com/kleyersoma/Keras_Label_Smoothing

label smoothing的选择

label smoothing是一种正则化的方式,全称为Label Smoothing Regularization(LSR),即标签平滑正则化。

在传统的分类任务计算损失的过程中,是将真实的标签做成one-hot的形式,然后使用交叉熵来计算损失。而label smoothing是将真实的one hot标签做一个标签平滑处理,使得标签变成又概率值的soft label.其中,在真实label处的概率值最大,其他位置的概率值是个非常小的数。

在label smoothing中有个参数epsilon,描述了将标签软化的程度,该值越大,经过label smoothing后的标签向量的标签概率值越小,标签越平滑,反之,标签越趋向于hard label,在训练ImageNet-1k的实验里通常将该值设置为0.1。

label_smoohing相当于一种正则方式,在相对较小的模型上,精度提升不明显甚至会有所下降,下表展示了ResNet18在ImageNet-1k上使用label_smoothing前后的精度指标。可以明显看到,在使用label_smoothing后,精度有所下降。

image

较大的模型使用label smoothing可以有效的提升模型的精度,较小的模型使用此种方法可能会降低模型精度。所以在决定是否使用label_smoohing前,需要评估模型的大小和任务的难易程度。

 

软标签编码和硬标签编码的不同之处在于:

[1] - 硬编码的类别标签向量是二值的,如,一个类别标签是正类别,其他类别标签为负类别.

[2] - 软编码的类别标签中,正类别具有最大的概率;其他类别也具有非常小的概率.

 

1.背景介绍

图像分类的任务是从一组固定的类别中为输入图像分配一个标签。这是计算机视觉的核心问题之一,尽管它很简单,但却有大量的实际应用。
例如,在下面的图像中,一个图像分类模型接受一个图像,并将概率分配给两个标签,{cat, dog}。如图所示,请记住,对于计算机来说,图像是由一个大的三维数字数组表示的。
在本例中,cat图像为248像素宽,400像素高,有红、绿、蓝(或简称RGB)三种颜色通道。因此,图像由248 x 400 x 3个数字或总共297,600个数字组成。每个数字都是一个从0(黑色)到255(白色)的整数。我们的任务是把这25万个数字变成一个单一的标签,比如“cat”。
在这里插入图片描述

2. 训练分类模型

训练一个将图像分类为猫图像或狗图像的模型就是一个二元分类的例子。
我们已经看到,在图像分类的任务是采取一个像素数组,代表一个图像,并分配一个标签给它。我们完整的流程可以形式化如下:

  • input:我们的输入由一组N个图像组成,每个图像都用K个不同的类中的一个标记。我们将这些数据称为训练集。
  • learning:我们的任务是使用训练集来学习每一节课的内容。我们将此步骤称为训练分类器或学习模型。

3.数据标签出错问题

但是如果你的训练数据包含了错误的标签呢?如果一只狗被贴上猫的标签呢?如果你从互联网上获取数据,这种数据错误标签可能会发生,互联网是获取数据的一个非常常见的来源。在这里插入图片描述
这将最终导致您的问题,要么了解数据集中的噪声,要么了解不正确的特性。然而,这在一定程度上是可以避免的。如果您在一个小数据集上进行培训,您可以查看所有的标签并手动检查它们,或者外包来做这些脏活儿。下一节将分享另一种数学方法。
所以,问题是你的模型将学习不正确的特征(从一只狗),并将这些特征与“猫”的标签联系起来。我们怎么解决呢?为了深入研究这个问题,我们来看看图像分类问题中使用的损失函数。
在得到loss function之前,我们需要建立segmentation model,给出每个类别的概率:
在这里插入图片描述
在图像分类问题中,我们使用softmax loss,定义如下:

 L = −(y log ( p) +(1−y)log(1−p))
  • 这里,L是损失,y是真正的标签(0 - cat, 1 - dog), p是图像属于第1类的概率。模型的目标是减少损失。

损失本质上驱动您的“梯度”,简单地说,这决定了模型的“学习”。因为这个原因,我们需要密切关注损失。
假设你有一张狗的图片,有着0.99的可能性。你的损失将是:

	L = -(1*(log(0.99) + (1–0.99)*log(0.01)) ≈ 0

这很好!当预测准确时,损失应该很小!
如果你的数据有错误的标签,这种损失会特别高,这将导致学习上的问题。
那么我们该怎么做呢?在下一节中,我们将看到一种最小化错误标签损失的方法。

4. Label Smoothing

当我们将交叉熵损失应用于分类任务时,我们期望真正的标签是1,而其他的是0。换句话说,我们毫不怀疑真实的标签是真实的,而其他的则不是。总是这样吗?也许不是。许多手动注释是多个参与者的结果。他们可能有不同的标准。他们可能会犯一些错误。毕竟他们是人。因此,我们所坚信的基本真理可能是错误的。
一个可能的解决办法是放松我们对标签的信心。例如,我们可以稍微降低损失目标值,从1降低到0.9。很自然地,我们为其他的目标值增加了0。这个想法被称为Label Smoothing。

If label_smoothing is nonzero, smooth the labels towards 1/num_classes: new_onehot_labels = onehot_labels * (1 - label_smoothing) + label_smoothing / num_classes
这是什么意思?
假设你在训练一个二元分类模型。你的标签应该是0 - cat, 1 - not cat。
现在,假设label_smoothing= 0.2
利用上面的方程,我们得到:

  new_onehot_labels = [0 1] * (1 — 0.2) + 0.2 / 2 =[0 1]*(0.8) + 0.1
  new_onehot_labels =  [0.9 0.1]

这些是软标签,而不是硬标签,即0和1。当出现错误预测时,这将最终降低您的损失,随后,您的模型将在较小程度上惩罚和学习错误。(不希望模型对其预测结果过度自信.
本质上,标签平滑将帮助您的模型围绕错误的标签数据进行训练,从而提高其健壮性和性能。(标签平滑可以降低模型的可信度,并防止模型下降到过拟合所出现的损失的深度裂缝里.

 

5.implementation in Pytorch

class LabelSmoothingCrossEntropy(nn.Module):
    def __init__(self):
        super(LabelSmoothingCrossEntropy, self).__init__()
    def forward(self, x, target, smoothing=0.1):
        confidence = 1. - smoothing
        logprobs = F.log_softmax(x, dim=-1)
        nll_loss = -logprobs.gather(dim=-1, index=target.unsqueeze(1))
        nll_loss = nll_loss.squeeze(1)
        smooth_loss = -logprobs.mean(dim=-1)
        loss = confidence * nll_loss + smoothing * smooth_loss
        return loss.mean()
from utils import LabelSmoothingCrossEntropy

criterion = LabelSmoothingCrossEntropy()
loss = criterion(outputs, targets)
loss.backward()
optimizer.step()

6.进一步的学习

When Does Label Smoothing Help?

  • 11
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值