通用的說,熵(Entropy)被用於描述一個系統中的不確定性(the uncertainty of a system)。在不同領域熵有不同的解釋,比如熱力學的定義和消息理論也不大相同。
要想明白交叉熵(Cross Entropy)的意義,可以從熵(Entropy) -> KL散度(Kullback-Leibler Divergence) -> 交叉熵這個順序入手。 當然,也有多種解釋方法[1]。
先給出一個「接地氣但不嚴謹」的概念表述:
一句話總結的話: KL散度可以被用於計算代價,而在特定情況下最小化KL散度等價於最小化交叉熵。而交叉熵的運算更簡單,所以用交叉熵來當做代價 。
我知道你現在看著有點暈,但請保持耐心繼續往下看。 *為了通俗易懂,我沒有嚴格按照數學規範來命名概念,比如文中的「事件」指的是「訊息」,望各位嚴謹的讀者理解。
1. 什麽是熵(Entropy)?
放在消息理論的語境裏面來說,就是一個事件所包含的資訊量。我們常常聽到「這句話資訊量好大」,比如「昨天花了10萬,終於在西二環買了套四合院」。
這句話為什麽資訊量大? 因為它的內容出乎意料,違反常理。 由此引出:
因此熵被定義為 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散度的數學定義:
從公式中可以看出:
換句話說,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散度的公式:
\begin{equation*} D_{KL}(A||B) = \sum_{i}P_{A}(x_i) log\bigg(\frac{P_{A}(x_i)}{P_{B}(x_i)} \bigg) = \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})
這是交叉熵公式:
\begin{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散度和交叉熵在特定條件下等價。這個發現是這篇回答的重點。
同時補充交叉熵的一些性質:
*4. 另一種理解KL散度、交叉熵、熵的角度(選讀)- 可跳過
那麽問題來了,為什麽有KL散度和交叉熵兩種演算法?為什麽他們可以用來求分布的不同?什麽時候可以等價使用?
一種消息理論的解釋是 :
對於大部份讀者,我覺得可以不用深入理解。感謝評論區@王瑞欣的指正,不知道為什麽@不到他。
一些對比與觀察:
既然等價,那麽我們優先選擇更簡單的公式,因此選擇交叉熵。
5. 機器如何「學習」?
機器學習的過程就是希望在訓練數據上 模型學到的分布 P(model) 和 真實數據的分布 P(real) 越接近越好,那麽我們已經介紹過了....怎麽最小化兩個分布之間的不同呢? 用預設的方法,使其KL散度最小 !
但我們沒有真實數據的分布,那麽只能退而求其次, 希望 模型學到的分 布和 訓練數據的分布 P(training) 盡量相同, 也就是把訓練數據當做模型和真實數據之間的代理人 。假設訓練數據是從總體中獨立同步分布采樣(Independent and identically distributed sampled)而來,那麽我們可以利用最小化訓練數據的經驗誤差來降低模型的泛化誤差。簡單說:
由此非常理想化的看法是如果 模型(左) 能夠學到 訓練數據(中) 的分布,那麽應該近似的學到了 真實數據(右) 的分布: P(model) \simeq P(training) \simeq P(real)
6. 為什麽交叉熵可以用作代價?
接著上一點說,最小化模型分布 P(model) 與 訓練數據上的分布 P(training) 的差異 等價於 最小化這兩個分布間的KL散度,也就是最小化 KL(P(training)||P(model)) 。
比照第四部份的公式:
巧的是, 訓練數據的分布A是給定的 。那麽根據 我們在第四部份說的,因為A固定不變,那麽求 D_{KL}(A||B) 等價於求 H(A,B) ,也就是A與B的交叉熵 。 得證,交叉熵可以用於計算「學習模型的分布」與「訓練數據分布」之間的不同。當交叉熵最低時(等於訓練數據分布的熵),我們學到了「最好的模型」。
但是,完美的學到了訓練數據分布往往意味著過擬合,因為訓練數據不等於真實數據,我們只是假設它們是相似的,而一般還要假設存在一個高斯分布的誤差,是模型的泛化誤差下線。
7. 總結
因此在評價機器學習模型時,我們往往不能只看訓練數據上的誤分率和交叉熵,還是要關註測試數據上的表現。如果在測試集上的表現也不錯,才能保證這不是一個過擬合或者欠擬合的模型。交叉熵比照誤分率還有更多的優勢,因為它可以和很多概率模型完美的結合。
所以邏輯思路是,為了讓學到的模型分布更貼近真實數據分布,我們最小化 模型數據分布 與 訓練數據之間的KL散度,而因為訓練數據的分布是固定的,因此最小化KL散度等價於最小化交叉熵。
因為等價,而且交叉熵更簡單更好計算,當然用它咯 ʕ•ᴥ•ʔ
[1] 不同的領域都有不同解釋,更傳統的機器學習說法是似然函數的最大化就是交叉熵。 正所謂橫看成嶺側成峰,大家沒必要非說哪種思路是對的,有道理就好 。