透徹講解~交叉熵代價函數

2020-11-23 程序猿浩波

交叉熵代價函數(Cross-entropy cost function)是用來衡量人工神經網絡(ANN)的預測值與實際值的一種方式。與二次代價函數相比,它能更有效地促進ANN的訓練。在介紹交叉熵代價函數之前,本文先簡要介紹二次代價函數,以及其存在的不足。

一、二次代價函數的不足

ANN的設計目的之一是為了使機器可以像人一樣學習知識。人在學習分析新事物時,當發現自己犯的錯誤越大時,改正的力度就越大。比如投籃:當運動員發現自己的投籃方向離正確方向越遠,那麼他調整的投籃角度就應該越大,籃球就更容易投進籃筐。同理,我們希望:ANN在訓練時,如果預測值與實際值的誤差越大,那麼在反向傳播訓練的過程中,各種參數調整的幅度就要更大,從而使訓練更快收斂。然而,如果使用二次代價函數訓練ANN,看到的實際效果是,如果誤差越大,參數調整的幅度可能更小,訓練更緩慢。

以一個神經元的二類分類訓練為例,進行兩次實驗(ANN常用的激活函數為sigmoid函數,該實驗也採用該函數):輸入一個相同的樣本數據x=1.0(該樣本對應的實際分類y=0);兩次實驗各自隨機初始化參數,從而在各自的第一次前向傳播後得到不同的輸出值,形成不同的代價(誤差):

實驗1:第一次輸出值為0.82

實驗2:第一次輸出值為0.98在實驗1中,隨機初始化參數,使得第一次輸出值為0.82(該樣本對應的實際值為0);經過300次迭代訓練後,輸出值由0.82降到0.09,逼近實際值。而在實驗2中,第一次輸出值為0.98,同樣經過300迭代訓練,輸出值只降到了0.20。

從兩次實驗的代價曲線中可以看出:實驗1的代價隨著訓練次數增加而快速降低,但實驗2的代價在一開始下降得非常緩慢;直觀上看,初始的誤差越大,收斂得越緩慢。

其實,誤差大導致訓練緩慢的原因在於使用了二次代價函數。二次代價函數的公式如下:

其中,C表示代價,x表示樣本,y表示實際值,a表示輸出值,n表示樣本的總數。為簡單起見,同樣一 個樣本為例進行說明,此時二次代價函數為:

目前訓練ANN最有效的算法是反向傳播算法。簡而言之,訓練ANN就是通過反向傳播代價,以減少代價為導向,調整參數。參數主要有:神經元之間的連接權重w,以及每個神經元本身的偏置b。調參的方式 是採用梯度下降算法 ( Gradient descent ),沿著梯度方向調整參數大小。W和b的梯度推導如下:

其中,Z表示神經元的輸入,の表示激活函數。從以上公式可以看出,W和b的梯度跟激活函數的梯度成正比,激活函數的梯度越大,w和b的大小調整得越快,訓練收合得就越快。而神經網絡常用的激活函數為sigmoid函數,該函數的曲線如下所示:

如圖所示,實驗2的初始輸出值(0.98)對應的梯度明顯小於實驗1的輸出值(0.82),因此實驗2的參數梯度下降得比實驗1慢。這就是初始的代價(誤差)越大,導致訓練越慢的原因。與我們的期望不符,即:不能像人一樣,錯誤越大,改正的幅度越大,從而學習得越快。

可能有人會說,那就選擇一個梯度不變化或變化不明顯的激活函數不就解決問題了嗎?圖樣圖森破,那樣雖然簡單粗暴地解決了這個問題,但可能會引起其他更多更麻煩的問題。而且,類似sigmoid這樣的函數(比如tanh函數)有很多優點,非常適合用來做激活函數,具體請自行google之

交叉熵代價函數的定義

那麼我們如何解決這個問題呢?研究表明,我們可以通過使用交叉嫡函數來替換二次代價函數。為了理解什麼是交叉嫡,我們稍微改變一下之前的簡單例子。假設,我們現在要訓練一個包含若干輸入變量的的神經元,

對應的權重為

和偏置

:

神經元的輸出就是

其中

是輸入的帶權和。我們如下定義這個神經元的交叉嫡代價函數:

關於輸出層的權重的偏導數為

交叉熵在分類問題中的應用

交叉熵損失函數應用在分類問題中時,不管是單分類還是多分類,類別的標籤都只能是 0 或者 1。

交叉熵在單分類問題中的應用

這裡的單類別是指,每一張圖像樣本只能有一個類別,比如只能是狗或只能是貓。交叉熵在單分類問題上基本是標配的方法

那麼

對應一個batch的loss就是

m為當前batch的樣本數

交叉熵在多標籤問題中的應用

這裡的多類別是指,每一張圖像樣本可以有多個類別,比如同時包含一隻貓和一隻狗和單分類問題的標籤不同,多分類的標籤是n-hot。

值得注意的是,這裡的Pred採用的是sigmoid函數計算。將每一個節點的輸出歸一化到[0,1]之間。所有Pred值的和也不再為1。換句話說,就是每一個Label都是獨立分布的,相互之間沒有影響。所以交叉熵在這裡是單獨對每一個節點進行計算,每一個節點只有兩種可能值,所以是一個二項分布。對於二項分布這種特殊的分布,熵的計算可以進行簡化。

同樣的,交叉熵的計算也可以簡化,即

注意,上式只是針對一個節點的計算公式。這一點一定要和單分類Ioss區分開來。例子中可以計算為:

式中m為當前batch中的樣本量,n為類別數。

交叉熵代價函數對權重求導的證明

交叉熵代價函數的定義:

所以

其向量形式是

對偏置用同樣的方法可得

交叉熵的含義和來源

我們對於交叉熵的討論聚焦在代數分析和代碼實現。這雖然很有用,但是也留下了一個未能回答的更加寬泛的概念上的問題,如:交叉熵究竟表示什麼?存在一些直覺上的思考交叉熵的方法嗎?我們如何想到這個概念?

讓我們從最後一個問題開始回答:什麼能夠激發我們想到交叉熵?假設我們發現學習速度下降了,並理解其原因是因為對於二次代價函數,輸出層的權重的偏導數為

如果我們選擇的損失函數滿足這些條件,那麼它們就能以簡單的方式呈現這樣的特性:初始誤差越大,神經元學習得越快。這也能夠解決學習速度下降的問題。實際上,從這些公式開始,現在我們就看看憑著我們數學的直覺推導出交叉熵的形式是可行的。我們來推一下,由鏈式法則,我們有

對比等式, 我們有

而這裡的常量就是所有單獨的常量的平均。所以我們看到方程

當然,我這裡沒有嚴格地給出"不確定性"到底意味著什麼,所以看起來像在誇誇其談。但是實際上,在資訊理論中有一種準確的方式來定義不確定性究竟是什麼。詳細內容請看交叉嫡(cross-entropy)的數學歷史。

交叉熵(cross-entropy)的數學歷史

通用的說,熵(Entropy)被用於描述一個系統中的不確定性(the uncertainty of a system)。在不同領域熵有不同的解釋,比如熱力學的定義和資訊理論也不大相同。先給出一個"不嚴謹"的概念表述:

熵:可以表示一個事件A的自信息量,也就是A包含多少信息。KL散度:可以用來表示從事件A的角度來看,事件B有多大不同。交叉熵:可以用來表示從事件A的角度來看,如何描述事件B。

一句話總結的話:KL散度可以被用於計算代價,而在特定情況下最小化KL散度等價於最小化交叉熵。而交叉熵的運算更簡單,所以用交叉熵來當做代價。信息量

首先是信息量。假設我們聽到了兩件事,分別如下:事件A:巴西隊進入了2018世界盃決賽圈。事件B:中國隊進入了2018世界盃決賽圈。

僅憑直覺來說,顯而易見事件B的信息量比事件A的信息量要大。究其原因,是因為事件A發生的概率很大,事件B發生的概率很小。所以當越不可能的事件發生了,我們獲取到的信息量就越大。越可能發生的事件發生了,我們獲取到的信息量就越小。那麼信息量應該和事件發生的概率有關。

由於是概率所以

的取值範圍是[0,1],繪製為圖形如下:

什麼是熵(Entropy)?

放在資訊理論的語境裡面來說,就是一個事件所包含的信息量。我們現在有了信息量的定義,而熵用來表示所有信息量的期望,即:

如何衡量兩個事件/分布之間的不同:KL散度

我們上面說的是對於一個隨機變量x的事件A的自信息量,如果我們有另一個獨立的隨機變量x相關的事件B,該怎麼計算它們之間的區別?此處我們介紹默認的計算方法:KL散度,有時候也叫KL距離,一般被用於計算兩個分布之間的不同。看名字似乎跟計算兩個點之間的距離也很像,但實則不然,因為KL散度不具備有對稱性。在距離上的對稱性指的是A到B的距離等於B到A的距離。

KL散度的數學定義:

相對熵又稱KL散度,如果我們對於同一個隨機變量 x 有兩個單獨的概率分布 P(x) 和 Q(x),我們可以使用 KL 散度(Kullback-Leibler (KL) divergence)來衡量這兩個分布的差異維基百科對相對熵的定義

In the context of machine learning, DKL(P‖Q) is often called the information gain achieved if P is used instead of Q.

對於離散事件我們可以定義事件A和B的差別為:

對於連續事件,那麼我們只是把求和改為求積分而已。

從公式中可以看出:

如果 , 即兩個事件分布完全相同,那麼KL散度等於0。觀察公式, 可以發現減號左邊的就是事件A的嫡,請記住這個發現。如果顛倒一下順序求 那麼就需要使用B的嫡,答案就不一樣了。所以KL散度 來計算兩個分布A與B的時候是不是對稱的,有"坐標系"的問題** 換句話說,KL散度由A自己的熵與B在A上的期望共同決定。當使用KL散度來衡量兩個事件(連續或離散),上面的公式意義就是求 A與B之間的對數差 在 A上的期望值。

KL散度 = 交叉熵 - 熵?

如果我們默認了用KL散度來計算兩個分布間的不同,那還要交叉熵做什麼?

對比一下這是KL散度的公式:

這是嫡的公式:

這是交叉嫡公式:

為什麼交叉嫡可以用作代價?

此處的A就是數據的真實分布: 此處的B就是模型從訓練數據上學到的分布: 但是,完美的學到了訓練數據分布往往意味著過擬合,因為訓練數據不等於真實數據,我們只是假設它們是相似的,而一般還要假設存在一個高斯分布的誤差,是模型的泛化誤差下線。

因此在評價機器學習模型時,我們往往不能只看訓練數據上的誤分率和交叉熵,還是要關注測試數據上的表現。如果在測試集上的表現也不錯,才能保證這不是一個過擬合或者欠擬合的模型。交叉熵比照誤分率還有更多的優勢,因為它可以和很多概率模型完美的結合。

所以邏輯思路是,為了讓學到的模型分布更貼近真實數據分布,我們最小化 模型數據分布 與 訓練數據之間的KL散度,而因為訓練數據的分布是固定的,因此最小化KL散度等價於最小化交叉熵。

因為等價,而且交叉熵更簡單更好計算,當然用它。

相關焦點

  • 理解熵、交叉熵和交叉熵損失
    交叉熵損失是深度學習中應用最廣泛的損失函數之一,這個強大的損失函數是建立在交叉熵概念上的。當我開始使用這個損失函數時,我很難理解它背後的直覺。在google了不同材料後,我能夠得到一個令人滿意的理解,我想在這篇文章中分享它。
  • 簡單的交叉熵損失函數,你真的懂了嗎?
    說起交叉熵損失函數「Cross Entropy Loss」,腦海中立馬浮現出它的公式:我們已經對這個交叉熵函數非常熟悉,大多數情況下都是直接拿來使用就好。但是它是怎麼來的?為什麼它能表徵真實樣本標籤和預測概率之間的差值?上面的交叉熵函數是否有其它變種?也許很多朋友還不是很清楚!
  • 完美解釋交叉熵
    通過幾個簡單的例子來解釋和總結什麼是交叉熵( Cross Entropy) 以及機器學習分類問題中為什麼使用交叉熵。其中2是這個方案中的交叉熵。而最優方案的交叉熵是1.75。給定一個策略, 交叉熵就是在該策略下猜中顏色所需要的問題的期望值。更普遍的說,交叉熵用來衡量在給定的真實分布下,使用非真實分布所指定的策略消除系統的不確定性所需要付出成本的大小。交叉的字面意思在於:真實分布與非真實分布的交叉。給定一個方案, 越優的策略, 最終的交叉熵越低。
  • 你還認為似然函數跟交叉熵是一個意思呀?
    似然函數不就是交叉熵嗎?」「機器學習中的似然函數怎麼看起來跟概率統計課本裡的不一樣呢?」「學長學長,我把這個model的輸出接上交叉熵後怎麼報錯了?」 「似然函數」名字的意義已經在以前的多篇文章中提過了,更通用的定義來說,似然函數就是衡量當前模型參數對於已知樣本集X的解釋情況,通用的表現形式如下: 注意!似然函數的定義當然沒有限定樣本集X的分布函數。這樣來看似然函數的話很抽象,不知道實際中如何去用。所以我們把問題縮小一下啦。
  • 乾貨|不同的損失函數會對深度神經網絡帶來什麼樣的影響?
    二次損失函數會在神經元犯了明顯錯誤的情況下使得網絡學習緩慢,而使用交叉熵損失函數則會在明顯犯錯的時候學的更快。 今天,我們主要來談談不同的損失函數會對深度神經網絡帶來什麼樣的影響?
  • 機器學習中各種熵的定義及理解
    交叉熵交叉熵是一個用來比較兩個概率分布p和q的度量公式。換句話說,交叉熵是衡量在真實分布下,使用非真實分布所制定的策略能夠消除系統不確定性的大小。如何正確理解上述這段描述呢?同樣地,交叉熵可也以推廣到連續域。
  • softmax 損失函數 & 參數更新詳解
    對參數求偏導推導及更新要點回歸:邏輯回歸二分類用sigmoid變換成預測單個「概率」,損失函數為交叉熵,用梯度下降求解參數wbsoftmax多分類用softmax變換成多個「概率」,損失函數和求解思路類似相比(−∞,+∞)範圍內的數值結果,概率天然具有更好的可解釋性;我們獲得了K個類別(−
  • 機器學習之模型評估(損失函數)
    2.分類問題分類問題損失函數主要有交叉熵損失、0-1損失、合頁損失、指數損失和Modified Huber 損失。其中最重要的是交叉熵損失。本文對它做一個重點介紹。交叉熵損失也稱負對數似然,它是二分類問題中最常用的損失函數,比如邏輯回歸。
  • 深度學習中常見的損失函數
    該式就是sigmoid函數的交叉熵,這也是上文說的在分類問題上,交叉熵的實質是對數似然函數。在深度學習中更普遍的做法是將softmax作為最後一層,此時常用的仍是對數似然損失函數,如下所示:該式其實是式(1)的推廣,正如softmax是sigmoid的多類別推廣一樣,在TensorFlow裡面根據最後分類函數softmax和sigmoid就分為softmax交叉熵以及sigmoid的交叉熵,並對這兩個功能進行統一封裝。
  • 神經網絡中的各種損失函數介紹
    基本上,在輸出為實數的情況下,應使用此損失函數。二元交叉熵當你執行二元分類任務時,可以選擇該損失函數。如果你使用BCE(二元交叉熵)損失函數,則只需一個輸出節點即可將數據分為兩類。輸出值應通過sigmoid激活函數,以便輸出在(0-1)範圍內。
  • 入門| 機器學習中常用的損失函數你知多少?
    選自towards data science作者:Ravindra Parmar機器之心編譯參與:李詩萌、王淑婷本文作者將常用的損失函數分為了兩大類:分類和回歸。然後又分別對這兩類進行了細分和講解,其中回歸中包含了一種不太常見的損失函數:平均偏差誤差,可以用來確定模型中存在正偏差還是負偏差。
  • TensorFlow2.0(8):誤差計算——損失函數總結
    ,對於分類問題,特別是目標輸出為One-hot向量的分類任務中,下面要說的交叉熵損失函數就要合適的多。2 交叉熵損失函數 交叉熵(Cross Entropy)是資訊理論中一個重要概念,主要用於度量兩個概率分布間的差異性信息,交叉熵越小,兩者之間差異越小,當交叉熵等於0時達到最佳狀態,也即是預測值與真實值完全吻合。
  • 熵:傷腦筋的熵
    這說明對可逆過程,從狀態A到狀態B,不依賴於路徑,有,所以說S是一個狀態函數。實際上,無論循環是否是可逆的,在循環結束時,「工作介質」是恢復了原狀的。針對一個熱力學體系,總可以定義這樣的狀態函數 S,它是一個廣延量,一個對氣體、磁體、電介質來說是共性的東西。
  • 熵:傷腦筋的熵-虎嗅網
    Entropy的概念是1865年克勞修斯正式引進的一個關於熱力學體系的態函數,用來表述熱力學第二定律,其本意是希望用一種新的形式來表達熱機在其循環過程中所要滿足的條件。而經典概率的可分解性, factorizability, 恰恰通過對數函數保證了熵的可加性。奈何天意乎?而這般得窺天機的工作,是要耗費心血甚至要以生命為代價的。玻爾茲曼的工作建立在原子論的基礎上,而1900年前後人們還沒有能力看到原子,對原子論的懷疑或責難也算情理之中的事情,這裡面尤以馬赫的名言 「Haben Sie mal Atom gesehen」為代表。
  • 機器學習算法中的7個損失函數的詳細指南
    回歸損失函數平方誤差損失絕對誤差損失Huber損失二分類損失函數二分類交叉熵Hinge損失多分類損失函數多分類交叉熵損失KL散度(Kullback二元交叉熵損失讓我們從理解術語"熵"開始。 通常,我們使用熵來表示無序或不確定性。測量具有概率分布p(X)的隨機變量X:負號用於使最後的結果為正數。概率分布的熵值越大,表明分布的不確定性越大。
  • 從最優化的角度看待 Softmax 損失函數
    Softmax交叉熵損失函數應該是目前最常用的分類損失函數了,在大部分文章中,Softmax交叉熵損失函數都是從概率角度來解釋的,本周二極市就推送了一篇Softmax相關文章:一文道盡softmax loss及其變種。本文將嘗試從最優化的角度來推導出Softmax交叉熵損失函數,希望能夠啟發出更多的研究思路。
  • Python機器學習算法中的7個損失函數的詳細指南
    目錄什麼是損失函數?回歸損失函數平方誤差損失絕對誤差損失Huber損失二分類損失函數二分類交叉熵Hinge損失多分類損失函數多分類交叉熵損失KL散度(Kullback Leibler Divergence Loss)1. 什麼是損失函數?假設你在山頂,需要下山。你如何決定走哪個方向?
  • 吳恩達機器學習筆記 - 線性回歸、代價函數與梯度下降
    因為我們訓練函數參數,最終還是要選擇一個最優的,那麼代價函數就給我們一個最優參數的度量方式,使得我們可以根據數學理論選擇訓練參數。3.1 預測房價的代價函數還是用預測房價的例子來介紹下代價函數的原理,這是預測房價的數據集:我們使用線性回歸算法來預測,所以取假設函數 Hypothesis 的表達式為 2 個參數(theta_0,theta_1)線性函數。
  • 熵:傷腦筋的熵|賢說八道
    Entropy的概念是1865年克勞修斯正式引進的一個關於熱力學體系的態函數,用來表述熱力學第二定律,其本意是希望用一種新的形式來表達熱機在其循環過程中所要滿足的條件。考察一個閉合的過程,有,其中dQ是流入系統的熱量,T是絕對溫度。對於可逆過程,有。
  • 什麼是熵?
    在本篇文章中,熵都是指代香農熵(Shannon entropy)。其實還有幾種其他類型的熵,但是在自然語言處理或者機器學習領域中,我們提到的熵都是香農熵。所以在沒有特意說明的情況下,下面就是熵的公式。簡單回顧一下概率分布:概率分布是一個函數,對於每個可能的結果都有一個概率,且所有的概率相加等於 1。當所有可能的結果具有相同的可能性時,該分布為均勻分布。例如:拋硬幣實驗(50% 和 50% 的概率), 均勻的骰子(每個面朝上的概率都為六分之一)。