熵、交叉熵和散度,這是一篇最純碎的理解!

2021-02-08 機器學習與python集中營


點擊上方「機器學習與python集中營」,星標公眾號




主題:物理概念的熵


熵(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%×20.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)


因此在做極值問題時,不會對結果有什麼影響。



相關焦點

  • 小孩都看得懂的熵、交叉熵和 KL 散度
    但是小明用二進位密碼和我交流,我收到的簡訊是下面這樣子的:    0 1 0 0 1 0 0 0為了理解簡訊的真實含義,我需要一個解碼錶,如下:主題:KL 散度Kullback-Leibler 散度(KL 散度)是熵與交叉熵之間的差值。稱之為散度而不是距離是因為距離是對稱的,而散度可以是不對稱的。回到我們的場景,把哈登動作分布稱為 p 分布,把威少動作分布稱為 q 分布,那麼 p 分布對 q 分布的 KL 散度定義為
  • 熵、交叉熵和KL散度的基本概念和交叉熵損失函數的通俗介紹
    (也稱為對數損失)是分類問題中最常用的損失函數之一。但是,由於當今龐大的庫和框架的存在以及它們的易用性,我們中的大多數人常常在不了解熵的核心概念的情況下著手解決問題。所以,在這篇文章中,讓我們看看熵背後的基本概念,把它與交叉熵和KL散度聯繫起來。我們還將查看一個使用損失函數作為交叉熵的分類問題的示例。什麼是熵?
  • 機器學習小知識: 圖解熵、交叉熵和 KL-散度
    交叉熵是分類問題中最常用的損失函數之一。但是由於如今有大量容易上手的現成庫和框架,我們大多數人常常在沒有真正了解熵的核心概念的情況下,就可以熟練地解決問題。在本文中,讓我們研究一下熵這個概念背後的基本直覺,並將其與交叉熵、KL-散度相關聯。我們還將使用交叉熵作為損失函數,結合一個實例來看看它在分類問題中的應用。1什麼是熵?
  • 透徹講解~交叉熵代價函數
    假設我們發現學習速度下降了,並理解其原因是因為對於二次代價函數,輸出層的權重的偏導數為如果我們選擇的損失函數滿足這些條件,那麼它們就能以簡單的方式呈現這樣的特性:初始誤差越大,神經元學習得越快。這也能夠解決學習速度下降的問題。實際上,從這些公式開始,現在我們就看看憑著我們數學的直覺推導出交叉熵的形式是可行的。
  • 為什麼交叉熵(cross-entropy)可以用於計算代價?
    如果我們默認了用KL散度來計算兩個分布間的不同,那還要交叉熵做什麼?事實上交叉熵和KL散度的公式非常相近,其實就是KL散度的後半部分(公式2.1):A和B的交叉熵 = A與B的KL散度 - A的熵。  ,也就是說KL散度和交叉熵在特定條件下等價。這個發現是這篇回答的重點。同時補充交叉熵的一些性質:*4. 另一種理解KL散度、交叉熵、熵的角度(選讀)- 可跳過那麼問題來了,為什麼有KL散度和交叉熵兩種算法?
  • Pytorch 中交叉熵 Loss 趣解
    背景最近一直在總結Pytorch中Loss的各種用法,交叉熵是深度學習中最常用的計算方法,寫這個稿子把交叉熵的來龍去脈做一個總結。信息量的計算公式為:信息熵理解了信息量之後,信息熵的理解也就不再困難了。熵原本是熱力學中的一個概念,是用來衡量混亂程度的物理量。信息熵則是借用熱力學的概念,衡量在事件發生前對於產生信息量的期望。
  • 簡單的交叉熵,你真的懂了嗎?
    引言        我們都知道損失函數有很多種:均方誤差(MSE)、SVM的合頁損失(hinge loss)、交叉熵(cross entropy)。這幾天看論文的時候產生了疑問:為啥損失函數很多用的都是交叉熵(cross entropy)?其背後深層的含義是什麼?如果換做均方誤差(MSE)會怎麼樣?下面我們一步步來揭開交叉熵的神秘面紗。2.
  • 可視化理解二值交叉熵/對數損失
    因此,熵為零!另一方面,如果我們確切知道該點的一半是綠色和另一半是紅色?那是最壞的情況,對吧?由於這可能永遠不會發生,因此交叉熵將比在真實分布上計算出的熵具有更大的值。▲ 交叉熵減去熵事實上,交叉熵和熵之間的差還有個名字……KL散度(Kullback-Leibler Divergence
  • 關於交叉熵損失
    ·       DKL(p∥q)≥0(可以舉幾個簡單的例子驗證)總的來說,相對熵是用來衡量同一個隨機變量的兩個不同分布之間的距離。在實際應用中,假如p(x)是目標真實的分布,而q(x)是預測得來的分布,為了讓這兩個分布儘可能的相同的,就需要最小化KL散度。
  • 交叉熵(Cross Entropy)從原理到代碼解讀
    原理部分:要想搞懂交叉熵需要先清楚一些概念,順序如下:==1.自信息量—>2.信息熵(熵)—>3.相對熵(KL散度)—>4.交叉熵==1.自信息量隨機事件4.交叉熵有了對前面概念的鋪墊,就很容易理解交叉熵
  • 機器學習中各種熵的定義及理解
    針對這類問題,利用香農熵以及衍生的其他熵概念去度量概率分布的信息量是個很好的解決方案。本文會儘可能用簡單的描述分享自己對各種熵的定義及理解,歡迎交流討論。1. 自信息自信息又稱信息量。「陳羽凡吸毒?!工作室不是剛闢謠了嗎?哇!信息量好大!」在生活中,極少發生的事情最容易引起吃瓜群眾的關注。
  • 機器學習最常用的損失函數之交叉熵
    在這篇文章裡將對這個概念進行詳細的分析。相對熵(relative entropy)又稱為KL散度(Kullback-Leibler divergence),KL距離,是兩個隨機分布間距離的度量。記為DKL(p||q)。它度量當真實分布為p時,假設分布q的無效性。
  • 你是否有過疑問:為啥損失函數很多用的都是交叉熵(cross entropy)?
    引言我們都知道損失函數有很多種:均方誤差(MSE)、SVM的合頁損失(hinge loss)、交叉熵(cross entropy)。這幾天看論文的時候產生了疑問:為啥損失函數很多用的都是交叉熵(cross entropy)?其背後深層的含義是什麼?如果換做均方誤差(MSE)會怎麼樣?下面我們一步步來揭開交叉熵的神秘面紗。2.
  • Softmax函數與交叉熵
    交叉熵說交叉熵之前先介紹相對熵,相對熵又稱為KL散度(Kullback-Leibler Divergence),用來衡量兩個分布之間的距離,記為,而當先對所有的輸出用softmax進行轉換為概率值,再套用交叉熵的公式。
  • 【小知識】Softmax函數與交叉熵
    交叉熵說交叉熵之前先介紹相對熵,相對熵又稱為KL散度(Kullback-Leibler Divergence),用來衡量兩個分布之間的距離,記為,而當先對所有的輸出用softmax進行轉換為概率值,再套用交叉熵的公式。
  • 完美解釋交叉熵
    通過幾個簡單的例子來解釋和總結什麼是交叉熵( Cross Entropy) 以及機器學習分類問題中為什麼使用交叉熵。在這個問題中, 問題個數的期望是這個式子就是熵的表達式. 簡單來說, 其意義就是在最優化策略下, 猜到顏色所需要的問題的個數。熵代表的是隨機變量或整個系統的不確定性,熵越大,隨機變量或系統的不確定性就越大。
  • Softmax和交叉熵的深度解析和Python實現
    而且,現在很多開源的深度學習框架,直接就把各種損失函數寫好了(甚至在 Pytorch中 CrossEntropyLoss 已經把 Softmax函數集合進去了),你根本不用操心怎麼去實現他們,但是你真的理解為什麼要這麼做嗎?這篇小文就將告訴你:Softmax 是如何把 CNN 的輸出轉變成概率,以及交叉熵是如何為優化過程提供度量。為了讓讀者能夠深入理解,我們將會用 Python 一一實現他們。
  • 簡單的交叉熵損失函數,你真的懂了嗎?
    說起交叉熵損失函數「Cross Entropy Loss」,腦海中立馬浮現出它的公式:我們已經對這個交叉熵函數非常熟悉,大多數情況下都是直接拿來使用就好。但是它是怎麼來的?為什麼它能表徵真實樣本標籤和預測概率之間的差值?上面的交叉熵函數是否有其它變種?也許很多朋友還不是很清楚!
  • 什麼是交叉熵啊?| 小白深度學習入門
    我們說,這是一句毫無信息量的話,因為他沒有消除任何不確定性。前女友對你說「我結婚了」,這句話包含了信息量,去除了不確定性。但如果前女友和你說「我是女的」,這句話就毫無信息量,這就是廢話。信息熵,泛泛的說是用來衡量一段信息的信息量大小的。這個定義我之前也不理解,直到我看見一個說法,突然茅塞頓開:信息熵是用來衡量表達一個隨機變量需要的最少的比特位數。
  • 如何理解KL散度的不對稱性?
    為了討論這個知識點,我們需要掌握(或者暫且當做已知)的先決知識點有:1 自信息:符合分布 P 的某一事件 x 出現,傳達這條信息所需的最少信息長度為自信息,表達為 2 熵:從分布 P 中隨機抽選一個事件,傳達這條信息所需的最優平均信息長度為香農熵