三分鐘看懂深度學習標籤平滑(Label Smoothing)技巧

深度學習 盜夢空間 人工智能 電腦 數據學習DataLearner 2019-06-28
三分鐘看懂深度學習標籤平滑(Label Smoothing)技巧

交叉熵(Cross-Entropy)損失函數是分類模型中的一種非常重要的目標函數。在二分類問題中,交叉熵損失函數的形式如下:

−[ylogp+(1−y)log(1−p)]

如果分類準確,交叉熵損失函數的結果是0(即上式中p和y一致的情況),否則交叉熵為無窮大。也就是說交叉熵對分類正確給的是最大激勵。換句話說,對於標註數據來說,這個時候我們認為其標註結果是準確的(不然這個結果就沒意義了)。但實際上,有一些標註數據並不一定是準確的。那麼這時候,使用交叉熵損失函數作為目標函數並不一定是最優的。

在早期的神經網絡研究中,也有發現,一些非標準的交叉熵損失函數表現會更好一點。

對於這個問題,我們還可以這麼去理解。在分類任務中,我們通常對類別標籤的編碼使用[0,1,2,…]這種形式。在深度學習中,通常在全連接層的最後一層,加入一個softmax來計算輸入數據屬於每個類別的概率,並把概率最高的作為這個類別的輸入,然後使用交叉熵作為損失函數。這會導致模型對正確分類的情況獎勵最大,錯誤分類懲罰最大。如果訓練數據能覆蓋所有情況,或者是完全正確,那麼這種方式沒有問題。但事實上,這不可能。所以這種方式可能會帶來泛化能力差的問題,即過擬合。

在2016年,Szegedy等人提出了inception v2的模型(論文:Rethinking the inception architecture for computer vision.)。其中提到了Label Smoothing技術,用以減輕這個問題。

我們先來看一下原理。假設我們的分類只有兩個,一個是貓一個不是貓,分別用1和0表示。Label Smoothing的工作原理是對原來的[0 1]這種標註做一個改動,假設我們給定Label Smoothing的值為0.1:

[0,1]×(1−0.1)+0.1/2=[0.05,0.95]

可以看到,原來的[0,1]編碼變成了[0.05,0.95]了。這個label_smoothing的值假設為ϵ,那麼就是說,原來分類準確的時候,p=1,不準確為p=0,現在變成了p=1−ϵϵ,也就是說對分類準確做了一點懲罰。

Label Smoothing在很多問題上對模型都有一定的提升。

在Tensorflow中使用方法時候只要在損失函數中加上label_smoothing的值即可,如下:

tf.losses.softmax_cross_entropy(
onehot_labels,
logits,
weights=1.0,
label_smoothing=0,
scope=None,
loss_collection=tf.GraphKeys.LOSSES,
reduction=Reduction.SUM_BY_NONZERO_WEIGHTS
)

相關推薦

推薦中...