當前位置: 華文問答 > 數碼

為什麽交叉熵(cross

2017-09-13數碼

通用的說,熵(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): \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*}
  • 對於 連續事件 ,那麽我們只是把求和改為求積分而已(2.2)。\begin{equation*} D_{KL}(A||B) = \int a(x) log\bigg(\frac{a(x)}{b(x)} \bigg) \end{equation*}
  • 從公式中可以看出:

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

    \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散度和交叉熵在特定條件下等價。這個發現是這篇回答的重點。

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

  • 和KL散度相同,交叉熵也不具備對稱性: H(A,B) \ne 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] 不同的領域都有不同解釋,更傳統的機器學習說法是似然函數的最大化就是交叉熵。 正所謂橫看成嶺側成峰,大家沒必要非說哪種思路是對的,有道理就好