原文:Label Smoothing - 2019.08.10
作者:Lei Mao
机器学习和深度学习中,往往采用很多正则化技术,比如L1,L2, dropout 等,来避免模型过拟合.
在分类任务中,模型有时候会对训练样本过度自信的预测,这对于模型的泛化能力是不好的.
这里,介绍类别标签平滑作为分类问题的正则化技术,避免模型对训练样本过度自信的预测.
1. 分类交叉熵损失函数
对于 K 类的分类问题,$\lbrace 1, 2, ..., K \rbrace$, 例如,对于样本 i, 训练数据集中的 $(x_i, y_i)$,则可以得到其关于类别标签的 groundtruth 分布 $p(y|x_i)$,且 $\sum _{y=1}^K p(y|x_i) = 1$.
假设参数为 $\theta$ 的模型,其预测的类别分布为 $q_{\theta}(y|x_i)$,且 $\sum_{y=1}^K q_{\theta} (y | x_i) = 1$.
正如在 Cross Entropy, KL Divergence, and Maximum Likelihood Estimation 博文里所描述的,这里的交叉熵是:
$$ H_i(p, q_{\theta}) = - \sum_{y=1}^K p(y|x_i) log q_{\theta} (y|x_i) $$
假设训练数据集中共有 n 个样本,则损失函数为:
$$ L = \sum_{i=1}^{n} H_i(p, q_{\theta}) $$
$$ L = - \sum_{i=1}^{n} \sum_{y=1}^K p(y|x_i) log q_{\theta} (y|x_i) $$
2. One-Hot 类别编码
一般情况下,$p(y|x_i)$ 是 one-hot 编码向量,有:
$$ p(y|x_i) = \begin{cases} 1 &\text{if } y=y_i \\ 0 &\text{otherwise} \end{cases} $$
基于此,损失函数可以进一步简约为:
$$ L = - \sum_{i=1}^{n} \sum_{y=1}^K p(y|x_i) log q_{\theta} (y|x_i) $$
$$ L = - \sum_{i=1}^{n}p(y_i|x_i) log q_{\theta} (y_i|x_i) $$
最小化该损失函数,等价于对训练数据集的最大化似然估计.(证明可参考 Cross Entropy, KL Divergence, and Maximum Likelihood Estimation)
在损失函数优化过程中,如果训练数据集中不存在任何冲突的类别标签,是有可能将 $L$ 几乎最小化到值为0 的. 冲突的类别标签,是指,数据集中存在两个样本能够提取相同的特征,但其 groundtruth 类别标签不同.
由于 $q_{\theta}(y_i|x_i))$ 往往是采用 softmax 函数计算得到的:
$$ q_{\theta} (y_i |x_i) = \frac{exp(z_{y_i})}{\sum_{j=1}^K exp(z_j)} $$
采用 One-hot 类别标签编码的结果是,$exp(z_{y_i})$ 的值非常大,其它 $exp(z_j), j \neq y_i$ 的值非常小.给定一个无冲突(non-conflicting
) 的数据集,模型会将每个训练样本以置信度几乎为 1 的正确预测. 这显然是过拟合的一个信号,过拟合的模型,其泛化能力不够好.
那么如何确认在模型训练过程中,不是朝着对训练数据中的类别标签过度自信的方向呢? 采用无冲突的训练数据集,以及 one-hot 类别编码,过拟合好像是不可避免的.
对此,引入了类别平滑技术作为正则化.
3.标签平滑
标签平滑是引入噪声分布 $u(y|x)$.
对于数据 $x_i, y_i$,其 groundtruth 标签是:
$$ p'(y|x_i) = (1 - \epsilon) p(y|x_i) + \epsilon u(y|x_i) $$
$$ p'(y|x_i) = \begin{cases} 1-\epsilon+\epsilon u(y|x_i) &\text{if } y=y_i \\ \epsilon u(y|x_i) &\text{otherwise} \end{cases} $$
其中,$\epsilon \in [0, 1]$ 为权重因子,$\sum_{y=1}^K p'(y|x_i) = 1$.
对应的,损失函数为:
$$ L' = - \sum_{i=1}^n \sum_{y=1}^K p'(y|x_i) log q_{\theta} (y|x_i) $$
$$ L' = - \sum_{i=1}^n \sum_{y=1}^K [(1 - \epsilon) p(y|x_i) + \epsilon u(y|x_i)] log q_{\theta} (y|x_i) $$
进一步简化损失函数:
$$ L' = \sum_{i=1}^n \lbrace (1 - \epsilon) [- \sum_{y=1}^K p(y|x_i) log q_{\theta} (y|x_i)] + \epsilon [- \sum_{y=1}^K u(y|x_i)log q_{\theta} (y|x_i)] \rbrace $$
$$ L' = - \sum_{i=1}^n [(1-\epsilon) H_i(p, q_{\theta}) + \epsilon H_i(u, q_{\theta})] $$
可以看出,对于训练数据集中的每个样本,损失函数的分布是 one-hot 编码分布和预测的分布 $H_i(p, q_{\theta})$ 间的交叉熵,与噪声分布和预测的分布 $H_i(u, q_{\theta})$ 间的交叉熵,的混合体.
在训练过程中,如过模型过度自信的学习分布,则 $H_i(p, q_{\theta})$ 将趋向于 0;但 $H_i(u, q_{\theta})$ 将会明显增加.
因此,采用标签平滑,可以真正引入了正则子 $H_i(u, q_{\theta})$,以避免模型过度自信的预测.
实际上,$u(y|x)$ 是服从均匀分布的,其不依赖于数据,也就是:
$$ u = \frac{1}{K} $$
4. 总结
标签平滑是分类问题中的一种正则化技术,其避免模型在训练过程中过度自信的预测类别,提升泛化能力.
5. 相关材料
[1] - Rethinking the Inception Architecture for Computer Vision
[2] - Pytorch - 标签平滑labelsmoothing实现 - AIUAI
[3] - InceptionV3 - 类别标签平滑正则化LSR - AIUAI
[4] - [基于 Keras 和 Tensorflow 的标签平滑实现[译] - AIUAI](https://www.aiuai.cn/aifarm1347.html)