Label Smoothing --- 防止过拟合

Label Smoothing 是一种正则化的方法,对标签平滑化处理以防止过拟合

在分类模型当中,经常对标签使用one-hot的形式,然后去预测样本属于每一个标签的概率,如果不考虑多标签的情况下,选择概率最大的作为我们的预测标签。

然而在实际过程中,这样对标签编码可能存在两个问题:
(1)可能导致过拟合;
(2)模型对于预测过于自信,以至于忽略到可能的小样本标签。

交叉熵损失函数的实际是在最小化预测概率与真实标签概率的交叉熵:
L = − ∑ i y i l o g p i L=-\sum_i y_ilogp_i L=iyilogpi
而我们真正在计算交叉熵损失函数的时候,对于真实标签概率的取值要么是1,要么是0,表征我们已知样本属于某一类别的概率是为1的确定事件,属于其他类别的概率则均为0, 所以总是选择与标签等的log概率损失值作为计算损失函数的值,如:假设存在标签[0, 1, 2]
y = 0 , L = − l o g p 0 ; y = 1 , L = − l o g p 1 , y = 2 , L = − l o g p 2 y=0, L=-logp_0 ;y=1, L=-logp_1, y=2, L=-logp_2 y=0,L=logp0;y=1,L=logp1,y=2,L=logp2
事实上,在计算 y = 0 y=0 y=0的时候,我们也要适当的考虑 y = 1 , y = 2 y=1, y=2 y=1,y=2的情况,label smoothing的原理就是为损失函数增强其他标签的损失函数值。

类似于其为非标签的标签增加了一定概率的可选择性。

假设标签光滑化处理标签真实概率的表达式为:
p = ( 1 − ϵ ) y + ϵ K p = (1-\epsilon) y + \frac {\epsilon}{K} p=(1ϵ)y+Kϵ
y y y为真实标签的时候,概率取值为 p = ( 1 − ϵ ) + ϵ K p = (1-\epsilon) + \frac {\epsilon}{K} p=(1ϵ)+Kϵ,否则取概率 ϵ K \frac {\epsilon}{K} Kϵ

如,对上述例子而言:

ϵ = 0.1 \epsilon=0.1 ϵ=0.1,当某个样本真实标签为 y = 0 y=0 y=0的时候,损失函数值计算如下:
L = − 0.93 l o g p 0 − 0.03 l o g p 1 − 0.03 l o g p 2 L=-0.93logp_0 - 0.03 logp_1 - 0.03 logp_2 L=0.93logp00.03logp10.03logp2
其中 p 0 , p 1 , p 1 p_0, p_1, p_1 p0,p1,p1表示该模型将该标签分别预测为这三个标签的概率, p 0 + p 1 + p 1 = 1 p_0+p_1+p_1=1 p0+p1+p1=1
不进行标签光滑化处理的话,该样本损失函数值计算如下:
L = − l o g p 0 L=-logp_0 L=logp0

标签在某种程度上软化了,增加了模型的泛化能力,一定程度上防止过拟合。

代码如下:

def label_smoothing(self, inputs, epsilon=0.1):

        K = inputs.get_shape().as_list()[-1]
        return ((1-epsilon) * inputs) + (epsilon / K)

y_smoothed = label_smoothing(tf.one_hot(Y_inputs, depth=class_num))
loss = tf.nn.softmax_cross_entropy_with_logits(logits=scores, labels=y_smoothed)

参考资料:
[1]. https://blog.csdn.net/lqfarmer/article/details/74276680
[2].https://www.zhihu.com/question/59201590

你可能感兴趣的:(自然语言处理,深度学习)