圖片分類裡的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