輸出層所用的激活函數,要根據求解問題的性質決定。一般地,
- 迴歸問題可以使用恆等函數,也就是說會將輸入按原樣輸出;
- 二元分類問題可以使用
sigmoid
函數; - 多元分類問題可以使用
softmax
函數;
1. softmax 函數定義
用圖表示 softmax
函數的話,如圖 3-22所示。圖 3-22中,softmax
函數
的輸出通過箭頭與所有的輸入信號相連。這是因爲,從式(3.10)可以看出,輸出層的各個神經元都受到所有輸入信號的影響。
2. softmax 函數實現
在 IPython 中實現過程:
In [1]: import numpy as np
In [2]: a = np.array([0.3, 2.9, 4.0])
In [3]: exp_a = np.exp(a)
In [4]: exp_a
Out[4]: array([ 1.34985881, 18.17414537, 54.59815003])
In [5]: sum_exp_a = np.sum(exp_a)
In [6]: sum_exp_a
Out[6]: 74.1221542101633
In [7]: y = exp_a/sum_exp_a
In [8]: y
Out[8]: array([0.01821127, 0.24519181, 0.73659691])
In [9]:
將其封裝成函數顯示爲:
In [9]: def softmax(x):
...: exp_x = np.exp(x)
...: sum_exp_x = np.sum(exp_x)
...: y = exp_x/sum_exp_x
...: return y
...:
In [10]: a = np.array([0.3, 2.9, 4.0])
In [11]: softmax(a)
Out[11]: array([0.01821127, 0.24519181, 0.73659691])
In [12]:
3. softmax 函數缺陷
softmax
函數的實現中要進行指數函數的運算,但是此時指數函數的值很容易變得非常大。比如,e10 的值會超過 20000,e100 會變成一個後面有 40 多個 0 的超大值,e1000 的結果會返回一個表示無窮大的 inf
。如果在這些超大值之間進行除法運算,結果會出現“不確定”的情況,也就是人們常說的發生溢出問題。
4. softmax 函數改進
式(3.11)說明,在進行 softmax
的指數函數的運算時,加上(或者減去)某個常數並不會改變運算的結果。這裏的 C
可以使用任何值,但是爲了防止溢出,一般會使用輸入信號中的最大值。我們來看一個具體的例子。
In [13]: a = np.array([1010, 1000, 990])
In [14]: np.exp(a)/ np.sum(np.exp(a))
Out[14]: array([nan, nan, nan])
In [16]: c = np.max(a)
In [17]: c
Out[17]: 1010
In [18]: a - c
Out[18]: array([ 0, -10, -20])
In [19]: np.exp(a-c)/np.sum(np.exp(a-c))
Out[19]: array([9.99954600e-01, 4.53978686e-05, 2.06106005e-09])
In [20]:
如該例所示,通過減去輸入信號中的最大值(上例中的 c
),我們發現原本爲 nan
(not a number
,不確定)的地方,現在被正確計算了。綜上,我們可以像下面這樣實現 softmax
函數。
In [22]: def softmax(a):
...: c = np.max(a)
...: exp_a = np.exp(a-c)
...: sum_exp_a = np.sum(exp_a)
...: y = exp_a / sum_exp_a
...: return y
...:
In [23]:
5. softmax 函數特徵
使用 softmax()
函數,可以按如下方式計算神經網絡的輸出。
In [5]: a = np.array([0.3, 2.9 ,4.0])
In [6]: y = softmax(a)
In [7]: y
Out[7]: array([0.01821127, 0.24519181, 0.73659691])
In [8]: np.sum(y)
Out[8]: 1.0
In [9]:
如上所示,softmax
函數的輸出是 0.0 到 1.0之間的實數。並且,softmax
函數的輸出值的總和是 1。輸出總和爲 1 是 softmax
函數的一個重要性質。正
因爲有了這個性質,我們纔可以把 softmax
函數的輸出解釋爲“概率”。
比如,上面的例子可以解釋成 y[0] 的概率是 0.018(1.8%),y[1] 的概率
是 0.245(24.5%),y[2] 的概率是0.737(73.7%)。
這裏需要注意的是,即便使用了 softmax
函數,各個元素之間的大小關係也不會改變。這是因爲指數函數(y = exp(x)
)是單調遞增函數。實際上,上例中 a
的各元素的大小關係和 y
的各元素的大小關係並沒有改變。比如,a
的最大值是第 2 個元素,y
的最大值也仍是第 2 個元素。
一般而言,神經網絡只把輸出值最大的神經元所對應的類別作爲識別結果。
並且,即便使用 softmax
函數,輸出值最大的神經元的位置也不會變。
因此,神經網絡在進行分類時,輸出層的 softmax
函數可以省略。在實際的問題中,由於指數函數的運算需要一定的計算機運算量,因此輸出層的 softmax
函數
一般會被省略。
6. 輸出層神經元數量
輸出層的神經元數量需要根據待解決的問題來決定。
對於分類問題,輸出層的神經元數量一般設定爲類別的數量。比如,對於某個輸入圖像,預測是圖中的數字 0 到 9 中的哪一個的問題(10 類別分類問題),可以像圖3-23 這樣,將輸出層的神經元設定爲 10 個。
如圖 3-23 所示,在這個例子中,輸出層的神經元從上往下依次對應數字 0, 1, . . ., 9。此外,圖中輸出層的神經元的值用不同的灰度表示。這個例子中神經元 y2
顏色最深,輸出的值最大。這表明這個神經網絡預測的是 y2
對應的類別,也就是“2”。
參考:《深度學習入門:基於Python的理論與實現》