softmax函數到底是什麼?——歸一化指數函數,及其python實現

softmax應該算是機器學習的入門數學知識了。softmax函數,它並不十分複雜,但又不是十分簡單,總之這個函數就是很難去背誦下來,以致於每次你要寫softmax的時候,都得搜一下才行。而每次搜索softmax,都對你的信心是一次小規模打擊——這麼簡單的數學公式我還不會?我這是要涼啊。。。


好了,廢話少說。我想,我們一直難以把並不很複雜的softmax函數背下來的原因,可能並非因爲我們懶,而是因爲我們一直都沒有摸透softmax的本質。這可能也和我們接觸softmax的時間點有關——我們接觸它的時候是初學者,亦步亦趨地追隨課程進度或者博客的知識尚且費勁兒,對於這類公式,我們就當它“本來就該是這樣”了。至少對我而言,我一直都想不通,softmax的公式爲何這麼奇怪。

 

我們來看看softmax的另一個名字就一目瞭然了———softmax函數,又稱歸一化指數函數。

所以很顯然,softmax的意思呢,即是將一個k維向量z,映射到另一個k維空間中,這種映射函數就是softmax。那麼我們爲啥要softmax來映射一遍?因爲softmax可以將向量z的每個維度的取值均壓縮至(0,1)之間。這就是softmax的本質,也是softmax函數的初衷


因此,softmax函數的表達式就顯而易見了:分母是所有k維向量z所有維度的自然底數e指數之和,分子是待求維度的自然底數e的指數,如下所示:

$$softmax(z)_j = \dfrac{e^{z_j}}{\sum_{k=1}^{K}e^{z_k}}$$

其中,\(softmax(z)_j\)指的是k維向量z經過softmax函數映射後的第j維的取值。


而softmax在機器學習或深度學習中,更多的是以“多項邏輯迴歸”而存在的,用來計算樣本向量\(X^{(i)}\)屬於某個類別的概率分佈。其中,屬於第j個類別的概率爲:

$$P(y^{(i)}|x^{(i)};\Theta) = \dfrac{e^{\Theta^{T}X^{(i)}_j}}{\sum_{k=1}^{K} e^{\Theta^{T}X^{(i)}_k}}$$

如公式所示,我們同樣將向量\(\Theta^{T} X^{(i)}\)進行歸一化映射。


python實現(其實是numpy實現)

import numpy as np
z = np.array([1.0, 2.0, 3.0, 4.0, 1.0, 2.0, 3.0])
softmax_z = np.exp(z)/sum(np.exp(z))

最後,在談一談softmax名字的由來:

Softmax 不同於普通的 max 函數:max 函數只輸出最大的那個值,而 Softmax 則確保較小的值也有較小的概率,不會被直接捨棄掉,是一個比較“Soft”的“max”,這個“soft”是對比合頁損失的“hard”而來的。

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