1. 程式人生 > >詳解機器學習損失函式之交叉熵

詳解機器學習損失函式之交叉熵

本文始發於個人公眾號:TechFlow,原創不易,求個關注


今天這篇文章和大家聊聊機器學習領域的熵。

我在看paper的時候發現對於交叉熵的理解又有些遺忘,複習了一下之後,又有了一些新的認識。故寫下本文和大家分享。

熵這個概念應用非常廣泛,我個人認為比較經典的一個應用是在熱力學當中,反應一個系統的混亂程度。根據熱力學第二定律,一個孤立系統的熵不會減少。比如一盒乒乓球,如果把盒子掀翻了,乒乓球散出來,它的熵增加了。如果要將熵減小,那麼必須要對這個系統做功,也就是說需要有外力來將散落的乒乓球放回盒子裡,否則乒乓球的分佈只會越來越散亂。

開創了資訊理論的夏農大佬靈光一閃,既然自然界微觀巨集觀的問題都有熵,那麼資訊應該也有。於是他開創性地將熵這個概念引入資訊理論領域,和熱力學的概念類似,資訊理論當中的熵指的是資訊量的混亂程度,也可以理解成資訊量的大小。


資訊量


舉個簡單的例子,以下兩個句子,哪一個句子的資訊量更大呢?

  1. 我今天沒中彩票
  2. 我今天中彩票了

從文字上來看,這兩句話的字數一致,描述的事件也基本一致,但是顯然第二句話的資訊量要比第一句大得多,原因也很簡單,因為中彩票的概率要比不中彩票低得多。

相信大家也都明白了,一個資訊傳遞的事件發生的概率越低,它的資訊量越大。我們用對數函式來量化一個事件的資訊量:

\[I(X)=-log(P(X))\]

因為一個事件發生的概率取值範圍在0到1之間,所以log(p(X))的範圍是負無窮到0,我們加一個負號將它變成正值。畫成函式大概是下面這個樣子:


資訊熵


我們上面的公式定義的是資訊量,但是這裡有一個問題,我們定義的只是事件X的一種結果的資訊量。對於一個事件來說,它可能的結果可能不止一種。我們希望定義整個事件的資訊量,其實也很好辦,我們算下整個事件資訊量的期望即可,這個期望就是資訊熵。

期望的公式我們應該都還記得:

\[E(X)=\sum P(X)X\]

我們套入資訊量的公式可以得到資訊熵H(x):

\[H(X)=-\sum_{i=1}^nP(x_i)log(P(x_i))\]


相對熵(KL散度)


在我們介紹相對熵之前,我們先試著思考一個問題,我們為什麼需要相對熵這麼一個概念呢?

原因很簡單,因為我們希望測量我們訓練出來的模型和實際資料的差別,相對熵的目的就是為了評估和驗證模型學習的效果。也就是說相對熵是用來衡量兩個概率分佈的差值的,我們用這個差值來衡量模型預測結果與真實資料的差距。明白了這點之後,我們來看相對熵的定義:

\[D_{KL}(P||Q)= \sum_{i=1}^nP(x_i)log(\frac{P(x_i)}{Q(x_i)})\]

如果把\(\sum_{i=1}^nx_i\)看成是一個事件的所有結果,那\(x_i\)可以理解成一個事件的一個結果。那麼所有的\(P(x_i)\)和\(Q(x_i)\)就可以看成是兩個關於事件X的概率分佈。\(P(x_i)\)樣本真實的分佈,我們可以求到。而\(Q(x_i)\)是我們模型產出的分佈。KL散度越小,表示這兩個分佈越接近,說明模型的效果越好。

光看上面的KL散度公式可能會雲裡霧裡,不明白為什麼能反應P和Q兩個分佈的相似度。因為這個公式少了兩個限制條件:

\[\sum_{i=1}^nP(x_i)=1, \quad \sum_{i=1}^nQ(x_i)=1\]

對於單個\(P(x_i)\)來說,當然\(Q(x_i)\)越大\(P(x_i)log(\frac{P(x_i)}{Q(x_i)})\)越小。但由於所有的\(Q(x_i)\)的和是1,當前的i取的值大了,其他的i取的值就要小。

我們先來直觀地感受一下,再來證明。

我們假設\(x_i\)只有0和1兩個取值,也就是一個事件只有發生或者不發生。我們再假設\(P(x=0)=P(x=1)=0.5\),我們畫一下\(P(x_i)log(\frac{P(x_i)}{Q(x_i)})\)的影象:

和我們預料的一樣,函式隨著\(Q(x_i)\)的遞增而遞減。但是這只是一個x的取值,別忘了,我們相對熵計算的是整個分佈,那我們加上另一個x的取值會發生什麼呢?

從函式影象上,我們很容易看出,當Q(x)=0.5的時候,KL散度取最小值,最小值為0。我們對上面的公式做一個變形:

\[D_{KL}(P||Q)= \sum_{i=1}^nP(x_i)log(\frac{P(x_i)}{Q(x_i)})=\sum_{i=1}^nP(x_i)log(P(x_i)) - \sum_{i=1}^nP(x_i)log(Q(x_i))\]

這個式子左邊\(\sum_{i=1}^nP(x_i)log(P(x_i))\)其實就是\(-H(X)\),對於一個確定的事件X來說,它的資訊熵是確定的,也就是說\(H(X)\)是一個常數,\(P(x_i)\)也是常數。log函式是一個凹函式,-log是凸函式。我們把\(P(x_i)\)當成常數的話,可以看出\(- \sum_{i=1}^nP(x_i)log(Q(x_i))\)是一個凸函式。

凸函式有一個jensen不等式:\(f(E(X)) \ge E(f(X)\),也即:變數期望的函式值大於變數函式值的期望,有點繞口令,看不明白沒關係,可以通過下圖直觀感受:

我們利用這個不等式試著證明:\(D_{KL}\ge 0\)

首先,我們對原式進行變形:

\[D_{KL}=\sum_{i=1}^nP(x_i)log(\frac{P(x_i)}{Q(x_i)})=E(log(\frac{P(x_i)}{Q(x_i)}))=E[-log(\frac{Q(x_i)}{P(x_i)})]\]

然後我們利用不等式:

\[E[-log(\frac{Q(x_i)}{P(x_i)})]\ge -log(E[\frac{Q(x_i)}{P(x_i)}])=-log(\sum_{i=1}^nP(x_i)\frac{Q(x_i)}{P(x_i)})=-log(\sum_{i=1}^nQ(x_i))=0\]

所以KL散度是一個非負值,但是為什麼當P和Q相等時,能取到最小值呢?我們單獨拿出右邊\(-\sum_{i=1}^nP(x_i)log(Q(x_i))\),我們令\(C(P, Q)=-\sum_{i=1}^nP(x_i)log(Q(x_i))\)。

我們探索\(C(P, P) - C(P, Q)\)的正負性來判斷P和Q的關係。

\[ \begin{aligned} C(P, P) - C(P, Q) &= \sum_{i=1}^nP(x_i)log(Q(x_i))-\sum_{i=1}^nP(x_i)log(P(x_i))\\ &=\sum_{i=1}^nP(x_i)log(\frac{Q(x_i)}{P(x_i)}) \end{aligned} \]

因為log(x)是凸函式,所以我們利用jensen不等式,可以得到:

\[ a_1log(x_1)+a_2log(x_2)+\cdots+a_nlog(x_n)\leq log(a_1x_1+a_2x_2+\cdots+a_nx_n),\quad (\sum_{i=1}^n a_i=1) \]

我們帶入\(\sum_{i=1}^nP(x_i)log(\frac{Q(x_i)}{P(x_i)}\)

\[ \begin{aligned} P(x_1)log(\frac{Q(x_1)}{P(x_1)})+P(x_2)log(\frac{Q(x_2)}{P(x_2)})+\cdots+P(x_n)log(\frac{Q(x_n)}{P(x_n)}) &\leq log(P(x_1)\frac{Q(x_1)}{P(x_1)} + P(x_2)\frac{Q(x_2)}{P(x_2)} + \cdots + P(x_n)\frac{Q(x_n)}{P(x_n)} \\ \sum_{i=1}^nP(x_i)log(\frac{Q(x_i)}{P(x_i)} &\leq log(Q(x_1) + Q(x_2) + \cdots + Q(x_n)) = 0 \end{aligned} \]

所以\(C(P, P) - C(P, Q) \leq 0\), 即\(C(P, P) \leq C(P, Q)\),當且僅當 P=Q時等號成立。


交叉熵


通過上面一系列證明,我們可以確定,KL散度可以反映兩個概率分佈的距離情況。由於P是樣本已知的分佈,所以我們可以用KL散度反映Q這個模型產出的結果與P的距離。距離越近,往往說明模型的擬合效果越好,能力越強。

我們把上面定義的C(P, Q)帶入KL散度的定義,會發現:

\[D_{KL}(P||Q)= \sum_{i=1}^nP(x_i)log(\frac{P(x_i)}{Q(x_i)})=\sum_{i=1}^nP(x_i)log(P(x_i)) + C(P, Q)\]

對於一個確定的樣本集來說,\(P(x_i)\)是定值,所以我們可以拋開左邊\(\sum_{i=1}^nP(x_i)log(P(x_i))\)不用管它,單純來看右邊。右邊我們剛剛定義的C(P, Q)其實就是交叉熵。

說白了,交叉熵就是KL散度去除掉了一個固定的定值的結果。KL散度能夠反映P和Q分佈的相似程度,同樣交叉熵也可以,而且交叉熵的計算相比KL散度來說要更為精簡一些。

如果我們只考慮二分類的場景,那麼\(C(P, Q) = -P(x=0)log(Q(x=0)) - P(x=1)log(Q(x=1))\)

由於\(P(x=0)\)結果已知,並且:\(P(x=0) + P(x=1)=1, Q(x=0) + Q(x=1)=1\)。我們令\(P(x=0) = y, Q(x=0)=\hat{y}\)

所以上式可以變形為:

\[C(P, Q) = -(ylog(\hat{y}) + (1 - y)log(1 - \hat{y}))\]

這個式子就是我們在機器學習書上最常見到的二分類問題的交叉熵的公式在資訊理論上的解釋,我們經常使用,但是很少會有資料會將整個來龍去脈完整的推導一遍。對於我們演算法學習者而言,我個人覺得只有將其中的細節深挖一遍,才能真正獲得提升,才能做到知其然,並且知其所以然。理解了這些,我們在面試的時候才能真正做到遊刃有餘。

當然,到這裡其實還沒有結束。仍然存在一個問題,可以反映模型與真實分佈距離的公式很多,為什麼我們訓練模型的時候單單選擇了交叉熵呢,其他的公式不行嗎?為什麼呢?


分析


我們來實際看個例子就明白了,假設我們對模型:\(\hat{y} = \sigma(\theta X)\)選擇MSE(均方差)作為損失函式。假設對於某個樣本x=2,y=0,\(\theta_0=2, \theta_1 = 1\)那麼\(\theta X=4\),此時\(\sigma(\theta X)=0.98\)。

此時\(\displaystyle MSE=\frac{(\sigma(\theta X)-y)^2}{2}\)。

我們對它求關於\(\theta\)的偏導:

\[ \begin{aligned} MSE' &= (\sigma(\theta X)-y)\cdot \sigma'(\theta X)\cdot X\\ &=0.98 * 2 * \sigma(\theta X)\cdot (1-\sigma(\theta X)) \\ &\approx 2 * 0.98 * 0.02 \\ &\approx 0.04 \end{aligned} \]

所以如果我們通過梯度下降來學習的話,\(\theta_{next} = \theta - 0.04 * \eta \cdot \theta\)。

這個式子看起來很正常,但是隱藏了一個問題,就是我們這樣計算出來的梯度實在是太小了。通過梯度下降去訓練模型需要消耗大量的時間才能收斂。

如果我們將損失函式換成交叉熵呢?

我們回顧一下交叉熵求梯度之後的公式:

\[\frac{\partial}{\partial\theta}J(\theta) = -(\hat{Y} - Y)\cdot X\]

我們帶入上面具體的值,可以算出來如果使用交叉上來訓練,我們算出來的梯度為1.96,要比上面算出來的0.04大了太多了。顯然這樣訓練模型的收斂速度會快很多,這也是為什麼我們訓練分類模型採用交叉熵作為損失函式的原因。

究其原因是因為如果我們使用MSE來訓練模型的話,在求梯度的過程當中免不了對sigmoid函式求導。而正是因為sigmoid的導數值非常小,才導致了我們梯度下降的速度如此緩慢。那麼為什麼sigmoid函式的導數這麼小呢?我們來看下它的影象就知道了:

觀察一下上面這個影象,可以發現當x的絕對值大於4的時候,也就是影象當中距離原點距離大於4的兩側,函式影象就變得非常平緩。而導數反應函式影象的切線的斜率,顯然這些區域的斜率都非常小,而一開始引數稍微設定不合理,很容易落到這些區間裡。那麼通過梯度下降來迭代自然就會變得非常緩慢。

所以無論是機器學習還是深度學習,我們一般都會少會對sigmoid函式進行梯度下降。在之前邏輯迴歸的文章當中,我們通過極大似然推匯出了交叉熵的公式,今天我們則是利用了資訊理論的知識推導了交叉熵的來龍去脈。兩種思路的出發點和思路不同,但是得到的結果卻是同樣的。關於這點數學之美當中給出瞭解釋,因為資訊理論是更高維度的理論,它反映的其實是資訊領域最本質的法則。就好像物理學當中公式千千萬,都必須要遵守能量守恆、物質守恆一樣。機器學習也好,深度學習也罷,無非是資訊領域的種種應用,自然也逃不脫資訊理論的框架。不知道看到這裡,你有沒有一點豁然開朗和一點震撼的感覺呢?

今天的文章就到這裡,公式比較多,但推導過程並不難,希望大家不要被嚇住,能冷靜看懂。如果覺得有所收穫,請順手掃碼點個關注吧,你們的支援是我最大的動力。

相關推薦

機器學習損失函式交叉

本文始發於個人公眾號:TechFlow,原創不易,求個關注 今天這篇文章和大家聊聊機器學習領域的熵。 我在看paper的時候發現對於交叉熵的理解又有些遺忘,複習了一下之後,又有了一些新的認識。故寫下本文和大家分享。 熵這個概念應用非常廣泛,我個人認為比較經典的一個應用是在熱力學當中,反應一個系統的混亂程度。

機器學習經典損失函式交叉和均方差

技術交流qq群: 659201069損失函式是用來評估預測模型效果的,即model的預測值與實真實值的差距。不用的機器學習模型有不同的損失函式來評估。本篇博文主要講用於分類問題的交叉熵和迴歸問題的均方差。先來說下分類和迴歸的區別。機器學習或深度學習領域常見的就是分類和迴歸,通

深度學習基礎--loss與啟用函式--sigmiod與softmax;對數損失函式交叉代價函式

sigmiod與softmax   sigmiod就是邏輯迴歸(解決二分類問題);softmax是多分類問題的邏輯迴歸   雖然邏輯迴歸能夠用於分類,不過其本質還是線性迴歸。它僅線上性迴歸的基礎上,在特徵到結果的對映中加入了一層sigmoid函式(非線性)對映,即先把特徵線性求和,然後使

入門|機器學習中的梯度消失、爆炸原因及其解決方法

前言:   本文主要深入介紹深度學習中的梯度消失和梯度爆炸的問題以及解決方案。本文分為三部分,第一部分主要直觀的介紹深度學習中為什麼使用梯度更新,第二部分主要介紹深度學習中梯度消失及爆炸的原因,第三部分對提出梯度消失及爆炸的解決方案。有基礎的同鞋可以跳著閱讀。 其中,梯度

《TensorFlow實戰Google深度學習框架》——4.2.1 經典損失函式交叉、均方差)

目錄 1、交叉熵 1、交叉熵 交叉熵是分類問題中使用比較廣的一種損失函式,刻畫了兩個概率分佈之間的距離。 給定兩個概率分佈p和q,通過q來表示p的交叉熵為: 交叉熵刻畫的是兩個概率分佈之間的距離,然而神經網路的輸出卻不一定是一個概率分佈。Softmax迴歸就

深度學習裡的損失函式交叉

1.MSE損失函式 損失函式是機器學習與深度學習裡面的重要概念。從名字上就可以看出,損失函式(Loss Function)反應的是模型對資料的擬合程度。一般來說,損失函式越小,說明模型對資料的擬合也越好。同時我們還希望當損失函式比較大的時候,對應的梯度也會比較大,這樣梯度下降的時候更

機器學習損失函式、L1-L2正則化的前世今生

前言: 我們學習一個演算法總是要有個指標或者多個指標來衡量一下算的好不好,不同的機器學習問題就有了不同的努力目標,今天我們就來聊一聊迴歸意義下的損失函式、正則化的前世今生,從哪裡來,到哪裡去。 一.L1、L2下的Lasso Regression和Ridg

機器學習-損失函式彙總

在統計學習中,當有了模型的假設空間,則需要考慮通過什麼樣的準則學習或選擇最優的模型,然而需要引入損失函式與風險函式的概念。    損失函式是度量模型一次預測的好壞;    風險函式是度量平均意義下模型

機器學習中的K近鄰算法(上)

指定 測試 mage 分數 info 模型 參數 center 性能 在人工智能中,機器學習是一個十分重要的內容,而在機器學習中,k近鄰算法是一個十分容易理解的機器學習算法。正因為容易理解,並且k近鄰算法也是一個十分重要的內容,所以我們在這幾篇文章中給大家介紹一下k近鄰算

機器學習中的K近鄰算法(下)

img 同仁 支持 並且 圖片 自己 src 是什麽 k近鄰 我們在上一篇文章中給大家介紹了很多關於K近鄰算法的知識,比如K近鄰算法的三要素、算法執行的步驟、應用領域以及註意事項,但是K近鄰算法的使用註意事項可能大家可能不是很清楚的,我們在這篇文章中針對這個問題進行解答,

例項機器學習如何解決問題

前言 隨著大資料時代的到來,機器學習成為解決問題的一種重要且關鍵的工具。不管是工業界還是學術界,機器學習都是一個炙手可熱的方向,但是學術界和工業界對機器學習的研究各有側重,學術界側重於對機器學習理論的研究,工業界側重於如何用機器學習來解決實際問題。我們結合美團在機器學習

深度學習經典網路架構(十):九大框架彙總

目錄 0、概覽 2、總結 本文是對本人前面講的的一些經典框架的彙總。 純手打,如果有不足之處,可以在評論區裡留言。 0、概覽 1、個人心得 (1)LeNet:元老級框架,結構簡單,卻開創了卷積神經網路的新紀元,具有重要的學

STM32 標準外設版USB驅動庫(架構+檔案+函式+使用說明+示例程式)

寫在前面 目前,ST的USB驅動有兩套,一套是早期的獨立版USB驅動,官方培訓文件中稱為Legacy library,最新版為2.2.0;一套為針對其Cube系列的驅動,根據晶片不同可能有區別,具體見對應晶片的Cube驅動包,官方培訓文件中稱為Cube li

ufunc函式( 基礎學習 tcy)

ufunc函式 2018/11/22 # ufunc是universal function的縮寫,是一種能對陣列中每個元素進行操作的函式。 # Numpy內建的許多ufunc函式都是C語言實現的,計算速度非常快 ===============================

深度學習經典網路架構(九):DPN(Dual Path Network)

目錄 0、簡介 1、優勢 3、總結 0、簡介 論文:Dual Path Networks 演算法詳解: 介紹的duall path networks(DPN)是顏水成老師新作,2017年4月在arxiv上放出,對於影象分類的效果有一定提升。我們知

SQL開窗函式--可代替聚合函式使用

       在沒學習開窗函式之前,我們都知道,用了分組之後,查詢欄位就只能是分組欄位和聚合的欄位,這帶來了極大的不方便,有時我們查詢時需要分組,又需要查詢不分組的欄位,每次都要又到子查詢,這樣顯得sql語句複雜難懂,給維護程式碼的人帶來很大的痛苦,然而開窗函數出現了,

自己動手實現深度學習框架-4 使用交叉損失函式支援分類任務

程式碼倉庫: https://github.com/brandonlyg/cute-dl 目標 增加交叉熵損失函式,使框架能夠支援分類任務的模型。 構建一個MLP模型, 在mnist資料集上執行分類任務準確率達到91%。 實現交叉熵損失函式 數學原理 分解交叉熵損失函式     &n

python子進程模塊subprocess與應用實例

app 命令執行 windows rom not tput 一個 網絡 shell命令 二、應用實例解析 2.1 subprocess模塊的使用 1. subprocess.call >>> subprocess.call(["ls", "-l"]) 0

人工智能與機器學習的不同

沒有 機器學習 決定 深度學習 支持向量 傳統 模擬 性能 處理 人工智能早已不是一個新名詞,它的發展歷史已經有幾十年。從80年代早期開始,當時計算機科學家設計出可以學習和模仿人類行為的算法。在學習方面,最重要的算法是神經網絡,但由於模型過於強大,沒有足夠的數據支持,導致不

機器學習數學基礎矩陣理論(三)

gis 引入 定義 增加 2017年 理論值 nbsp 得到 正數 矩陣求導 目錄 一、 矩陣求導的基本概念 1. 一階導定義 2. 二階導數 二、 梯度下降 1. 方向導數. 1.1 定義 1.2 方向導數的計算公式. 1.3 梯度下降最快的方向 1.