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