標籤: 深度學習微信
SOFTMAX 長什麼樣子?以下圖所示網絡
從圖的樣子上看,和普通的全鏈接方式並沒有差別,但激勵函數的形式卻大不同。
ide
其中$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來進行預測。
結果以下:
樣本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] | × |
樣本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還不算太離譜。
如今咱們用損失函數來定義模型的表現。
$$ClassificationError=\frac{count of error items}{count of all items} $$
-模型1:$$ClassificationError=\frac{1}{3}$$
-模型2:$$ClassificationError=\frac{1}{3}$$
模型1和模型2雖然都預測錯了1個,但相對來講模型2表現更好,按理說模型越好,損失函數值越小,但分類錯誤率並沒表現出來。
均方偏差損失也是一種比較常見的損失函數,其定義爲:
$$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)]$
其中:
多分類實際是二分類的擴展。
$$ J= - \sum\limits_{i = 1}^K {{y_i}\log ({p_i})} $$
其中:
如今咱們用交叉熵損失函數來計算損失函數值。
能夠發現,交叉熵損失函數能夠捕捉到模型1和模型2的差別。
交叉熵損失函數常常用於分類問題中,特別是神經網絡分類問題,因爲交叉熵涉及到計算每一個類別的機率,因此在神經網絡中,交叉熵與softmax函數緊密相關。
咱們用神經網絡的最後一層輸出狀況來看。
下面咱們來推下整個求導公式,求導如圖所示,分爲三個過程:
$$\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}}}} }}$$
$$ \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)) $$
接下來咱們只須要把上面的組合起來:
$$\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,梯度就是這麼容易計算!!!太神奇了?!就是爲何神經網絡分類器要用交叉熵損失函數的緣由!