為什麼交叉熵(cross-entropy)可以用於計算代價?

兩個數的差值可以表示距離,這個很好理解,但是為什麼交叉熵也可以用於計算「距離」?


通用的說,熵(Entropy)被用於描述一個系統中的不確定性(the uncertainty of a system)。在不同領域熵有不同的解釋,比如熱力學的定義和資訊理論也不大相同。

要想明白交叉熵(Cross Entropy)的意義,可以從熵(Entropy) -&> KL散度(Kullback-Leibler Divergence) -&> 交叉熵這個順序入手。當然,也有多種解釋方法[1]。

先給出一個「接地氣但不嚴謹」的概念表述:

  • 熵:可以表示一個事件A的自信息量,也就是A包含多少信息。
  • KL散度:可以用來表示從事件A的角度來看,事件B有多大不同。
  • 交叉熵:可以用來表示從事件A的角度來看,如何描述事件B。

一句話總結的話:KL散度可以被用於計算代價,而在特定情況下最小化KL散度等價於最小化交叉熵。而交叉熵的運算更簡單,所以用交叉熵來當做代價

我知道你現在看著有點暈,但請保持耐心繼續往下看。*為了通俗易懂,我沒有嚴格按照數學規範來命名概念,比如文中的「事件」指的是「消息」,望各位嚴謹的讀者理解。

1. 什麼是熵(Entropy)?

放在資訊理論的語境裡面來說,就是一個事件所包含的信息量。我們常常聽到「這句話信息量好大」,比如「昨天花了10萬,終於在西二環買了套四合院」。

這句話為什麼信息量大?因為它的內容出乎意料,違反常理。由此引出:

  • 越不可能發生的事件信息量越大,比如「我不會死」這句話信息量就很大。而確定事件的信息量就很低,比如「我是我媽生的」,信息量就很低甚至為0
  • 獨立事件的信息量可疊加。比如「a. 張三今天喝了阿薩姆紅茶,b. 李四前天喝了英式早茶」的信息量就應該恰好等於a+b的信息量,如果張三李四喝什麼茶是兩個獨立事件。

因此熵被定義為 S(x) = -sum_{i}P(x_{i})log_{b}P(x_{i})x 指的不同的事件比如喝茶, P(x_{i}) 指的是某個事件發生的概率比如和紅茶的概率。對於一個一定會發生的事件,其發生概率為1, S(x) =- log(1) * 1 = -0*1=0 ,信息量為0。

2. 如何衡量兩個事件/分布之間的不同(一):KL散度

我們上面說的是對於一個隨機變數x的事件A的自信息量,如果我們有另一個獨立的隨機變數x相關的事件B,該怎麼計算它們之間的區別?

此處我們介紹默認的計算方法:KL散度,有時候也叫KL距離,一般被用於計算兩個分布之間的不同。看名字似乎跟計算兩個點之間的距離也很像,但實則不然,因為KL散度不具備有對稱性。在距離上的對稱性指的是A到B的距離等於B到A的距離。

舉個不恰當的例子,事件A:張三今天買了2個土雞蛋,事件B:李四今天買了6個土雞蛋。我們定義隨機變數x:買土雞蛋,那麼事件A和B的區別是什麼?有人可能說,那就是李四多買了4個土雞蛋?這個答案只能得50分,因為忘記了"坐標系"的問題。換句話說,對於張三來說,李四多買了4個土雞蛋。對於李四來說,張三少買了4個土雞蛋。選取的參照物不同,那麼得到的結果也不同。更嚴謹的說,應該是說我們對於張三和李四買土雞蛋的期望不同,可能張三天天買2個土雞蛋,而李四可能因為孩子滿月昨天才買了6個土雞蛋,而平時從來不買。

KL散度的數學定義:

  • 對於離散事件我們可以定義事件A和B的差別為(2.1): egin{equation*} D_{KL}(A||B) = sum_{i}P_{A}(x_i) logigg(frac{P_{A}(x_i)}{P_{B}(x_i)} igg) = sum_{i}P_{A}(x_i)log(P_{A}(x_i ))- P_{A}(x_i)log(P_{B}(x_i)) end{equation*}
  • 對於連續事件,那麼我們只是把求和改為求積分而已(2.2)。egin{equation*} D_{KL}(A||B) = int a(x) logigg(frac{a(x)}{b(x)} igg) end{equation*}

從公式中可以看出:

  • 如果 P_A=P_B ,即兩個事件分布完全相同,那麼KL散度等於0。
  • 觀察公式2.1,可以發現減號左邊的就是事件A的熵,請記住這個發現
  • 如果顛倒一下順序求 D_{KL}(B||A),那麼就需要使用B的熵,答案就不一樣了。所以KL散度來計算兩個分布A與B的時候是不是對稱的,有「坐標系」的問題D_{KL}(A||B)
e D_{KL}(B||A)

換句話說,KL散度由A自己的熵與B在A上的期望共同決定。當使用KL散度來衡量兩個事件(連續或離散),上面的公式意義就是求 A與B之間的對數差 在 A上的期望值。

3. KL散度 = 交叉熵 - 熵?

如果我們默認了用KL散度來計算兩個分布間的不同,那還要交叉熵做什麼?

事實上交叉熵和KL散度的公式非常相近,其實就是KL散度的後半部分(公式2.1):A和B的交叉熵 = A與B的KL散度 - A的熵。 D_{KL}(A||B) = -S(A)+H(A,B)

對比一下這是KL散度的公式:

egin{equation*} D_{KL}(A||B) = sum_{i}P_{A}(x_i) logigg(frac{P_{A}(x_i)}{P_{B}(x_i)} igg) = sum_{i}P_{A}(x_i)log(P_{A}(x_i ))- P_{A}(x_i)log(P_{B}(x_i)) end{equation*}

這是熵的公式:

S(A) = -sum_{i}P_A(x_{i})logP_A(x_{i})

這是交叉熵公式:

egin{equation*} H(A,B)= -sum_{i}P_{A}(x_i)log(P_{B}(x_i)) end{equation*}

此處最重要的觀察是,如果 S(A)是一個常量,那麼 D_{KL}(A||B) = H(A,B) 也就是說KL散度和交叉熵在特定條件下等價。這個發現是這篇回答的重點。

同時補充交叉熵的一些性質:

  • 和KL散度相同,交叉熵也不具備對稱性:  H(A,B) 
e H(B,A) ,此處不再贅述。
  • 從名字上來看,Cross(交叉)主要是用於描述這是兩個事件之間的相互關係,對自己求交叉熵等於熵。即 H(A,A) = S(A) ,注意只是非負而不一定等於0。

*4. 另一種理解KL散度、交叉熵、熵的角度(選讀)- 可跳過

那麼問題來了,為什麼有KL散度和交叉熵兩種演算法?為什麼他們可以用來求分布的不同?什麼時候可以等價使用?

一種資訊理論的解釋是

  • 熵的意義是對A事件中的隨機變數進行編碼所需的最小位元組數。
  • KL散度的意義是「額外所需的編碼長度」如果我們用B的編碼來表示A。
  • 交叉熵指的是當你用B作為密碼本來表示A時所需要的「平均的編碼長度」。

對於大部分讀者,我覺得可以不用深入理解。感謝評論區@王瑞欣的指正,不知道為什麼@不到他。

一些對比與觀察:

  • KL散度和交叉熵的不同處:交叉熵中不包括「熵」的部分
  • KL散度和交叉熵的相同處:a. 都不具備對稱性 b. 都是非負的
  • 等價條件(章節3):當 A 固定不變時,那麼最小化KL散度 D_{KL}(A||B) 等價於最小化交叉熵 H(A,B) D_{KL}(A||B) = H(A,B)

既然等價,那麼我們優先選擇更簡單的公式,因此選擇交叉熵。

5. 機器如何「學習」?

機器學習的過程就是希望在訓練數據上模型學到的分布 P(model)真實數據的分布 P(real) 越接近越好,那麼我們已經介紹過了....怎麼最小化兩個分布之間的不同呢?用默認的方法,使其KL散度最小

但我們沒有真實數據的分布,那麼只能退而求其次,希望模型學到的分布和訓練數據的分布 P(training) 盡量相同,也就是把訓練數據當做模型和真實數據之間的代理人。假設訓練數據是從總體中獨立同步分布採樣(Independent and identically distributed sampled)而來,那麼我們可以利用最小化訓練數據的經驗誤差來降低模型的泛化誤差。簡單說:

  • 最終目的是希望學到的模型的分布和真實分布一致: P(model) simeq P(real )
  • 但真實分布是不可知的,我們只好假設 訓練數據 是從真實數據中獨立同分布採樣而來: P(training) simeq P(real )
  • 退而求其次,我們希望學到的模型分布至少和訓練數據的分布一致 P(model) simeq P(training)

由此非常理想化的看法是如果模型(左)能夠學到訓練數據(中)的分布,那麼應該近似的學到了真實數據(右)的分布: P(model) simeq P(training) simeq P(real)

6. 為什麼交叉熵可以用作代價?

接著上一點說,最小化模型分布 P(model) 與 訓練數據上的分布 P(training) 的差異 等價於 最小化這兩個分布間的KL散度,也就是最小化 KL(P(training)||P(model))

比照第四部分的公式:

  • 此處的A就是數據的真實分布: P(training)
  • 此處的B就是模型從訓練數據上學到的分布: P(model)

巧的是,訓練數據的分布A是給定的。那麼根據我們在第四部分說的,因為A固定不變,那麼求 D_{KL}(A||B) 等價於求 H(A,B) ,也就是A與B的交叉熵得證,交叉熵可以用於計算「學習模型的分布」與「訓練數據分布」之間的不同。當交叉熵最低時(等於訓練數據分布的熵),我們學到了「最好的模型」。

但是,完美的學到了訓練數據分布往往意味著過擬合,因為訓練數據不等於真實數據,我們只是假設它們是相似的,而一般還要假設存在一個高斯分布的誤差,是模型的泛化誤差下線。

7. 總結

因此在評價機器學習模型時,我們往往不能只看訓練數據上的誤分率和交叉熵,還是要關注測試數據上的表現。如果在測試集上的表現也不錯,才能保證這不是一個過擬合或者欠擬合的模型。交叉熵比照誤分率還有更多的優勢,因為它可以和很多概率模型完美的結合。

所以邏輯思路是,為了讓學到的模型分布更貼近真實數據分布,我們最小化 模型數據分布 與 訓練數據之間的KL散度,而因為訓練數據的分布是固定的,因此最小化KL散度等價於最小化交叉熵。

因為等價,而且交叉熵更簡單更好計算,當然用它咯 ?????


[1] 不同的領域都有不同解釋,更傳統的機器學習說法是似然函數的最大化就是交叉熵。正所謂橫看成嶺側成峰,大家沒必要非說哪種思路是對的,有道理就好


cross-entropy就是kl divergence的馬甲。kl divergence可以看作兩個概率分布的距離。


如果咱不想去深度糾結裡頭的數學,那就記住這幾個結論,一樣可以理解交叉熵的意義。我盡量回溯理解思路,如果說到題主已然理解的知識點,跳過就好:)

第一,使用交叉熵的模型,輸出一定是概率!那什麼叫輸出的是概率呢?先不考慮任意維度的輸出,就假設咱的輸出是 y = (y_1, y_2, y_3) ,也就是說,一個三維向量。那麼對合法的 y 而言,必須保證

    1. y_1+y_2+y_3=1 ,總概率必須為 1 ,這個不抽象吧。
    2. y_1, y_2, y_3 geq 0 ,概率不能為負,這個也很合理吧。

上述兩個條件粗略來看其實就是概率測度三條公理中的前兩條,不過這是題外話。

那麼,如何保證輸出一定符合這倆條件呢,因為我們的模型一定是千奇百怪,如果是神經網路,那輸出層是一個仿射變換的結果,比如說,長這樣 (0.8,-1.2,0.0) ,有正有負,和還不為 1 。所以,為了將之變成概率,我們又要引入另一個函數叫 softmax。公式我就不給了,網上一大把。若把 (0.8,-1.2,0.0) 丟到 softmax 裡頭去,結果會得到 (0.63,0.09,0.28) ,是不是和為 1 ?而且各項都大於等於 0

對三個參數是這樣,對任意 n 個參數也是這樣。很多模型中,softmax 和 cross-entropy 是不分家的,在 tensorflow 中,有一個方法就叫 softmax_cross_entropy_with_logits,意思就是對 logits 先 softmax,後 cross-entropy。所謂 logits 就是指還沒有被概率化的輸出。

第二,label 也必須是概率。這個不難理解,畢竟模型的輸出和學習的目標得用同一種「語言」,或者用數學的話說,必須在同一個空間中,才容易操作。以分類為例,一個數據集,每一個輸入,數據集都會提供你一個對應的 label。以爛大街的 MNIST 數據集為例,輸入是一張張固定大小的正方形圖片,上面有手寫的數字。每張圖片對應一個 label,取值範圍在 09 ,分別代表張圖片上寫的是啥數字。如果題主有親自操作過一些 MNIST 數據集學習的教程的話,記不記有一步操作,要將 lable 轉為 one-hot 向量。比方說,你的 label 是 5 ,那麼對應的 one-hot 形式就是

qquad (0,0,0,0,0,1,0,0,0,0)

有沒有發覺這是符合概率定義的?加和為 1 ,且都大於等於 0 。one-hot 操作從本質來說,就是把 lable 空間變換到一個概率測度空間。注意,這是一個條件概率,而且大白話版定義如下

quad l_{	ext{one-hot}} = (p_0, cdots, p_k, cdots , p_9)

quad p_k = 	ext{Pr}(	ext{the given picture is digit } k mid 	ext{given picture})

quad p_k = 1 quad 	ext{if the label tells me that the given picture is digit }k

quad p_k = 0 quad 	ext{if the label tells me that the given picture is a digit other than }k

不好意思用英文,但是 LaTex 裡頭的中文字體太難看了。。。如果你按照上面的定義,就可以把每一個 09 的 label 轉化為其 one-hot 形式,為啥那麼簡單的事情定義那麼繁瑣?這就是數學。。。不過,說好不深究數學的。不過有一點要注意,那就是提到的條件概率。包括你模型要預測的也是一個條件概率。概率的東西這兒就不展開,但是如果題主不滿足於會使用模型,而是要理解模型為什麼可行,概率論和統計是怎麼也繞不掉的內容。說概率模型統計模型已經被當代的深度學習淘汰的人就是忽略了一個事實,那怕是神經網路,也是一種概率模型。用到了 one-hot?用到了 cross-entropy? 這就是概率啊!就算一個模型沒有顯式地使用了概率,要分析其性能,從概率的角度研究也幾乎是唯一的途徑。

在人類很笨,且對世界本質含混不清的情況下,研究概率是理解現象的唯一途徑。—— 我說的

第三,在強調了模型輸出是概率,label 也是概率的前提下,我們就可以說到 cross-entropy 了。式子我也不寫了,只要記住如下幾個事實。

  1. cross-entropy 的輸入是兩個概率。
  2. 兩個概率在相同時,cross-entropy 取得的值最小。而且,離得越「遠」,結果就差得越「遠」。不信你可以試試, mathbb H(0.2, 0.2) < mathbb H(0.2, 0.5)< mathbb H(0.2, 0.8) ,多維情況也一樣, mathbb Hig((0,0,1), (0,0,1)ig) < mathbb Hig((0,0,1), (0.2,0.3,0.5)ig)。正是這樣的性質,使得 cross-entropy 可以作為一種偽距離而存在。
  3. cross-entropy 操作不對稱,即,mathbb H (0.2, 0.5) 
eq mathbb H (0.5, 0.2) 。或者說,cross-entropy 不符合距離定義。尤其,別把模型輸出和 one-hot label 掉個個兒丟到 cross-entropy 里,不然,log(0) 看計算機怎麼想。

如果不深究,那麼就是一點點思辨的過程了。既然 cross-entropy 作代價函數,它在倆概率相同的時候結果最小。那麼我們將 cross-entropy 對模型輸出做梯度下降,然後更新模型,那麼更新後的模型的輸出概率是不是離 one-hot label 更近了呢?因為相同時最小啊!如果是你面對的是一個數據集,且一次丟進模型的是多個數據,那你就求 cross-entropy 之平均,然後再求梯度下降之平均,更新後模型的概率輸出在趨勢上就離 one-hot label 更近了些。

最後,謝邀。這回答對 cross-entropy 函數怎麼來的並沒有涉及太多,這屬於資訊理論內容。但卻反覆強調了模型輸出是概率,one-hot label 是概率。在我看來,的確,如果真正理解了這點,不論用 cross-entropy,還是其他答主提到的 KL-divergence,還是使用可以定義為距離的 JS-divergence,都可以信手拈來。

如有誤,歡迎指正。


熵是什麼?設p是一個分布, -pln p 表示該種概率分布的熵,而 -ln p 表示編碼的長度。所以熵就是最小的平均編碼長度。交叉熵,就是用一種分布q去近似未知的分布p,那如何評價你選的分布q的好壞呢?就用你選定的q去編碼分布p,然後得出的編碼長度最小就表明你選擇的分布q是很好的。


熵就是不確定程度。
交叉熵,知道一個東西之後 另一個東西的不確定度。
機器學習可以看做根據特徵猜label。
看到特徵(及其變換)之後,你對label的猜測是更確定了啊,還是不確定了啊?
這還不能當loss,啥能當?


沒什麼難理解的,對於多分類問題( instance 的標籤為 1-hot-encoding,輸出為 softmax ),『負對數似然函數』 ( Negative log likelihood ) 與『交叉熵』是一回事。


通過最大似然估計推導


二分類問題的交叉熵損失函數的本質是假設數據服從以模型輸出為參數的伯努利分布的極大似然估計。

以下是導出過程。

訓練數據可以表示為 D = left( (	extbf{x}_1, y_1), (	extbf{x}_2, y_2), ..., (	extbf{x}_N, y_N) 
ight),且 y subset left{ 0,1 
ight} ,即訓練任務為一個二分類的有監督學習,並令 f left( 	extbf{x},Theta 
ight) 為對應特徵 	extbf{x} 的模型輸出, Theta 為模型參數。假設 P left( y | 	extbf{x} 
ight) 服從參數為  f left(	extbf{x},Theta 
ight) 的伯努利分布,則似然函數為 P(	extbf{y} | 	extbf{X} ) = prod_{n}^{N} Bernoulli (y_n| 	extbf{x}_n,f(	extbf{x}_n,Theta)) = prod_{n}^{N} f(	extbf{x}_n,Theta)^{P(y_n| 	extbf{x}_n)}(1-f(	extbf{x}_n,Theta)^{1 -P(y_n| 	extbf{x}_n)}) ,在 D 中, P(y_n| 	extbf{x}_n) 即為 y_n ,為表示方便以下公式都做相應替換,按照最大化對數似然推導:

argmax_Theta log{P(	extbf{y}|	extbf{X})} = log{ prod_{n}^{N} f(	extbf{x}_n,Theta)^{y_n}(1-f(	extbf{x}_n,Theta)^{1 -y_n})}

= sum_{n}^{N} y_n log{f(	extbf{x}_n,Theta)} + (1-y_n) log{(1-f(	extbf{x}_n,Theta))}

 = argmin_Theta - sum_{n}^{N} y_n log{f(	extbf{x}_n,Theta)} + (1-y_n) log{(1-f(	extbf{x}_n,Theta))} ,求平均即為交叉熵損失函數。

同理,應對多分類問題的交叉熵損失函數本質上為假設數據服從以模型輸出為參數的多項分布的極大似然估計。而應對回歸問題時, L_1 Loss和 L_2 Loss均可用極大似然估計法推得, L_1L_2 正則化項則可以通過貝葉斯估計中的最大後驗概率估計推得。


不說那些高大上的數學語言了,比如交叉熵就是計算最大似然估計之類的,你就把交叉熵理解成一個賭徒要去賭博時計算收益的方法就好了。舉個例子,你一共有100塊錢的初始總資產,賭一次投的錢占當前總資產的比例是a,贏的概率是p,贏的倍率是n,輸的話這一次投的錢就木有了,你想贏盡量多的錢,又不想破產,那就要計算每次投錢的比例a。單純收益的期望越大肯定是每次投的越多越好,但你一次投的越多,破產的幾率也越大,兩方面的考慮一綜合,比較合理的投資收益指標就是交叉熵的形式。
比如你單次投資後的總資產期望為100(1+a*(n-1))*p+100(1- a)*(1-p),假設n為2,那包含a的部分就可以寫成a*p+(1-a)*(1-p),這個的最大(或最小,和p有關,這裡假設2*p&>1)期望就是a越大越好,但這明顯不符合我們的想法,因為如果一次就把所有資產全投上,那一旦賭輸我就直接破產了,肯定不行。之所以這樣是因為上式中第二項最小也只能到零,而第一項相對來說卻很大,兩邊不成比例。怎麼解決呢?很好辦,取對數啊。變成p*ln(a)+(1-p)*ln(1-a)就好了,這樣第二項就可以變負了,破產的風險也就可以合理考慮到了。


兩個概率分布越接近 交叉熵就越小 而且易於求導當然適合當lost function


Maximum Likelyhood Estimation ----&> KL Divergence ----&> Cross Entropy ----(negative log-likelyhood of Nornal, Bernolli and Softmax distribution etc.) ----&>(MSE loss for regression, binary_cross_entropy loss for logistic regression and softmax_cross_entropy loss for multiclass classification)


KL散度定義為真實分布p(x)與模擬分布q(x)之間的相對熵, KL(p||q) = -int p(x)ln~q(x)dx - (-int p(x)ln~p(x)dx) 它表示若使用不同於真實分布的概率分布,那麼我們一定會損失編碼率,並且在傳輸時增加的平均額外信息量至少等於兩份布間的KL散度。

而交叉熵等於 p(x)~q(x) 間的KL散度減去 p(x) 的熵, p(x) 的熵固定的話那麼最小化交叉熵則代表最小化KL散度,也就相當於使損失碼率最小。。。。


摘自Bengio Deep Learning


其實很多答主都說了,再強答一波……

對於理解為什麼交叉熵成為代價函數有很多角度,但我個人沒有從交叉熵本身的性質去理解。我也認為它是由求訓練集的極大似然而推導出來的(換句話說就是找到使訓練集出現可能性最大的參數集的方式)。具體到神經網路,如果你的輸出層函數是softmax或sigmoid(最常見的分類用的輸出函數)的時候,當你把softmax或sigmoid帶入訓練集的極大似然表達式,就會得到交叉熵函數。很多論文和教材直接用了這個結論,而忽略了推導過程。

當然也可以用非極大似然的方式來估計參數,不過具體的例子我就不太了解了。

---------------------------------------------------

看了其他答主的回答,覺得從KL散度來理解也不錯。


如果是兩個數值那麼直接取差值或者平方差什麼的沒問題,但是如果是分類任務這麼做就不行了,分類任務是計算特徵關於類別的分布,真實分布和模型分布的差異便可以採用交叉熵來衡量。


有兩坨一樣重大便土在兩個坑裡,這倆坨大便的差距不僅僅是這兩個坑的距離,還要考慮到兩坨大便的形狀。

有很多方法能評價兩坨大便的不同(distance或者divergence 或者discrepency)一個正確的scoring rule 都能描述這些不同,交叉熵只是其中簡單易用的一種對數scoring rule。

當然以上這些都是後人總結,熵作為描述信息的一種方法確實是開創性的。


理論上你可以定義任何種類的loss。cross entropy剛好還是proper的。


交叉熵可以衡量兩個概率分布的差別,可以看看這個解釋交叉熵的回答
https://www.zhihu.com/question/41252833/answer/108777563


可以理解為計算概率,正確答案的對數概率越大越好。前面加個負號就可以做梯度下降了


推薦閱讀:

ICLR 2017 有什麼值得關注的亮點?
如何用簡單易懂的例子解釋條件隨機場(CRF)模型?它和HMM有什麼區別?
在 Caffe 中如何計算卷積?
卷積神經網路工作原理直觀的解釋?
在與 AlphaGo(包括 Master) 的對局中是否出現了一些人類歷史上從未想到過的著法、技巧?

TAG:人工智慧 | 機器學習 | 神經網路 | 深度學習(Deep Learning) |