圖片分類里的Center Loss
目標函數(shù),損失函數(shù),代價函數(shù)
損失函數(shù)度量的是預(yù)測值與真實值之間的差異.損失函數(shù)通常寫做L(y,y).y代表了預(yù)測值,y代表了真實值.目標函數(shù)可以看做是優(yōu)化目標,優(yōu)化模型的最后目標就是使得這個目標函數(shù)最大或者最小.代價函數(shù)類似于目標函數(shù).區(qū)別:目標函數(shù)(代價函數(shù))可以包含一些約束條件如正則化項.
一般不做嚴格區(qū)分.下面所言損失函數(shù)均不包含正則項.
常見的損失函數(shù)
以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):均方對數(shù)損失(mse的改進).
mslefirst_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)#msefirst_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的改進:如果想要預(yù)測的值范圍很大,mse會受到一些大的值的引導(dǎo),即使小的值預(yù)測準也不行.假設(shè)如: y_true:[1,2,3,100] y_1:[1,2,3,110] y_2:[2,3,4,100] mse計算結(jié)果(y_1:100,y_2:3)會認為y_2優(yōu)于y_1. msle計算結(jié)果(有_1:0.047,0.27)通過預(yù)先將所有值取log緩解了這一情況,會認為y_1優(yōu)于y_2.這比較合理.
logcosh燙燙燙.回歸
def cosh(x): return (K.exp(x) + K.exp(-x)) / 2K.mean(K.log(cosh(y_pred - y_true)), axis=-1)
這個函數(shù)沒見人用過,按照公式作圖如下:
大致可以看出來如果y_pred與y_true差異越小則值越小.
kullback_leiber_divergence:KL散度.兩個概率分布P和Q差別的非對稱性的度量. 典型情況下,P表示數(shù)據(jù)的真實分布,Q表示數(shù)據(jù)的理論分布,模型分布,或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的樣本平均所需的額外的位元數(shù)。(熵,交叉熵,)舉例:假設(shè)現(xiàn)在有兩個分布p和q,p為真實,q為模型預(yù)測的熵的本質(zhì)是信息量度量:按照真實分布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數(shù)稱為KL散度.KL散度wikiKL散度zhihu**
categorical_crossentropy:多類的對數(shù)損失.一種解釋:softmax公式:logistic regression的目標函數(shù)是根據(jù)最大似然來做的.也就是假設(shè)x屬于類y,預(yù)測出概率為oy,那么需要最大化oy.softmax_loss如下:下面是二類分類交叉熵公式:數(shù)值穩(wěn)定性問題
Center Loss損失函數(shù)
開始正題.以mnist數(shù)據(jù)集為例.(手寫數(shù)字,28*28圖像,10分類問題)
categorical crossentropy(softmax loss)的問題通常會使用softmax loss多分類損失函數(shù).使用CNN網(wǎng)絡(luò)(mnist分類容易達到較高的準確度,為了實驗效果,網(wǎng)絡(luò)設(shè)計的故意差了點,如沒有使用BN,relu,dropout,L2等trick),選擇在倒數(shù)第二層全連接層輸出節(jié)點為2個,稱為是特征,而后將這2個節(jié)點接到最后的的10節(jié)點全連接層.正常的訓(xùn)練過程,到達較高準確度后將每個數(shù)據(jù)的倒數(shù)第二層的特征打印出來.如下圖:
缺點:
從聚類角度看,提取的特征并不好.很多情況下類內(nèi)間距甚至要大于類間間距.我們期望特征不僅可分,而且要求差異大,特征學(xué)習(xí)需要保證提取的特征有識別度。
占據(jù)的面積有點大.通常情況下,我們希望每一類只占很小一部分.因為手寫字符很多啊,這些數(shù)字就占了這么大地方,如果新來了英文字母呢…也就是我們期望模型能識別出在訓(xùn)練數(shù)據(jù)的標簽中沒有的分類。特征學(xué)習(xí)需要保證提取的特征具有普適性.
softmax會使得模型過度自信,分類結(jié)果基本非1即0,上圖里有些點在邊界但是softmax認為已經(jīng)可以了,根本沒必要再修正.同時softmax這種特性使得基本上沒有辦法去設(shè)置諸如可信度等度量.(場景?)
原因?舉例:最后一層全連接層輸出V=[x1,x2,x3],真實標簽是[1,0,0].那么假設(shè)V=[x1,x2,x3]是[3.1,3,3],那么softmax的公式使得其只需要V的模長增加倍數(shù)即可以降低loss損失.這太容易(只需要增大參數(shù)即可)使得網(wǎng)絡(luò)往往就是這樣做的.而不是我們通常想要的那樣去努力降低x2,x3的相對于x1的值如[3.1,1,1]這樣.這也是所以L2正則會緩解過擬合的一個原因.
解決辦法:很多,如故意讓softmax也去模擬下均勻分布輸出而不僅僅是one_hot.這里只涉及其中一種也就是centerloss.
那么換一個損失函數(shù)吧.均方誤差損失?如下圖:不但準確度下降到30%,而且互相直接還有了覆蓋交集.有趣的地方:
1和其他數(shù)字很明顯的分開了.
2,4,5,8,9這幾個炸了根本分不開.
在上述的幾個損失函數(shù)上,softmax工作的是最好的了.
Center Loss針對softmax表現(xiàn)出的問題針對性解決.-→類內(nèi)間距太大了.
對每一個類都維護一個類中心c,而后在特征層如果該樣本里類中心的特征太遠就要懲罰.也就是所謂的centerloss.類中心c:每一個樣本的特征需要通過一個好的網(wǎng)絡(luò)到達特征層獲得,這樣計算完后所有樣本的特征的平均值為類中心c,而好的網(wǎng)絡(luò)需要是在有類中心加入的情況下才能得到…
沒法直接獲得c,所以將其放到網(wǎng)絡(luò)里自己生成,在每一個batch里更新center.即隨機初始化center,而后每一個batch里計算當(dāng)前數(shù)據(jù)與center的距離,而后將這個梯度形式的距離加到center上.類似于參數(shù)修正.同樣的類似于梯度下降法,這里再增加一個scale度量a,使得center不會抖動.
實驗表明只使用centerloss效果很一般,所以一般是將centerloss與softmax結(jié)合起來,引入?yún)?shù)lambda.總體結(jié)構(gòu)如下:4.算法過程
5.實驗結(jié)果準確度提高約0.6%.
總結(jié)
一種新的loss函數(shù),看起來效果不錯,而且也更加符合認知,生成的模型魯棒性可能更好.
本質(zhì)是度量學(xué)習(xí),經(jīng)常應(yīng)用在分類領(lǐng)域,原理簡單,計算復(fù)雜度不大,經(jīng)常能提升效果.
有點使用空間換取時間的意思.
屬于一個trick.不一定適合所有場景.一般來說,如果同一類樣本很類似如mnist手寫數(shù)字,人臉數(shù)據(jù),那么centerloss往往能夠帶來效果提升.而如果本身同一類樣本就差異很大,如cifar100,那么則不一定.也可以理解成一個人的一堆臉取平均值仍然是他的臉,而一堆不同的狗取平均值則可能難以認出是什么.
參數(shù)設(shè)置:a一般取0.5,lambda則0.1-0.0001之間不等,需要實驗調(diào)參.
參考論文 A Discriminative Feature Learning Approach for Deep Face Recognition