簡單的交叉熵,你真的懂了嗎?

2021-02-20 AI部落聯盟

1. 引言

        我們都知道損失函數有很多種:均方誤差(MSE)、SVM的合頁損失(hinge loss)、交叉熵(cross entropy)。這幾天看論文的時候產生了疑問:為啥損失函數很多用的都是交叉熵(cross entropy)?其背後深層的含義是什麼?如果換做均方誤差(MSE)會怎麼樣?下面我們一步步來揭開交叉熵的神秘面紗。

2. 交叉熵的來源

2.1 信息量

        一條信息的信息量大小和它的不確定性有很大的關係。一句話如果需要很多外部信息才能確定,我們就稱這句話的信息量比較大。比如你聽到「雲南西雙版納下雪了」,那你需要去看天氣預報、問當地人等等查證(因為雲南西雙版納從沒下過雪)。相反,如果和你說「人一天要吃三頓飯」,那這條信息的信息量就很小,因為條信息的確定性很高。

        那我們就能將事件x_0的信息量定義如下(其中p(x_0)表示事件x_0發生的概率):

概率總是一個0-1之間的值,-log(x)的圖像如上

2.2 熵

        信息量是對於單個事件來說的,但是實際情況一件事有很多種發生的可能,比如擲骰子有可能出現6種情況,明天的天氣可能晴、多雲或者下雨等等。熵是表示隨機變量不確定的度量,是對所有可能發生的事件產生的信息量的期望。公式如下:

n表示事件可能發生的情況總數

        其中一種比較特殊的情況就是擲硬幣,只有正、反兩種情況,該種情況(二項分布或者0-1分布)熵的計算可以簡化如下:

p(x)代表擲正面的概率,1-p(x)則表示擲反面的概率(反之亦然)

2.3 相對熵

        相對熵又稱KL散度,用于衡量對於同一個隨機變量x的兩個分布p(x)和q(x)之間的差異。在機器學習中,p(x)常用於描述樣本的真實分布,例如[1,0,0,0]表示樣本屬於第一類,而q(x)則常常用於表示預測的分布,例如[0.7,0.1,0.1,0.1]。顯然使用q(x)來描述樣本不如p(x)準確,q(x)需要不斷地學習來擬合準確的分布p(x)。

        KL散度的公式如下:

n表示事件可能發生的情況總數

KL散度的值越小表示兩個分布越接近。

2.4 交叉熵

        我們將KL散度的公式進行變形,得到:

        前半部分就是p(x)的熵,後半部分就是我們的交叉熵:

        機器學習中,我們常常使用KL散度來評估predict和label之間的差別,但是由於KL散度的前半部分是一個常量,所以我們常常將後半部分的交叉熵作為損失函數,其實二者是一樣的。

3. 交叉熵作為loss函數的直覺

        在回歸問題中,我們常常使用均方誤差(MSE)作為損失函數,其公式如下:

m表示樣本個數,loss表示的是m個樣本的均值

        其實這裡也比較好理解,因為回歸問題要求擬合實際的值,通過MSE衡量預測值和實際值之間的誤差,可以通過梯度下降的方法來優化。而不像分類問題,需要一系列的激活函數(sigmoid、softmax)來將預測值映射到0-1之間,這時候再使用MSE的時候就要好好掂量一下了,為啥這麼說,請繼續看:

sigmoid加MES的基本公式

gradient推導過程

上面複雜的推導過程,其實結論就是下面一張圖:

C就是👆的J,sigma就是sigmoid函數,a就是predict

        從以上公式可以看出,w和b的梯度跟激活函數的梯度成正比,激活函數的梯度越大,w和b的大小調整得越快,訓練收斂得就越快。而我們都知道sigmoid函數長這樣:

圖片來自:https://blog.csdn.net/u014313009/article/details/51043064

        在上圖的綠色部分,初始值是0.98,紅色部分初始值是0.82,假如真實值是0。直觀來看那麼0.82下降的速度明顯高於0.98,但是明明0.98的誤差更大,這就導致了神經網絡不能像人一樣,誤差越大,學習的越快。 

但是如果我們把MSE換成交叉熵會怎麼樣呢?

x表示樣本,n表示樣本的總數

重新計算梯度:

推導過程

另外sigmoid有一個很好的性質:

我們從結果可以看出梯度中不再含有sigmoid的導數,有的是sigmoid的值和實際值之間的差,也就滿足了我們之前所說的錯誤越大,下降的越快。

這也就是在分類問題中常用cross entropy 而不是 MSE的原因了。

相關焦點

  • 簡單的交叉熵損失函數,你真的懂了嗎?
    說起交叉熵損失函數「Cross Entropy Loss」,腦海中立馬浮現出它的公式:我們已經對這個交叉熵函數非常熟悉,大多數情況下都是直接拿來使用就好。但是它是怎麼來的?為什麼它能表徵真實樣本標籤和預測概率之間的差值?上面的交叉熵函數是否有其它變種?也許很多朋友還不是很清楚!
  • 小孩都看得懂的熵、交叉熵和 KL 散度
    比如 01101110 就可以解碼成 01-10-11-10,簡單。主題:複習一下熵現在我們知道最優編碼長度就是熵(通常上面一節解釋,希望現在可以秒懂熵的公式)。>(不直觀,接受吧少年)    Hq(p) ≠ Hp(q)    熵比交叉熵要小,那兩者之間的差距是什麼?
  • 熵、交叉熵和散度,這是一篇最純碎的理解!
    比如 01101110 就可以解碼成 01-10-11-10,簡單。主題:複習一下熵現在我們知道最優編碼長度就是熵(通常上面一節解釋,希望現在可以秒懂熵的公式)。反過來,如果用威少編碼來發送哈登動作分布的信息,得到信息平均編碼長度就也叫做交叉熵。正規定義:使用專門為另一個分布製作的密碼錶來發送某個分布中事件的信息,此時信息的平均編碼長度定義為交叉熵(cross-entropy)。
  • 熵、交叉熵和KL散度的基本概念和交叉熵損失函數的通俗介紹
    但是,由於當今龐大的庫和框架的存在以及它們的易用性,我們中的大多數人常常在不了解熵的核心概念的情況下著手解決問題。所以,在這篇文章中,讓我們看看熵背後的基本概念,把它與交叉熵和KL散度聯繫起來。我們還將查看一個使用損失函數作為交叉熵的分類問題的示例。什麼是熵?
  • 完美解釋交叉熵
    通過幾個簡單的例子來解釋和總結什麼是交叉熵( Cross Entropy) 以及機器學習分類問題中為什麼使用交叉熵。在這個問題中, 問題個數的期望是這個式子就是熵的表達式. 簡單來說, 其意義就是在最優化策略下, 猜到顏色所需要的問題的個數。熵代表的是隨機變量或整個系統的不確定性,熵越大,隨機變量或系統的不確定性就越大。
  • 可視化理解二值交叉熵/對數損失
    介紹如果你正在訓練一個二分類器,很有可能你正在使用的損失函數是二值交叉熵/對數(binary cross-entropy / log)。你是否想過使用此損失函數到底意味著什麼?log_loss(y, y_pred)print('x = {}'.format(x))print('y = {}'.format(y))print('p(y) = {}'.format(np.round(y_pred, 2)))print('Log Loss / Cross Entropy = {:.4f}'.format(loss))告訴我數學(真的嗎
  • 什麼是交叉熵啊?| 小白深度學習入門
    前女友對你說「我結婚了」,這句話包含了信息量,去除了不確定性。但如果前女友和你說「我是女的」,這句話就毫無信息量,這就是廢話。信息熵,泛泛的說是用來衡量一段信息的信息量大小的。這個定義我之前也不理解,直到我看見一個說法,突然茅塞頓開:信息熵是用來衡量表達一個隨機變量需要的最少的比特位數。
  • Softmax函數與交叉熵
    交叉熵說交叉熵之前先介紹相對熵,相對熵又稱為KL散度(Kullback-Leibler Divergence),用來衡量兩個分布之間的距離,記為關於熵與交叉熵等概念,可以參考該博客再做了解。回到我們多分類的問題上,真實的類標籤可以看作是分布,對某個樣本屬於哪個類別可以用One-hot的編碼方式,是一個維度為
  • 關於交叉熵損失
    這樣兩個分布的交叉熵H(p,q)也就等價於最小化這兩個分布的相對熵DKL(p∥q)。設p(x)是目標分布(訓練數據的分布),我們的目標的就讓訓練得到的分布q(x)儘可能的接近p(x),這時就可以最小化DKL(p∥q),等價於最小化交叉熵H(p,q) 。
  • 透徹講解~交叉熵代價函數
    可能有人會說,那就選擇一個梯度不變化或變化不明顯的激活函數不就解決問題了嗎?圖樣圖森破,那樣雖然簡單粗暴地解決了這個問題,但可能會引起其他更多更麻煩的問題。而且,類似sigmoid這樣的函數(比如tanh函數)有很多優點,非常適合用來做激活函數,具體請自行google之交叉熵代價函數的定義那麼我們如何解決這個問題呢?研究表明,我們可以通過使用交叉嫡函數來替換二次代價函數。為了理解什麼是交叉嫡,我們稍微改變一下之前的簡單例子。
  • Softmax和交叉熵的深度解析和Python實現
    當中,老師一定會告訴你在全連接層後面應該加上 Softmax 函數,如果正常情況下(不正常情況指的是類別超級多的時候)用交叉熵函數作為損失函數,你就一定可以得到一個讓你基本滿意的結果。而且,現在很多開源的深度學習框架,直接就把各種損失函數寫好了(甚至在 Pytorch中 CrossEntropyLoss 已經把 Softmax函數集合進去了),你根本不用操心怎麼去實現他們,但是你真的理解為什麼要這麼做嗎?這篇小文就將告訴你:Softmax 是如何把 CNN 的輸出轉變成概率,以及交叉熵是如何為優化過程提供度量。為了讓讀者能夠深入理解,我們將會用 Python 一一實現他們。
  • 機器學習小知識: 圖解熵、交叉熵和 KL-散度
    交叉熵是分類問題中最常用的損失函數之一。但是由於如今有大量容易上手的現成庫和框架,我們大多數人常常在沒有真正了解熵的核心概念的情況下,就可以熟練地解決問題。在本文中,讓我們研究一下熵這個概念背後的基本直覺,並將其與交叉熵、KL-散度相關聯。我們還將使用交叉熵作為損失函數,結合一個實例來看看它在分類問題中的應用。1什麼是熵?
  • 交叉熵(Cross Entropy)從原理到代碼解讀
    原理部分:要想搞懂交叉熵需要先清楚一些概念,順序如下:==1.自信息量—>2.信息熵(熵)—>3.相對熵(KL散度)—>4.交叉熵==1.自信息量隨機事件交叉熵=信息熵+相對熵為什麼這麼定義呢,先看相對熵,我們對相對熵計算公式展開得:可以看出相對熵展開後的第一項正好是信息熵的負值。
  • 【小知識】Softmax函數與交叉熵
    交叉熵說交叉熵之前先介紹相對熵,相對熵又稱為KL散度(Kullback-Leibler Divergence),用來衡量兩個分布之間的距離,記為關於熵與交叉熵等概念,可以參考該博客再做了解。回到我們多分類的問題上,真實的類標籤可以看作是分布,對某個樣本屬於哪個類別可以用One-hot的編碼方式,是一個維度為
  • 為什麼交叉熵(cross-entropy)可以用於計算代價?
    而交叉熵的運算更簡單,所以用交叉熵來當做代價。我知道你現在看著有點暈,但請保持耐心繼續往下看。*為了通俗易懂,我沒有嚴格按照數學規範來命名概念,比如文中的「事件」指的是「消息」,望各位嚴謹的讀者理解。1. 什麼是熵(Entropy)?放在資訊理論的語境裡面來說,就是一個事件所包含的信息量。我們常常聽到「這句話信息量好大」,比如「昨天花了10萬,終於在西二環買了套四合院」。
  • Pytorch 中交叉熵 Loss 趣解
    背景最近一直在總結Pytorch中Loss的各種用法,交叉熵是深度學習中最常用的計算方法,寫這個稿子把交叉熵的來龍去脈做一個總結。KL散度與交叉熵理解了信息量和信息熵之後,接下來就是交叉熵的概念了。介紹交叉熵之前,Loss是繞不開的。
  • 機器學習最常用的損失函數之交叉熵
    那麼什麼又是熵呢?還是通過上邊的例子來說明,假設小明的考試結果是一個0-1分布XA只有兩個取值{0:不及格,1:及格},在某次考試結果公布前,小明的考試結果有多大的不確定度呢?你肯定會說:十有八九不及格!因為根據先驗知識,小明及格的概率僅有0.1,90%的可能都是不及格的。怎麼來度量這個不確定度?求期望!
  • 你是否有過疑問:為啥損失函數很多用的都是交叉熵(cross entropy)?
    引言我們都知道損失函數有很多種:均方誤差(MSE)、SVM的合頁損失(hinge loss)、交叉熵(cross entropy)。這幾天看論文的時候產生了疑問:為啥損失函數很多用的都是交叉熵(cross entropy)?其背後深層的含義是什麼?如果換做均方誤差(MSE)會怎麼樣?下面我們一步步來揭開交叉熵的神秘面紗。2.
  • 為什麼分類問題的損失函數採用交叉熵而不是均方誤差MSE
    我們可以回憶下交叉熵Loss和均方差Loss定義是什麼:最小均方誤差,MSE(Mean Squared Error)Loss交叉熵當label = 1,也即 ,交叉熵損失函數 如圖所示,可知交叉熵損失函數的值域為
  • 你還認為似然函數跟交叉熵是一個意思呀?
    似然函數不就是交叉熵嗎?」「機器學習中的似然函數怎麼看起來跟概率統計課本裡的不一樣呢?」「學長學長,我把這個model的輸出接上交叉熵後怎麼報錯了?」 「似然函數」名字的意義已經在以前的多篇文章中提過了,更通用的定義來說,似然函數就是衡量當前模型參數對於已知樣本集X的解釋情況,通用的表現形式如下: