主題:物理概念的熵
熵(entropy)是物理中的一個概念。如下圖,水有三種狀態:固態、液態和氣態,分別以冰、水和水蒸氣的形式存在。
它們具有不同的熵值:
現在你大體有個感覺,越不穩定的東西具有的熵值越大。
世界處處充滿不確定性,從不確定到確定肯定是得到了額外的信息。從計算機專業術語來講,比特(BIT, Binary Digit)是衡量信息的單位。
講到這裡小孩可能聽不懂了,那麼就先不嚴謹的認為,比特可用 0 或 1 代表,而
傳遞 1 比特信息 = 將不確定性減半
主題:等概率事件的信息量
從物理切換到體育,假設馬賽克隊的哈登每次進攻,50% 機會投籃,50% 的機會灌籃,如下圖所示。
如果我預測他會投籃,或他會灌籃
=>
我都把兩種情況減少到了一種情況,
=>
我將不確定性減半
=>
我發出 1 比特的信息
計算公式
log2(2) = log2(1/50%) = 1
咦?信息(1 比特)和概率(50%)聯繫起來了。
類比一下:
2 種情況,每種發生的概率是 1/2 = 1/21,預測任意一種情況發出 1 比特信息
4 種情況,每種發生的概率是 1/4 = 1/22,預測任意一種情況發出 2 比特信息
8 種情況,每種發生的概率是 1/8 = 1/23,預測任意一種情況發出 3 比特信息
...
2N 種情況,每種發生的概率是 1/2N,預測任意一種情況發出 N 比特信息
主題:不等概率事件的信息量
等概率發生的事件理解起來容易,那如果哈登每次進攻,75% 機會投籃,25% 的機會灌籃呢?如下圖所示。
這時我們可以把它等價想像成有四個事件,3 個投籃事件和 1 個灌籃事件。
那麼
如果平均來看,
75%×0.42 + 25%×2 = 0.81
我發出的信息量是 0.81 比特。
主題:熵 = 平均信息量
現在我們可以歸納一下,對於有 p 概率發生的事件,預測該事件發生等價於發出 log2(1/p) 比特信息,因為 log2(1/x) = - log2(x),我們可以將信息量寫成
信息量 = - log2(p)
考慮到所有事件,平均信息量的公式為(期望公式)
平均信息量 = -∑i pi×log2(pi)
平均信息量就是資訊理論中的熵!用符號 H(p) 表示(粗體 p 代表 p1, p2, ..., pn),因此我們有
H(p) = -∑i pi×log2(pi)
主題:等概率事件編碼
某天我在客戶那邊做項目,看不了 NBA 直播,只能通過在美國的朋友小明發簡訊直播,他會告訴我哈登每次進攻的手段:三分、上籃、灌籃、兩分。
但是小明用二進位密碼和我交流,我收到的簡訊是下面這樣子的:
0 1 0 0 1 0 0 0
為了理解簡訊的真實含義,我需要一個解碼錶,如下:
這樣,我就可以把小明傳的密碼分段,然後將每段密碼在解碼錶中找到對應的動作,因此 01001000 就解碼成上籃三分灌籃三分。
假設哈登兩分、三分、上籃、灌籃這四個動作是等概率發生,那面我們可以給編碼長度(橫軸)和動作頻率(縱軸)做一個可視化,如下圖。
圖中彩色面積之和就表示每次簡訊說一個動作所需要的密碼的期望長度,顯然在這種情況下,期望長度為 2 比特。
主題:不等概率事件編碼
如果哈登進攻手段(兩分、三分、上籃、灌籃)不是等概率發生呢?我們知道哈登最喜歡投三分(1/2 時間),再就是上籃(1/4 時間),而投兩分(1/8 時間)和上籃(1/8 時間)比較少。
每個動作我們還是用長度為 2 的密碼編碼時,那麼最後得到的期望長度還是 2 比特,如下圖所示。
你要知道從小明美國從發簡訊很貴啊,按編碼長度收錢的,他可以做的更好一點麼(即編碼更短一些)?先看下圖。
現在每次簡訊的期望密碼長度變成了 1.75 比特,好過 2 比特。
其實我們做法很簡單,就
對於頻率高的動作(三分),我們用短編碼(0)
對於頻率低的動作(兩分),我們用短編碼(111)
因此上面上籃三分灌籃三分的編碼為 10 0 111 100。
問題來了,當解碼的時候,我怎麼把這一串編碼拆分為對應到每個動作的一個個編碼呢?如果每個動作的編碼長度都一樣,我那還可以等分,但現在每個每個動作的編碼長度都不一樣。
別問,問就是下節告訴你(儘管不情願)!
主題:資訊理論
正式了解一下編碼:
長度為 1 的編碼有 2 個:{0, 1}
長度為 2 的編碼有 4 = 22 個:{00, 01, 10, 11}
...
長度為 N 的編碼有 2N 個:{太多了,不想寫了}
每次只要加 1 比特,編碼種數就翻倍。如下圖。
如果每個編碼長度相等,那麼一串編碼就有唯一的解碼方式。比如 01101110 就可以解碼成 01-10-11-10,簡單。
如果每個編碼長度不相等,那麼一串編碼可以用同解碼方法,比如 01101110 可以解碼成以下兩種(其實有很多種)
0 - 11 - 01 - 110
01 - 110 - 111 - 0
這樣不就亂套了,必須採取限制,有個規則叫 prefix codes,就是任何編碼都不能是其他編碼的前綴。舉例
如果你用了 0,你就不能再用以 0 開頭的其他編碼,如 01, 001, 011 ...
如果你用了 01,你就不能再用以 01 開頭的其他編碼,如 011, 011111 ...
從上圖可知
如果你用了 0,你失去了 1/2 的編碼空間了
如果你用了 01,你失去了 1/4 的編碼空間了
這就是代價,這需要權衡,當你對一個動作用了短編碼,你就需要對其他動作用個長編碼。
下圖就是一種編碼,而且是最優編碼(這個就不證明了,需要用到拉格朗日算子,目測沒有小孩可以懂)。
這樣我們就給每一個進攻動作一個密碼:
兩分 - 0
三分 - 10
上籃 - 110
灌籃 - 111
用上面一串密碼來編碼不會有任何歧義了。
主題:複習一下熵
現在我們知道最優編碼長度就是熵(通常上面一節解釋,希望現在可以秒懂熵的公式)。
無論怎麼修改編碼,如果一個隨機事件的概率定下來了,那麼用於交流該事件用的平均編碼長度不會低於基於該事件分布的熵。
如果很確定會發生什麼事,那麼就根本沒有發送信息的必要。
如果某件事有 2 種可能,概率分別為 50%,那麼只需要發送 1 比特。
如果有 64 種可能,每種發生的可能性都一樣,那麼平均需要 6 比特。
實際上,如果這些可能性中,每件事發生的概率相對集中,那麼所需要的平均編碼長度就更短,而如果概率相對分散,那麼需要的平均編碼長度就更長。均勻分布需要的平均編碼長度最長。
主題:交叉熵
小明通過研究哈登的歷史進攻動作發生頻率(三分 1/2,上籃 1/4,灌籃和兩分 1/8),做了一套編碼(定義為哈登編碼),每次傳遞一次信息只用 1.75 比特。
現在我又想讓小明告訴我威少的下一個進攻動作,還可以用哈登編碼來傳遞信息嗎?威少的歷史進攻動作發生頻率如下:
下圖對比一下哈登和威少的進攻動作頻率圖。
這樣,如果用哈登編碼來發送威少動作分布的信息,得到信息平均編碼長度就叫做交叉熵。
反過來,如果用威少編碼來發送哈登動作分布的信息,得到信息平均編碼長度就也叫做交叉熵。
正規定義:使用專門為另一個分布製作的密碼錶來發送某個分布中事件的信息,此時信息的平均編碼長度定義為交叉熵(cross-entropy)。
把哈登動作分布稱為 p 分布,把威少動作分布稱為 q 分布,那麼 p 分布對 q 分布的交叉熵公式如下
而 q 分布對 p 分布的交叉熵公式如下(把 p 和 q 位置反過來)
熵和交叉熵的總結在下圖。
根據上面公式計算各種熵和交叉熵,得到
用哈登編碼傳遞哈登進攻信息 H(p) = 1.75 比特
用哈登編碼傳遞威少進攻信息 Hp(q) = 2.25 比特
用威少編碼傳遞威少進攻信息 H(q) = 1.75 比特
用威少編碼傳遞哈登進攻信息 Hq(p) = 2.375 比特
我們發現兩個規律:
熵小於交叉熵(符合熵是最優編碼的結論)
H(p) = Hp(p)< Hq(p)
H(q) = Hq(q) < Hp(q)
交叉熵不對稱(不直觀,接受吧少年)
Hq(p) ≠ Hp(q)
熵比交叉熵要小,那兩者之間的差距是什麼?看下節。
主題:KL 散度
Kullback-Leibler 散度(KL 散度)是熵與交叉熵之間的差值。稱之為散度而不是距離是因為距離是對稱的,而散度可以是不對稱的。
回到我們的場景,把哈登動作分布稱為 p 分布,把威少動作分布稱為 q 分布,那麼 p 分布對 q 分布的 KL 散度定義為
而 q 分布對 p 分布的 KL 散度定義為
上面 log2(q(x)/p(x)) 或 log2(p(x)/q(x)) 實際上是描述編碼每個進攻動作時兩種不同的編碼之間的長度差異。
分布 p 和 q 差別越大,那麼之間的 KL 散度 KLq(p) 和 KLp(q) 也就越大。
最後看看湖人隊的麥基,他進攻手段只有灌籃,如下圖所示。
我不需要做什麼預測(不需要發出任何信息),因此麥基 100% 會灌籃,根據公式我們有
H(p) = - 0×log20 - 1×log21 = 0
我們知道 log21 = 0,而且需要定義 log20 = 0。
如果某件事本身越不確定,而當你知道發生了什麼時,你得到的信息也就越多。
交叉熵,即使用針對另一分布製作的密碼錶對某個分布內的事件進行通訊時的長度,其組成分為兩部分:
使用針對本分布密碼錶進行通訊時所需的最短平均編碼長度,即熵
因使用針對其他分布的密碼錶而導致的多出的部分,即 KL 散度
數學表達式如下:
交叉熵p(q) = 熵(q) + 散度p(q)
交叉熵q(p) = 熵(p) + 散度q(p)
最後提一下機器學習用的熵公式裡面的對數都是以 e 為底,即 ln(),它和以 2 為底的對數隻差一個大於零的常數項,我們有
ln(x) = log2(x) / log2e = c×log2(x)
因此在做極值問題時,不會對結果有什麼影響。