在識別手寫數字的流程中,咱們提到,Softmax 層將神經網絡的輸出變成了一個機率分佈。這裏面主要用到的就是 Softmax 函數。python
首先咱們要回答一個問題,爲何要把一串數字變成機率分佈?算法
咱們能夠從一個選擇的問題提及。假設咱們要從 3 個個體裏隨機選擇一個個體,但它們分別具備權重爲 一、四、13,咱們但願權重高的個體更容易被選中。也就是說,被選中的機率與個體在整體中所佔比例成正比。網絡
熟悉遺傳算法的同窗可能立刻能想到,在遺傳算法的個體選擇裏用到的 輪盤賭選擇算法 就能夠用在這個場景裏。它的描述以下:函數
實際上很簡單,將全部個體加和,而後計算各個個體在總數中的比例。這些比例之和爲 1,那麼就能夠根據區間進行隨機選擇了。spa
以上述例子舉例,三個個體總數爲 1 + 4 + 13 = 18,因此比例分別爲:code
個體 | 比例 | 累計比例 |
---|---|---|
1 | 1 / 18 = 0.06 | 0.06 |
4 | 4 / 18 = 0.22 | 0.06 + 0.22 = 0.28 |
13 | 13 / 18 = 0.72 | 0.28 + 0.72 = 1 |
這時隨機生成一個 0 到 1 的數,若是落在 [0, 0.06) 中,則第一個個體被選中;若是落在 [0.06, 0.28) 中,則第二個個體被選中;若是落在 [0.28, 1) 中,則第三個個體被選中。cdn
很容易理解,在輪盤賭算法裏面,個體的值不能是負數,這就須要咱們提早對個體值進行處理。假設咱們原始值裏面包含負數,那麼在進行輪盤賭以前須要轉化爲正數。blog
將輪盤賭算法寫成更易於理解的形式則爲:ip
咱們的原始值 x 能夠包含正數和負數,但通過函數 f 的處理,能夠都映射到正數上。你可能已經想到了,這裏的 f 正是:get
綜合一下,就獲得了咱們的 Softmax 函數:
假設咱們的原始值爲 -一、0、三、5,那麼經由 Softmax 處理可得:
x | 分子 ![]() |
比例 |
---|---|---|
-1 | 0.368 | 0.002 |
0 | 1 | 0.006 |
3 | 20.09 | 0.118 |
5 | 148.41 | 0.874 |
在 Python 中,使用 Numpy 很是容易實現:
import numpy as np
def softmax(xs):
return np.exp(xs) / sum(np.exp(xs))
xs = np.array([-1, 0, 3, 5])
print(softmax(xs)) # [0.0021657, 0.00588697, 0.11824302, 0.87370431]
複製代碼
固然,實際上咱們把 Softmax 函數用在神經網絡裏並非爲了選擇,而重點在於 表示機率,若是說咱們的神經網絡在像貓仍是像狗的問題上分別輸出爲 -1 和 2,那麼咱們能夠說,有 95.3% 像狗。這就是 Softmax 函數的功勞。
x | ![]() |
機率 |
---|---|---|
-1 | 0.368 | 0.047 |
2 | 7.39 | 0.953 |