模型壓縮及優化 — Label smoothing

22 12
AIoT Taipei
Published in
4 min readNov 21, 2020

首先先付上
論文連結

實作程式

def label_smoothing(labels, factor=0.1):labels *= (1 — factor)
labels += (factor / labels.shape[1])
return labels
def label_smoothing(labels, factor=0.1):
num_labels = labels.get_shape().as_list()[-1]
labels = ((1-factor) * labels) + (factor/ num_labels)
return labels

Label smoothing 介紹

label smoothing 又稱為標籤平滑,常用在分類網路中來防止過擬和的一種方法,整體簡單易用,在小資料集上可以取得非常好的效果,首先我們先來看看整體是怎麼運作的。

首先來看看公式

傳統的one hot encoding

而Label smoothing 導入一個factor 機制呈現

假設今天有四個類別,分別為dog , cat , bird , turtle

# 分別對應到的類別為

dog = 0 , cat = 1 , bird = 2 , turtle = 3

# 變成one hot encoding 後

dog = [ 1 , 0 , 0 , 0 ]

cat = [ 0 , 1, 0 , 0 ]

bird = [ 0 , 0 , 1 , 0 ]

turtle = [ 0, 0 , 0 , 1 ]

# 而Label smoothing 概念很簡單 就是擁有一個factor 把其機率,分配給其他類別 ,假設factor = 0.1 其類別會變為

dog = [ 0.9 , 0.03 , 0.03 , 0.03 ]

cat = [ 0.03 , 0.9 , 0.03 , 0.03]

bird = [ 0.03 , 0.03 , 0.9 , 0.03 ]

turtle = [ 0.03 , 0.03 , 0.03 , 0.9 ]

那這樣做會有甚麼效果呢,我們從Loss 來觀察此問題,

首先我們先來看一下分類任務中最常見的cross entropy

我們如果套用上面的四種類別,首先來看看正確的Loss會呈現甚麼樣子

可以看到如果整體分類呈現正常梯度下降的話 使用Label smoothing 對比不使用的loss下降會比較少

那如果是呈現反向呢?

可以看到就算Training時 判錯 loss 也不會相較原本扣的太多

Label smoothing 結論

(1) 今天True positive的時候 loss 不會下降得太快,False positive 的時候 loss 不會逞罰得太多,使其不容易陷入局部最優點 一定程度可以抑制過擬和現象

(2) 如果今天類別過於相像時,其判定不會過於絕對,而假如今天可能有類別相近的時候,分配給這些少數的機率也能使神經網路不這麼絕對

Label smoothing 經驗分享

(1) 不管是在object detection 的分類網路 又或是 多分類網路導入label smoothing 皆有不錯的效果,基本上算輕鬆又容易上升準確度的做法

(2) 當資料足夠多的時候,Label smoothing 這個效果很容易使網路變得欠擬和,有時候甚至會看見其分類的score 上限變為0.9

(3) factor設計通常為0.1 ,筆者試過使用0.2 ,0.3 等參數,會發現皆無較好的效果,反而使網路難以收斂

(4) 由於Training 時使用label smoothing 這個機制,而Validation的時候則不會使用,所以在觀察loss 圖的時候 Validation loss 通常會比 Training loss 低0.5 ,不易於觀察,這時候只要記錄好三條曲線,分別為計算正常的Training loss, label smoothing 的loss 以及Validation loss即可。

(5) 可以利用label smoothing的特性來做點變形,甚至遇上同樣類型的事物時,甚至可以將factor分配給相似類別,而不是全部類別,也通常會有不錯的效果。

--

--