Machine Learning 第二篇 神經網路的介紹與執行
名詞定義
神經網路(neural network)
類似與上次的多層感知器,以下是一個神經網路範例。
最左側被稱爲輸入層,最右側被成爲輸出層,而中間其它層被稱爲隱藏層。 ![[Pasted image 20241108091315.png]]
活化函數(activation function)
活化,顧名思義,就是決定如何以輸入來活化輸入,或是如果你還記得上一篇的感知器發火,也可以說成就是決定如何發火。
活化函數
Step 函數
以上個篇章講述的感知器,他的活化函數如果用 python 表達大抵會長成這樣:
def step_function(x):
if x > 0:
return 1
else:
return 0
或是如果我們要方便 numpy 使用,我們可以簡單的寫成:
def step_function(x):
return x > 0
執行結果如下:
>>> import numpy as np
>>> x = np.array([-1.0, 0.0, 1.0, 2.0])
>>> step_function(x)
array([False, False, True, True])
Sigmoid 函數
$$\text{sigmoid}(x)=\frac{1}{1+\exp(-x)}$$
import numpy as np
def sigmoid_function(x):
return 1 / (1 + np.exp(-x))
Step 函數和 Sigmoid 函數的比較
- (a) 爲 Step 函數
- (b) 爲 Sigmoid 函數
可以明顯注意到,Sigmoid 比較平滑,它並不是斬釘截鐵的判斷 $0$ 或是 $1$,它是有回傳一個 $[0, 1]$ 的範圍的。
其它活化函數
還有很多其它活化函數,只是礙於篇幅以及筆者功力有限,就沒辦法一一舉例的。
利用矩陣計算來執行神經網路
以下方的三層(或稱爲四層)神經網路爲例子:
最左邊的 $x_1, x_2$ 要如何經過 $w^1_{11}, w^1_{21}$ 來計算的得到 $a_1$ 呢?注意,$w^{i}_{jk}$ 代表第 $i$ 層的第 $k$ 個 input 對第 $k$ 個 output 的權重;$b^i_j$ 代表第 $i$ 層中的常數對 output $j$ 的權重。
顯然:$$a_1=x_1w^1_{11}+x_2w^1_{21} + b^1_1$$ 如果用矩陣表達,我們可以得到:$A^1=XW^1+B^1$
因此,我們可以寫出下面的實作:
import numpy as np
def sigmoid(x):
return 1 / (1 + np.exp(-x))
def init_network():
"""
Initialize a neural network model.
"""
network = {}
network['layer'] = 3
network['W'] = []
network['b'] = []
network['W'].append(np.array([[0.1, 0.3, 0.5], [0.2, 0.4, 0.6]]))
network['W'].append(np.array([[0.1, 0.4], [0.2, 0.5], [0.3, 0.6]]))
network['W'].append(np.array([[0.1, 0.3], [0.2, 0.4]]))
network['b'].append(np.array([0.1, 0.2, 0.3]))
network['b'].append(np.array([0.1, 0.2]))
network['b'].append(np.array([0.1, 0.2]))
return network
def forward(network, x):
"""
Calculate the final result.
"""
z = x
for i in range(network['layer']):
a = np.dot(z, network['W'][i]) + network['b'][i]
z = sigmoid(a)
return a
network = init_network()
x = np.array([1.0, 0.5])
y = forward(network, x)
print(y) # [0.31682708 0.69627909]
輸出層的設計
機器學習大概可以分爲「分類問題」與「迴歸問題」,分類問題就是對某個對象進行分類,例如分類是男生女生;迴歸問題是預測一個值,例如預測明天的天氣。
softmax 函數
分類問題很常使用 softmax
函數,其定義爲 $\exp$ 的算數權重:
$$y_k=\frac{\exp(a_k)}{\Sigma \exp(a_i)}$$
因此,顯然 softmax
會回傳一個在 $[0, 1]$ 之間的實數,且總和爲 $1$,可以把每一個個別的值當成它的權重或是機率。
需要注意的事情是指數函數的增長非常快速,爲了防止電腦無法計算那麼大的數值,我們通常可以取一個數字 $C$,使得所有 $a_k := a_k-C$。
以下是 python 中使用 numpy 的 softmax
實作:
def softmax(a):
c = np.max(a)
exp_a = np.exp(a - c)
return exp_a / np.sum(exp_a)
輸出層神經元的數量
在分類問題當中,通常與可能性的數量有關,比如說我們要判斷手寫數字(0 到 9 共 10 種可能),我們就會有 10 個神經元在輸出層,每個神經元輸出值代表該數字的可能性。
