LabelSmooth
一种通过简单修改类别标签实现的分类问题优化方法,整理这个的同时我也明白了为什么使用交叉熵来做分类问题,很有收获。
1 − ϵ , i = y 1 - \epsilon,i=y 1−ϵ,i=y
ϵ K − 1 , i ≠ y \frac{\epsilon}{K-1},i \not= y K−1ϵ,i=y
Agile Pioneer
Cross Entropy
我们在刻画两个分布间的距离时候经常使用交叉熵,至于为什么使用交叉熵而不是使用均方误差,我之前也有疑问,自从看了大神的论证才豁然开朗,原来分类问题在对模型求梯度的时候,均方误差在过大的时候会瘫痪,具体去看文章吧。
SoftMax的定义如下(即在输入为x的条件下,推理类别为k的概率):
![](https://i-blog.csdnimg.cn/blog_migrate/c723b3b174b6159645b8be18a74a8b53.png)
其中 z i z_i zi一般叫做logits ,即未被归一化的对数概率。我们用 p 代表 predicted probability,用 q 代表 groundtruth 。在分类问题中loss函数一般用交叉熵,即:
![](https://i-blog.csdnimg.cn/blog_migrate/fffdf82be1a8167b64e7ceb66e9124d6.png)
交叉熵对于logits可微,且偏导数形式简单: ∂ l o s s ∂ z k = p ( z k ) − q ( z k ) , ( q ( z k ) ∈ 0 , 1 ) \frac{∂loss}{∂z_{k}}=p(z_k)−q(z_k) ,(q(z_k) \in {0, 1}) ∂zk∂loss=p(zk)−q(zk),(q(zk)∈0,1) ,显然梯度时有界的(-1到1),为了最小化交叉熵,最优的预测概率分布应为 z k = i n f , ( k = y ) z_k=inf,(k=y) zk=inf,(k=y)(这样对应的 p ( k ∣ x ) = 1 p(k|x)=1 p(k∣x)=1), z k = 0 , ( k ≠ y ) z_k=0,(k \not= y) zk=0,(k=y) ,也就是说,神经网络的输出会被鼓励尽量去增加正确标签与错误标签的输出值之差,这样就容易出现过拟合问题。
LabelSmooth
Label smooth的提出就是为了解决过拟合问题,增加泛化能力。最早是在Inception v2中被提出,是一种正则化的策略。其通过"软化"传统的one-hot类型标签,使得在计算损失值时能够有效抑制过拟合现象。如下图所示,label smoothing将真实的概率分布改为如下公式,其中K是类别数, ϵ \epsilon ϵ表示一个很小的数,比如0.01,K表示类别数
![](https://i-blog.csdnimg.cn/blog_migrate/1e795d774b8ab5a2907416ff5f5a8ddd.png)
Pytorch 实现的参考代码:
# pred 是预测的onehot向量
# label 是整型类别
one_hot_label = torch.zeros_like(pred)
# 把对应整数映射到one-hot向量对应的位置取值为1
one_hot_label = one_hot_label.scatter(1, label.view(-1, 1), 1)
one_hot_label = one_hot_label * (1 - self.eps) + (1 - one_hot_label) * self.eps / (n_class - 1)
使用LabelSmooth之后求Cross Entropy就变为了如下表达式:
![](https://i-blog.csdnimg.cn/blog_migrate/cd842e66a504e1eac677b8b5dada3524.png)
此时求 ∂ l o s s ∂ z k \frac{∂loss}{∂z_{k}} ∂zk∂loss,当 k = y k=y k=y时, ∂ l o s s ∂ z k = p ( z k ) − ( 1 − ε ) \frac{∂loss}{∂z_{k}} = p(z_k) - (1 - \varepsilon ) ∂zk∂loss=p(zk)−(1−ε),而当 k ≠ y k \not= y k=y时, ∂ l o s s ∂ z k = p ( z k ) − ( ε K − 1 ) \frac{∂loss}{∂z_{k}} = p(z_k) - (\frac{\varepsilon}{K - 1}) ∂zk∂loss=p(zk)−(K−1ε)
手推过程:
Label Smooth的优势
- 一种正则化的方法,能够一定程度改善模型过拟合问题,提高泛化性
- 全概率和0概率鼓励所属类别和其他类别之间的差距尽可能加大,而由梯度有界可知,这种情况很难适应。会造成模型过于相信预测的类别,而通过LabelSmooth可以将 z i z_i zi的范围限定一下,会避免这种问题。
- 如果分类准确,交叉熵损失函数的结果是0,否则交叉熵为无穷大。也就是说交叉熵对分类正确给的是最大激励。换句话说,对于标注数据来说,这个时候我们认为其标注结果是准确的,但实际上,有一些标注数据并不一定是准确的。那么这时候,使用交叉熵损失函数作为目标函数并不一定是最优的,所以LabelSmooth有一定的容错性