來源:https://www.jianshu.com/p/c02a1fbffad6
簡單易懂的softmax交叉熵損失函數求導
來寫一個softmax求導的推導過程,不僅可以給自己理清思路,還可以造福大眾,豈不美哉~
softmax經常被添加在分類任務的神經網絡中的輸出層,神經網絡的反向傳播中關鍵的步驟就是求導,從這個過程也可以更深刻地理解反向傳播的過程,還可以對梯度傳播的問題有更多的思考。
softmax 函數
softmax(柔性最大值)函數,一般在神經網絡中, softmax可以作為分類任務的輸出層。其實可以認為softmax輸出的是幾個類別選擇的概率,比如我有一個分類任務,要分為三個類,softmax函數可以根據它們相對的大小,輸出三個類別選取的概率,並且概率和為1。
softmax函數的公式是這種形式:
S_i代表的是第i個神經元的輸出。
ok,其實就是在輸出后面套一個這個函數,在推導之前,我們統一一下網絡中的各個表示符號,避免后面突然出現一個什么符號懵逼推導不下去了。
首先是神經元的輸出,一個神經元如下圖:
神經元的輸出設為:
其中w_{ij}是第i個神經元的第j個權重,b是偏移值。z_i表示該網絡的第i個輸出。
給這個輸出加上一個softmax函數,那就變成了這樣:
a_i代表softmax的第i個輸出值,右側就是套用了softmax函數。
損失函數 loss function
在神經網絡反向傳播中,要求一個損失函數,這個損失函數其實表示的是真實值與網絡的估計值的誤差,知道誤差了,才能知道怎樣去修改網絡中的權重。
損失函數可以有很多形式,這里用的是交叉熵函數,主要是由於這個求導結果比較簡單,易於計算,並且交叉熵解決某些損失函數學習緩慢的問題。交叉熵的函數是這樣的:
其中y_i表示真實的分類結果。
到這里可能嵌套了好幾層,不過不要擔心,下面會一步步推導,強烈推薦在紙上寫一寫,有時候光看看着看着就迷糊了,自己邊看邊推導更有利於理解~
最后的准備
在我最開始看softmax推導的時候,有時候看到一半不知道是怎么推出來的,其實主要是因為一些求導法則忘記了,唉~
所以這里把基礎的求導法則和公式貼出來~有些忘記的朋友可以先大概看一下:
推導過程
好了,這下正式開始~
首先,我們要明確一下我們要求什么,我們要求的是我們的loss對於神經元輸出(z_i)的梯度,即:
根據復合函數求導法則:
有個人可能有疑問了,這里為什么是a_j而不是a_i,這里要看一下softmax的公式了,因為softmax公式的特性,它的分母包含了所有神經元的輸出,所以,對於不等於i的其他輸出里面,也包含着z_i,所有的a都要納入到計算范圍中,並且后面的計算可以看到需要分為i = j和i ≠ j兩種情況求導。
下面我們一個一個推:
第二個稍微復雜一點,我們先把它分為兩種情況:
如果i=j:
如果i≠j:
ok,接下來我們只需要把上面的組合起來:
最后的結果看起來簡單了很多,最后,針對分類問題,我們給定的結果y_i最終只會有一個類別是1,其他類別都是0,因此,對於分類問題,這個梯度等於: