Softmax函數詳解以及求導過程

這幾天學習了一下softmax激活函數,以及它的梯度求導過程,整理一下便於分享和交流!

softmax函數

softmax用於多分類過程中,它將多個神經元的輸出,映射到(0,1)區間內,可以看成概率來理解,從而來進行多分類!

假設我們有一個數組,V,Vi表示V中的第i個元素,那麼這個元素的softmax值就是
Si=eijejS_{i}=\frac{e^{i}}{\sum_{j} e^{j}}
更形象的如下圖表示:

softmax直白來說就是將原來輸出是3,1,-3通過softmax函數一作用,就映射成爲(0,1)的值,而這些值的累和爲1(滿足概率的性質),那麼我們就可以將它理解成概率,在最後選取輸出結點的時候,我們就可以選取概率最大(也就是值對應最大的)結點,作爲我們的預測目標!

舉一個我最近碰到利用softmax的例子:我現在要實現基於神經網絡的句法分析器。用到是基於轉移系統來做,那麼神經網絡的用途就是幫我預測我這一個狀態將要進行的動作是什麼?比如有10個輸出神經元,那麼就有10個動作,1動作,2動作,3動作…一直到10動作。(這裏涉及到nlp的知識,大家不用管,只要知道我現在根據每個狀態(輸入),來預測動作(得到概率最大的輸出),最終得到的一系列動作序列就可以完成我的任務即可)

原理圖如下圖所示:

那麼比如在一次的輸出過程中輸出結點的值是如下:

[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 = w41o1+w42o2+w43*o3

z5 = w51o1+w52o2+w53*o3

z6 = w61o1+w62o2+w63*o3

z4,z5,z6分別代表結點4,5,6的輸出,01,02,03代表是結點1,2,3往後傳的輸入.

那麼我們可以經過softmax函數得到
a4=ez4zz4+zz5+zz6a5=ez5zz4+zz5+zz6a6=ez6zz4+zz5+zz6\begin{array}{l} a_{4}=\frac{e^{z 4}}{z^{z 4}+z^{z 5}+z^{z 6}} \\ a_{5}=\frac{e^{z 5}}{z^{z 4}+z^{z 5}+z^{z 6}} a_{6}=\frac{e^{z 6}}{z^{z 4}+z^{z 5}+z^{z 6}} \end{array}
好了,我們的重頭戲來了,怎麼根據求梯度,然後利用梯度下降方法更新梯度!

要使用梯度下降,肯定需要一個損失函數,這裏我們使用交叉熵作爲我們的損失函數,爲什麼使用交叉熵損失函數,不是這篇文章重點,後面有時間會單獨寫一下爲什麼要用到交叉熵函數(這裏我們默認選取它作爲損失函數)

交叉熵函數形式如下:
Loss=iyilnai\text {Loss}=-\sum_{i} y_{i} \ln a_{i}

其中y代表我們的真實值,a代表我們softmax求出的值。i代表的是輸出結點的標號!在上面例子,i就可以取值爲4,5,6三個結點(當然我這裏只是爲了簡單,真實應用中可能有很多結點)

現在看起來是不是感覺複雜了,居然還有累和,然後還要求導,每一個a都是softmax之後的形式!

但是實際上不是這樣的,我們往往在真實中,如果只預測一個結果,那麼在目標中只有一個結點的值爲1,比如我認爲在該狀態下,我想要輸出的是第四個動作(第四個結點),那麼訓練數據的輸出就是a4 = 1,a5=0,a6=0,哎呀,這太好了,除了一個爲1,其它都是0,那麼所謂的求和符合,就是一個幌子,我可以去掉啦!

爲了形式化說明,我這裏認爲訓練數據的真實輸出爲第j個爲1,其它均爲0!

那麼Loss就變成了Loss =yjlnaj=-y_{j} \ln a_{j},累和已經去掉了,太好了。現在我們要開始求導數了!

我們在整理一下上面公式,爲了更加明白的看出相關變量的關係:

其中yj=1y_{j}=1,那麼形式變爲Loss=lnaj=-\ln a_{j}

那麼形式越來越簡單了,求導分析如下:

參數的形式在該例子中,總共分爲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結點這!


那麼由上面求導結果再乘以交叉熵損失函數求導

Loss=lnaj=-\ln a_{j},它的導數爲1aj-\frac{1}{a_{j}},與上面aj(1aj)a_{j}\left(1-a_{j}\right)相乘爲aj1a_{j}-1(形式非常簡單,這說明我只要正向求一次得出結果,然後反向傳梯度的時候,只需要將它結果減1即可,後面還會舉例子!)那麼我們可以得到Loss對於4結點的偏導就求出了了(這裏假定4是我們的預計輸出)

第二種情況爲:

這裏對應我的例子圖如下,我這時對的是j不等於i,往前傳:

那麼由上面求導結果再乘以交叉熵損失函數求導

Loss=lnaj=-\ln a_{j},它的導數爲1aj-\frac{1}{a_{j}},與上面ajai-a_{j}*a_{i}相乘爲ai-a_{i}(形式非常簡單,這說明我只要正向求一次得出結果,然後反向傳梯度的時候,只需要將它結果保存即可,後續例子會講到)這裏就求出了除4之外的其它所有結點的偏導,然後利用鏈式法則繼續傳遞過去即可!我們的問題也就解決了!

舉例說明

舉個例子,通過若干層的計算,最後得到的某個訓練樣本的向量的分數是[ 2, 3, 4 ],

那麼經過softmax函數作用後概率分別就是=[e2e2+e3+e4\frac{e^{2}}{e^{2}+e^{3}+e^{4}},e3e2+e3+e4\frac{e^{3}}{e^{2}+e^{3}+e^{4}},e4e2+e3+e4\frac{e^{4}}{e^{2}+e^{3}+e^{4}}] = [0.0903,0.2447,0.665],如果這個樣本正確的分類是第二個的話,那麼計算出來的偏導就是[0.0903,0.2447-1,0.665]=[0.0903,-0.7553,0.665],是不是非常簡單!!然後再根據這個進行back propagation就可以了.

到這裏,這篇文章的內容就講完了,我希望根據自己的理解,通過列出大量例子,直白的給大家講解softmax的相關內容,讓大家少走彎路,真心希望對大家的理解有幫助!

參考文章

1.https://zhuanlan.zhihu.com/p/25723112

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章