爲何是SoftMax?

標籤: 深度學習微信


輸出層的激勵函數 - SOFTMAX

SOFTMAX 長什麼樣子?以下圖所示網絡

image_1cq5pgbtq6vsb0ks2a1jippcf9.png

從圖的樣子上看,和普通的全鏈接方式並沒有差別,但激勵函數的形式卻大不同。
微信截圖_20181022153759.png-66.5kB
image_1cqdbm3l51ntme1g1i4pnd1u2t4c.png-186.3kBide

  • 首前後面一層做爲預測分類的輸出節點,每個節點就表明一個分類,如圖所示,那麼這7個節點就表明着7個分類的模型,任何一個節點的激勵函數都是:
    $$ {\sigma _i}(z) = \frac{{{e^{{z_i}}}}}{{\sum\limits_{j = 1}^m {{e^{{z_i}}}} }} $$

其中$i$就是節點的下標次序,而$z_i=w_i+b_i$,也就說這是一個線性分類器的輸出做爲天然常數$e$的指數。最有趣的是最後一層有這樣的特性:
$$\sum\limits_{i = 1}^J {{\sigma _i}(z)} = 1$$
也就是說最後一層的每一個節點的輸出值的加和是1。這種激勵函數從物理意義上能夠解釋爲一個樣本經過網絡進行分類的時候在每一個節點上輸出的值都是小於等於1的,是它從屬於這個分類的機率。
訓練數據由訓練樣本和分類標籤組成。以下圖所,j假設有7張圖,分別爲飛機、汽車、輪船、貓、狗、鳥、太陽,則圖像的分類標籤以下表示:
$$\left[ \begin{array}{l}1 \\0 \\0 \\0 \\0 \\0 \\0 \end{array} \right]\left[ \begin{array}{l}0 \\1 \\0 \\0 \\0 \\0 \\0 \end{array} \right]\left[ \begin{array}{l}0 \\0 \\1 \\0 \\0 \\0 \\0 \end{array} \right]\left[ \begin{array}{l}0\\0 \\0 \\1 \\0 \\0 \\0 \end{array} \right]\left[ \begin{array}{l}0\\0 \\0 \\0 \\1 \\0 \\0 \end{array} \right]\left[ \begin{array}{l}0\\0 \\0 \\0 \\0 \\1 \\0 \end{array} \right]\left[ \begin{array}{l}0\\0 \\0 \\0 \\0 \\0 \\1 \end{array} \right]$$函數

這種激勵函數一般用在神經網絡的最後一層做爲分類器的輸出,有7個節點就能夠作7個不一樣類別的判別,有1000個節點就能夠作1000個不一樣樣本類別的判斷。學習

熵與交叉熵

的本質是香農信息量($log( \frac{{1}}{{p}})$,$-log(p)$)的指望。
熵在信息論中表明隨機變量不肯定度的度量。一個離散型隨機變量 X 的熵 H(X) 定義爲:
$$ H(X) = - \sum\limits_{i = 1}^K {p({x_i})\log (p({x_i}))} $$
交叉熵刻畫的是實際輸出機率和指望輸出機率的距離,交叉熵的值越小,則兩個機率分佈越接近,即實際與指望差距越小。交叉熵中的交叉就體如今$p$(指望機率分佈),$q$(實際機率分佈)。假設機率分佈$p$爲指望輸出,機率分佈爲$q$爲實際輸出,$H(X)$爲交叉熵。則:
$$H(X) = - \sum\limits_{i = 1}^K {p({x_i})\log (q({x_i}))}$$
假如,n=3,指望輸出$p=(1,0,0)$,模型1的實際輸出爲$q_1=(0.5,0.2,0.3)$,模型2的實際輸出爲$q_2=(0.8,0.1,0.1)$,那麼交叉熵爲:
$$H(p,q_1)=-(1 \times {\ln ^{0.5}}0 +0 \times ln^{0.2} + 0 \times ln^{0.3})= 0.69$$
$$H(p,q_2)=-(1 \times {\ln ^{0.8}}0 + 0 \times ln^{0.1} + 0 \times ln^{0.1})= 0.22$$ui

pytorch中的實現:spa

import torch
import numpy as np
input1 = torch.from_numpy(np.array([[0.8,0.1,0.1]]))
input1.requires_grad=True
target1= torch.from_numpy(np.array([0])).long()
output1 = loss(input1, target1)
print(nll_loss(torch.log(input1),target1))

輸出 tensor(0.2231, dtype=torch.float64, grad_fn=<NllLossBackward>)
很顯然,$q_2$和$p$分佈更接近。code

假如,以「中國乒乓球隊和巴西乒乓球對比賽結果」爲例:
假設中國乒乓球隊和巴西乒乓球隊歷史交手64次,其中中國隊獲勝63次,63/64是賽前你們廣泛承認的中國隊獲勝機率,這個是先驗機率。
那麼此次中國隊獲勝的平均信息量有多大呢?
$$H(X_i=中國隊獲勝) = \frac{{63}}{{64}}{\log _2}\frac{{63}}{{64}} $$
同理:
$$H(X_i=巴西隊獲勝) = \frac{{1}}{{64}}{\log _2}\frac{{1}}{{64}} $$ip

因此,「中國乒乓球隊和巴西乒乓球對比賽結果」,這一信息的信息熵爲:
$$H(X) =- \sum\limits_{i = 1}^n {p({x_i})\log (p({x_i}))}\\ =H(X_i=中國隊獲勝)+H(X_i=巴西隊獲勝)\\ =\frac{{63}}{{64}}{\log _2}\frac{{63}}{{64}} + \frac{{1}}{{64}}{\log _2}\frac{{1}}{{64}}\\ = 0.1164 $$rem

交叉熵損失函數

爲何Cross Entropy損失函數經常使用於分類問題中呢?咱們從一個簡單的例子來分析。

問題引入
假設咱們有一個 三分類問題,分別用 模型1模型2來進行預測。

結果以下:

  • 模型1
樣本id 預測值 實際值 是否預測正確
1 [0.3,0.3,0.4] [0,0,1]
2 [0.3,0.4,0.3] [0,1,0]
3 [0.1,0.2,0.7] [1,0,0] ×
  • 模型2
樣本id 預測值 實際值 是否預測正確
1 [0.1,0.2,0.7] [0,0,1]
2 [0.1,0.7,0.2] [0,1,0]
3 [0.3,0.4,0.3] [1,0,0] ×

樣本1和樣本2模型1以0.4>0.3的微弱優點正確預測樣本1的標籤爲類別3,而模型2以0.7>0.2>0.1的巨大優點毫無懸念的正確預測出樣本標籤。

對於樣本3模型1模型2均預測錯誤,但模型1以0.7>0.2>0.1的機率,錯誤的預測樣本標籤爲標籤3,但實際標籤爲標籤1,錯的離譜!!!但模型2雖然也預測錯了,但0.4>0.3>0.2還不算太離譜。

如今咱們用損失函數來定義模型的表現。

Classification Error(分類錯誤率)

$$ClassificationError=\frac{count of error items}{count of all items} $$
-模型1:$$ClassificationError=\frac{1}{3}$$

-模型2:$$ClassificationError=\frac{1}{3}$$

模型1和模型2雖然都預測錯了1個,但相對來講模型2表現更好,按理說模型越好,損失函數值越小,但分類錯誤率並沒表現出來。

Mean Squared Error(均方偏差)

均方偏差損失也是一種比較常見的損失函數,其定義爲:
$$MSE=\frac{1}{n}\sum\limits_i^n {{{(\widehat {{y_i}} - {y_i})}^2}} $$

模型1:$$MSE=frac{(0.3^2+0.3^2+0.6^2)+(0.3^2+0.6^2+0.3^2)+(0.9^2+0.2^2+0.7^2)}{3}
\ =0.81$$

-模型2:$$MSE=frac{(0.1^2+0.1^2+0.3^2)+(0.1^2+0.3^2+0.2^2)+(0.7^2+0.4^2+0.3^2)}{3}
\ =0.34$$

咱們發現MSE能判斷出模型2優於模型1,但採用梯度降低法來求解的時候,MSE的一個缺點就是其偏導值在輸出機率值接近0或者接近1的時候很是小,這可能會形成模型剛開始訓練時,梯度幾乎消失。
對於分類問題的損失函數來講,分類錯誤率(分類精確率)和平方和損失都不是很好的損失函數,下面咱們來看一下交叉熵損失函數的表現狀況。

交叉熵損失函數的定義

二分類

在二分類的狀況下,模型最終預測的結果只有2類,對於每一個類別咱們預測的機率爲$1-p$和$p$。
此時Binary Cross Entropy:
$J=-[y·log(p)+(1-y)·log(1-p)]$
其中:

  • y : 樣本標籤,正樣本標籤爲1,負樣本標籤爲0
  • p : 預測爲正樣本的機率

多分類

多分類實際是二分類的擴展。
$$ J= - \sum\limits_{i = 1}^K {{y_i}\log ({p_i})} $$
其中:

  • K : 類別的數量
  • y : 是不是類別$c$,$y \in (0,1)$
  • p : 樣本屬於類別$c$的機率

如今咱們用交叉熵損失函數來計算損失函數值。

  • 模型1:
    $$CEE=-[0 \times log0.3 + 0 \times log0.3 + 1 \times log0.4] -[0 \times log0.3 + 1 \times log0.4 + \\ 0 \times log0.3] -[1 \times log0.1 + 0 \times log0.2 + 0 \times log0.7]\\= 0.397+0.397 +1 =1.8 $$
  • 模型2:
    $$CEE=-[0 \times log0.1 + 0 \times log0.2 + 1 \times log0.7]-[0 \times log0.1 + 1 \times log0.7 + \\ 0 \times log0.2]-[1 \times log0.1 + 0 \times log0.2 + 0 \times log0.3]\\= 0.15+0.15+0.397=0.697 $$

能夠發現,交叉熵損失函數能夠捕捉到模型1和模型2的差別。

函數性質

交叉熵損失函數常常用於分類問題中,特別是神經網絡分類問題,因爲交叉熵涉及到計算每一個類別的機率,因此在神經網絡中,交叉熵與softmax函數緊密相關。
咱們用神經網絡的最後一層輸出狀況來看。
微信截圖_20181023174230.png-94kB

下面咱們來推下整個求導公式,求導如圖所示,分爲三個過程:
$$\frac{{\partial J}}{{\partial {w_n}}} = \frac{{\partial J}}{{\partial {p_j}}} \cdot \frac{{\partial {p_j}}}{{\partial {y_i}}} \cdot \frac{{\partial {y_i}}}{{\partial {w_n}}}$$

先看$\frac{{\partial J}}{{\partial {p_j}}}$:

$$ \frac{{\partial J}}{{\partial {p_j}}} = \frac{{\partial ( - \sum\limits_{j = 1}^K {{y_i}\log ({p_j})} )}}{{\partial {p_j}}} = - \sum\limits_{j = 1}^K {\frac{{{y_i}}}{{{p_j}}}} $$

結合上圖,再看$ \frac{{\partial {p_j}}}{{\partial {y_i}}}$:
$${p_j} = \frac{{{e^{{y_i}}}}}{{\sum\limits_{j = 1}^K {{e^{{y_j}}}} }}$$

  • 當j=i時候:
    $$ {p_i} = \frac{{{e^{{y_i}}}}}{{\sum\limits_{j = 1}^K {{e^{{y_j}}}} }}$$

$$ \frac{{\partial {p_j}}}{{\partial {y_i}}} = \frac{{\partial (\frac{{{e^{{y_i}}}}}{{\sum\limits_{j = 1}^K {{e^{{y_j}}}} }})}}{{\partial {y_i}}} \\= \frac{{({e^{{y_i}}})'\sum\limits_{j = 1}^K {{e^{{y_j}}}} - {e^{{y_i}}}(\sum\limits_{j = 1}^K {{e^{{y_k}}}} )'}}{{{{(\sum\limits_{j = 1}^K {{e^{{y_j}}}} )}^2}}} \\= \frac{{{e^{{y_i}}}\sum\limits_{j = 1}^K {{e^{{y_i}}}} - {{({e^{{y_i}}})}^2}}}{{{{(\sum\limits_{j = 1}^K {{e^{{y_i}}}} )}^2}}} \\= \frac{{{e^{{y_i}}}}}{{\sum\limits_{j = 1}^K {{e^{{y_j}}}} }} - \frac{{{{({e^{{y_i}}})}^2}}}{{{{(\sum\limits_{j = 1}^K {{e^{{y_j}}}} )}^2}}} \\= \frac{{{e^{{y_i}}}}}{{\sum\limits_{j = 1}^K {{e^{{y_j}}}} }}(1 - \frac{{{e^{{y_i}}}}}{{\sum\limits_{j = 1}^K {{e^{{y_j}}}} }})\\= S({y_i})(1 - S({y_i})\\=p(i)(1-p(i)) $$

  • 當j≠i時候:
    $${p_j} = \frac{{{e^{{y_j}}}}}{{\sum\limits_{j = 1}^K {{e^{{y_j}}}} }}$$
    $$ \frac{{\partial {p_j}}}{{\partial {y_i}}} = \frac{{\partial (\frac{{{e^{{y_j}}}}}{{\sum\limits_{j = 1}^K {{e^{{y_j}}}} }})}}{{\partial {y_i}}}\\= \frac{{({e^{{y_j}}})'\sum\limits_{j = 1}^K {{e^{{y_j}}}} - {e^{{y_j}}}(\sum\limits_{j = 1}^K {{e^{{y_j}}}} )'}}{{{{(\sum\limits_{j = 1}^K {{e^{{y_j}}}} )}^2}}}\\ = \frac{{0\sum\limits_{j = 1}^K {{e^{{y_j}}}} - {e^{{y_j}}}{e^{{y_i}}}}}{{{{(\sum\limits_{k = 1}^K {{e^{{y_k}}}} )}^2}}}\\= \frac{{ - {e^{{y_j}}}{e^{{y_j}}}}}{{{{(\sum\limits_{j = 1}^K {{e^{{y_j}}}} )}^2}}}\\= - S({y_j})S({y_i})\\-p(j)p(i)$$
  • 再看$\frac{{\partial {y_i}}}{{\partial {w_n}}}$
    $$\frac{{\partial {y_i}}}{{\partial {w_n}}}=x_n$$

    接下來咱們只須要把上面的組合起來:

$$\frac{{\partial J}}{{\partial {p_j}}} \cdot \frac{{\partial {p_j}}}{{\partial {y_i}}}\\ \begin{array}{l} = - p(i)(1 - p(i))\sum\limits_{i = 1,i = j}^K {\frac{{{y_i}}}{{{p_i}}}} - p(i)p(j)\sum\limits_{i = 1,i \ne j}^K {\frac{{{y_i}}}{{{p_j}}}}\\= - (1 - p(i))\sum\limits_{i = 1,i = j}^K {{y_i}} - p(i)\sum\limits_{i = 1,i \ne j}^K {{y_i}}\\= - \sum\limits_{i = 1,i = j}^K {{y_i}} + p(i)\sum\limits_{i = 1}^K {{y_i}}\end{array}$$
最後針對分類問題,給定的$y_i$中只會有一個類別是1,其餘類別都是0,因此
$$\frac{{\partial J}}{{\partial {p_j}}} \cdot \frac{{\partial {p_j}}}{{\partial {y_i}}} \cdot \frac{{\partial J}}{{\partial {w_n}}} \\= \frac{{\partial {y_i}}}{{\partial {w_n}}}\\=(p(i)-1)w_n$$

注意看,$p(i)-1$是啥?是否是SoftMax層的輸出的機率-1,梯度就是這麼容易計算!!!太神奇了?!就是爲何神經網絡分類器要用交叉熵損失函數的緣由!

相關文章
相關標籤/搜索