機(jī)器學(xué)習(xí)小知識(shí): 圖解熵、交叉熵和 KL-散度
1什么是熵?
首先,本文指的熵是指信息熵。想要明白熵的確切含義,先讓我們了解一下信息論的一些基礎(chǔ)知識(shí)。在這個(gè)數(shù)字時(shí)代,信息由位(即比特,由 0 和 1)組成。在通信時(shí),有些位是有用的,有些是冗余的,有些是錯(cuò)誤,依此類推。當(dāng)我們傳達(dá)信息時(shí),我們希望向收件人發(fā)送盡可能多的有用信息。
在 Claude Shannon 的論文《通信的數(shù)學(xué)理論》(1948)中,他指出,傳輸 1 比特的信息意味著將接收者的不確定性降低 2 倍。
讓我們來看看他說的意思。例如,考慮一個(gè)天氣狀況隨機(jī)的地方,每天可能有 50% 的機(jī)率是晴天或陰雨。

現(xiàn)在,如果氣象站告訴你明天要下雨,那么他們將不確定性降低了 2 倍。起初,有兩種可能,但在收到氣象站的信息后,就只有一種可能了。在這里,氣象站向我們發(fā)送了一點(diǎn)點(diǎn)有用的信息,無論他們?nèi)绾尉幋a這些信息,這都是事實(shí)。
即使發(fā)送的信息是多雨(Rainy),并且每個(gè)字符占用一個(gè)字節(jié),消息總的大小也相當(dāng)于 40 比特,但是它們?nèi)匀恢粋鬟_(dá)了 1 比特的有用信息。
假設(shè)天氣有 8 種可能的狀態(tài),所有可能性都相同。

現(xiàn)在,當(dāng)氣象站為你提供第二天的天氣時(shí),它們會(huì)將不確定性降低了 8 倍。由于每個(gè)事件的發(fā)生機(jī)率為 1/8,因此降低因子為 8。

但是,如果不同天氣的可能性不一樣該怎么辦呢?
假設(shè)有 75% 的概率是晴天,25% 的概率是下雨。

現(xiàn)在,如果氣象站說第二天要下雨,那么不確定性就會(huì)降低 4 倍,即 2 個(gè)比特信息。減少的不確定性是事件概率的倒數(shù)。在這種情況下,25% 的倒數(shù)是 4,以 2 為底的
解讀
原來憑空猜下雨,你只有 1/4 把握,得到天氣預(yù)報(bào)后現(xiàn)在的把握是 1 了。確定性提升到 4 倍,或者說不確定性降低到 4 倍。 原來猜晴天,你有 3/4 把握,得到天氣預(yù)報(bào)后現(xiàn)在的把握是 1 了。確定性提升到 4/3 倍,或者說不確定性降低到 4/3 倍。
2信息熵
我們經(jīng)常會(huì)說,某個(gè)新聞的信息量好大。那么這個(gè)信息量到底怎么定義呢?所含的文字?所表達(dá)的內(nèi)容?貌似并不好定義。
可以這么來理解,對(duì)某個(gè)事件由不確定到確定就得到了所謂的信息量,那么如何來量化它呢?即這個(gè)信息量到底有多大呢?這個(gè)就需要對(duì)不確定到確定這個(gè)轉(zhuǎn)化作量化了。首先看看怎么量化不確定性。通過前文我們知道,事件概率越大,不確定性自然就越小,再結(jié)合事件是獨(dú)立的這個(gè)前提。信息量應(yīng)該滿足下面這些條件,
信息量跟事件的概率值成反比,即 。概率越大的事件確定性越大,因此由不確定到確定的轉(zhuǎn)化所含的信息量越小。 兩個(gè)獨(dú)立事件所對(duì)應(yīng)的信息量應(yīng)等于各自信息量之和,因?yàn)橄嗷ゲ挥绊?,所謂的可加性,即 。
滿足這兩個(gè)條件的常見函數(shù)有嗎?答案是肯定的,比如
這個(gè)正是 Shannon 采用的函數(shù)。來一小段 Python 代碼繪制一下這個(gè)函數(shù),
#?compare?probability?vs?information?entropy
from?math?import?log2
from?matplotlib?import?pyplot
#?list?of?probabilities
probs?=?[0.1,?0.2,?0.3,?0.4,?0.5,?0.6,?0.7,?0.8,?0.9,?1.0]
#?calculate?information
info?=?[-log2(p)?for?p?in?probs]
#?plot?probability?vs?information
pyplot.plot(probs,?info,?marker='.')
pyplot.title('Probability?vs?Information')
pyplot.xlabel('Probability')
pyplot.ylabel('Information')
pyplot.show()
結(jié)果見下圖,對(duì)照一下圖像來更好地理解一下這個(gè)函數(shù)吧。

好了,接下來我們就用這個(gè)函數(shù)來計(jì)算信息熵。熵,從數(shù)學(xué)上看,衡量的是一種期望值,即隨機(jī)變量多次試驗(yàn)后所傳遞的信息量的平均值。假設(shè)離散隨機(jī)變量對(duì)應(yīng)的分布為
這里用的都是以 2 為底的對(duì)數(shù),也因此信息量對(duì)應(yīng)的單位稱為比特(bit)。下面我們回到前文的例子。

如果氣象站說第二天是晴天,那么我們將獲得 0.41 比特的信息量。因此,平均而言,我們將從氣象站獲得多少信息量呢?
好吧,明天有 75% 的機(jī)率是晴天,這會(huì)給你 0.41 比特的信息,明天有 25% 的機(jī)率會(huì)下雨,它為給你提供 2 比特的信息,對(duì)應(yīng)于下圖

平均而言,我們每天從氣象站獲得 0.81 比特的信息。因此,我們把剛剛計(jì)算出的平均值稱為信息熵。這很好地衡量了事件的不確定性。
希望熵的公式現(xiàn)在完全有了意義。它衡量的是你每天收到天氣預(yù)報(bào)時(shí)得到的平均信息量。通常,它給出了我們從給定的概率分布
如果我們生活在每天陽光明媚的沙漠中,平均來說,每天我們不會(huì)從氣象站獲得太多信息。熵值將接近于零。另一方面,如果每天的天氣情況變化很大,熵值將很大。
3交叉熵
現(xiàn)在,讓我們談?wù)劷徊骒?。可以將它看成平均信息長度。比如上面例子中,考慮到有 8 種可能的天氣狀況,它們的可能性均等,可以使用 3 個(gè)比特的信息對(duì)每種狀況來編碼。

如圖所示,這里的平均信息長度為 3,這就是這個(gè)例子的交叉熵。
但是現(xiàn)在,假設(shè)你住在陽光充足的地區(qū),天氣的概率分布并不均勻,具體如下圖所示,

每天都有 35% 的機(jī)率是晴天,雷雨的可能性只有 1%。因此,我們可以計(jì)算該概率分布的熵,得,
請注意,此處使用的是以 2 為底的對(duì)數(shù)。
因此,氣象站平均發(fā)送 3 個(gè)比特信息,但是接收者僅獲得 2.23 個(gè)有用的比特信息。那么,是不是說明我們還可以做得更好呢?
例如,像下面這樣來更改編碼,

現(xiàn)在,我們只使用 2 個(gè)比特信息表示晴天或部分晴天,使用 3 個(gè)比特信息表示多云和大部分多云,使用 4 個(gè)比特信息表示中雨和小雨,使用 5 個(gè)比特信息表示大雨和雷暴。對(duì)天氣坐這樣的編碼方式是不會(huì)引起歧義的,例如,你鏈接多條消息,則只有一種方法可以解釋比特流。例如,01100 只能表示部分晴天(01),然后是小雨(100)。因此,如果我們計(jì)算該站每天發(fā)送的平均比特?cái)?shù),則可以得出,
這是我們新的和改進(jìn)的交叉熵,它比以前的 3 個(gè)比特更好?,F(xiàn)在,假設(shè)我們在不同的地方使用相同的代碼,那兒的天氣是相反的,多雨。

現(xiàn)在,如果我們計(jì)算交叉熵,
我們得到 4.58 個(gè)比特,大約是熵的兩倍。平均而言,該站發(fā)送 4.58 個(gè)比特信息,但只有 2.23 個(gè)比特信息對(duì)接收者來說是有用的。每條消息發(fā)送的信息量是必要信息的兩倍。這是因?yàn)槲覀兪褂玫拇a對(duì)天氣分布做出了一些隱含的假設(shè)。例如,當(dāng)我們在晴天使用 2 個(gè)比特信息時(shí),我們含蓄地預(yù)測了晴天的概況為 25%。這是因?yàn)?
同樣,我們計(jì)算所有的天氣情況。

分母中 2 的冪對(duì)應(yīng)于用于傳輸信息的比特?cái)?shù)。很明顯,預(yù)測分布
因此,現(xiàn)在我們可以將交叉熵(
請注意,本示例中使用的對(duì)數(shù)均是以 2 為底的。
正如你所見,除了我們在這里使用預(yù)測概率的對(duì)數(shù)外,它看起來與熵的等式非常相似。如果我們的預(yù)測是完美的,那就是預(yù)測分布等于真實(shí)分布,那么交叉熵就等于熵。但是,如果分布不同,交叉熵就會(huì)比熵更大一些,因?yàn)槎嗔艘恍┍忍?。交叉熵超過熵的數(shù)量,被稱為相對(duì)熵,或更通常稱為 Kullback-Leibler Divergence(KL-散度)??偨Y(jié)一下,簡而言之,
從上面的例子中,我們得到
4應(yīng)用
現(xiàn)在,讓我們在實(shí)際應(yīng)用中來用一用交叉熵。比如,我們正在訓(xùn)練一個(gè)圖像分類器,對(duì)看起來比較相似的不同動(dòng)物進(jìn)行分類,例如浣熊啊、小熊貓啊、狐貍之類等等。

因此,對(duì)于可能的 7 個(gè)類別中的每一個(gè)類別,分類器會(huì)分別給出一個(gè)概率,即所謂的預(yù)測分布。由于這是有監(jiān)督的學(xué)習(xí)問題,因此我們是知道真實(shí)分布的。
在上面的示例中,我拍了一只浣熊的照片,因此在真實(shí)分布中,浣熊類的概率應(yīng)該為 100%,其他類的概率為 0。我們可以將這兩個(gè)分布之間的交叉熵作為成本函數(shù),稱為交叉熵?fù)p失。
這只是我們前面看到的等式,除了它通常使用自然對(duì)數(shù)而不是 以 2 為底的對(duì)數(shù)。對(duì)于訓(xùn)練而言,這無關(guān)緊要,因?yàn)橐?2 為底的對(duì)數(shù)
因此,當(dāng)類別概率被稱為一個(gè)獨(dú)熱編碼向量(這意味著一個(gè)類別具有 100% 概率,其余類別均為 0%)時(shí),交叉熵只是真實(shí)類別的估計(jì)概率的負(fù)對(duì)數(shù)。
在這個(gè)例子中,交叉熵為
現(xiàn)在,你可以看到,當(dāng)對(duì)真實(shí)類別的預(yù)測概率接近 0 時(shí),成本函數(shù)可能會(huì)非常大。但是,當(dāng)預(yù)測概率接近 1 時(shí),成本函數(shù)將接近 0。因此,我們需要對(duì)每個(gè)類使用更多的例子來訓(xùn)練分類器,以減少損失。
5小結(jié)
我們以氣象站更新第二天的天氣為例,了解了香農(nóng)信息理論的概念。然后我們將其與熵、交叉熵相關(guān)聯(lián)。最后,我們使用一個(gè)例子看了下交叉熵?fù)p失函數(shù)的實(shí)際用法。我希望本文能幫大家弄清熵、交叉熵和 KL-散度以及他們之間的聯(lián)系。
- 完 -
?參考資料?
Hands-On Machine Learning with Scikit-Learn and TensorFlow: https://www.oreilly.com/library/view/hands-on-machine-learning/9781491962282/
[2]Entropy, Cross-Entropy, and KL-Divergence Explained: https://towardsdatascience.com/entropy-cross-entropy-and-kl-divergence-explained-b09cdae917a
[3]A Gentle Introduction to Information Entropy: https://machinelearningmastery.com/what-is-information-entropy
[4]Entropy_information_theory: https://en.wikipedia.org/wiki/Entropy_information_theory

