👨💻 作者简介:非科班转码,正在不断丰富自己的技术栈
🗒️ 博客主页:https://raelum.blog.csdn.net
🎯 主要领域:NLP、RS、GNN
📢 如果这篇文章有帮助到你,可以关注❤️ + 点赞👍 + 收藏⭐ + 留言💬,这将是我创作的最大动力

考虑单个样本的交叉熵损失
H ( p , q ) = − ∑ i = 1 C p i log q i H(p,q)=-\sum_{i=1}^C p_i\log q_i H(p,q)=−i=1∑Cpilogqi
其中
C
C
C 代表类别个数,
p
i
p_i
pi 是真实分布(即 target),
q
i
q_i
qi 是预测分布(即神经网络输出的 prediction)。
如果真实分布采用传统的 One-Hot 向量,则其分量非 0 0 0 即 1 1 1。不妨设第 k k k 个位置是 1 1 1,其余位置是 0 0 0,此时交叉熵损失变为
H ( p , q ) = − log q k H(p,q)=-\log q_k H(p,q)=−logqk
从上面的表达式不难发现一些问题:
target 错误)更容易对模型的训练产生影响;缓解这些问题的方法就是采用 Label Smoothing 的技术,它也是一种正则化的技巧,具体如下:
p
i
:
=
{
1
−
ϵ
,
i
=
k
ϵ
/
(
C
−
1
)
,
i
≠
k
p_i:= {1−ϵ,i=kϵ/(C−1),i≠k
其中 ϵ \epsilon ϵ 是一个小正数。
例如,设原始 target 为
[
0
,
0
,
1
,
0
,
0
,
0
]
[0,0,1,0,0,0]
[0,0,1,0,0,0],取
ϵ
=
0.1
\epsilon=0.1
ϵ=0.1,则经过 Label Smoothing 后 target 变为
[
0.02
,
0.02
,
0.9
,
0.02
,
0.02
,
0.02
]
[0.02,0.02,0.9,0.02,0.02,0.02]
[0.02,0.02,0.9,0.02,0.02,0.02]。
📌 原始的 One-Hot 向量通常称为 Hard Target(或 Hard Label),经过标签平滑后通常称为 Soft Target(或 Soft Label)
import torch
def label_smoothing(label, eps):
label[label == 1] = 1 - eps
label[label == 0] = eps / (len(label) - 1)
return label
a = torch.tensor([0, 0, 1, 0, 0, 0], dtype=torch.float)
print(label_smoothing(a, 0.1))
# tensor([0.0200, 0.0200, 0.9000, 0.0200, 0.0200, 0.0200])
优点:
缺点: