機器學習入門(06)— 輸出層多元分類、softmax 激活函數以及輸出層的神經元數量

輸出層所用的激活函數,要根據求解問題的性質決定。一般地,

  • 迴歸問題可以使用恆等函數,也就是說會將輸入按原樣輸出;
  • 二元分類問題可以使用 sigmoid 函數;
  • 多元分類問題可以使用 softmax 函數;

1. softmax 函數定義

softmax函數定義
用圖表示 softmax 函數的話,如圖 3-22所示。圖 3-22中,softmax 函數
的輸出通過箭頭與所有的輸入信號相連。這是因爲,從式(3.10)可以看出,輸出層的各個神經元都受到所有輸入信號的影響。
softmax 函數

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 ),我們發現原本爲 nannot 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的理論與實現》

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