交叉熵代價函數(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散度等價於最小化交叉熵。
因為等價,而且交叉熵更簡單更好計算,當然用它。