1. 感知機概念
下圖是一個接收兩個輸入信號的感知機的例子。
x1
、 x2
是輸入信號, y
是輸出信號, w1
、 w2
是權重( w
是 weight
的首字母)。圖中的 ○
稱爲“神經元”或者“節點”。輸入信號被送往神經元時,會被分別乘以固定的權重( w1*x1
、 w2*x2
)。神經元會計算傳送過來的信號的總和,只有當這個總和超過了某個界限值時,纔會輸出 1。這也稱爲“神經元被激活” 。這裏將這個界限值稱爲閾值,用符號 θ
表示。
把上述內容用數學式來表示,見下公式
感知機的多個輸入信號都有各自固有的權重,這些權重發揮着控制各個信號的重要性的作用。也就是說,權重越大,對應該權重的信號的重要性就越高。
2. 感知機實現
2.1 簡單實現
與門是有兩個輸入和一個輸出的門電路。這種輸入信號和輸出信號的對應表稱爲“真值表”。如圖所示,與門僅在兩個輸入均爲 1 時輸出1,其他時候則輸出 0。
以邏輯與門爲例來看看如何實現:
In [1]: def AND(x1, x2):
...: w1, w2, theta = 0.5, 0.5, 0.7
...: result = x1 * w1 + x2 * w2
...: if result >= theta:
...: return 1
...: else:
...: return 0
...:
In [2]:
按照同樣的步驟,也可以實現與非門和或門,不過讓我們來對它們的實現稍作修改。
2.2 導入權重和偏置
式(2.1)的 θ
換成 −b
,於是就可以用式(2.2)來表示感知機的行爲。
式(2.1)和式(2.2)雖然有一個符號不同,但表達的內容是完全相同的。此處,b 稱爲偏置,w1 和 w2 稱爲權重。如式(2.2)所示,感知機會計算輸入信號和權重的乘積,然後加上偏置,如果這個值大於 0 則輸出 1,否則輸出 0。
使用 NumPy
實現 2.2 所描述的感知機,代碼如下:
In [2]: import numpy as np
In [3]: x = np.array([0, 1]) # 輸入
In [5]: w = np.array([0.5, 0.5]) # 權重
In [6]: b = -0.7 # 偏置
In [7]: w * x
Out[7]: array([0. , 0.5])
In [8]: np.sum(w*x)
Out[8]: 0.5
In [9]: np.sum(w*x) + b
Out[9]: -0.19999999999999996 # 大約爲-0.2(由浮點小數造成的運算誤差)
In [10]:
在 NumPy
數組的乘法運算中,當兩個數組的元素個數相同時,各個元素分別相乘,因此 w*x
的結果就是它們的各個元素分別相乘([0, 1] *[0.5, 0.5] => [0, 0.5])。之後, np.sum(w*x)
再計算相乘後的各個元素的總和。最後再把偏置加到這個加權總和上,就完成了式(2.2)的計算。
2.3 使用權重和偏置的實現
代碼如下:
In [11]: def AND(x1, x2):
...: x = np.array([x1, x2])
...: w = np.array([0.5, 0.5])
...: b = -0.7
...: result = np.sum(w*x) + b
...: if result <= 0:
...: return 0
...: else:
...: return 1
In [12]:
這裏把 −θ
命名爲偏置 b
,但是請注意,偏置和權重 w1
、 w2
的作用是不一樣的。
具體地說, w1
和 w2
是控制輸入信號的重要性的參數,而偏置是調整神經元被激活的容易程度(輸出信號爲 1 的程度)的參數。
例如:
- 若
b
爲−0.1
,則只要輸入信號的加權總和超過0.1
,神經元就會被激活。 - 但是如果
b
爲−20.0
,則輸入信號的加權總和必須超過20.0
,神經元纔會被激活。
像這樣,偏置的值決定了神經元被激活的容易程度。另外,這裏我們將 w1
和 w2
稱爲權重,將 b
稱爲偏置,但是根據上下文,有時也會將 b
、 w1
、 w2
這些參數統稱爲權重。
3. 感知機侷限性
感知機的侷限性就在於它只能表示由一條直線分割的空間。下圖這樣彎曲的曲線無法用感知機表示。另外,由下圖這樣的曲線分割而成的空間稱爲非線性空間,由直線分割而成的空間稱爲線性空間。
4. 多層感知機
與門、或門是單層感知機,而異或門是 2 層感知機。疊加了多層的感知機也稱爲多層感知機( multi-layered perceptron
)。
圖2-13中的感知機總共由 3 層構成,但是因爲擁有權重的層實質上只有 2 層(第 0 層和第 1 層之間,第 1 層和第 2 層之間),所以稱爲 “2 層感知機”。不過,有的文獻認爲圖 2-13 的感知機是由 3 層構成的,因而將其稱爲“3 層感知機”。
在圖2-13所示的 2 層感知機中,先在第 0 層和第 1 層的神經元之間進行信號的傳送和接收,然後在第 1 層和第 2 層之間進行信號的傳送和接收,具體如下所示。
- 第 0 層的兩個神經元接收輸入信號,並將信號發送至第 1 層的神經元。
- 第 1 層的神經元將信號發送至第 2 層的神經元,第 2 層的神經元輸出 y。
這種 2 層感知機的運行過程可以比作流水線的組裝作業。第 1 段(第 1 層)的工人對傳送過來的零件進行加工,完成後再傳送給第 2 段(第 2 層)的工人。第 2 層的工人對第 1 層的工人傳過來的零件進行加工,完成這個零件後出貨(輸出)。
通過這樣的結構( 2 層結構),感知機得以實現異或門。這可以解釋爲 “單層感知機無法表示的東西,通過增加一層就可以解決”。也就是說,通過疊加層(加深層),感知機能進行更加靈活的表示。
5. 總結
• 感知機是具有輸入和輸出的算法。給定一個輸入後,將輸出一個既定的值;
• 感知機將權重和偏置設定爲參數;
• 使用感知機可以表示與門和或門等邏輯電路;
• 異或門無法通過單層感知機來表示;
• 使用 2 層感知機可以表示異或門;
• 單層感知機只能表示線性空間,而多層感知機可以表示非線性空間;
• 多層感知機(在理論上)可以表示計算機;
參考:《深度學習入門:基於Python的理論與實現》