最近看到汐梦聆海关于SL这个工作的阅读分享,发现自己工作中也有含噪声标签分类的问题(甚至有些场景标签干脆就是置信度不高的伪标签)。其实由于数据量大和标注成本受限,工业界的数据集常常会出现噪声标签,模型对这类标签的拟合会导致学习的异常进行。SL这个工作从数学层面对交叉熵进行改进,提出了一种更加鲁棒的Symmetric Cross Entropy(SCE)损失,可以一定程度上缓解由于noisy label带来的训练问题,该工作也被ICCV2019收录。
简介
如何在有噪声标注的数据集上进行训练是一直受到工业界关注的问题,也产生了很多不错的工作。具体到分类任务上来看,论文作者发现使用交叉熵学习的深度神经网络会去过拟合那些简单类别而在一些困难类别上欠学习。直觉上,交叉熵需要额外的一项来促进困难类别的学习,更重要的是,这一项应该对噪声有容忍能力以避免过拟合噪声标签。受到KL散度的启发,论文提出了一种Symmetric cross entropy Learning(SL,对称交叉熵学习),该方法通过具有噪声鲁棒性的反向交叉熵(RCE)来对称地增强交叉熵。SL方法同时解决存在噪声标签的情况下交叉熵的欠学习和过拟合的问题。作者对SL的进行了理论分析,并在一系列基准数据集上证明了SL优于SOTA方法,而且SL可以方便地集成到现有的方法中以提高模型性能。
-
论文标题
Symmetric Cross Entropy for Robust Learning with Noisy Labels
-
论文地址
http://arxiv.org/abs/1908.06112
-
论文源码
https://github.com/HanxunH/SCELoss-Reproduce
介绍
目前的深度神经网络往往都是上百层有着百万级别的训练参数,这样的模型需要大规模的清晰标注的数据集才能合理训练。然而,时至今日,即使ImageNet这样的高质量数据集也存在不少的误标,这主要是因为标注大规模数据集确实代价昂贵并且容易出错。因此如何在存在噪声标注的情况下训练深度神经网络是一个非常重要的研究课题。
在这篇论文中,作者主要关注计算机视觉中常见的图像分类任务,经过调查发现,交叉熵(Cross Entropy,CE)虽然是分类任务最常用的损失,但是使用CE训练的网络其实存在类别偏置现象:一些容易类别(“easy” class)收敛的速度快于其他的困难类别(“hard” class)。不妨看下图,首先来看图a,即使标签是干净的,使用CE训练的模型在各个类别上的测试准确率依然相去甚远,比如class 1和class 3相差近20%;如图b,在添加噪声后采用CE进行训练,可以看到,这种差距更加明显,如class 6的容易类别已经对噪声过拟合了,像class 3这样的困难类别依然处于欠学习状态(即分类准确率低于标注清晰的情况);而图c中采用了广为人知的Label Smoothing Regularization(LSR),显然,它依然存在欠学习问题。因此,从这些实验结果可以看出,整体准确率的低下源于难类别的准确率较低,这和之前的研究认为的仅仅是过拟合噪声标签这个原因还是有区别的。
下图是对学习到的embedding进行可视化的结果,图a是干净标注的数据,图b则是加入40%噪声的数据,显然图a情况下各类的边界更加清晰,但是无论是图a还是图b,都存在一些容易类别的边界清晰而一些困难类别的边界模糊。
受到KL散度的启发,作者在CE基础上添加了一个噪声容忍的项,名为Reverse Cross Entropy(RCE),它和CE组合构成了Symmetric
cross entropy Learning(SL)的基础。SL不仅可以改进困难类别的学习,而且可以增强网络对噪声标签的鲁棒性,它们的改进效果可以从上面的图中最后一张子图看出来。和那些动辄修改网络或者对现有方法改动颇多的方法相比,SL非常容易使用,只需要对现有训练流程轻微改动即可。
SL
交叉熵局限
在具体介绍SL方法之前,首先来回顾一下交叉熵损失。给定一个 K K K类的数据集 D = { ( x , y ) ( i ) } i = 1 n \mathcal{D}=\left\{(x, y)^{(i)}\right\}_{i=1}^{n} D={(x,y)(i)}i=1n,其中 x ∈ X ⊂ R d x \in \mathcal{X} \subset \mathbb{R}^{d} x∈X⊂Rd表明一个样本的输入是 d d d维的,而 y ∈ Y = { 1 , ⋯ , K } y \in \mathcal{Y}=\{1, \cdots, K\} y∈Y={1,⋯,K}是其对应的标签。对每个样本 x x x而言,一个分类器 f ( x ) f(x) f(x)计算其属于各个类别的概率分布,对于某个类别 k k k而言,其概率为 p ( k ∣ x ) = e z k ∑ j = 1 K e z j p(k \mid x)=\frac{e^{z_{k}}}{\sum_{j=1}^{K} e^{z_{j}}} p(k∣x)=∑j=1Kezjezk,这里的 z j z_j zj是概率值。不妨记 x x x的GT分布为 q ( k ∣ x ) q(k \mid x) q(k∣x),显然有 ∑ k = 1 K q ( k ∣ x ) = 1 \sum_{k=1}^{K} q(k \mid x)=1 ∑k=1Kq(k∣x)=1。如果是单标签的情况,那么必有 q ( y ∣ x ) = 1 q(y \mid x) = 1 q(y∣x)=1且对所有 k ≠ y k \ne y k=y的情况有 q ( k ∣ x ) = 0 q(k \mid x)=0 q(k∣x)=0。综上,交叉熵损失定义如下。
ℓ c e = − ∑ k = 1 K q ( k ∣ x ) log p ( k ∣ x ) \ell_{c e}=-\sum_{k=1}^{K} q(k \mid \mathbf{x}) \log p(k \mid \mathbf{x}) ℓce=−k=1∑Kq(k∣x)logp(k∣x)
作者这里在Cifar10上随机生成了一些噪声标签(40%),使用一个8层卷积神经网络进行分类,训练总共120轮,选取第10轮、第50轮和第100轮作为前期、中期和后期。 下图所示的为CE训练清晰标注和添加噪声的标注的测试准确率,无论是清晰数据还是噪声数据,不同类别之间存在差异,但是随着训练的进行,清晰数据后期差异较小但是即使在后期,噪声数据的差异依然存在,一些难类别并没有得到充分训练,而一些容易类别已经出现了过拟合现象。因此,得出结论,难类别的欠学习才是网络整体性能下降的原因而不是过拟合噪声标签。
进一步从学习到的表示的角度来探索CE造成欠学习的原因。由于难类别的表示和其他类别的相似度较高,因此极有困难被预测为其他类别标签,这就是之前聚类图上class 3没有明显聚类的原因。但是,class 3中仍有60%干净的标注,对此进一步研究,下图是class 3对干净数据的预测置信度和分布情况,可以看出,即使是干净的数据,置信度也不是很高,这表示网络其实没有得到充分的训练。
因此,最终总结得到,CE对于难类别的学习是不够充分的,尤其是存在噪声标签的场景下。
对称交叉熵学习
为了解决上文提到的交叉熵的局限性,作者提出了一种充分学习和噪声鲁棒性之间寻求平衡的方法,称为Symmetric cross entropy Learning,简称SL。
定义
给定两个分布 q q q和 p p p,交叉熵 H ( q , p ) H(q,p) H(q,p)和KL散度 K L ( q ∣ ∣ p ) KL(q||p) KL(q∣∣p)之间的关系如下式, H ( q ) H(q) H(q)表示 q q q的熵, q = q ( k ∣ x ) q=q(k|x) q=q(k∣x)表示样本 x x x的真实类别分布, p ( k ∣ x ) p(k|x) p(k∣x)则是预测类别分布。从KL散度的角度来看,优化的目的就是使得 p p p接近 q q q,也就是最小化两者的KL散度 K L ( q ∣ ∣ p ) KL(q||p) KL(q∣∣p)。
K L ( q ∥ p ) = H ( q , p ) − H ( q ) K L(q \| p)=H(q, p)-H(q) KL(q∥p)=H(q,p)−H(q)
但是,当存在噪声时, q ( k ∣ x ) q(k|x) q(k∣x)未必代表真实分布,反而 p ( k ∣ x ) p(k|x) p(k∣x)一定程度上可以反映真实的分布,所以可以考虑另一个方向的KL散度 K L ( p ∣ ∣ q ) KL(p||q) KL(p∣∣q),将正反向的KL散度结合从而得到对称KL散度的公式如下所示。
S K L = K L ( q ∥ p ) + K L ( p ∥ q ) S K L=K L(q \| p)+K L(p \| q) SKL=KL(q∥p)+KL(p∥q)
将这个思路从KL散度迁移到交叉熵上面,就可以得到对称交叉熵SCE的公式如下所示。
S C E = C E + R C E = H ( q , p ) + H ( p , q ) S C E=C E+R C E=H(q, p)+H(p, q) SCE=CE+RCE=H(q,p)+H(p,q)
这里的 R C E = H ( p , q ) RCE = H(p,q) RCE=H(p,q)是 H ( q , p ) H(q,p) H(q,p)的反向版本,称为反向交叉熵Reverse Cross Entropy,RCE损失的计算式如下。
ℓ r c e = − ∑ k = 1 K p ( k ∣ x ) log q ( k ∣ x ) \ell_{r c e}=-\sum_{k=1}^{K} p(k \mid \mathbf{x}) \log q(k \mid \mathbf{x}) ℓrce=−k=1∑Kp(k∣x)logq(k∣x)
因此最终的对称交叉熵损失SCE定义如下。
ℓ s c e = ℓ c e + ℓ r c e \ell_{s c e}=\ell_{c e}+\ell_{r c e} ℓsce=ℓce+ℓrce
关于RCE的噪声容忍性下文会证明,但是CE项时对噪声非鲁棒的,但是CE对模型收敛又是非常有效的,因此为了获得有效性和鲁棒性,作者设计了两个超参数来解耦学习框架,超参数 α \alpha α用于解决CE的过拟合问题而 β \beta β则探索RCE的鲁棒性,因此,形式上,SL损失如下式所示。在 ℓ r c e \ell_{rce} ℓrce中由于真实分布 q ( k ∣ x ) q(k|x) q(k∣x)是one-hot编码,因此含有0值,因此定义 l o g 0 = A log 0 = A log0=A,这里的A是一个小于0的常数, β \beta β的设置也和A的值有关。
ℓ s l = α ℓ c e + β ℓ r c e \ell_{s l}=\alpha \ell_{c e}+\beta \ell_{r c e} ℓsl=αℓce+βℓrce
理论分析
首先是关于鲁棒性的分析,也就是 ℓ r c e \ell_{rce} ℓrce对噪声是鲁棒的。不妨记样本 x x x的噪声标签为 y ^ \hat{y} y^而真实标签为 y y y,分类器为 f f f且损失函数为 ℓ r c e \ell_{rce} ℓrce。定义 f f f在清晰标签下的风险为 R ( f ) = E x , y ℓ r c e R(f)=\mathbb{E}_{\mathbf{x}, y} \ell_{r c e} R(f)=Ex,yℓrce,而在噪声率为 η \eta η的标注下的风险为 R η ( f ) = E x , y ^ ℓ r c e R^{\eta}(f)=\mathbb{E}_{\mathbf{x}, \hat{y}} \ell_{r c e} Rη(f)=Ex,y^ℓrce,记 f ∗ f^{*} f∗和 f η ∗ f_{\eta}^{*} fη∗为 R η ( f ) R^{\eta}(f) Rη(f)和 R η ( f ) R^{\eta}(f) Rη(f)的全局最小值。如果 f η ∗ f_{\eta}^{*} fη∗和 f ∗ f^{*} f∗在噪声数据下有同样的分类概率,那么称该损失是噪声鲁棒的,也叫noise-tolerant。这个的证明过程感兴趣的可以查看论文的Theorem 1部分,我这里不多赘述了,此外作者下面还继续对SL的梯度进行了推导从而分析了SL的学习过程不同于CE损失,我这里忽略推导过程,给出推导的结果,见下面的式子。
∂ ℓ s l ∂ z j = { ∂ ℓ c e ∂ z j − ( A p j 2 − A p j ) , q j = q y = 1 ∂ ℓ c e ∂ z j + ( − A p j p y ) , q j = 0 \frac{\partial \ell_{s l}}{\partial z_{j}}=\left\{\begin{array}{ll} \frac{\partial \ell_{c e}}{\partial z_{j}}-\left(A p_{j}^{2}-A p_{j}\right), & q_{j}=q_{y}=1 \\ \frac{\partial \ell_{c e}}{\partial z_{j}}+\left(-A p_{j} p_{y}\right), & q_{j}=0 \end{array}\right. ∂zj∂ℓsl={∂zj∂ℓce−(Apj2−Apj),∂zj∂ℓce+(−Apjpy),qj=qy=1qj=0
∂ ℓ c e ∂ z j = { p j − 1 ≤ 0 , q j = q y = 1 p j ≥ 0 , q j = 0 \frac{\partial \ell_{c e}}{\partial z_{j}}=\left\{\begin{array}{ll} p_{j}-1 \leq 0, & q_{j}=q_{y}=1 \\ p_{j} \geq 0, & q_{j}=0 \end{array}\right. ∂zj∂ℓce={pj−1≤0,pj≥0,qj=qy=1qj=0
从上面的式子,学习的过程是使得 p j p_j pj趋近于1,当 p j < 0.5 p_j<0.5 pj<0.5时RCE会促进学习,当 p j > 0.5 p_j>0.5 pj>0.5时,RCE会降低样本的学习速度。当 q j = 0 ( ∂ ℓ c e ∂ z j ≥ 0 ) q_{j}=0\left(\frac{\partial \ell_{c e}}{\partial z_{j}} \geq 0\right) qj=0(∂zj∂ℓce≥0)时,第二项 − A p j p y -A p_{j} p_{y} −Apjpy取决于 p j p_j pj和 p y p_y py, p y p_y py越大说明模型越信任自己的预测,同时 − A p j p y -A p_{j} p_{y} −Apjpy也越大,其他标签的预测概率的下降速度就越快。当 p y = 0 p_y=0 py=0的时候, − A p j p y -A p_{j} p_{y} −Apjpy为0对梯度的大小没有改变,这意味着网络对标注类别没有信息,标签很有可能是错误的。
接着作者还证明了当 A = − 2 A=-2 A=−2时,RCE就退化为MAE,也就是说RCE其实是MAE的推广形式,且和GCE不同,的两项是对称的。最后,这里可以附上一个SCE loss的PyTorch实现如下。
class SCELoss(torch.nn.Module):def __init__(self, alpha=0.1, beta=1.0, num_classes=10):super(SCELoss, self).__init__()self.alpha = alphaself.beta = betaself.num_classes = num_classesdef forward(self, pred, labels):# CCEce = F.cross_entropy(pred, labels, ignore_index=-1)device = pred.device# RCEpred = F.softmax(pred, dim=1)pred = torch.clamp(pred, min=1e-7, max=1.0)label_one_hot = F.one_hot(labels, self.num_classes).float().to(device)label_one_hot = torch.clamp(label_one_hot, min=1e-4, max=1.0)rce = (-1 * torch.sum(pred * torch.log(label_one_hot), dim=1))# Lossloss = self.alpha * ce + self.beta * rce.mean()return loss
实验
关于实验配置包括如何引入噪声的,可以查看原论文,这里不展开叙述了。
下图是添加60%噪声后使用CE和SL的逐类测试准确率的区别,可以发现,SL整体性能是大大提高的,更加充分学习了每一个类别,尤其是难类别,这源于SL自适应速度会对难类别更加充分学习。
通过可视化CE和SL训练后学到的Representations,可以发现,即使面对噪声,SL各个类别之间的分界还是非常分明的,这就是说,SL更加noise-tolerant。
作者还进行了一些参数分析和消融实验,我这里就不一一展示了,下图是各个数据集上和其他方法的比较,证明了SL的SOTA性能。
总结
对于标签噪声的问题,作者进行了大量的实验分析,最终得到了和前人不同的结论,噪声标签下分类效果差的原因主要来源于难类别学习不充分而不是过拟合噪声标签。受到KL散度的启发,设计了和CE对称的RCE并组合得到了SL损失,作者理论证明了RCE的噪声容忍能力并实验验证了SL的噪声标签下学习的效果,是很值得关注的一个方法。本文也只是我本人从自身出发对这篇文章进行的解读,想要更详细理解的强烈推荐阅读原论文。最后,如果我的文章对你有所帮助,欢迎一键三连,你的支持是我不懈创作的动力。