1. 程式人生 > >一文搞懂交叉熵損失

一文搞懂交叉熵損失

本文從資訊理論和最大似然估計得角度推導交叉熵作為分類損失函式的依據。

從熵來看交叉熵損失

資訊量

資訊量來衡量一個事件的不確定性,一個事件發生的概率越大,不確定性越小,則其攜帶的資訊量就越小。

設\(X\)是一個離散型隨機變數,其取值為集合\(X = {x_0,x_1,\dots,x_n}\) ,則其概率分佈函式為\(p(x) = Pr(X = x),x \in X\),則定義事件\(X = x_0\) 的資訊量為:
\[ I(x_0) = -\log(p(x_0)) \]
當\(p(x_0) = 1\)時,該事件必定發生,其資訊量為0.

熵用來衡量一個系統的混亂程度,代表系統中資訊量的總和;熵值越大,表明這個系統的不確定性就越大。

資訊量是衡量某個事件的不確定性,而熵是衡量一個系統(所有事件)的不確定性。

熵的計算公式
\[ H(x) = -\sum_{i=1}^np(x_i)\log(p(x_i)) \]
其中,\(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\)的相對熵是:
\[ D_{KL}(p \parallel q) = \sum_i p(x_i) log(\frac{p(x_i)}{q(x_i)}) \]

相對熵具有以下性質:

  • 如果\(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)\)的困難程度:
\[ H(p,q) = \sum_ip(x_i)log\frac{1}{\log q(x_i)} = -\sum_ip(x_i)\log q(x_i) \]
將熵、相對熵以及交叉熵的公式放到一起,
\[ \begin{align} H(p) &= -\sum_{i}p(x_i) \log p(x_i) \\ D_{KL}(p \parallel q) &= \sum_{i}p(x_i)\log \frac{p(x_i)}{q(x_i)} = \sum_i (p(x_i)\log p(x_i) - p(x_i) \log q(x_i)) \\ H(p,q) &= -\sum_ip(x_i)\log q(x_i) \end{align} \]
通過上面三個公式就可以得到
\[ D_{KL}(p,q) = H(p,q)- H(p) \]
在機器學習中,目標的分佈\(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\) 的概率分佈,得到似然函式
\[ L(\theta) = q(X; \theta) = \prod_i^mq(x_i;\theta) \]
最大似然估計就是求得\(\theta\) 使得\(L(\theta)\) 的值最大,也就是
\[ \theta_{ML} = arg \max_{\theta} \prod_i^mq(x_i;\theta) \]
對上式的兩邊同時取\(\log\) ,等價優化\(\log\) 的最大似然估計即log-likelyhood ,最大對數似然估計
\[ \theta_{ML} = arg \max_\theta \sum_i^m \log q(x_i;\theta) \]
對上式的右邊進行縮放並不會改變\(arg \max\) 的解,上式的右邊除以樣本的個數\(m\)
\[ \theta_{ML} = arg \max_\theta \frac{1}{m}\sum_i^m\log q(x_i;\theta) \]

和相對熵等價

上式的最大化\(\theta_{ML}\) 是和沒有訓練樣本沒有關聯的,就需要某種變換使其可以用訓練的樣本分佈來表示,因為訓練樣本的分佈可以看作是已知的,也是對最大化似然的一個約束條件。

注意上式的
\[ \frac{1}{m}\sum_i^m\log q(x_i;\theta) \]
相當於求隨機變數\(X\) 的函式\(\log (X;\theta)\) 的均值 ,根據大數定理,隨著樣本容量的增加,樣本的算術平均值將趨近於隨機變數的期望。 也就是說
\[ \frac{1}{m}\sum_i^m \log q(x_i;\theta) \rightarrow E_{x\sim P}(\log q(x;\theta)) \]
其中\(E_{X\sim P}\) 表示符合樣本分佈\(P\) 的期望,這樣就將最大似然估計使用真實樣本的期望來表示
\[ \begin{aligned} \theta_{ML} &= arg \max_{\theta} E_{x\sim P}({\log q(x;\theta)}) \\ &= arg \min_{\theta} E_{x \sim P}(- \log q(x;\theta)) \end{aligned} \]
對右邊取負號,將最大化變成最小化運算。

上述的推導過程,可以參考 《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))\) 。

\[ \begin{aligned} D_{KL}(p \parallel q) &= \sum_i p(x_i) log(\frac{p(x_i)}{q(x_i)})\\ &= E_{x\sim p}(\log \frac{p(x)}{q(x)}) \\ &= E_{x \sim p}(\log p(x) - \log q(x)) \\ &= E_{x \sim p}(\log p(x)) - E_{x \sim p} (\log q(x)) \end{aligned} \]

由於\(E_{x \sim p} (\log p(x))\) 是訓練樣本的期望,是個固定的常數,在求最小值時可以忽略,所以最小化\(D_{KL}(p \parallel q)\) 就變成了最小化\(-E_{x\sim p}(\log q(x))\) ,這和最大似然估計是等價的。

和交叉熵等價

最大似然估計、相對熵、交叉熵的公式如下
\[ \begin{aligned}\theta_{ML} &= -arg \min_\theta E_{x\sim p}\log q(x;\theta) \\D_{KL} &= E_{x \sim p}\log p(x) - E_{x \sim p} \log q(x) \\H(p,q) &= -\sum_i^m p(x_i) \log q(x_i) = -E_{x \sim p} \log q(x)\end{aligned}\begin{aligned}\theta_{ML} &= arg \min_\theta E_{x\sim p}\log q(x;\theta) \\D_{KL} &= E_{x \sim p}\log p(x) - E_{x \sim p} \log q(x) \\H(p,q) &= -\sum_i^m p(x_i) \log q(x_i) = -E_{x \sim p} \log q(x)\end{aligned} \]
從上面可以看出,最小化交叉熵,也就是最小化\(D_{KL}\) ,從而預測的分佈\(q(x)\) 和訓練樣本的真實分佈\(p(x)\) 最接近。而最小化\(D_{KL}\) 和最大似然估計是等價的。

多分類交叉熵

多分類任務中輸出的是目標屬於每個類別的概率,所有類別概率的和為1,其中概率最大的類別就是目標所屬的分類。 而softmax 函式能將一個向量的每個分量對映到\([0,1]\) 區間,並且對整個向量的輸出做了歸一化,保證所有分量輸出的和為1,正好滿足多分類任務的輸出要求。所以,在多分類中,在最後就需要將提取的到特徵經過softmax函式的,輸出為每個類別的概率,然後再使用交叉熵 作為損失函式。

softmax函式定義如下:
\[ S_i = \frac{e^{z_i}}{\sum^n_{i=1}e^{z_i}} \]
其中,輸入的向量為\(z_i(i = 1,2,\dots,n)\) 。

更直觀的參見下圖

通過前面的特徵提取到的特徵向量為\((z_1,z_2,\dots,z_k)\) ,將向量輸入到softmax函式中,即可得到目標屬於每個類別的概率,概率最大的就是預測得到的目標的類別。

Cross Entropy Loss

使用softmax函式可以將特徵向量對映為所屬類別的概率,可以看作是預測類別的概率分佈\(q(c_i)\) ,有
\[ q(c_i) = \frac{e^{z_i}}{\sum^n_{i=1}e^{z_i}} \]

其中\(c_i\) 為某個類別。

設訓練資料中類別的概率分佈為\(p(c_i)\) ,那麼目標分佈\(p(c_i)\) 和預測分佈\(q(c_i)\)的交叉熵為
\[ H(p,q) =-\sum_ip(c_i)\log q(c_i) \]
每個訓練樣本所屬的類別是已知的,並且每個樣本只會屬於一個類別(概率為1),屬於其他類別概率為0。具體的,可以假設有個三分類任務,三個類分別是:貓,豬,狗。現有一個訓練樣本類別為貓,則有:
\[ \begin{align} p(cat) & = 1 \\ p(pig) &= 0 \\ p(dog) & = 0 \end{align} \]

通過預測得到的三個類別的概率分別為:\(q(cat) = 0.6,q(pig) = 0.2,q(dog) = 0.2\) ,計算\(p\) 和\(q\) 的交叉熵為:
\[ \begin{aligned} H(p,q) &= -(p(cat) \log q(cat) + p(pig) + \log q(pig) + \log q(dog)) \\ &= - (1 \cdot \log 0.6 + 0 \cdot \log 0.2 +0 \cdot \log 0.2) \\ &= - \log 0.6 \\ &= - \log q(cat) \end{aligned} \]
利用這種特性,可以將樣本的類別進行重新編碼,就可以簡化交叉熵的計算,這種編碼方式就是one-hot 編碼。以上面例子為例,
\[ \begin{aligned} \text{cat} &= (1 0 0) \\ \text{pig} &= (010) \\ \text{dog} &= (001) \end{aligned} \]
通過這種編碼方式,在計算交叉熵時,只需要計算和訓練樣本對應類別預測概率的值,其他的項都是\(0 \cdot \log q(c_i) = 0\) 。

具體的,交叉熵計算公式變成如下:
\[ \text{Cross_Entropy}(p,q) = - \log q(c_i) \]
其中\(c_i\) 為訓練樣本對應的類別,上式也被稱為負對數似然(negative log-likelihood,nll)。

PyTorch中的Cross Entropy

PyTorch中實現交叉熵損失的有三個函式torch.nn.CrossEntropyLosstorch.nn.LogSoftmax以及torch.nn.NLLLoss

  • torch.nn.functional.log_softmax 比較簡單,輸入為\(n\)維向量,指定要計算的維度dim,輸出為\(log(Softmax(x))\)。其計算公式如下:

\[ \text{LogSoftmax}(x_i) = \log (\frac{\exp(x_i)}{\sum_j \exp(x_j)}) \]

沒有額外的處理,就是對輸入的\(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 不做處理,輸出的結果為向量;meannone結果求均值後輸出;sumnone 結果求和後輸出。

  • torch.nn.CrossEntropyLoss就是上面兩個函式的組合nll_loss(log_softmax(input))

二分類交叉熵

多分類中使用softmax函式將最後的輸出對映為每個類別的概率,而在二分類中則通常使用sigmoid 將輸出對映為正樣本的概率。這是因為二分類中,只有兩個類別:{正樣本,負樣本},只需要求得正樣本的概率\(q\),則\(1-q\) 就是負樣本的概率。這也是多分類和二分類不同的地方。

\(\text{sigmoid}\) 函式的表示式如下:
\[ \sigma(z) = \frac{1}{1 + e^{-z}} \]
sigmoid的輸入為\(z\) ,其輸出為\((0,1)\) ,可以表示分類為正樣本的概率。

二分類的交叉熵可以看作是交叉熵損失的一個特列,交叉熵為
\[ \text{Cross_Entropy}(p,q) = -\sum_i^m p(x_i) \log q(x_i) \]
這裡只有兩個類別\(x \in {x_1,x_2}\) ,則有
\[ \begin{aligned} \text{Cross_Entropy}(p,q) &= -(p(x_1) \log q(x_1) + p(x_2) \log q(x_2)) \end{aligned} \]
因為只有兩個選擇,則有\(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\) 。則上式可改寫為
\[ \text{Cross_Entropy}(p,q) = -(p \log q + (1-p) \log (1-q)) \]
也就是二分類交叉熵的損失函式。

總結

相對熵可以用來度量兩個分佈相似性,假設分佈\(p\)是訓練樣本的分佈,\(q\)是預測得到的分佈。分類訓練的過程實際上就是最小化\(D_{KL}(p \parallel q)\),由於由於交叉熵
\[H(p,q)= D_{KL}(p \parallel q) + H(p)\]
其中,\(H(p)\)是訓練樣本的熵,是一個已知的常量,這樣最小化相對熵就等價於最小化交叉熵。

從最大似然估計轉化為最小化負對數似然
\[ \theta_{ML} = -arg \min_\theta E_{x\sim p}\log q(x;\theta) \]
也等價於最小化相對熵