答案來自專欄:機器學習算法與天然語言處理php
詳解softmax函數以及相關求導過程react
這幾天學習了一下softmax激活函數,以及它的梯度求導過程,整理一下便於分享和交流。算法
softmax函數
softmax用於多分類過程當中,它將多個神經元的輸出,映射到(0,1)區間內,能夠當作機率來理解,從而來進行多分類!數組
假設咱們有一個數組,V,Vi表示V中的第i個元素,那麼這個元素的softmax值就是網絡
更形象的以下圖表示:機器學習
softmax直白來講就是將原來輸出是3,1,-3經過softmax函數一做用,就映射成爲(0,1)的值,而這些值的累和爲1(知足機率的性質),那麼咱們就能夠將它理解成機率,在最後選取輸出結點的時候,咱們就能夠選取機率最大(也就是值對應最大的)結點,做爲咱們的預測目標!函數
舉一個我最近碰到利用softmax的例子:我如今要實現基於神經網絡的句法分析器。用到是基於轉移系統來作,那麼神經網絡的用途就是幫我預測我這一個狀態將要進行的動做是什麼?好比有10個輸出神經元,那麼就有10個動做,1動做,2動做,3動做...一直到10動做。(這裏涉及到nlp的知識,你們不用管,只要知道我如今根據每一個狀態(輸入),來預測動做(獲得機率最大的輸出),最終獲得的一系列動做序列就能夠完成個人任務便可)學習
原理圖以下圖所示:優化
那麼好比在一次的輸出過程當中輸出結點的值是以下:.net
[0.2,0.1,0.05,0.1,0.2,0.02,0.08,0.01,0.01,0.23]
那麼咱們就知道此次我選取的動做是動做10,由於0.23是此次機率最大的,那麼怎麼理解多分類呢?很容易,若是你想選取倆個動做,那麼就找機率最大的倆個值便可~(這裏只是簡單的告訴你們softmax在實際問題中通常怎麼應用)
softmax相關求導
當咱們對分類的Loss進行改進的時候,咱們要經過梯度降低,每次優化一個step大小的梯度,這個時候咱們就要求Loss對每一個權重矩陣的偏導,而後應用鏈式法則。那麼這個過程的第一步,就是對softmax求導傳回去,不用着急,我後面會舉例子很是詳細的說明。在這個過程當中,你會發現用了softmax函數以後,梯度求導過程很是很是方便!
下面咱們舉出一個簡單例子,原理同樣,目的是爲了幫助你們容易理解!
咱們能獲得下面公式:
z4 = w41*o1+w42*o2+w43*o3
z5 = w51*o1+w52*o2+w53*o3
z6 = w61*o1+w62*o2+w63*o3
z4,z5,z6分別表明結點4,5,6的輸出,01,02,03表明是結點1,2,3日後傳的輸入.
那麼咱們能夠通過softmax函數獲得



好了,咱們的重頭戲來了,怎麼根據求梯度,而後利用梯度降低方法更新梯度!
要使用梯度降低,確定須要一個損失函數,這裏咱們使用交叉熵做爲咱們的損失函數,爲何使用交叉熵損失函數,不是這篇文章重點,後面有時間會單獨寫一下爲何要用到交叉熵函數(這裏咱們默認選取它做爲損失函數)
交叉熵函數形式以下:
其中y表明咱們的真實值,a表明咱們softmax求出的值。i表明的是輸出結點的標號!在上面例子,i就能夠取值爲4,5,6三個結點(固然我這裏只是爲了簡單,真實應用中可能有不少結點)
如今看起來是否是感受複雜了,竟然還有累和,而後還要求導,每個a都是softmax以後的形式!
可是實際上不是這樣的,咱們每每在真實中,若是隻預測一個結果,那麼在目標中只有一個結點的值爲1,好比我認爲在該狀態下,我想要輸出的是第四個動做(第四個結點),那麼訓練數據的輸出就是a4 = 1,a5=0,a6=0,哎呀,這太好了,除了一個爲1,其它都是0,那麼所謂的求和符合,就是一個幌子,我能夠去掉啦!
爲了形式化說明,我這裏認爲訓練數據的真實輸出爲第j個爲1,其它均爲0!
那麼Loss就變成了
,累和已經去掉了,太好了。如今咱們要開始求導數了!
咱們在整理一下上面公式,爲了更加明白的看出相關變量的關係:
其中
,那麼形式變爲
那麼形式愈來愈簡單了,求導分析以下:
參數的形式在該例子中,總共分爲w41,w42,w43,w51,w52,w53,w61,w62,w63.這些,那麼好比我要求出w41,w42,w43的偏導,就須要將Loss函數求偏導傳到結點4,而後再利用鏈式法則繼續求導便可,舉個例子此時求w41的偏導爲:
w51.....w63等參數的偏導同理能夠求出,那麼咱們的關鍵就在於Loss函數對於結點4,5,6的偏導怎麼求,以下:
這裏分爲倆種狀況:
j=i對應例子裏就是以下圖所示:
好比我選定了j爲4,那麼就是說我如今求導傳到4結點這!
那麼由上面求導結果再乘以交叉熵損失函數求導
,它的導數爲
,與上面
相乘爲
(形式很是簡單,這說明我只要正向求一次得出結果,而後反向傳梯度的時候,只須要將它結果減1便可,後面還會舉例子!)那麼咱們能夠獲得Loss對於4結點的偏導就求出了了(這裏假定4是咱們的預計輸出)
第二種狀況爲:
這裏對應個人例子圖以下,我這時對的是j不等於i,往前傳:
那麼由上面求導結果再乘以交叉熵損失函數求導
,它的導數爲
,與上面
相乘爲
(形式很是簡單,這說明我只要正向求一次得出結果,而後反向傳梯度的時候,只須要將它結果保存便可,後續例子會講到)這裏就求出了除4以外的其它全部結點的偏導,而後利用鏈式法則繼續傳遞過去便可!咱們的問題也就解決了!
下面我舉個例子來講明爲何計算會比較方便,給你們一個直觀的理解
舉個例子,經過若干層的計算,最後獲得的某個訓練樣本的向量的分數是[ 2, 3, 4 ],
那麼通過softmax函數做用後機率分別就是=[
,
,
] = [0.0903,0.2447,0.665],若是這個樣本正確的分類是第二個的話,那麼計算出來的偏導就是[0.0903,0.2447-1,0.665]=[0.0903,-0.7553,0.665],是否是很是簡單!!而後再根據這個進行back propagation就能夠了
到這裏,這篇文章的內容就講完了,我但願根據本身的理解,經過列出大量例子,直白的給你們講解softmax的相關內容,讓你們少走彎路,真心但願對你們的理解有幫助!歡迎交流指錯!畫圖整理不易,以爲有幫助的給個讚唄,哈哈!
參考:
softmax的log似然代價函數(公式求導)
交叉熵代價函數(做用及公式推導)
Softmax迴歸 - Ufldl
部分圖片來自於網絡!