Softmax 函數

在識別手寫數字的流程中,咱們提到,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

f(x) = e^x

綜合一下,就獲得了咱們的 Softmax 函數:

假設咱們的原始值爲 -一、0、三、5,那麼經由 Softmax 處理可得:

\sum_{j=1}^N f(x_j) = e^{-1} + e^0 + e^3 + e^5= 169.87

x 分子 e^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 e^x 機率
-1 0.368 0.047
2 7.39 0.953

參考

相關文章
相關標籤/搜索