Softmax函數

數學,尤其是概率論和相關領域中,Softmax函數,或稱歸一化指數函數[1]:198,是邏輯斯諦函數的一種推廣。它能將一個含任意實數的K維向量  「壓縮」到另一個K維實向量  中,使得每一個元素的範圍都在之間,並且所有元素的和為1(也可視為一個 (k-1)維的hyperplane或subspace)。該函數的形式通常按下面的式子給出:

   for j = 1, …, K.

Softmax函數實際上是有限項離散概率分佈的梯度對數歸一化。因此,Softmax函數在包括 多項邏輯迴歸[1]:206–209 ,多項線性判別分析樸素貝葉斯分類器類神經網絡等的多種基於概率的多分類問題方法中都有着廣泛應用。[2] 特別地,在多項邏輯迴歸和線性判別分析中,函數的輸入是從K個不同的線性函數得到的結果,而樣本向量 x 屬於第 j 個分類的概率為:

這可以被視作K個線性函數Softmax函數的複合)。

實際實現的時候,為了防止溢位,會先把每個元素減去原先的最大值

例子

輸入向量 對應的Softmax函數的值為 。輸出向量中擁有最大權重的項對應着輸入向量中的最大值「4」。這也顯示了這個函數通常的意義:對向量進行歸一化,凸顯其中最大的值並抑制遠低於最大值的其他分量。

下面是使用Python進行函數計算的範例程式碼:

import math
z = [1.0, 2.0, 3.0, 4.0, 1.0, 2.0, 3.0]
z_exp = [math.exp(i) for i in z]  
print(z_exp)  # Result: [2.72, 7.39, 20.09, 54.6, 2.72, 7.39, 20.09] 
sum_z_exp = sum(z_exp)  
print(sum_z_exp)  # Result: 114.98 
softmax = [round(i / sum_z_exp, 3) for i in z_exp]
print(softmax)  # Result: [0.024, 0.064, 0.175, 0.475, 0.024, 0.064, 0.175]

Python使用numpy計算的範例代碼:

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


Julia 的範例:

julia> A = [1.0, 2.0, 3.0, 4.0, 1.0, 2.0, 3.0]
7-element Array{Float64,1}:
 1.0
 2.0
 3.0
 4.0
 1.0
 2.0
 3.0

julia> exp.(A) ./ sum(exp.(A))
7-element Array{Float64,1}:
 0.0236405
 0.0642617
 0.174681
 0.474833
 0.0236405
 0.0642617
 0.174681

參考資料

  1. ^ 1.0 1.1 Bishop, Christopher M. (2006).
  2. ^ ai-faq What is a softmax activation function?頁面存檔備份,存於互聯網檔案館