SL解读
最近看到汐夢聆海關于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方法之前,首先來回顧一下交叉熵損失。給定一個KKK類的數據集D={(x,y)(i)}i=1n\mathcal{D}=\left\{(x, y)^{(i)}\right\}_{i=1}^{n}D={(x,y)(i)}i=1n?,其中x∈X?Rdx \in \mathcal{X} \subset \mathbb{R}^ze8trgl8bvbqx∈X?Rd表明一個樣本的輸入是ddd維的,而y∈Y={1,?,K}y \in \mathcal{Y}=\{1, \cdots, K\}y∈Y={1,?,K}是其對應的標簽。對每個樣本xxx而言,一個分類器f(x)f(x)f(x)計算其屬于各個類別的概率分布,對于某個類別kkk而言,其概率為p(k∣x)=ezk∑j=1Kezjp(k \mid x)=\frac{e^{z_{k}}}{\sum_{j=1}^{K} e^{z_{j}}}p(k∣x)=∑j=1K?ezj?ezk??,這里的zjz_jzj?是概率值。不妨記xxx的GT分布為q(k∣x)q(k \mid x)q(k∣x),顯然有∑k=1Kq(k∣x)=1\sum_{k=1}^{K} q(k \mid x)=1∑k=1K?q(k∣x)=1。如果是單標簽的情況,那么必有q(y∣x)=1q(y \mid x) = 1q(y∣x)=1且對所有k≠yk \ne yk?=y的情況有q(k∣x)=0q(k \mid x)=0q(k∣x)=0。綜上,交叉熵損失定義如下。
?ce=?∑k=1Kq(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∑K?q(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。
定義
給定兩個分布qqq和ppp,交叉熵H(q,p)H(q,p)H(q,p)和KL散度KL(q∣∣p)KL(q||p)KL(q∣∣p)之間的關系如下式,H(q)H(q)H(q)表示qqq的熵,q=q(k∣x)q=q(k|x)q=q(k∣x)表示樣本xxx的真實類別分布,p(k∣x)p(k|x)p(k∣x)則是預測類別分布。從KL散度的角度來看,優化的目的就是使得ppp接近qqq,也就是最小化兩者的KL散度KL(q∣∣p)KL(q||p)KL(q∣∣p)。
KL(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散度KL(p∣∣q)KL(p||q)KL(p∣∣q),將正反向的KL散度結合從而得到對稱KL散度的公式如下所示。
SKL=KL(q∥p)+KL(p∥q)S K L=K L(q \| p)+K L(p \| q) SKL=KL(q∥p)+KL(p∥q)
將這個思路從KL散度遷移到交叉熵上面,就可以得到對稱交叉熵SCE的公式如下所示。
SCE=CE+RCE=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)
這里的RCE=H(p,q)RCE = H(p,q)RCE=H(p,q)是H(q,p)H(q,p)H(q,p)的反向版本,稱為反向交叉熵Reverse Cross Entropy,RCE損失的計算式如下。
?rce=?∑k=1Kp(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∑K?p(k∣x)logq(k∣x)
因此最終的對稱交叉熵損失SCE定義如下。
?sce=?ce+?rce\ell_{s c e}=\ell_{c e}+\ell_{r c e} ?sce?=?ce?+?rce?
關于RCE的噪聲容忍性下文會證明,但是CE項時對噪聲非魯棒的,但是CE對模型收斂又是非常有效的,因此為了獲得有效性和魯棒性,作者設計了兩個超參數來解耦學習框架,超參數α\alphaα用于解決CE的過擬合問題而β\betaβ則探索RCE的魯棒性,因此,形式上,SL損失如下式所示。在?rce\ell_{rce}?rce?中由于真實分布q(k∣x)q(k|x)q(k∣x)是one-hot編碼,因此含有0值,因此定義log0=Alog 0 = Alog0=A,這里的A是一個小于0的常數,β\betaβ的設置也和A的值有關。
?sl=α?ce+β?rce\ell_{s l}=\alpha \ell_{c e}+\beta \ell_{r c e} ?sl?=α?ce?+β?rce?
理論分析
首先是關于魯棒性的分析,也就是?rce\ell_{rce}?rce?對噪聲是魯棒的。不妨記樣本xxx的噪聲標簽為y^\hat{y}y^?而真實標簽為yyy,分類器為fff且損失函數為?rce\ell_{rce}?rce?。定義fff在清晰標簽下的風險為R(f)=Ex,y?rceR(f)=\mathbb{E}_{\mathbf{x}, y} \ell_{r c e}R(f)=Ex,y??rce?,而在噪聲率為η\etaη的標注下的風險為Rη(f)=Ex,y^?rceR^{\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損失,我這里忽略推導過程,給出推導的結果,見下面的式子。
??sl?zj={??ce?zj?(Apj2?Apj),qj=qy=1??ce?zj+(?Apjpy),qj=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??+(?Apj?py?),?qj?=qy?=1qj?=0?
??ce?zj={pj?1≤0,qj=qy=1pj≥0,qj=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?
從上面的式子,學習的過程是使得pjp_jpj?趨近于1,當pj<0.5p_j<0.5pj?<0.5時RCE會促進學習,當pj>0.5p_j>0.5pj?>0.5時,RCE會降低樣本的學習速度。當qj=0(??ce?zj≥0)q_{j}=0\left(\frac{\partial \ell_{c e}}{\partial z_{j}} \geq 0\right)qj?=0(?zj???ce??≥0)時,第二項?Apjpy-A p_{j} p_{y}?Apj?py?取決于pjp_jpj?和pyp_ypy?,pyp_ypy?越大說明模型越信任自己的預測,同時?Apjpy-A p_{j} p_{y}?Apj?py?也越大,其他標簽的預測概率的下降速度就越快。當py=0p_y=0py?=0的時候,?Apjpy-A p_{j} p_{y}?Apj?py?為0對梯度的大小沒有改變,這意味著網絡對標注類別沒有信息,標簽很有可能是錯誤的。
接著作者還證明了當A=?2A=-2A=?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的噪聲標簽下學習的效果,是很值得關注的一個方法。本文也只是我本人從自身出發對這篇文章進行的解讀,想要更詳細理解的強烈推薦閱讀原論文。最后,如果我的文章對你有所幫助,歡迎一鍵三連,你的支持是我不懈創作的動力。
總結
- 上一篇: Minetorch教程
- 下一篇: EANet解读