Inception V2/V3里的Label Smoothing

原论文:《Rethinking the Inception Architecture for Computer Vision》

原论文学习笔记:https://blog.csdn.net/COINVK/article/details/129061046;

原论文在第7节首次提出Label Smoothing概念;

Label Smoothing:一种机制/策略,通过估计训练时的label-dropout的边缘化效应实现对分类器的正则化;

对于每个训练数据 x x x,模型计算对于标签 k k k的概率(就是模型最后的softmax归一化):

z i z_i zi:logits;

数据的真实标签记为: q ( k ∣ x ) q(k|x) q(kx)

softmax归一化之后,概率和加起来为1,即:

为了简洁起见,省略 p p p q q q对训练数据 x x x的依赖性,将 p ( k ∣ x ) p(k|x) p(kx)写作 p ( k ) p(k) p(k),将 q ( k ∣ x ) q(k|x) q(kx)写作 q ( k ) q(k) q(k)

定义交叉熵损失函数(Cross-entropy loss):

交叉熵损失由极大似然估计推导:最小化上述损失函数相当于最大化标签的预期对数似然性(说人话:最大化每个数据被正确分类的概率);

  • 取对数可以保证单调性,把乘法变成加法;
  • 取符号把最大化变成最小化;

交叉熵损失相对于logits z k z_k zk是可微的,因此可以用于深度模型的梯度训练。

梯度的一个简单形式,其范围在−1和1之间:

考虑用one-hot独热向量编码时,只有正确的类别对应的标签为1(记为y),其他均为0,

比如:三分类问题,
one-hot编码对应正确答案为:(0, 1, 0);
softmax最终预测结果为:(0.4, 0.5, 0.1);

交叉熵损失: l = − ( 0 ∗ l o g ( 0.4 ) + 1 ∗ l o g ( 0.5 ) + 0 ∗ l o g ( 0.1 ) ) ≈ 0.3 l = -(0 * log(0.4) +1 * log(0.5) + 0 * log(0.1)) ≈0.3 l=(0log(0.4)+1log(0.5)+0log(0.1))0.3

softmax最终预测结果为:(0.1, 0.8, 0.1);
交叉熵损失: l = − ( 0 ∗ l o g ( 0.1 ) + 1 ∗ l o g ( 0.8 ) + 0 ∗ l o g ( 0.1 ) ) ≈ 0.1 l = -(0 * log(0.1) +1 * log(0.8) + 0 * log(0.1)) ≈0.1 l=(0log(0.1)+1log(0.8)+0log(0.1))0.1

上述例子说明:正确答案对应的概率越大,交叉熵损失函数就越小;

网络希望正确类别对应的logits无限增大,一直增大的正无穷,才能保证损失函数 l l l最小;


这会导致两个问题:

  • 过拟合,模型无法泛化;
  • 鼓励模型过于自信,不计代价的增大某一类的logits;

基于以上讨论提出label-smoothing regularization(缩写为LSR);

考虑在损失函数中加入一个平滑参数 ε ε ε,将训练数据的标签分布变为:

δ k , y δ_{k,y} δk,y:原始真实标签,当y = k时, δ k , y = 1 δ_{k,y}=1 δk,y=1,other, δ k , y = 0 δ_{k,y}=0 δk,y=0

u ( k ) u(k) u(k):一种分布函数,根据实验,建议选择均匀分布函数,即 u ( k ) = 1 / K u(k)=1/K u(k)=1/K,(K为分类个数);

真实的标签变为:

举例:
三分类问题,原始标签为 ( 1 , 0 , 0 , 0 ) (1, 0, 0, 0) (1,0,0,0)=> one-hot编码;
K = 4 K = 4 K=4,令 ε = 0.1 ε=0.1 ε=0.1,代入上式,
i = y时,y = 1-0.1 = 0.9;
i != y 时,y = 0.1 / 3 = 0.03333;
则新标签变为:
( 0.9 , 0.03333 , 0.03333 , 0.03333 ) (0.9, 0.03333, 0.03333, 0.03333) (0.9,0.03333,0.03333,0.03333)

交叉熵损失函数+Label Smoothing:

相当于,用 H ( q , p ) H(q,p) H(q,p) H ( u , p ) H(u,p) H(u,p)替换了之前的替换单个交叉熵损失 H ( q , p ) H(q,p) H(q,p)

第二项 H ( u , p ) H(u,p) H(u,p) ε 1 − ε \frac{ε}{1-ε} 1εε的相对权重惩罚了预测的标签分布p与先前的u的偏差;

H ( u ) H(u) H(u)是固定的;

H ( u , p ) H(u,p) H(u,p)是预测分布 p p p与均匀分布程度的度量;

Label Smoothing 用 pytorch实现:

import torch

def smooth_one_hot(true_labels: torch.Tensor, classes: int, smoothing=0.0):
    """
    if smoothing == 0, it's one-hot method
    if 0 < smoothing < 1, it's smooth method

    """
    assert 0 <= smoothing < 1
    confidence = 1.0 - smoothing
    label_shape = torch.Size((true_labels.size(0), classes))    # torch.Size([2, 5])
    with torch.no_grad():
        true_dist = torch.empty(size=label_shape, device=true_labels.device)    # 空的,没有初始化
        true_dist.fill_(smoothing / (classes - 1))
        _, index = torch.max(true_labels, 1)
        true_dist.scatter_(1, torch.LongTensor(index.unsqueeze(1)), confidence)     # 必须要torch.LongTensor()
    return true_dist



true_labels = torch.zeros(2, 5)
true_labels[0, 1], true_labels[1, 3] = 1, 1
print('标签平滑前:\n', true_labels)

true_dist = smooth_one_hot(true_labels, classes=5, smoothing=0.1)
print('标签平滑后:\n', true_dist)



'''
Loss = CrossEntropyLoss(NonSparse=True, ...)
. . .
data = ...
labels = ...

outputs = model(data)

smooth_label = smooth_one_hot(labels, ...)
loss = (outputs, smooth_label)
...
'''

猜你喜欢

转载自blog.csdn.net/COINVK/article/details/129122437