通俗詳解softmax函數及其求導過程

2021-02-21 機器學習算法與自然語言處理

陸續的將以前的一些文章原創保護和重新排版一下!以及它的梯度求導過程,整理一下便於分享和交流!

1、softmax函數講解

2、softmax函數求導過程詳解

3、softmax函數求導為什麼如此方便

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

假設我們有一個數組,V,Vi表示V中的第i個元素,那麼這個元素的softmax值就是 si = si/(si+sj+...sk)更形象的如下圖表示:

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在實際問題中一般怎麼應用)


當我們對分類的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函數得到

a4 = e^z4/(e^z4+e^z5+e^z6)

a5 = e^z5/(e^z4+e^z5+e^z6)

a6 = e^z6/(e^z4+e^z5+e^z6)

好了,我們的重頭戲來了,怎麼根據求梯度,然後利用梯度下降方法更新梯度!

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

交叉熵函數形式如下:

其中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,累和已經去掉了,太好了。現在我們要開始求導數了!

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

其中yj = 1,那麼形式變為Loss = -lnaj

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

參數的形式在該例子中,總共分為w41,w42,w43,w51,w52,w53,w61,w62,w63.這些,那麼比如我要求出w41,w42,w43的偏導,就需要將Loss函數求偏導傳到結點4,然後再利用鏈式法則繼續求導即可,舉個例子此時求w41的偏導為:


w51w63等參數的偏導同理可以求出,那麼我們的關鍵就在於Loss函數對於結點4,5,6的偏導怎麼求,如下:

這裡分為倆種情況:

j=i對應例子裡就是如下圖所示:

比如我選定了j為4,那麼就是說我現在求導傳到4結點這!

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

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

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


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

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

下面我舉個例子來說明為什麼計算會比較方便,給大家一個直觀的理解

舉個例子,通過若干層的計算,最後得到的某個訓練樣本的向量的分數是[z4,z5,z6] = [ 2, 3, 4 ],
那麼經過softmax函數作用後概率分別就是=[e^2/(e^2+e^3+e^4),e^3/(e^2+e^3+e^4),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的相關內容,讓大家少走彎路,真心希望對大家的理解有幫助!歡迎交流指錯!畫圖整理不易,希望對大家有幫助,哈哈!

參考:

softmax的log似然代價函數(公式求導)

交叉熵代價函數(作用及公式推導)

Softmax回歸 - Ufldl

部分圖片來自於網絡!

近期文章預告:

《一文搞懂k近鄰(k-NN)算法(二)》(正在編寫,馬上整理完畢!敬請期待)

《詳解貝葉斯分類以及代碼實現》

《詳解增強學習MDP過程》

《換個角度談線性代數相關基礎》

開通了[自然語言處理與機器學習]公眾號,記錄自己在cs,ml,nlp中的學習所得,不保證是很難得知識,但一定是我理解的乾貨,歡迎按住下面二維碼掃描關注!

相關焦點

  • 【softmax】詳解softmax函數以及相關求導過程
    激活函數,以及它的梯度求導過程,整理一下便於分享和交流!一、softmax函數softmax用於多分類過程中,它將多個神經元的輸出,映射到(0,1)區間內,可以看成概率來理解,從而來進行多分類!假設我們有一個數組,V,Vi表示V中的第i個元素,那麼這個元素的softmax值就是
  • Softmax函數與交叉熵
    第用我們高中就知道的求導規則:對於對softmax函數的求導,我在兩年前微信校招面試基礎研究崗位一面的時候,就遇到過,這個屬於比較基礎的問題。注意,該函數的參數logits在函數內會用softmax進行處理,所以傳進來時不能是softmax的輸出了。區別既然我們可以自己實現交叉熵的損失函數,為什麼TensorFlow還要再實現tf.nn.softmax_cross_entropy_with_logits函數呢?
  • 【小知識】Softmax函數與交叉熵
    第用我們高中就知道的求導規則:對於對softmax函數的求導,我在兩年前微信校招面試基礎研究崗位一面的時候,就遇到過,這個屬於比較基礎的問題。注意,該函數的參數logits在函數內會用softmax進行處理,所以傳進來時不能是softmax的輸出了。區別既然我們可以自己實現交叉熵的損失函數,為什麼TensorFlow還要再實現tf.nn.softmax_cross_entropy_with_logits函數呢?
  • 談Softmax激活函數以及Softmax回歸和Logistic回歸關係
    0-1區間,將神經元輸出構造成概率分布,用於多分類問題中,Softmax激活函數映射值越大,則真實類別可能性越大,下面先給出Softmax函數計算公式:下圖給出了Softmax作激活函數對輸出值映射處理過程,形象理解Softmax函數
  • 【Softmax】乾貨 | 淺談Softmax函數
    引言Softmax函數幾乎是深度學習中的標配了,在人工神經網絡中,幾乎無處不可見softmax函數的身影。可以認為softmax是arg max操作的一種平滑近似。我將softmax的用途總結為兩種:分類:給定一系列類別,softmax可以給出某輸入被劃分到各個類別的概率分布。
  • logistic函數和softmax函數
    閱讀目錄1. logistic函數2. softmax函數3. logistic和softmax的關係4. 參考內容簡單總結一下機器學習最常見的兩個函數,一個是logistic函數,另一個是softmax函數,若有不足之處,希望大家可以幫忙指正。
  • softmax進階多分類 - 基礎理解
    放在邏輯回歸二分類後面說因為覺得很多相似的地方,比如用的損失函數,比如映射的過程,比如求解參數的過程,是二分類向多分類的進階,也是神經網絡的基礎。———————————————多分類變換思維 - 引入softmax從指數形式角度理解softmax數學推導出softmax函數從名字soft再次理解———————————————
  • 乾貨 | 淺談Softmax函數
    引言Softmax函數幾乎是深度學習中的標配了,在人工神經網絡中,幾乎無處不可見softmax函數的身影。可以認為softmax是arg max操作的一種平滑近似。我將softmax的用途總結為兩種:分類:給定一系列類別,softmax可以給出某輸入被劃分到各個類別的概率分布。
  • 乾貨 | 淺談 Softmax 函數
    引言Softmax函數幾乎是深度學習中的標配了,在人工神經網絡中,幾乎無處不可見softmax函數的身影。可以認為softmax是arg max操作的一種平滑近似。我將softmax的用途總結為兩種:分類:給定一系列類別,softmax可以給出某輸入被劃分到各個類別的概率分布。
  • 淺談logistic函數和softmax函數
    目錄1. logisitic函數2. softmax函數3. logistic函數和softmax函數的關係4. 總結1.1 logistic函數定義logsitic函數也就是經常說的sigmoid函數,幾何形狀也就是一條sigmoid曲線。
  • 大學高數:隱函數的求導公式
    隱函數,即不是顯式的函數,自變量和因變量在同一個函數中。即F(x,y,z)=0。本篇文章主要內容為:一個方程所確定的隱函數及其導數;方程組所確定的隱函數及其導數。一個方程所確定的隱函數及其導數定理1:所得公式:對於二階導數:三個變量時:
  • 詳解與實戰TensorFlow MNIST手寫體數字識別(softmax and cnn)
    激活函數(activation Function)為了實現神經網絡的非線性建模能力,解決一些線性不可分的問題,我們通常使用激活函數來引入非線性因素。激活函數都採用非線性函數,常用的Sigmoid、tanh、ReLU等。
  • 反向傳播原來這麼簡單 | 神經網絡 | 損失函數與Softmax(1)
    >輸出:[[0.2  0.24 0.02 1.59 0.03 0.03 0.11 0.22 0.02 0.01] [0.02 0.03 0.26 0.04 1.35 0.03 0.02 0.05 0.29 0.08] [0.07 0.04 0.07 0.03 0.04 1.19 0.16 0.03 0.05 0.26]]然而,神經網絡計算過程中的參數都保存在函數中
  • 隱函數求導的基本步驟與方法
    1、隱函數求導的基本原則    對於隱函數求導一般不贊成通過記憶公式的方式來求需要計算的導數,一般建議藉助於求導的四則運算法則與複合函數求導的運算法則,採取對等式兩邊同時關於同一變量的求導數的方式來求解。即用隱函數求導公式推導的方式求隱函數的導數。
  • 說說「隱函數與隱函數組求導」
    說說「隱函數與隱函數組求導」老韓昨天上午講到9-5節,隱函數的求導公式。
  • 從最優化的角度看待 Softmax 損失函數
    Softmax交叉熵損失函數應該是目前最常用的分類損失函數了,在大部分文章中,Softmax交叉熵損失函數都是從概率角度來解釋的,本周二極市就推送了一篇Softmax相關文章:一文道盡softmax loss及其變種。本文將嘗試從最優化的角度來推導出Softmax交叉熵損失函數,希望能夠啟發出更多的研究思路。
  • 求導升華之:多元複合函數的求導法則
    本篇文章將一元函數微分學中複合函數的求導法則推廣到多元複合函數的情形。多元複合函數的求導法則在多元函數微分學中也起著重要作用。本篇文章主要分兩個知識點:多元複合函數的求導法則,全微分形式不變性。多元複合函數的求導法則:主要是講述方法,就是鏈式法則。
  • [BTTB] 你不知道的 Softmax
    不過明明在介紹 softmax 為什麼突然亂入 LogSoftmax,首先因為實際訓練中很少直接拿 softmax 作為損失函數,而更多是使用 LogSoftmax;第二點也是最重要的,其實到現在為止說的 softmax 並不是真正的 softmax,而真正意義上的 softmax