M5.1 用錯的機率表下注一年會多輸多少:KL Divergence 與 Cross-Entropy
本篇重用M5.0保險為什麼存在:Convex Function 與 Jensen 不等式·M1.1從鞋子猜身高:Conditional Expectation
一張錯的天氣表
一家賭場每天對明天的天氣開盤:晴、雨、陰三種結果,你可以把手上的錢按任意比例押在三個結果上,押中的部分按賠率放大。假設賠率是公平的:押中「晴」的錢乘上 , 是賭場公告的機率表。
你手上有一張自己的機率表 ,你照它的比例下注——這是長期複利下最合理的策略(Kelly [3])。問題是真實的天氣照另一張表 出現,而你不知道。
一年後,你的財富會比一個知道真實 並照 下注的人差多少?請先用直覺回答:這個差距會是零、是一個常數、還是每天累積?它會不會因為你錯的方向不同而差很多——比方說「把 30% 的雨天當成 10%」和「把 10% 的雨天當成 30%」,哪個更傷?寫下你有多確定。
課堂提問Q1
翻成數學。每天的隨機變數是什麼?「財富」怎麼隨天數變化?「比知道 的人差多少」要比的是哪個量?
先想一想,再展開看整理後的答案
課堂上會先把每天的天氣寫成隨機變數 ,獨立、分佈 。照 下注,若第 天出現 ,你押在 上的比例是 ,賠率是 ,所以財富乘上 。一年後:
複利讓「相乘」變成 的「相加」,長期平均後每天的成長率是一個期望值——對真實分佈 取期望,因為天氣照 出現。
知道 的人用同一個式子,把 換成 。兩人每天成長率的差:
賭場的 消掉了——差距只跟你的表 與真實的 有關。這個量就是這一篇的物件。它每天累積:一年後兩人財富的 差是它的 365 倍。
先抓住這個畫面:每天多輸一點點
想像兩個人並排坐在賭場,一年裡看到同一串天氣。知道 的人每天的財富曲線( 座標)是一條有斜率的直線加上抖動;你的曲線也是一條直線加抖動,但斜率低了一個固定的量。兩條線之間的縫隙以固定速度張開。
那個固定的量,就是你「用錯表」的代價:每一天、平均而言,你比他少賺 單位的 財富。它不是一次性的罰金,是每天都要付的租金——租的是「你不知道的那部分真相」。
寫成數學:KL、非負、與 cross-entropy
定義。 兩個分佈 (同一個樣本空間)之間的 Kullback–Leibler divergence:
連續分佈把和換成積分。讀法:真相是 ,你以為是 ,每次觀測平均多付的 代價。
非負性(兩行)。 把 寫成 , 是 convex(M5.0),Jensen 說
等號成立 ⟺ Jensen 的等號 ⟺ 是常數( strictly convex)⟺ 。用錯表永遠有代價,只有表完全對才不用付。 這就是為什麼 KL 可以當「距離」用——雖然它不是真正的距離(下面會看到)。
Cross-entropy 與 entropy。 把 拆開:
只跟真相有關,是「就算知道 也逃不掉的不確定性」(賭場那條線的斜率上限); 是你實際付的。所以 cross-entropy 逃不掉的部分 用錯表多付的部分。當我們只能動 時,最小化 與最小化 是同一件事——這就是為什麼「cross-entropy loss」和「讓模型分佈接近資料分佈」是一體的兩面。
不對稱。 ,而且差別不是技術性的。看兩種錯:
- 太小而 不小——你以為某件事幾乎不會發生,它卻常發生。 很大,乘上不小的 , 爆炸( 時趨近 )。這是「押太少在會發生的事上」——賭場裡這叫破產。
- 太大而 很小——你把機率浪費在不會發生的事上。 是負的,但乘上很小的 ,貢獻有限。 對這種錯很寬容。
把 對調,罰的方向就對調: 對「 在 為零的地方放了質量」爆炸,對「 漏掉 的某一塊」寬容。選哪個方向,就是選要對哪種錯嚴格。
展開細節KL 不是距離:不對稱、不滿足三角不等式,但有一個更好的性質
距離(metric)要對稱、要滿足三角不等式;KL 兩者都不滿足。它也不是「差多少」的唯一選擇——total variation、Hellinger、Wasserstein 都是。KL 的特別之處有兩個。第一,它有上面那個「每次觀測的 log 代價」的操作意義(Kelly 賭注、編碼長度:用 q 設計的碼去編 p 產生的訊息,平均多用 KL 個 nat)。第二,它對獨立乘積可加:KL(p₁p₂ ‖ q₁q₂) = KL(p₁‖q₁) + KL(p₂‖q₂)——這正是「365 天的代價是一天的 365 倍」。可加性是 log 帶來的,任何不用 log 的距離都沒有。
另一個常用的事實:KL(p‖q) ≥ ½‖p − q‖₁²(Pinsker 不等式)。所以 KL 小 ⟹ 兩個分佈在任何事件上的機率差都小;但反過來不成立——total variation 很小時 KL 仍可能是無限大(只要 q 在某個 p 不為零的點上是零)。
回到賭場:直覺對了一半
回答起點問題。差距不是零、不是常數,是每天累積:一年後 財富差 。用 、 算:
一年 nat——你的財富是他的 倍。三項裡第二項(把 30% 的雨天當成 10%)貢獻了全部;把 20% 的陰天高估成 30% 那一項甚至是負的。直覺說「兩種錯都傷」——對,但傷的程度差了一個數量級,而且方向是明確的:低估會發生的事,比高估不會發生的事貴得多。
反過來的錯——真相 、你的表 ,也就是把 10% 的雨天當成 30%:。比 小——同樣是「雨天差 20 個百分點」,方向不同代價不同,這就是不對稱。
判斷依賴的假設:天氣真的照一個固定的 獨立出現(大數法則才成立),以及你照 的比例全額下注(Kelly 策略;若你只押一部分,代價按比例縮小,但排序不變)。
回到賭場:跑一年,然後把某個 壓到零
import numpy as np
rng = np.random.default_rng(0)
p = np.array([0.5, 0.3, 0.2]); q = np.array([0.6, 0.1, 0.3])
kl = lambda a, b: np.sum(a * np.log(a / b))
print(kl(p, q), kl(q, p)) # 0.157 vs 0.121:不對稱
x = rng.choice(3, size=(2000, 365), p=p) # 2000 個「一年」,每年 365 天真實天氣
gap = np.log(p[x]).sum(1) - np.log(q[x]).sum(1) # 知道 p 的人 − 照 q 下注的人(log 財富差)
print(gap.mean() / 365, gap.std() / 365) # ≈ 0.158,抖動 ≈ 0.03:每天多輸 KL
# 破壞:把雨天的機率壓到幾乎零
q_bad = np.array([0.7, 1e-6, 0.3 - 1e-6])
print(kl(p, q_bad)) # ≈ 3.5 nat/天:每個雨天輸掉 3×10⁵ 倍
模擬 2000 個「一年」,每天平均多輸 nat、與公式一致,抖動是 (一年 365 天的隨機性)。把雨天的機率壓到 :KL 跳到 nat/天——每個雨天你的財富乘上 ,一年約 110 個雨天,破產。理論不只說「用錯表會輸」,還說出哪一格錯最貴、貴多少。
先消化一下
參考文獻
- Cover, T. M., Thomas, J. A. Elements of Information Theory. Wiley, 2nd ed., 2006.(第 2.3 節 relative entropy 的定義、第 2.6 節非負性(information inequality)、第 6 章 gambling and data compression:Kelly 賭注與「多輸 KL」的推導、第 11.6 節 Pinsker 不等式。)
- Kullback, S., Leibler, R. A. On Information and Sufficiency. Annals of Mathematical Statistics 22(1), 1951.(原始出處。)
- Kelly, J. L. A New Interpretation of Information Rate. Bell System Technical Journal 35(4), 1956.(照機率比例下注使長期成長率最大;用錯表的損失。)
- MacKay, D. J. C. Information Theory, Inference, and Learning Algorithms. Cambridge University Press, 2003.(第 2 章:entropy、cross-entropy 與 KL 的直覺解釋與練習。)