1. 程式人生 > >softmax交叉熵損失函式反向傳播求導過程分析

softmax交叉熵損失函式反向傳播求導過程分析

目錄

一、softmax 函式

二、損失函式 loss function

三、最後的準備工作                                                                                                      

四、具體的推導過程



softmax經常被新增在分類任務的神經網路中的輸出層,神經網路的反向傳播中關鍵的步驟就是求導,從這個過程也可以更深刻地理解反向傳播的過程,還可以對梯度傳播的問題有更多的思考。

一、softmax 函式

softmax函式,一般在神經網路中, softmax可以作為分類任務的輸出層。其實可以認為softmax輸出的是幾個類別選擇的概率,比如我有一個分類任務,要分為三個類,softmax函式可以根據它們相對的大小,輸出三個類別選取的概率,並且概率和為1。

softmax函式的公式是這種形式:

                                                                                 \large S _ { i } = \frac { e ^ { z _ { i } } } { \sum _ { k } e ^ { z _ { k } } }

\large S_{i}​代表的是第i個神經元的輸出。ok,其實就是在輸出後面套一個這個函式,在推導之前,我們統一一下網路中的各個表示符號,避免後面突然出現一個什麼符號懵逼推導不下去了。

首先是神經元的輸出,一個神經元如下圖:

                                                         

 

神經元的輸出設為:

                                                                                  \large z _ { i } = \sum _ { j } w _ { i j } x _ { i j } + b

其中 \large w_{ij} 是第 \large i 個神經元的第 \large j 個權重,\large b 是偏移值,  \large z_{i} 表示該網路的第 \large i 個神經元的輸出。給這個輸出加上一個softmax函式,那就變成了這樣: 

                                                                                  \large a _ { i } = \frac { e ^ { z _ { i } } } { \sum _ { k } e ^ { z _ { k } } }

\large a_{i} ​代表softmax的第 \large i 個輸出值,就是套用了softmax函式。

二、損失函式 loss function

在神經網路反向傳播中,要求一個損失函式,這個損失函式其實表示的是真實值與網路的估計值的誤差,知道誤差了,才能知道怎樣去修改網路中的權重。

損失函式可以有很多形式,這裡用的是交叉熵函式,原因如下2個:

  1. 主要是由於這個求導結果比較簡單,易於計算,
  2. 交叉熵解決某些損失函式學習緩慢的問題。

交叉熵的函式是這樣的:

                                                                                 \large C = - \sum _ { i } y _ { i } \ln a _ { i }

其中 \large y_{i} 表示真實的分類結果。到這裡可能嵌套了好幾層,不過不要擔心,下面會一步步推導,強烈推薦在紙上寫一寫,有時候光看看著看著就迷糊了,自己邊看邊推導更有利於理解。

三、最後的準備工作                                                                                                      

                                                    

四、具體的推導過程

好了,這下正式開始,首先,我們要明確一下我們要求什麼,我們要求的是我們的 \large loss 對於神經元輸出 \large z_{i} 的梯度,即:
                                                                                             \large \frac { \partial C } { \partial z _ { i } }

根據複合函式求導法則:

                                                                                        \large \frac { \partial C } { \partial z _ { i } } = \sum _ { j } \left( \frac { \partial C _ { j } } { \partial a _ { j } } \frac { \partial a _ { j } } { \partial z _ { i } } \right)

由於有些朋友對於之前的寫法有些疑惑,所以我這裡修改了一下,這裡為什麼是 \large a_{j} 而不是 \large a_{i} 這裡要看一下softmax的公式了,因為softmax公式的特性,它的分母包含了所有神經元的輸出,所以,對於不等於 \large i 的其他輸出裡面,也包含著 \large z_{i}  所有的都要納入到計算範圍中,並且後面的計算可以看到需要分為 \large i=j, i\neq j兩種情況求導。
下面我們一個一個推:

                                                                           \large \frac { \partial C _ { j } } { \partial a _ { j } } = \frac { \partial \left( - y _ { j } \ln a _ { j } \right) } { \partial a _ { j } } = - y _ { j } \frac { 1 } { a _ { j } }

 

第二個稍微複雜一點,我們先把它分為兩種情況:

①如果 \large i=j :

                   \large \frac { \partial a _ { i } } { \partial z _ { i } } = \frac { \partial \left( \frac { e ^ { z _ { i } } } { \sum _ { k } e ^ { z _ { i k } } } \right) } { \partial z _ { i } } = \frac { \sum _ { k } e ^ { z _ { k } } e ^ { z _ { i } } - \left( e ^ { z _ { i } } \right) ^ { 2 } } { \left( \sum _ { k } e ^ { z _ { k } } \right) ^ { 2 } } = \left( \frac { e ^ { z _ { i } } } { \sum _ { k } e ^ { z _ { k } } } \right) \left( 1 - \frac { e ^ { z _ { i } } } { \sum _ { k } e ^ { z _ { k } } } \right) = a _ { i } \left( 1 - a _ { i } \right)

②如果\large i\neq j :

                                         \large \frac { \partial a _ { j } } { \partial z _ { i } } = \frac { \partial \left( \frac { e ^ { i j } } { \sum _ { k } e ^ { - i k } } \right) } { \partial z _ { i } } = - e ^ { z _ { j } } \left( \frac { 1 } { \sum _ { k } e ^ { z _ { k } } } \right) ^ { 2 } e ^ { z i } = - a _ { i } a _ { j }

接下來我們只需要把上面的組合起來:

                                       \large \frac { \partial C } { \partial z _ { i } } = \sum _ { j } \left( \frac { \partial C _ { j } } { \partial a _ { j } } \frac { \partial a _ { j } } { \partial z _ { i } } \right) = \sum _ { j \neq i } \left( \frac { \partial C _ { j } } { \partial a _ { j } } \frac { \partial a _ { j } } { \partial z _ { i } } \right) + \sum _ { i = j } \left( \frac { \partial C _ { j } } { \partial a _ { j } } \frac { \partial a _ { j } } { \partial z _ { i } } \right)

                                                \large = \sum _ { j \neq i } - y _ { j } \frac { 1 } { a _ { j } } \left( - a _ { i } a _ { j } \right) + \left( - y _ { i } \frac { 1 } { a _ { i } } \right) \left( a _ { i } \left( 1 - a _ { i } \right) \right)

                                               \large = \sum _ { j \neq i } a _ { i } y _ { j } + \left( - y _ { i } \left( 1 - a _ { i } \right) \right)

                                               \large = \sum _ { j \neq i } a _ { i } y _ { j } + a _ { i } y _ { i } - y _ { i }

                                               \large = a _ { i } \sum _ { j } y _ { j } - y _ { i }

 最後的結果看起來簡單了很多,最後,針對分類問題,我們給定的結果 \large y_{i} 最終只會有一個類別是1,其他類別都是0,因此,對於分類問題,這個梯度等於:
                                                              \large \frac { \partial C } { \partial z _ { i } } = a _ { i } - y _ { i }

參考作者:https://blog.csdn.net/qian99/article/details/78046329