【正则化】Label Smoothing详解

1. 概述

       Label Smoothing(标签平滑),像 L1、L2 和 Dropout 一样,是一种正则化方法,通常用于分类问题,目的是防止模型在训练时过于自信地预测标签,改善泛化能力差的问题(也是解决错误标注的一种方法)。

2. Label Smoothing

公式如下:

在这里插入图片描述

       y’_i表示在原标签基础上修改后的标签值,y_i为原标签值。以二分类为例,原标签值为[0,1],经过计算之后,标签值就变为了[0.05,0.95]。简单来说就是把label给重置了一下。

以Cross Entropy为例;

在这里插入图片描述
解释如下:
       上面提到y’_i为修改后的标签值,那么我们可以在原来Cross Entropy Loss的基础上将原来的标签y_i替换为y’_i,即将上面的公式带入到Cross Entropy Loss中,化简之后为(1-ε)H(y,p)+εH(u,p),即在原来loss的基础上又增加了一项。
       

● 通俗理解:

       通俗理解:这个平滑就是一定程度缩小 label 中 min 和 max 的差距,label 平滑可以减 小过拟合,深度学习中的 Loss 实际上就是鼓励模型去接近对应的 label,越接近 Loss 越小。 但是这样真的好吗?或者说,是不是有点过了,尤其针对像交叉熵这类 Loss,一旦 output 有些偏差,Loss 值就往无穷大去了,就逼迫模型去接近真实的 label。万一好不容易接近 label 了,结果这条 training data 还是错的(是很有可能的),或者 training data 并没有完整覆盖所 有类型,那就必须过拟合了。所以,适当调整 label,让两端的极值往中间凑,可以增加泛 化能力。

3. 示例

       假设有一批数据在神经网络最后一层的输出值和他们的真实标签

out = np.array([[4.0, 5.0, 10.0], [1.0, 5.0, 4.0], [1.0, 15.0, 4.0]])
y = np.array([[0, 0, 1], [0, 1, 0], [0, 1, 0]])

       直接计算softmax交叉熵损失:

res = tf.losses.softmax_cross_entropy(onehot_labels=y, logits=out, label_smoothing=0)
print(tf.Session().run(res))

结果为:0.11191821843385696

       使用标签平滑后:

res2 = tf.losses.softmax_cross_entropy(onehot_labels=y, logits=out, label_smoothing=0.001)
print(tf.Session().run(res2))
结果为:0.11647378653287888

       可以看出,损失比之前增加了,他的标签平滑的原理是对真实标签做了改变,

猜你喜欢

转载自blog.csdn.net/Roaddd/article/details/114761023