JOVANA
Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

資訊、熵與驚訝

驚訝是可以度量的,一旦你能度量它,分類器的預設損失就不再神秘。我們從一種簡單的感受——一個結果讓你有多吃驚——出發,搭出熵、交叉熵與KL散度。

你應該有多驚訝?

從一種人人都懂的感受開始:驚訝。如果朋友告訴你「今早太陽升起來了」,你幾乎什麼都沒學到——你本來就確定。如果他說「沙漠裡下雪了」,你會立刻坐直;那太不可能了,所以它攜帶了大量新資訊。資訊論把這種直覺變成一個數字。規則簡單又符合直覺:一個結果*越*不可能,它真的發生時就*越*令人驚訝——攜帶的資訊也*越*多。

於是我們想要一個量:當機率很小時它很大,當結果確定時它衰減到零。能辦到的選擇就是機率為p的結果的驚訝度:驚訝 = log(1/p)。當p = 1(確定)時,驚訝為log(1) = 0——毫無新意。當p極小時,1/p極大,於是驚訝很大。取以2為底的對數,就以位元為單位來度量它:一個你用一次公平擲硬幣(p = 1/2)就能猜中的結果,恰好攜帶1位元。

為什麼用對數,而不直接用1/p?因為驚訝應該能*累加*。如果兩件互不相關的事都發生了,它們的機率相乘(p·q),但直覺上你的總驚訝應該是各自驚訝之*和*。對數正是那個把乘法變成加法的函數:log(1/(p·q)) = log(1/p) + log(1/q)。正是這一條性質,使得對數在這一隅數學裡無處不在——你將看到,也包括你訓練分類器所用的損失。

熵:平均意義上的驚訝

單個結果有它的驚訝度。而一整個[[random-variable|隨機變數]]——比如明天的天氣,或一句話裡的下一個詞——有*許多*可能的結果,每個都有自己的機率。最自然的概括,就是長期來看你會感到的平均驚訝:用每個結果出現的頻率,給它的驚訝度加權求平均。這個平均值就是[[information-entropy|熵]]。熵越高,資訊源越不可預測;熵越低,就越可預測。

這正好接回本階前面講過的[[expectation-and-variance|期望]]:熵不過是驚訝的*期望值*。具體地,對於機率為p1、p2、……的各結果,熵 = pi · log(1/pi) 之和。一枚公平硬幣的熵為1位元——在兩個選項之間最不確定。一枚99%朝上的偏硬幣熵要小得多,因為多數時候你早就知道答案。一枚永遠正面朝上的硬幣熵為0:沒有任何可學的。

交叉熵:當你的模型猜錯了機率

熵假設你知道真實機率。但模型並不知道——它只有*猜測*。把真實分布記作p(自然實際怎麼做),把模型猜出的分布記作q(你的模型預測什麼)。交叉熵問的是:如果你用q的機率來度量驚訝,而結果其實是按p到來的,那麼你平均會感到多少驚訝?它就是「你相信q、而現實遵循p」所付出的平均驚訝。

關鍵事實來了,而且很溫和:交叉熵*總是不小於*真實的熵,且只有當q與p完全吻合時才與熵相等。任何不吻合都要多付驚訝。所以,如果你想讓模型的q映照現實的p,你只需把交叉熵*往下壓*——把它逼向由真實熵設下的地板。這正是訓練迴圈所做的事。

剩下的那段差距——交叉熵減去真實的熵——有它自己的名字:[[kl-divergence|KL散度]]。可以把它讀作「用錯分布所多付的*額外*驚訝」。當q = p時KL為零,q越偏離它越大,所以它表現得像一段從「你的信念」到「真相」的距離。一個誠實的提醒:它*不是*真正的距離——KL(p, q)一般不等於KL(q, p)。它是不對稱的,這正是人們說「散度」而非「度量」的原因。

為什麼交叉熵是分類問題的預設損失

現在收穫來了。一個分類器輸出標籤上的[[probability-distribution|機率分布]]——通常經由[[softmax|softmax]],它把原始分數壓成一組為正、加起來等於1的數。這就是模型的q。而單個帶標籤樣本的真相p簡單到極點:正確類別上機率為1,其餘全為0(一個「獨熱」向量)。把這個p代入交叉熵,幾乎一切都消掉了:單個樣本的損失就變成 log(1 / q_正確)——模型分給正確答案的那份驚訝。

把它讀成一種激勵。如果模型既自信又正確(q_正確接近1),驚訝接近0——幾乎不罰。如果它既自信又*錯誤*(q_正確接近0),損失會朝無窮飆升。對數狠狠懲罰自信的錯誤,獎勵有分寸的自信。在整個資料集上最小化這個損失,就是「訓練一個分類器」的日常含義——在二分類裡,它和你在評估中會遇到的[[log-loss|對數損失]]是同一回事,也是[[logistic-regression|邏輯迴歸]]內部的引擎。

它之所以是*預設*而非眾多選項之一,還有更深的理由。最小化交叉熵在數學上等同於[[maximum-likelihood-estimation|極大似然]]——選擇那組讓觀測資料最可能出現的參數,正是本階前面引入的原則。所以交叉熵不是某人隨手挑中的公式;它就是「讓訓練資料盡可能可能」寫成式子後的樣子。這份出身,加上它的梯度與softmax配合得極好,正是它成為[[loss-function|損失函數]]首選反應的原因。

# one labeled example, C classes
# logits  : raw model scores, length C
# y        : index of the true class

q = softmax(logits)          # model's predicted distribution, sums to 1
loss = -log(q[y])            # = log(1 / q[y]) = surprise on the true class

# confident & right -> q[y]~1 -> loss~0
# confident & wrong -> q[y]~0 -> loss huge
# average loss over the dataset is what training minimizes
單個樣本的交叉熵塌縮成:模型分給正確標籤的那份驚訝。

在實戰中讀懂它——以及一個提醒

現在你會到處認出這些觀念。語言模型就是透過最小化「下一個詞元是什麼?」上的交叉熵來訓練的——而[[perplexity|困惑度]],那個領域的招牌數字,不過是交叉熵取指數後,報成一個有效分支因子(「模型困惑的程度,就好像它在N個詞裡均勻亂猜」)。困惑度更低、交叉熵更低、平均驚訝更少:這是同一個量的三種視角。

還要記得前面說的KL的不對稱——它在悄悄塑造行為。當模型把機率放在真相為零之處時去罰它(一個方向的KL),和當它漏掉了確實會發生的結果時去罰它(另一個方向的KL),是不一樣的。用交叉熵訓練實際上用的是其中一個方向,這往往讓模型傾向於「覆蓋住真相」,而不是把全部賭注押在一個答案上。你不需要公式也能保留這個直覺:驚訝是貨幣,而一個好模型在誠實允許的範圍內,花得越少越好。

這就是本階最後一站的完整脈絡。驚訝是log(1/p)。熵是平均驚訝——一個源中無法迴避的不確定性。交叉熵是相信錯誤分布所付出的平均驚訝,KL散度是其中可以避免的那部分多餘,而一個分類器的訓練,就是把交叉熵往下擠——這不過是極大似然換了件外衣。手握向量、機率、微積分,如今再加上資訊,你已經可以滿懷真正的信心去讀這條階梯的其餘部分了。