Softmax 函數的特點和作用是什麼?

在看到LDA模型的時候突然發現一個叫softmax函數。
維基上的解釋和公式是:
「softmax function is a generalization of the logistic function that maps a length-p vector of real values to a length-K vector of values」

看了之後覺得很抽象,能否直觀的解釋一下這個函數的特點和介紹一下它的主要用在些領域?


----------

因為這裡不太方便編輯公式,所以很多公式推導的細節都已經略去了,如果對相關數學表述感興趣的話,請戳這裡的鏈接Softmax的理解與應用 - superCally的專欄 - 博客頻道 - http://CSDN.NET

----------

Softmax在機器學習中有非常廣泛的應用,但是剛剛接觸機器學習的人可能對Softmax的特點以及好處並不理解,其實你了解了以後就會發現,Softmax計算簡單,效果顯著,非常好用。

我們先來直觀看一下,Softmax究竟是什麼意思

我們知道max,假如說我有兩個數,a和b,並且a&>b,如果取max,那麼就直接取a,沒有第二種可能

但有的時候我不想這樣,因為這樣會造成分值小的那個飢餓。所以我希望分值大的那一項經常取到,分值小的那一項也偶爾可以取到,那麼我用softmax就可以了
現在還是a和b,a&>b,如果我們取按照softmax來計算取a和b的概率,那a的softmax值大於b的,所以a會經常取到,而b也會偶爾取到,概率跟它們本來的大小有關。所以說不是max,而是 Soft max
那各自的概率究竟是多少呢,我們下面就來具體看一下

定義

假設我們有一個數組,V,Vi表示V中的第i個元素,那麼這個元素的Softmax值就是

S_i = frac{e^{V_i}}{sum_j{e^{V_j}}}

也就是說,是該元素的指數,與所有元素指數和的比值

這個定義可以說非常的直觀,當然除了直觀樸素好理解以外,它還有更多的優點

1.計算與標註樣本的差距

在神經網路的計算當中,我們經常需要計算按照神經網路的正向傳播計算的分數S1,和按照正確標註計算的分數S2,之間的差距,計算Loss,才能應用反向傳播。Loss定義為交叉熵


L_i=-log(frac{e^{f_{y_i}}}{sum_j{e^j}})

取log裡面的值就是這組數據正確分類的Softmax值,它占的比重越大,這個樣本的Loss也就越小,這種定義符合我們的要求

2.計算上非常非常的方便

當我們對分類的Loss進行改進的時候,我們要通過梯度下降,每次優化一個step大小的梯度

我們定義選到yi的概率是

P_{y_i}=frac{e^{f_{y_i}}}{sum_j{e^j}}

然後我們求Loss對每個權重矩陣的偏導,應用鏈式法則(中間推導省略)

frac{partial{L_i}}{partial{f_{y_i}}}=frac{partial(-ln(frac{e^{f_{y_{i}}}}{sum_{j}e^{{j}}}))}{partial{f_{y_i}}}=P_{f_{y_i}}-1

最後結果的形式非常的簡單,只要將算出來的概率的向量對應的真正結果的那一維減1,就可以了

舉個例子,通過若干層的計算,最後得到的某個訓練樣本的向量的分數是[ 1, 5, 3 ],
那麼概率分別就是[0.015,0.866,0.117],如果這個樣本正確的分類是第二個的話,那麼計算出來的偏導就是[0.015,0.866?1,0.117]=[0.015,?0.134,0.117],是不是很簡單!!然後再根據這個進行back propagation就可以了


圖來自《一天搞懂深度學習》


SVM只選自己喜歡的男神,Softmax把所有備胎全部拉出來評分,最後還歸一化一下


答案來自專欄:機器學習演算法與自然語言處理

詳解softmax函數以及相關求導過程

這幾天學習了一下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的知識,大家不用管,只要知道我現在根據每個狀態(輸入),來預測動作(得到概率最大的輸出),最終得到的一系列動作序列就可以完成我的任務即可

原理圖如下圖所示:

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

[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函數得到

a_{4}= frac{e^{z4} }{z^{z4}+z^{z5}+z^{z6}}

a_{5} =frac{e^{z5} }{z^{z4}+z^{z5}+z^{z6}} a_{6}= frac{e^{z6} }{z^{z4}+z^{z5}+z^{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 = -y_{j}lna_{j} ,累和已經去掉了,太好了。現在我們要開始求導數了!

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

其中y_{j} =1,那麼形式變為Loss = -lna_{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 = -lna_{j} ,它的導數為-frac{1}{a_{j} } ,與上面a_{j}(1-a_{j} ) 相乘為a_{j}-1 形式非常簡單,這說明我只要正向求一次得出結果,然後反向傳梯度的時候,只需要將它結果減1即可,後面還會舉例子!)那麼我們可以得到Loss對於4結點的偏導就求出了了(這裡假定4是我們的預計輸出

第二種情況為:

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

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

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

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

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

那麼經過softmax函數作用後概率分別就是=[frac{e^{2} }{e^{2}+e^{3}+e^{4}}

,frac{e^{3} }{e^{2}+e^{3}+e^{4}} ,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的相關內容,讓大家少走彎路,真心希望對大家的理解有幫助!歡迎交流指錯!畫圖整理不易,覺得有幫助的給個讚唄,哈哈!

參考:

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

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

Softmax回歸 - Ufldl

部分圖片來自於網路!


看名字就知道了,就是如果某一個zj大過其他z,那這個映射的分量就逼近於1,其他就逼近於0,主要應用就是多分類,sigmoid函數只能分兩類,而softmax能分多類,softmax是sigmoid的擴展。


為什麼要取指數,第一個原因是要模擬max的行為,所以要讓大的更大。第二個原因是需要一個可導的函數。

讓大的更大的原因是讓錯的更錯,這樣學習效率更高。好比以前考試錯了,老師輕輕說了兩句,換成softmax兩巴掌上去,你說哪個學習效率高?


謝邀
Softmax就是MIMO的Sigmoid函數。
(Sigmoid函數是MISO)
以上。


softmax regression是一個將目標變數分為K類的演算法,建模使用的分布是多項式分布;sigmoid針對的是分兩類的邏輯回歸,使用伯努利分布來建模。其中的sigma_j = f(eta )是把參數估計表示為自然參數的形式。建議看下Andrew Ng機器學習的講義1。


就是把一堆實數的值映射到0-1區間,並且使他們的和為1。一般用來估計posterior probability,在多分類任務中有用到。


Softmax回歸 - Ufldl


好吧,過了好長時間之後在斯坦福的最優化課程裡面碰到了,https://www.youtube.com/watch?v=G4G7dWBi3IIlist=PLbBM_dvjud8oFj09MqqYnGSrT6zek42Q0index=4,28分鐘左右有講到這個函數。。。


題主問的嚴格來說應該是「Softmax激活函數(softmax activation function)」或「soft arg max函數」,與「Softmax函數」有差別。但很多教程並不區分。

以下是Softmax函數的定義:

lnsum_{i=1}^{n}{e^{x^{i}}}

這個函數與hard max(即大家通常用的max函數)有相似之處,在其中某個x顯著大於其他x時,返回值接近這個x,即max

下圖為softmax(x, 0)和hardmax(x,0)的圖形:

差別就在於softmax是連續可導的,消除了拐點,這個特性在機器學習的梯度下降法等地方非常必要。這也是「soft」的由來

進一步延伸,題主所問的softmax激活函數,實質是soft arg max函數,它的特性也是很soft的,例如:

hard arg max([1,0])=[1,0],而 soft arg max([1,0])=[exp(1),exp(0)]/(exp(1)+exp(0)) = [0.73, 0.27],可解釋為各類的概率


這個其實可以從線性回歸(Linear Regression)說起,因為邏輯回歸(Logistic Regression) 也是從線性回歸演化出來的,邏輯方程將實數域的回歸結果投影到[0,1]這個區間里所以邏輯回歸結果也可以被看做最大似然估計(Maximum Likelihood Estimation)的結果。

先上個栗子:

Linear Regression Logistic Regression(線性回歸 邏輯回歸)

線性回歸: Y = 	heta^TX + 	heta_0 (這裡就不細說線性回歸了), X為可觀測變數(observed variable), 	heta	heta_0 為參數。

想要將 Y 投射到[0,1]這個域里就必須滿足兩個條件

1. lim_{	heta^TX 
ightarrow infty}{hat{Y}} = 1

2. lim_{	heta^TX 
ightarrow -infty}{hat{Y}} = 0

邏輯方程(Logistic Function): Y = frac{1}{1+e^{	heta^TX}} 滿足這兩個條件

可以把邏輯方程看做線性回歸的歸一化。

從概率論的角度說邏輯方程可以將一個實數變換成概率來表達,在一個二類分類器里(two-class classifier)要最大化數據集的似然值等價於將每個數據點的線性回歸輸出推向正無窮(類1)和負無窮(類2)。

邏輯回歸的損失方程(Loss Function): frac{1}{N} sum^N_{i=1}(y_i-1)log(1-hat{y_i})-y_ilog(hat{y_i}) 可以用梯度下降來求得最大似然的參數值。

得到最大似然的參數值後我們可以用得到的參數來計算 P(y=1|X)P(y=0|X) = 1-P(y=1|X)

但是問題來了,如果不是二類分類問題(two-class classification),而是多類分類問題(multi-class classification) 那就要對邏輯回歸進行一般化(generalization)的操作了。

線性回歸的部分就不能只輸出一個值了,要輸出一個k-長度的向量,然後對這個向量進行歸一化且它們的和要等於1。

multiclass regression softmax (多類回歸)

再舉一個栗子:

在一個k-類分類問題的環境下

P(y=j|X) = frac{e^{	heta_j^TX}}{sum^K_{i=0}e^{	heta^T_iX}}

給一個k-長度的向量,用softmax函數可以輸出一個k-長度的向量滿足兩個條件,每個值都在[0,1]這個域里且它們的和為1

Z = egin{bmatrix} y_0\ y_1\ vdots \ y_k\ end{bmatrix}

softmax(Z) = egin{bmatrix} y

y_0,y_1,y_2dots y_k in[0,1]sum_{i=0}^k y_i = 1

softmax的應用的話主要有multiclass regression/softmax regression, 也有神經網路用softmax來當最後一層的激活函數來達到分類的功能(且能模擬出每個類的概率)。


max(e) approx ln{sum_k^i e^{i}}

softmax 是擬合離散值中最大值的可微分方法,易於計算

a^L_j = frac{e^{z^L_j}}{sum_k e^{z^L_k}}

應用到nn中,可以衡量一層中任意activation 的自信度,以此來調整對應loss的大小


類似於向量的元素(單位化)標準化,使得在對output層每個節點概率求和值為1,方便分類(classification)


關於 softmax 函數,除了公式,最需要知道的是它可以把任意形式的預測結果轉換成正確的概率。比如預測手寫漢字的結果,softmax函數可以轉換成概率,概率和為1。


馬太效應


softmax針對多類分類,輸出的是每一個分類的概率。


推薦閱讀:

如何評價rcnn、fast-rcnn和faster-rcnn這一系列方法?
有誰給解釋一下流形以及流形正則化?
計算機視覺中,目前有哪些經典的目標跟蹤演算法?
經過足夠長的時間, AlphaGo 的棋譜能收斂到一張上嗎?
如何看待圍棋世界冠軍柯潔 0-3 負於 AlphaGo 後落淚?

TAG:機器學習 | 概率 | 統計 |