1. 程式人生 > >tensorflow之交叉熵

tensorflow之交叉熵

https://blog.csdn.net/tsyccnh/article/details/79163834

(轉自上面的部落格,講得太好了,儲存一下,方便以後複習)

 

關於交叉熵在loss函式中使用的理解

交叉熵(cross entropy)是深度學習中常用的一個概念,一般用來求目標與預測值之間的差距。以前做一些分類問題的時候,沒有過多的注意,直接呼叫現成的庫,用起來也比較方便。最近開始研究起對抗生成網路(GANs),用到了交叉熵,發現自己對交叉熵的理解有些模糊,不夠深入。遂花了幾天的時間從頭梳理了一下相關知識點,才算透徹的理解了,特地記錄下來,以便日後查閱。
資訊理論

交叉熵是資訊理論中的一個概念,要想了解交叉熵的本質,需要先從最基本的概念講起。
1 資訊量

首先是資訊量。假設我們聽到了兩件事,分別如下:
事件A:巴西隊進入了2018世界盃決賽圈。
事件B:中國隊進入了2018世界盃決賽圈。
僅憑直覺來說,顯而易見事件B的資訊量比事件A的資訊量要大。究其原因,是因為事件A發生的概率很大,事件B發生的概率很小。所以當越不可能的事件發生了,我們獲取到的資訊量就越大。越可能發生的事件發生了,我們獲取到的資訊量就越小。那麼資訊量應該和事件發生的概率有關。

假設X
是一個離散型隨機變數,其取值集合為χ,概率分佈函式p(x)=Pr(X=x),x∈χ,則定義事件X=x0

的資訊量為:

I(x0)=−log(p(x0))

由於是概率所以p(x0)的取值範圍是[0,1],繪製為圖形如下:


這裡寫圖片描述
可見該函式符合我們對資訊量的直覺

2 熵

考慮另一個問題,對於某個事件,有n
種可能性,每一種可能性都有一個概率p(xi)


這樣就可以計算出某一種可能性的資訊量。舉一個例子,假設你拿出了你的電腦,按下開關,會有三種可能性,下表列出了每一種可能的概率及其對應的資訊量
序號     事件     概率p     資訊量I
A     電腦正常開機     0.7     -log(p(A))=0.36
B     電腦無法開機     0.2     -log(p(B))=1.61
C     電腦爆炸了     0.1     -log(p(C))=2.30

    注:文中的對數均為自然對數

我們現在有了資訊量的定義,而熵用來表示所有資訊量的期望,即:
H(X)=−∑i=1np(xi)log(p(xi))

其中n代表所有的n種可能性,所以上面的問題結果就是
H(X)===−[p(A)log(p(A))+p(B)log(p(B))+p(C))log(p(C))]0.7×0.36+0.2×1.61+0.1×2.300.804

然而有一類比較特殊的問題,比如投擲硬幣只有兩種可能,字朝上或花朝上。買彩票只有兩種可能,中獎或不中獎。我們稱之為0-1分佈問題(二項分佈的特例),對於這類問題,熵的計算方法可以簡化為如下算式:
H(X)==−∑i=1np(xi)log(p(xi))−p(x)log(p(x))−(1−p(x))log(1−p(x))

3 相對熵(KL散度)

相對熵又稱KL散度,如果我們對於同一個隨機變數 x 有兩個單獨的概率分佈 P(x) 和 Q(x),我們可以使用 KL 散度(Kullback-Leibler (KL) divergence)來衡量這兩個分佈的差異

維基百科對相對熵的定義

    In the context of machine learning, DKL(P‖Q) is often called the information gain achieved if P is used instead of Q.

即如果用P來描述目標問題,而不是用Q來描述目標問題,得到的資訊增量。

在機器學習中,P往往用來表示樣本的真實分佈,比如[1,0,0]表示當前樣本屬於第一類。Q用來表示模型所預測的分佈,比如[0.7,0.2,0.1]
直觀的理解就是如果用P來描述樣本,那麼就非常完美。而用Q來描述樣本,雖然可以大致描述,但是不是那麼的完美,資訊量不足,需要額外的一些“資訊增量”才能達到和P一樣完美的描述。如果我們的Q通過反覆訓練,也能完美的描述樣本,那麼就不再需要額外的“資訊增量”,Q等價於P。

KL散度的計算公式:
DKL(p||q)=∑i=1np(xi)log(p(xi)q(xi))(3.1)

n為事件的所有可能性。
DKL的值越小,表示q分佈和p分佈越接近

4 交叉熵

對式3.1變形可以得到:
DKL(p||q)==∑i=1np(xi)log(p(xi))−∑i=1np(xi)log(q(xi))−H(p(x))+[−∑i=1np(xi)log(q(xi))]

等式的前一部分恰巧就是p的熵,等式的後一部分,就是交叉熵:
H(p,q)=−∑i=1np(xi)log(q(xi))

在機器學習中,我們需要評估label和predicts之間的差距,使用KL散度剛剛好,即DKL(y||y^)
,由於KL散度中的前一部分−H(y)

不變,故在優化過程中,只需要關注交叉熵就可以了。所以一般在機器學習中直接用用交叉熵做loss,評估模型。
機器學習中交叉熵的應用
1 為什麼要用交叉熵做loss函式?

線上性迴歸問題中,常常使用MSE(Mean Squared Error)作為loss函式,比如:
loss=12m∑i=1m(yi−yi^)2

這裡的m表示m個樣本的,loss為m個樣本的loss均值。
MSE線上性迴歸問題中比較好用,那麼在邏輯分類問題中還是如此麼?
2 交叉熵在單分類問題中的使用

這裡的單類別是指,每一張影象樣本只能有一個類別,比如只能是狗或只能是貓。
交叉熵在單分類問題上基本是標配的方法
loss=−∑i=1nyilog(yi^)(2.1)

上式為一張樣本的loss計算方法。式2.1中n代表著n種類別。
舉例說明,比如有如下樣本

這裡寫圖片描述

對應的標籤和預測值
*     貓     青蛙     老鼠
Label     0     1     0
Pred     0.3     0.6     0.1

那麼
loss==−(0×log(0.3)+1×log(0.6)+0×log(0.1)−log(0.6)

對應一個batch的loss就是
loss=−1m∑j=1m∑i=1nyjilog(yji^)

m為當前batch的樣本數
3 交叉熵在多分類問題中的使用

這裡的多類別是指,每一張影象樣本可以有多個類別,比如同時包含一隻貓和一隻狗
和單分類問題的標籤不同,多分類的標籤是n-hot。
比如下面這張樣本圖,即有青蛙,又有老鼠,所以是一個多分類問題

這裡寫圖片描述

對應的標籤和預測值
*     貓     青蛙     老鼠
Label     0     1     1
Pred     0.1     0.7     0.8

值得注意的是,這裡的Pred不再是通過softmax計算的了,這裡採用的是sigmoid。將每一個節點的輸出歸一化到[0,1]之間。所有Pred值的和也不再為1。換句話說,就是每一個Label都是獨立分佈的,相互之間沒有影響。所以交叉熵在這裡是單獨對每一個節點進行計算,每一個節點只有兩種可能值,所以是一個二項分佈。前面說過對於二項分佈這種特殊的分佈,熵的計算可以進行簡化。

同樣的,交叉熵的計算也可以簡化,即
loss=−ylog(y^)−(1−y)log(1−y^)

注意,上式只是針對一個節點的計算公式。這一點一定要和單分類loss區分開來。
例子中可以計算為:
loss貓loss蛙loss鼠===−0×log(0.1)−(1−0)log(1−0.1)=−log(0.9)−1×log(0.7)−(1−1)log(1−0.7)=−log(0.7)−1×log(0.8)−(1−1)log(1−0.8)=−log(0.8)

單張樣本的loss即為loss=loss貓+loss蛙+loss鼠


每一個batch的loss就是:
loss=∑j=1m∑i=1n−yjilog(yji^)−(1−yji)log(1−yji^)

式中m為當前batch中的樣本量,n為類別數。
總結

路漫漫,要學的東西還有很多啊。
---------------------
作者:史丹利複合田
來源:CSDN
原文:https://blog.csdn.net/tsyccnh/article/details/79163834
版權宣告:本文為博主原創文章,轉載請附上博文連結!