-
問題背景
對(duì)于分類問題,尤其是多類別分類問題中,常常把類別向量做成one-hot vector(獨(dú)熱向量)。
簡單地說,就是對(duì)于多分類向量,計(jì)算機(jī)中往往用[0, 1, 3]等此類離散的、隨機(jī)的而非有序(連續(xù))的向量表示,而one-hot vector 對(duì)應(yīng)的向量便可表示為[0, 1, 0],即對(duì)于長度為n 的數(shù)組,只有一個(gè)元素是1,其余都為0。因此表征我們已知樣本屬于某一類別的概率是為1的確定事件,屬于其他類別的概率則均為0。
one-hot 帶來的問題:
對(duì)于損失函數(shù),我們需要用預(yù)測(cè)概率去擬合真實(shí)概率,而擬合one-hot的真實(shí)概率函數(shù)會(huì)帶來兩個(gè)問題:
1)無法保證模型的泛化能力,容易造成過擬合;
2)全概率和0概率鼓勵(lì)所屬類別和其他類別之間的差距盡可能加大,而由梯度有界可知,這種情況很難adapt。會(huì)造成模型過于相信預(yù)測(cè)的類別。
-
解決方法
使用下面的 label smoothing 可以緩解這個(gè)問題:
原理:對(duì)于以Dirac函數(shù)分布的真實(shí)標(biāo)簽,我們將它變成分為兩部分獲得(替換)
1) 第一部分:將原本Dirac分布的標(biāo)簽變量替換為(1 - ?)的Dirac函數(shù);
2) 第二部分:以概率 ? ,在u(k)u(k) 中份分布的隨機(jī)變量。
代碼對(duì)應(yīng):
def label_smoothing(inputs, epsilon=0.1):
K = inputs.get_shape().as_list()[-1] # number of channels
return ((1-epsilon) * inputs) + (epsilon / K)
代碼的第一行是取Y的channel數(shù)也就是類別數(shù)
第二行就是對(duì)應(yīng)公式了。
-
舉例說明
下面用一個(gè)例子理解一下:
假設(shè)我做一個(gè)蛋白質(zhì)二級(jí)結(jié)構(gòu)分類,是三分類,那么K=3;
假如一個(gè)真實(shí)標(biāo)簽是[0, 0, 1],取epsilon = 0.1,
新標(biāo)簽就變成了 (1 - 0.1)× [0, 0, 1] + (0.1 / 3) = [0, 0, 0.9] + [0.0333, 0.0333, 0.0333]
= [0.0333, 0.0333, 0.9333]
實(shí)際上分了一點(diǎn)概率給其他兩類(均勻分),讓標(biāo)簽沒有那么絕對(duì)化,留給學(xué)習(xí)一點(diǎn)泛化的空間。
從而能夠提升整體的效果。
下列文章表示,對(duì)K = 1000,? = 0.1的優(yōu)化參數(shù),實(shí)驗(yàn)結(jié)果有0.2%的性能提升。
參考:
Rethinking the Inception Architecture for Computer Vision
https://arxiv.org/abs/1512.00567
https://blog.csdn.net/neveer/article/details/91646657