【轉(zhuǎn)】TensorFlow四種Cross Entropy算法實現(xiàn)和應(yīng)用

作者:陳迪豪 來源:CSDN
http://dataunion.org/26447.html


交叉熵介紹

交叉熵(Cross Entropy)是Loss函數(shù)的一種(也稱為損失函數(shù)或代價函數(shù)),用于描述模型預(yù)測值與真實值的差距大小,常見的Loss函數(shù)就是均方平方差(Mean Squared Error),定義如下。


?平方差很好理解,預(yù)測值與真實值直接相減,為了避免得到負數(shù)取絕對值或者平方,再做平均就是均方平方差。注意這里預(yù)測值需要經(jīng)過sigmoid激活函數(shù),得到取值范圍在0到1之間的預(yù)測值。
平方差可以表達預(yù)測值與真實值的差異,但在分類問題種效果并不如交叉熵好,原因可以參考這篇博文 。交叉熵的定義如下,截圖來自https://hit-scir.gitbooks.io/neural-networks-and-deep-learning-zh_cn/content/chap3/c3s1.html

上面的文章也介紹了交叉熵可以作為Loss函數(shù)的原因,首先是交叉熵得到的值一定是正數(shù),其次是預(yù)測結(jié)果越準確值越小,注意這里用于計算的“a”也是經(jīng)過sigmoid激活的,取值范圍在0到1。如果label是1,預(yù)測值也是1的話,前面一項y * ln(a)就是1 * ln(1)等于0,后一項(1 – y) * ln(1 – a)也就是0 * ln(0)等于0,Loss函數(shù)為0,反之Loss函數(shù)為無限大非常符合我們對Loss函數(shù)的定義。

這里多次強調(diào)sigmoid激活函數(shù),是因為在多目標或者多分類的問題下有些函數(shù)是不可用的,而TensorFlow本身也提供了多種交叉熵算法的實現(xiàn)。

TensorFlow的交叉熵函數(shù)

TensorFlow針對分類問題,實現(xiàn)了四個交叉熵函數(shù),分別是
tf.nn.sigmoid_cross_entropy_with_logitstf.nn.softmax_cross_entropy_with_logitstf.nn.sparse_softmax_cross_entropy_with_logitstf.nn.weighted_cross_entropy_with_logits,詳細內(nèi)容參考API文檔https://www.tensorflow.org/versions/master/api_docs/python/nn.html#sparse_softmax_cross_entropy_with_logits

sigmoid_cross_entropy_with_logits詳解

我們先看sigmoid_cross_entropy_with_logits,為什么呢,因為它的實現(xiàn)和前面的交叉熵算法定義是一樣的,也是TensorFlow最早實現(xiàn)的交叉熵算法。這個函數(shù)的輸入是logits和targets,logits就是神經(jīng)網(wǎng)絡(luò)模型中的 W * X矩陣,注意不需要經(jīng)過sigmoid,而targets的shape和logits相同,就是正確的label值,例如這個模型一次要判斷100張圖是否包含10種動物,這兩個輸入的shape都是[100, 10]。注釋中還提到這10個分類之間是獨立的、不要求是互斥,這種問題我們成為多目標,例如判斷圖片中是否包含10種動物,label值可以包含多個1或0個1,還有一種問題是多分類問題,例如我們對年齡特征分為5段,只允許5個值有且只有1個值為1,這種問題可以直接用這個函數(shù)嗎?答案是不可以,我們先來看看sigmoid_cross_entropy_with_logits的代碼實現(xiàn)吧。

圖片描述

可以看到這就是標準的Cross Entropy算法實現(xiàn),對W * X得到的值進行sigmoid激活,保證取值在0到1之間,然后放在交叉熵的函數(shù)中計算Loss。對于二分類問題這樣做沒問題,但對于前面提到的多分類,例如年輕取值范圍在04,目標值也在04,這里如果經(jīng)過sigmoid后預(yù)測值就限制在0到1之間,而且公式中的1 – z就會出現(xiàn)負數(shù),仔細想一下0到4之間還不存在線性關(guān)系,如果直接把label值帶入計算肯定會有非常大的誤差。因此對于多分類問題是不能直接代入的,那其實我們可以靈活變通,把5個年齡段的預(yù)測用onehot encoding變成5維的label,訓(xùn)練時當(dāng)做5個不同的目標來訓(xùn)練即可,但不保證只有一個為1,對于這類問題TensorFlow又提供了基于Softmax的交叉熵函數(shù)。

softmax_cross_entropy_with_logits詳解

Softmax本身的算法很簡單,就是把所有值用e的n次方計算出來,求和后算每個值占的比率,保證總和為1,一般我們可以認為Softmax出來的就是confidence也就是概率,算法實現(xiàn)如下。


圖片描述

?softmax_cross_entropy_with_logits和sigmoid_cross_entropy_with_logits很不一樣,輸入是類似的logits和lables的shape一樣,但這里要求分類的結(jié)果是互斥的,保證只有一個字段有值,例如CIFAR-10中圖片只能分一類而不像前面判斷是否包含多類動物。想一下問什么會有這樣的限制?在函數(shù)頭的注釋中我們看到,這個函數(shù)傳入的logits是unscaled的,既不做sigmoid也不做softmax,因為函數(shù)實現(xiàn)會在內(nèi)部更高效得使用softmax,對于任意的輸入經(jīng)過softmax都會變成和為1的概率預(yù)測值,這個值就可以代入變形的Cross Entroy算法- y * ln(a) – (1 – y) * ln(1 – a)算法中,得到有意義的Loss值了。如果是多目標問題,經(jīng)過softmax就不會得到多個和為1的概率,而且label有多個1也無法計算交叉熵,因此這個函數(shù)只適合單目標的二分類或者多分類問題,TensorFlow函數(shù)定義如下。


圖片描述

再補充一點,對于多分類問題,例如我們的年齡分為5類,并且人工編碼為0、1、2、3、4,因為輸出值是5維的特征,因此我們需要人工做onehot encoding分別編碼為00001、00010、00100、01000、10000,才可以作為這個函數(shù)的輸入。理論上我們不做onehot encoding也可以,做成和為1的概率分布也可以,但需要保證是和為1,和不為1的實際含義不明確,TensorFlow的C++代碼實現(xiàn)計劃檢查這些參數(shù),可以提前提醒用戶避免誤用。

sparse_softmax_cross_entropy_with_logits詳解

sparse_softmax_cross_entropy_with_logits是softmax_cross_entropy_with_logits的易用版本,除了輸入?yún)?shù)不同,作用和算法實現(xiàn)都是一樣的。前面提到softmax_cross_entropy_with_logits的輸入必須是類似onehot encoding的多維特征,但CIFAR-10、ImageNet和大部分分類場景都只有一個分類目標,label值都是從0編碼的整數(shù),每次轉(zhuǎn)成onehot encoding比較麻煩,有沒有更好的方法呢?答案就是用sparse_softmax_cross_entropy_with_logits,它的第一個參數(shù)logits和前面一樣,shape是[batch_size, num_classes],而第二個參數(shù)labels以前也必須是[batch_size, num_classes]否則無法做Cross Entropy,這個函數(shù)改為限制更強的[batch_size],而值必須是從0開始編碼的int32或int64,而且值范圍是[0, num_class),如果我們從1開始編碼或者步長大于1,會導(dǎo)致某些label值超過這個范圍,代碼會直接報錯退出。這也很好理解,TensorFlow通過這樣的限制才能知道用戶傳入的3、6或者9對應(yīng)是哪個class,最后可以在內(nèi)部高效實現(xiàn)類似的onehot encoding,這只是簡化用戶的輸入而已,如果用戶已經(jīng)做了onehot encoding那可以直接使用不帶“sparse”的softmax_cross_entropy_with_logits函數(shù)。

weighted_sigmoid_cross_entropy_with_logits詳解

weighted_sigmoid_cross_entropy_with_logits是sigmoid_cross_entropy_with_logits的拓展版,輸入?yún)?shù)和實現(xiàn)和后者差不多,可以多支持一個pos_weight參數(shù),目的是可以增加或者減小正樣本在算Cross Entropy時的Loss。實現(xiàn)原理很簡單,在傳統(tǒng)基于sigmoid的交叉熵算法上,正樣本算出的值乘以某個系數(shù)接口,算法實現(xiàn)如下。


圖片描述

?總結(jié)

這就是TensorFlow目前提供的有關(guān)Cross Entropy的函數(shù)實現(xiàn),用戶需要理解多目標和多分類的場景,根據(jù)業(yè)務(wù)需求(分類目標是否獨立和互斥)來選擇基于sigmoid或者softmax的實現(xiàn),如果使用sigmoid目前還支持加權(quán)的實現(xiàn),如果使用softmax我們可以自己做onehot coding或者使用更易用的sparse_softmax_cross_entropy_with_logits函數(shù)。

TensorFlow提供的Cross Entropy函數(shù)基本cover了多目標和多分類的問題,但如果同時是多目標多分類的場景,肯定是無法使用softmax_cross_entropy_with_logits,如果使用sigmoid_cross_entropy_with_logits我們就把多分類的特征都認為是獨立的特征,而實際上他們有且只有一個為1的非獨立特征,計算Loss時不如Softmax有效。這里可以預(yù)測下,未來TensorFlow社區(qū)將會實現(xiàn)更多的op解決類似的問題,我們也期待更多人參與TensorFlow貢獻算法和代碼 !

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,578評論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,701評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,691評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,974評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,694評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,026評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,015評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,193評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,719評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,442評論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,668評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,151評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,846評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,255評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,592評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,394評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,635評論 2 380

推薦閱讀更多精彩內(nèi)容