softmax函數

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

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

假設我們有一個數組[a1, a2, a3 ... an],則
Si= e^ai / sum(e^a1 + e^a2 + ... +e^an)
如下圖:


image.png

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

二、softmax相關求導
當我們對分類的Loss進行改進的時候,我們要通過梯度下降,每次優(yōu)化一個step大小的梯度,這個時候我們就要求Loss對每個權重矩陣的偏導,然后應用鏈式法則。那么這個過程的第一步,就是對softmax求導傳回去,不用著急,我后面會舉例子非常詳細的說明。在這個過程中,你會發(fā)現用了softmax函數之后,梯度求導過程非常非常方便!


image.png

我們能得到下面公式:

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= e^z4 / sum(e^z4 + e^z5 + e^z6)
a5= e^z5 / sum(e^z4 + e^z5 + e^z6)
a6= e^z6 / sum(e^z4 + e^z5 + e^z6)
好了,我們的重頭戲來了,怎么根據求梯度,然后利用梯度下降方法更新梯度!**

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

交叉熵函數形式如下:
loss = -∑yi * log ai

其中y代表我們的真實值,a代表我們softmax求出的值。i代表的是輸出結點的標號!在上面例子,i就可以取值為4,5,6三個結點(當然我這里只是為了簡單,真實應用中可能有很多結點
現在看起來是不是感覺復雜了,居然還有累和,然后還要求導,每一個a都是softmax之后的形式!

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

為了形式化說明,我這里認為訓練數據的真實輸出為第j個為1,其它均為0!
那么Loss就變成了loss = -yi * log ai,累和已經去掉了,太好了。現在我們要開始求導數了!
我們在整理一下上面公式,為了更加明白的看出相關變量的關系:yj = 1, loss = - log ai
那么形式越來越簡單了,求導分析如下:
參數的形式在該例子中,總共分為w41,w42,w43,w51,w52,w53,w61,w62,w63.這些,那么比如我要求出w41,w42,w43的偏導,就需要將Loss函數求偏導傳到結點4,然后再利用鏈式法則繼續(xù)求導即可,舉個例子此時求w41的偏導為:


image.png

w51.....w63等參數的偏導同理可以求出,那么我們的關鍵就在于Loss函數對于結點4,5,6的偏導怎么求,如下:
這里分為倆種情況:


image.png

image.png

image.png

image.png

三、softmax實現(python)


image.png

image.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容