交叉熵是分類問題中最常用的損失函數之一。但是由于如今有大量容易上手的現成庫和架構,我們大多數人常常在沒有真正了解熵的核心概念的情況下,就可以熟練地解決問題。 在本文中,讓我們研究一下熵這個概念背後的基本直覺,并将其與交叉熵、KL-散度相關聯。 我們還将使用交叉熵作為損失函數,結合一個執行個體來看看它在分類問題中的應用。
1什麼是熵?
首先,本文指的熵是指資訊熵。想要明白熵的确切含義,先讓我們了解一下資訊論的一些基礎知識。在這個數字時代,資訊由位(即比特,由 0 和 1)組成。在通信時,有些位是有用的,有些是備援的,有些是錯誤,依此類推。當我們傳達資訊時,我們希望向收件人發送盡可能多的有用資訊。
在 Claude Shannon 的論文《通信的數學理論》(1948)中,他指出,傳輸 1 比特的資訊意味着将接收者的不确定性降低 2 倍。
讓我們來看看他說的意思。例如,考慮一個天氣狀況随機的地方,每天可能有 50% 的機率是晴天或陰雨。
現在,如果氣象站告訴你明天要下雨,那麼他們将不确定性降低了 2 倍。起初,有兩種可能,但在收到氣象站的資訊後,就隻有一種可能了。在這裡,氣象站向我們發送了一點點有用的資訊,無論他們如何編碼這些資訊,這都是事實。
即使發送的資訊是
多雨(Rainy)
,并且每個字元占用一個位元組,消息總的大小也相當于 40 比特,但是它們仍然隻傳達了 1 比特的有用資訊。
假設天氣有 8 種可能的狀态,所有可能性都相同。
現在,當氣象站為你提供第二天的天氣時,它們會将不确定性降低了 8 倍。由于每個事件的發生機率為 1/8,是以降低因子為 8。
但是,如果不同天氣的可能性不一樣該怎麼辦呢?
假設有 75% 的機率是晴天,25% 的機率是下雨。
現在,如果氣象站說第二天要下雨,那麼不确定性就會降低 4 倍,即 2 個比特資訊。減少的不确定性是事件機率的倒數。在這種情況下,25% 的倒數是 4,以 2 為底的 得到 2。是以,我們得到 2 個比特的有用資訊。
解讀
- 原來憑空猜下雨,你隻有 1/4 把握,得到天氣預報後現在的把握是 1 了。确定性提升到 4 倍,或者說不确定性降低到 4 倍。
- 原來猜晴天,你有 3/4 把握,得到天氣預報後現在的把握是 1 了。确定性提升到 4/3 倍,或者說不确定性降低到 4/3 倍。
2資訊熵
我們經常會說,某個新聞的資訊量好大。那麼這個資訊量到底怎麼定義呢?所含的文字?所表達的内容?貌似并不好定義。
可以這麼來了解,對某個事件由不确定到确定就得到了所謂的資訊量,那麼如何來量化它呢?即這個資訊量到底有多大呢?這個就需要對不确定到确定這個轉化作量化了。首先看看怎麼量化不确定性。通過前文我們知道,事件機率越大,不确定性自然就越小,再結合事件是獨立的這個前提。資訊量應該滿足下面這些條件,
- 資訊量跟事件的機率值成反比,即 。機率越大的事件确定性越大,是以由不确定到确定的轉化所含的資訊量越小。
- 兩個獨立事件所對應的資訊量應等于各自資訊量之和,因為互相不影響,所謂的可加性,即 。
滿足這兩個條件的常見函數有嗎?答案是肯定的,比如
這個正是 Shannon 采用的函數。來一小段 Python 代碼繪制一下這個函數,
結果見下圖,對照一下圖像來更好地了解一下這個函數吧。
好了,接下來我們就用這個函數來計算資訊熵。熵,從數學上看,衡量的是一種期望值,即随機變量多次試驗後所傳遞的資訊量的平均值。假設離散随機變量對應的分布為 ,那麼該離散随機變量的資訊熵定義為,
這裡用的都是以 2 為底的對數,也是以資訊量對應的機關稱為比特(bit)。下面我們回到前文的例子。
如果氣象站說第二天是晴天,那麼我們将獲得 0.41 比特的資訊量。是以,平均而言,我們将從氣象站獲得多少資訊量呢?
好吧,明天有 75% 的機率是晴天,這會給你 0.41 比特的資訊,明天有 25% 的機率會下雨,它為給你提供 2 比特的資訊,對應于下圖
平均而言,我們每天從氣象站獲得 0.81 比特的資訊。是以,我們把剛剛計算出的平均值稱為資訊熵。這很好地衡量了事件的不确定性。
希望熵的公式現在完全有了意義。它衡量的是你每天收到天氣預報時得到的平均資訊量。通常,它給出了我們從給定的機率分布 抽取的一個樣本中獲得的平均資訊量。它告訴我們某個機率分布對應的随機變量有多麼不可預測,即它的不确定程度。
如果我們生活在每天陽光明媚的沙漠中,平均來說,每天我們不會從氣象站獲得太多資訊。熵值将接近于零。另一方面,如果每天的天氣情況變化很大,熵值将很大。
3交叉熵
現在,讓我們談談交叉熵。可以将它看成平均資訊長度。比如上面例子中,考慮到有 8 種可能的天氣狀況,它們的可能性均等,可以使用 3 個比特的資訊對每種狀況來編碼。
如圖所示,這裡的平均資訊長度為 3,這就是這個例子的交叉熵。
但是現在,假設你住在陽光充足的地區,天氣的機率分布并不均勻,具體如下圖所示,
每天都有 35% 的機率是晴天,雷雨的可能性隻有 1%。是以,我們可以計算該機率分布的熵,得,
請注意,此處使用的是以 2 為底的對數。
是以,氣象站平均發送 3 個比特資訊,但是接收者僅獲得 2.23 個有用的比特資訊。那麼,是不是說明我們還可以做得更好呢?
例如,像下面這樣來更改編碼,
現在,我們隻使用 2 個比特資訊表示晴天或部分晴天,使用 3 個比特資訊表示多雲和大部分多雲,使用 4 個比特資訊表示中雨和小雨,使用 5 個比特資訊表示大雨和雷暴。對天氣坐這樣的編碼方式是不會引起歧義的,例如,你連結多條消息,則隻有一種方法可以解釋比特流。例如,01100 隻能表示部分晴天(01),然後是小雨(100)。是以,如果我們計算該站每天發送的平均比特數,則可以得出,
這是我們新的和改進的交叉熵,它比以前的 3 個比特更好。現在,假設我們在不同的地方使用相同的代碼,那兒的天氣是相反的,多雨。
現在,如果我們計算交叉熵,
我們得到 4.58 個比特,大約是熵的兩倍。平均而言,該站發送 4.58 個比特資訊,但隻有 2.23 個比特資訊對接收者來說是有用的。每條消息發送的資訊量是必要資訊的兩倍。這是因為我們使用的代碼對天氣分布做出了一些隐含的假設。例如,當我們在晴天使用 2 個比特資訊時,我們含蓄地預測了晴天的概況為 25%。這是因為 。
同樣,我們計算所有的天氣情況。
分母中 2 的幂對應于用于傳輸資訊的比特數。很明顯,預測分布 與真實分布 完全不同。
是以,現在我們可以将交叉熵()表示為真實機率分布 和預測機率分布 的函數 ,具體公式為,
請注意,本示例中使用的對數均是以 2 為底的。
正如你所見,除了我們在這裡使用預測機率的對數外,它看起來與熵的等式非常相似。如果我們的預測是完美的,那就是預測分布等于真實分布,那麼交叉熵就等于熵。但是,如果分布不同,交叉熵就會比熵更大一些,因為多了一些比特。交叉熵超過熵的數量,被稱為
相對熵
,或更通常稱為
Kullback-Leibler Divergence(KL-散度)
。總結一下,簡而言之,
從上面的例子中,我們得到
4應用
現在,讓我們在實際應用中來用一用交叉熵。比如,我們正在訓練一個圖像分類器,對看起來比較相似的不同動物進行分類,例如浣熊啊、小熊貓啊、狐狸之類等等。
是以,對于可能的 7 個類别中的每一個類别,分類器會分别給出一個機率,即所謂的預測分布。由于這是有監督的學習問題,是以我們是知道真實分布的。
在上面的示例中,我拍了一隻浣熊的照片,是以在真實分布中,浣熊類的機率應該為 100%,其他類的機率為 0。我們可以将這兩個分布之間的交叉熵作為成本函數,稱為交叉熵損失。
這隻是我們前面看到的等式,除了它通常使用自然對數而不是 以 2 為底的對數。對于訓練而言,這無關緊要,因為以 2 為底的對數 與自然對數之間的轉換關系為 ,其中分母是常數。注意,本文其他地方如沒有特别說明, 都是指以 2 為底的對數。
是以,當類别機率被稱為一個獨熱編碼向量(這意味着一個類别具有 100% 機率,其餘類别均為 0%)時,交叉熵隻是真實類别的估計機率的負對數。
在這個例子中,交叉熵為
現在,你可以看到,當對真實類别的預測機率接近 0 時,成本函數可能會非常大。但是,當預測機率接近 1 時,成本函數将接近 0。是以,我們需要對每個類使用更多的例子來訓練分類器,以減少損失。
5小結
我們以氣象站更新第二天的天氣為例,了解了香農資訊理論的概念。然後我們将其與熵、交叉熵相關聯。最後,我們使用一個例子看了下交叉熵損失函數的實際用法。我希望本文能幫大家弄清熵、交叉熵和 KL-散度以及他們之間的聯系。
小結一下: 給定一個分布為 的随機變量,如果你用分布 去編碼它,那你就得付出額外的編碼稅。這個稅要繳多少呢,正是 KL-散度。
- 完 -
⟳參考資料⟲
[1]
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