重點(diǎn):
- 感知機(jī)將權(quán)重與偏置設(shè)定為參數(shù)。
- 不改變結(jié)構(gòu),只改變參數(shù)可以使感知機(jī)實(shí)現(xiàn)不同的功能。
- 單層感知機(jī)只能表示線性空間,多層感知機(jī)可以表示非線性空間。
2.1 感知機(jī)是什么
感知機(jī)接收多個(gè)(0,1)輸入信號(hào),輸出一個(gè)(0,1)信號(hào)。
下圖展示了一個(gè)二輸入的感知機(jī)的例子:

x1,x2是輸入信號(hào),y是輸出信號(hào),w1,w2是權(quán)重,?表示一個(gè)神經(jīng)元,還有一個(gè)重要參數(shù)沒在圖中表示出來,是閾值θ,大于閾值輸出1,小于閾值輸出0。具體公式如下:

當(dāng)w1x1+w2x2>θ時(shí),輸出為1,稱“神經(jīng)元被激活”。
小結(jié):
- 閾值θ決定了輸出神經(jīng)元激活的難易程度。
- 權(quán)重w1,w2決定了輸入信號(hào)x1和x2的重要性。
2.2 簡(jiǎn)單邏輯電路
2.2.1 與門
與門真值表:
| x1 | x2 | y |
|---|---|---|
| 0 | 0 | 0 |
| 1 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 1 | 1 |
考慮用上面的二輸入感知機(jī)實(shí)現(xiàn)與門,可調(diào)的參數(shù)只有3個(gè),分別是權(quán)重w1,w2和閾值θ。
w1,w2,θ可取的值為:
| w1 | w2 | θ |
|---|---|---|
| 0.5 | 0.5 | 0.7 |
| 0.5 | 0.5 | 0.8 |
| 1.0 | 1.0 | 1.0 |
可以驗(yàn)證,當(dāng)參數(shù)取上面3種情況時(shí),只有x1,x2都為1,輸出y才為1。除了上面3種取法,還有無數(shù)種,可見參數(shù)的選擇不唯一。
2.2.2 與非門
與非門真值表:
| x1 | x2 | y |
|---|---|---|
| 0 | 0 | 1 |
| 1 | 0 | 1 |
| 0 | 1 | 1 |
| 1 | 1 | 0 |
與非門就是在與門基礎(chǔ)上,取反
w1,w2,θ可取的值為:
| w1 | w2 | θ |
|---|---|---|
| -0.5 | -0.5 | -0.7 |
| -0.5 | -0.5 | -0.8 |
| -1.0 | -1.0 | -1.0 |
與非門的參數(shù)選擇亦有無數(shù)種,不唯一。
2.2.3 或門
或門真值表:
| x1 | x2 | y |
|---|---|---|
| 0 | 0 | 0 |
| 1 | 0 | 1 |
| 0 | 1 | 1 |
| 1 | 1 | 1 |
w1,w2,θ可取的值為:
| w1 | w2 | θ |
|---|---|---|
| 0.5 | 0.5 | 0.3 |
| 0.5 | 0.5 | 0.4 |
| 1.0 | 1.0 | 0.7 |
或門的參數(shù)選擇亦有無數(shù)種,不唯一。
重點(diǎn): 與,或,與非門的感知機(jī)構(gòu)造都是一樣的,都是用二輸入感知機(jī)實(shí)現(xiàn),通過選取不同的參數(shù),實(shí)現(xiàn)不同的邏輯計(jì)算。
機(jī)器學(xué)習(xí)的目標(biāo)就是告訴計(jì)算機(jī)要實(shí)現(xiàn)的目標(biāo),讓計(jì)算機(jī)自動(dòng)選擇合適的參數(shù)。
2.3 感知機(jī)的Python實(shí)現(xiàn)
2.3.1 用偏置代替閾值
將上面的數(shù)學(xué)表達(dá)式的θ移到右邊,令b=-θ,換一種表達(dá)方式:

我們稱b為偏置,效果就像穿木屐,在計(jì)算b+w1x1+w2x2的過程中,權(quán)重w和輸入x都知道的時(shí)候,b總是將計(jì)算結(jié)果抬到一個(gè)高度,使其更容易或更難大于0。
權(quán)重w1,w2是控制輸入信號(hào)的重要性的參數(shù)。
偏置b是調(diào)整神經(jīng)元被激活的容易程度的參數(shù)。
2.3.2 用Python實(shí)現(xiàn)與門,與非門,或門
與門:
import numpy as np
def AND(x1, x2):
x = np.array([x1, x2])
w = np.array([0.5, 0.5])
b = -0.7
tmp = np.sum(w*x) + b
#mumpy中數(shù)組相乘,為其對(duì)應(yīng)位置元素相乘,構(gòu)成表達(dá)式b+w1x1+w2x2
if tmp <= 0:
return 0
else:
return 1
與非門:
import numpy as np
def NAND(x1, x2):
x = np.array([x1, x2])
w = np.array([-0.5, -0.5]) #只更改了參數(shù),結(jié)構(gòu)沒變
b = 0.7
tmp = np.sum(w*x) + b
if tmp <= 0:
return 0
else:
return 1
或門:
import numpy as np
def OR(x1, x2):
x = np.array([x1, x2])
w = np.array([0.5, 0.5]) #只更改了參數(shù),結(jié)構(gòu)沒變
b = -0.2
tmp = np.sum(w*x) + b
if tmp <= 0:
return 0
else:
return 1
2.4 感知機(jī)的局限性
2.4.1 異或門
我們來看一下異或門的真值表:
異或門真值表:
| x1 | x2 | y |
|---|---|---|
| 0 | 0 | 0 |
| 1 | 0 | 1 |
| 0 | 1 | 1 |
| 1 | 1 | 0 |
只有當(dāng)輸入x1和x2不一樣時(shí),輸出才為1。
我們用前面使用的二輸入感知機(jī)無法實(shí)現(xiàn)異或門,可以通過畫圖理解。
下面是或門的輸入輸出分布圖,●表示0,▲表示1,可以通過參數(shù)的選取,w1=1,w2=1,b=-0.5。

用直線-0.5+x1+x2=0可以將兩個(gè)不同的輸出區(qū)域分割開。

但是觀察異或門的輸入輸出分布圖:

很明顯,如果遵從數(shù)學(xué)公式:

無法使用一條直線b+w1x1+w2x2=0將不同的輸出區(qū)域分割開。
2.4.2 線性和非線性
感知機(jī)的局限性就在于它只能表示由一條直線分割的空間。
倘若我們要分割異或門的輸入輸出空間,就必須使用曲線。

這種由曲線分割而成的空間稱為非線性空間。
而由直線分割而成的空間稱為線性空間。
2.5 多層感知機(jī)
2.5.1 異或門的實(shí)現(xiàn)
單層二輸入感知機(jī)無法實(shí)現(xiàn)異或門的表達(dá),但是通過疊加感知機(jī),可以實(shí)現(xiàn)更多的邏輯表達(dá)。
用下面的符號(hào)來表達(dá)已有的可以用一個(gè)感知機(jī)表達(dá)的邏輯:

可以通過組合,疊加感知機(jī),實(shí)現(xiàn)異或門。

s1是與非門的輸出結(jié)果,s2是或門的輸出結(jié)果,將s1,s2作為與門的輸入,得到y(tǒng),可以實(shí)現(xiàn)異或門。
| x1 | x2 | s1 | s2 | y |
|---|---|---|---|---|
| 0 | 0 | 1 | 0 | 0 |
| 1 | 0 | 1 | 1 | 1 |
| 0 | 1 | 1 | 1 | 1 |
| 1 | 1 | 0 | 1 | 0 |
2.5.2 異或門的python實(shí)現(xiàn)
#要先從包含與,或,與非門的模塊導(dǎo)入對(duì)應(yīng)的函數(shù)
def XOR(x1, x2):
s1 = NAND(x1, x2)
s2 = OR(x1, x2)
y = AND(s1, s2)
return y
用感知機(jī)表示異或門,如下圖所示

從圖可以看出,異或門是一個(gè)多層感知機(jī)。
最左邊一層神經(jīng)元稱為第0層,為的是與Python的列表邏輯符合,由于上圖中,擁有權(quán)重的層實(shí)際上只有2層(第0層和第1層之間,第1層和第2層之間),所以稱為2層感知機(jī),有的文獻(xiàn)也稱為3層,忽略權(quán)重。
通過疊加層,感知機(jī)能進(jìn)行更靈活的表示,例如表示非線性空間。