圖片分類裡的Center Loss

目標函式,損失函式,代價函式

損失函式度量的是預測值與真實值之間的差異。損失函式通常寫做L(y

,y)。y

代表了預測值,y代表了真實值。

目標函式可以看做是最佳化目標,最佳化模型的最後目標就是使得這個目標函式最大或者最小。

代價函式類似於目標函式。

區別:目標函式(代價函式)可以包含一些約束條件如正則化項。

一般不做嚴格區分。下面所言損失函式均不包含正則項。

常見的損失函式

以keras文件列出的幾個為例

keras-loss

mse(mean_squared_error):均方誤差損失。

K。mean(K。square(y_pred-y_true),axis=-1)

mae(mean_absolute_error):平均絕對值誤差損失。

K。mean(K。abs(y_pred-y_true),axis=-1)

mape(mean_absolute_percentage_error):平均絕對百分誤差。

K。abs((y_true - y_pred) / K。clip(K。abs(y_true),K。epsilon(),None))

#clip(x,min,max)防止除0錯誤

msle(mean_squared_logarithmic_error):均方對數損失(mse的改進)。

#msle

first_log = K。log(K。clip(y_pred, K。epsilon(), None) + 1。)

second_log = K。log(K。clip(y_true, K。epsilon(), None) + 1。)

loss= K。mean(K。square(first_log - second_log), axis=-1)

#mse

first_log = K。clip(y_pred, K。epsilon(), None) + 1。

second_log = K。clip(y_true, K。epsilon(), None) + 1。

loss= K。mean(K。square(first_log - second_log), axis=-1)

msle相比與mse的改進:如果想要預測的值範圍很大,mse會受到一些大的值的引導,即使小的值預測準也不行。假設如:

y_true:[1,2,3,100]

y_1:[1,2,3,110]

y_2:[2,3,4,100]

mse計算結果(y_1:100,y_2:3)會認為y_2優於y_1。

msle計算結果(有_1:0。047,0。27)透過預先將所有值取log緩解了這一情況,會認為y_1優於y_2。這比較合理。

code

logcosh燙燙燙。迴歸

def cosh(x):

return (K。exp(x) + K。exp(-x)) / 2

K。mean(K。log(cosh(y_pred - y_true)), axis=-1)

這個函式沒見人用過,按照公式作圖如下:

大致可以看出來如果y_pred與y_true差異越小則值越小。

kullback_leiber_divergence:KL散度。

兩個機率分佈P和Q差別的非對稱性的度量。 典型情況下,P表示資料的真實分佈,Q表示資料的理論分佈,模型分佈,或P的近似分佈。

y_true = K。clip(y_true, K。epsilon(), 1)

y_pred = K。clip(y_pred, K。epsilon(), 1)

K。sum(y_true * K。log(y_true / y_pred), axis=-1)

一種解釋:KL散度是用來 度量使用基於Q的編碼來編碼來自P的樣本平均所需的額外的位元數。(熵,交叉熵,)

舉例:假設現在有兩個分佈p和q,p為真實,q為模型預測的

熵的本質是資訊量度量:

按照真實分佈p來衡量識別一個樣本所需要的平均編碼長度:

按照錯誤分佈q來表示來自真實分佈p的平均編碼長度(交叉熵):

舉例:

4個字母,真實分佈p=[0。5,0。5,0,0],q=[0。25,0。25,0。25,0。25],計算得到H(p)為1。H(p,q)為2。由q得到的平均編碼長度比由p得到的平均編碼長度多出的bit數稱為KL散度。

KL散度wiki

KL散度zhihu

categorical_crossentropy:多類的對數損失。

一種解釋:

softmax公式:

logistic regression的目標函式是根據最大似然來做的。也就是假設x屬於類y,預測出機率為oy,那麼需要最大化oy。

softmax_loss如下:

下面是二類分類交叉熵公式:

數值穩定性問題

Center Loss損失函式

開始正題。

以mnist資料集為例。(手寫數字,28*28影象,10分類問題)

categorical crossentropy(softmax loss)的問題

通常會使用softmax loss多分類損失函式。

使用CNN網路(mnist分類容易達到較高的準確度,為了實驗效果,網路設計的故意差了點,如沒有使用BN,relu,dropout,L2等trick),選擇在倒數第二層全連線層輸出節點為2個,稱為是特徵,而後將這2個節點接到最後的的10節點全連線層。

正常的訓練過程,到達較高準確度後將每個資料的倒數第二層的特徵打印出來。

如下圖:

缺點:

從聚類角度看,提取的特徵並不好。很多情況下類內間距甚至要大於類間間距。我們期望特徵不僅可分,而且要求差異大,特徵學習需要保證提取的特徵有識別度。

佔據的面積有點大。通常情況下,我們希望每一類只佔很小一部分。因為手寫字元很多啊,這些數字就佔了這麼大地方,如果新來了英文字母呢…也就是我們期望模型能識別出在訓練資料的標籤中沒有的分類。特徵學習需要保證提取的特徵具有普適性。

softmax會使得模型過度自信,分類結果基本非1即0,上圖裡有些點在邊界但是softmax認為已經可以了,根本沒必要再修正。同時softmax這種特性使得基本上沒有辦法去設定諸如可信度等度量。(場景?)

原因?舉例:

最後一層全連線層輸出V=[x1,x2,x3],真實標籤是[1,0,0]。那麼假設V=[x1,x2,x3]是[3。1,3,3],那麼softmax的公式使得其只需要V的模長增加倍數即可以降低loss損失。這太容易(只需要增大引數即可)使得網路往往就是這樣做的。而不是我們通常想要的那樣去努力降低x2,x3的相對於x1的值如[3。1,1,1]這樣。這也是所以L2正則會緩解過擬合的一個原因。

解決辦法:很多,如故意讓softmax也去模擬下均勻分佈輸出而不僅僅是one_hot。這裡只涉及其中一種也就是centerloss。

那麼換一個損失函式吧。均方誤差損失?如下圖:

不但準確度下降到30%,而且互相直接還有了覆蓋交集。

有趣的地方:

1和其他數字很明顯的分開了。

2,4,5,8,9這幾個炸了根本分不開。

在上述的幾個損失函式上,softmax工作的是最好的了。

Center Loss

針對softmax表現出的問題針對性解決。-→類內間距太大了。

對每一個類都維護一個類中心c,而後在特徵層如果該樣本里類中心的特徵太遠就要懲罰。也就是所謂的centerloss。

類中心c:每一個樣本的特徵需要透過一個好的網路到達特徵層獲得,這樣計算完後所有樣本的特徵的平均值為類中心c,而好的網路需要是在有類中心加入的情況下才能得到…

沒法直接獲得c,所以將其放到網路裡自己生成,在每一個batch裡更新center。即隨機初始化center,而後每一個batch裡計算當前資料與center的距離,而後將這個梯度形式的距離加到center上。類似於引數修正。同樣的類似於梯度下降法,這裡再增加一個scale度量a,使得center不會抖動。

實驗表明只使用centerloss效果很一般,所以一般是將centerloss與softmax結合起來,引入引數lambda。

總體結構如下:

4。演算法過程

5。實驗結果

準確度提高約0。6%。

總結

一種新的loss函式,看起來效果不錯,而且也更加符合認知,生成的模型魯棒性可能更好。

本質是度量學習,經常應用在分類領域,原理簡單,計算複雜度不大,經常能提升效果。

有點使用空間換取時間的意思。

屬於一個trick。不一定適合所有場景。一般來說,如果同一類樣本很類似如mnist手寫數字,人臉資料,那麼centerloss往往能夠帶來效果提升。而如果本身同一類樣本就差異很大,如cifar100,那麼則不一定。也可以理解成一個人的一堆臉取平均值仍然是他的臉,而一堆不同的狗取平均值則可能難以認出是什麼。

引數設定:a一般取0。5,lambda則0。1-0。0001之間不等,需要實驗調參。

參考論文

A Discriminative Feature Learning Approach for Deep Face Recognition