本文從信息論和最大似然估計得角度推導交叉熵作為分類損失函數的依據。
從熵來看交叉熵損失
信息量
信息量來衡量一個事件的不確定性,一個事件發生的概率越大,不確定性越小,則其攜帶的信息量就越小。
設\(X\)是一個離散型隨機變量,其取值為集合\(X = {x_0,x_1,\dots,x_n}\) ,則其概率分布函數為\(p(x) = Pr(X = x),x \in X\),則定義事件\(X = x_0\) 的信息量為:
當\(p(x_0) = 1\)時,該事件必定發生,其信息量為0.
熵
熵用來衡量一個系統的混亂程度,代表系統中信息量的總和;熵值越大,表明這個系統的不確定性就越大。
信息量是衡量某個事件的不確定性,而熵是衡量一個系統(所有事件)的不確定性。
熵的計算公式
其中,\(p(x_i)\)為事件\(X=x_i\)的概率,\(-log(p(x_i))\)為事件\(X=x_i\)的信息量。
可以看出,熵是信息量的期望值,是一個隨機變量(一個系統,事件所有可能性)不確定性的度量。熵值越大,隨機變量的取值就越難確定,系統也就越不穩定;熵值越小,隨機變量的取值也就越容易確定,系統越穩定。
相對熵 Relative entropy
相對熵也稱為KL散度(Kullback-Leibler divergence),表示同一個隨機變量的兩個不同分布間的距離。
設 \(p(x),q(x)\) 分別是 離散隨機變量\(X\)的兩個概率分布,則\(p\)對\(q\)的相對熵是:
相對熵具有以下性質:
- 如果\(p(x)\)和\(q(x)\)的分布相同,則其相對熵等於0
- \(D_{KL}(p \parallel q) \neq D_{KL}(q \parallel p)\),也就是相對熵不具有對稱性。
- $ D_{KL}(p \parallel q) \geq 0$
總的來說,相對熵是用來衡量同一個隨機變量的兩個不同分布之間的距離。在實際應用中,假如\(p(x)\)是目標真實的分布,而\(q(x)\)是預測得來的分布,為了讓這兩個分布盡可能的相同的,就需要最小化KL散度。
交叉熵 Cross Entropy
設 \(p(x),q(x)\) 分別是 離散隨機變量\(X\)的兩個概率分布,其中\(p(x)\)是目標分布,\(p\)和\(q\)的交叉熵可以看做是,使用分布\(q(x)\) 表示目標分布\(p(x)\)的困難程度:
將熵、相對熵以及交叉熵的公式放到一起,
通過上面三個公式就可以得到
在機器學習中,目標的分布\(p(x)\) 通常是訓練數據的分布是固定,即是\(H(p)\) 是一個常量。這樣兩個分布的交叉熵\(H(p,q)\) 也就等價於最小化這兩個分布的相對熵\(D_{KL}(p \parallel q)\)。
設\(p(x)\) 是目標分布(訓練數據的分布),我們的目標的就讓訓練得到的分布\(q(x)\)盡可能的接近\(p(x)\),這時候就可以最小化\(D_{KL}(p \parallel q)\),等價於最小化交叉熵\(H(p,q)\) 。
從最大似然看交叉熵
設有一組訓練樣本\(X= \{x_1,x_2,\cdots,x_m\}\) ,該樣本的分布為\(p(x)\) 。假設使用\(\theta\) 參數化模型得到\(q(x;\theta)\) ,現用這個模型來估計\(X\) 的概率分布,得到似然函數
最大似然估計就是求得\(\theta\) 使得\(L(\theta)\) 的值最大,也就是
對上式的兩邊同時取\(\log\) ,等價優化\(\log\) 的最大似然估計即log-likelyhood
,最大對數似然估計
對上式的右邊進行縮放並不會改變\(arg \max\) 的解,上式的右邊除以樣本的個數\(m\)
和相對熵等價
上式的最大化\(\theta_{ML}\) 是和沒有訓練樣本沒有關聯的,就需要某種變換使其可以用訓練的樣本分布來表示,因為訓練樣本的分布可以看作是已知的,也是對最大化似然的一個約束條件。
注意上式的
相當於求隨機變量\(X\) 的函數\(\log (X;\theta)\) 的均值 ,根據大數定理,隨着樣本容量的增加,樣本的算術平均值將趨近於隨機變量的期望。 也就是說
其中\(E_{X\sim P}\) 表示符合樣本分布\(P\) 的期望,這樣就將最大似然估計使用真實樣本的期望來表示
對右邊取負號,將最大化變成最小化運算。
上述的推導過程,可以參考 《Deep Learning》 的第五章。 但是,在書中變為期望的只有一句話,將式子的右邊除以樣本數量\(m\) 進行縮放,從而可以將其變為\(E_{x \sim p}\log q(x;\theta)\),沒有細節過程,也可能是作者默認上面的變換對讀者是一直。 確實是理解不了,查了很多文章,都是對這個變換的細節含糊其辭。一個周,對這個點一直耿耿於懷,就看了些關於概率論的科普書籍,其中共有介紹大數定理的:當樣本容量趨於無窮時,樣本的均值趨於其期望。
針對上面公式,除以\(m\)后,\(\frac{1}{m}\sum_i^m\log q(x_i;\theta)\) ,確實是關於隨機變量函數\(\log q(x)\) 的算術平均值,而\(x\) 是訓練樣本其分布是已知的\(p(x)\) ,這樣就得到了\(E_{x \sim p}(\log q(x))\) 。
由於\(E_{x \sim p} (\log p(x))\) 是訓練樣本的期望,是個固定的常數,在求最小值時可以忽略,所以最小化\(D_{KL}(p \parallel q)\) 就變成了最小化\(-E_{x\sim p}(\log q(x))\) ,這和最大似然估計是等價的。
和交叉熵等價
最大似然估計、相對熵、交叉熵的公式如下
從上面可以看出,最小化交叉熵,也就是最小化\(D_{KL}\) ,從而預測的分布\(q(x)\) 和訓練樣本的真實分布\(p(x)\) 最接近。而最小化\(D_{KL}\) 和最大似然估計是等價的。
多分類交叉熵
多分類任務中輸出的是目標屬於每個類別的概率,所有類別概率的和為1,其中概率最大的類別就是目標所屬的分類。 而softmax
函數能將一個向量的每個分量映射到\([0,1]\) 區間,並且對整個向量的輸出做了歸一化,保證所有分量輸出的和為1,正好滿足多分類任務的輸出要求。所以,在多分類中,在最后就需要將提取的到特征經過softmax
函數的,輸出為每個類別的概率,然后再使用交叉熵 作為損失函數。
softmax
函數定義如下:
其中,輸入的向量為\(z_i(i = 1,2,\dots,n)\) 。
更直觀的參見下圖
通過前面的特征提取到的特征向量為\((z_1,z_2,\dots,z_k)\) ,將向量輸入到softmax
函數中,即可得到目標屬於每個類別的概率,概率最大的就是預測得到的目標的類別。
Cross Entropy Loss
使用softmax
函數可以將特征向量映射為所屬類別的概率,可以看作是預測類別的概率分布\(q(c_i)\) ,有
其中\(c_i\) 為某個類別。
設訓練數據中類別的概率分布為\(p(c_i)\) ,那么目標分布\(p(c_i)\) 和預測分布\(q(c_i)\)的交叉熵為
每個訓練樣本所屬的類別是已知的,並且每個樣本只會屬於一個類別(概率為1),屬於其他類別概率為0。具體的,可以假設有個三分類任務,三個類分別是:貓,豬,狗。現有一個訓練樣本類別為貓,則有:
通過預測得到的三個類別的概率分別為:\(q(cat) = 0.6,q(pig) = 0.2,q(dog) = 0.2\) ,計算\(p\) 和\(q\) 的交叉熵為:
利用這種特性,可以將樣本的類別進行重新編碼,就可以簡化交叉熵的計算,這種編碼方式就是one-hot 編碼。以上面例子為例,
通過這種編碼方式,在計算交叉熵時,只需要計算和訓練樣本對應類別預測概率的值,其他的項都是\(0 \cdot \log q(c_i) = 0\) 。
具體的,交叉熵計算公式變成如下:
其中\(c_i\) 為訓練樣本對應的類別,上式也被稱為負對數似然(negative log-likelihood,nll)。
PyTorch中的Cross Entropy
PyTorch中實現交叉熵損失的有三個函數torch.nn.CrossEntropyLoss
,torch.nn.LogSoftmax
以及torch.nn.NLLLoss
。
torch.nn.functional.log_softmax
比較簡單,輸入為\(n\)維向量,指定要計算的維度dim
,輸出為\(log(Softmax(x))\)。其計算公式如下:
沒有額外的處理,就是對輸入的\(n\)維向量的每個元素進行上述運算。
torch.nn.functional.nll_loss
負對數似然損失(Negative Log Likelihood Loss),用於多分類,其輸入的通常是torch.nn.functional.log_softmax
的輸出值。其函數如下
torch.nn.functional.nll_loss(input, target, weight=None, size_average=None, ignore_index=-100, reduce=None, reduction='mean')
input
也就是log_softmax
的輸出值,各個類別的對數概率。target
目標正確類別,weight
針對類別不平衡問題,可以為類別設置不同的權值;ignore_index
要忽略的類別,不參與loss的計算;比較重要的是reduction
的值,有三個取值:none
不做處理,輸出的結果為向量;mean
將none
結果求均值后輸出;sum
將none
結果求和后輸出。
torch.nn.CrossEntropyLoss
就是上面兩個函數的組合nll_loss(log_softmax(input))
。
二分類交叉熵
多分類中使用softmax
函數將最后的輸出映射為每個類別的概率,而在二分類中則通常使用sigmoid
將輸出映射為正樣本的概率。這是因為二分類中,只有兩個類別:{正樣本,負樣本},只需要求得正樣本的概率\(q\),則\(1-q\) 就是負樣本的概率。這也是多分類和二分類不同的地方。
\(\text{sigmoid}\) 函數的表達式如下:
sigmoid的輸入為\(z\) ,其輸出為\((0,1)\) ,可以表示分類為正樣本的概率。
二分類的交叉熵可以看作是交叉熵損失的一個特列,交叉熵為
這里只有兩個類別\(x \in {x_1,x_2}\) ,則有
因為只有兩個選擇,則有\(p(x_1) + p(x_2) = 1,q(x_1) + q(x_2) = 1\) 。設,訓練樣本中\(x_1\)的概率為\(p\),則\(x_2\)為\(1-p\); 預測的\(x_1\)的概率為\(q\),則\(x_2\)的預測概率為\(1 - q\) 。則上式可改寫為
也就是二分類交叉熵的損失函數。
總結
相對熵可以用來度量兩個分布相似性,假設分布\(p\)是訓練樣本的分布,\(q\)是預測得到的分布。分類訓練的過程實際上就是最小化\(D_{KL}(p \parallel q)\),由於由於交叉熵
其中,\(H(p)\)是訓練樣本的熵,是一個已知的常量,這樣最小化相對熵就等價於最小化交叉熵。
從最大似然估計轉化為最小化負對數似然
也等價於最小化相對熵。