感知機算法是由美國學者 Frank Rosenblatt 在1957年提出來的。感知機算法自己很是簡單,可是它是神經網絡(深度學習)的起源的算法。下面,就簡單介紹下這個算法。python
感知機接收多個輸入信號,輸出一個信號。感知機的信號只有(1/0)兩種取值。算法
下圖是一個接收兩個輸入信號的感知機的例子。x1 和 x2是輸入信號, y是輸出信號,ω1、ω2 是權重。圖中的 ⭕️表示神經元(或者節點)。神經元會計算傳送過來的信號的總和,只有當這個總和超過了某個界限值時,纔會輸出1。這也稱爲「神經元被激活」。這裏將這個界限值稱爲閾值,用符號 θ 表示。網絡
那麼感知機的公式就能夠很容易表示出來了 :ide
(公式 1.1)學習
簡單邏輯電路其實是感知機的一個簡單的應用場景,這裏定義3個概念:與門(AND gate)、 與非門(NAND gate)、或門(OR gate)、異或門(XOR gate)。spa
這和邏輯條件的判斷類似,對於參數肯定的感知機模型,x1 和 x2取相應的值時,對應的y值以下圖: 3d
針對每個電路實例,很容易獲得結論: 前3種能夠有多種不一樣類型的感知機,不一樣的模型,參數不一致。code
下面,是用python實現3種感知機模型(肯定ω1、ω2,讓它們知足與門、與非門和或門的條件):blog
1 def AndGate(x1,x2): 2 theata = 0.6 3 w1 = 0.5 4 w2 = 0.5 5 sum = w1*x1 + w2*x2 6 if sum <= theata: 7 return 0 8 else: return 1 9 10 def NotAndGate(x1,x2): 11 theata = -0.6 12 w1 = -0.5 13 w2 = -0.5 14 sum = w1*x1 + w2*x2 15 if sum <= theata: 16 return 0 17 else: return 1 18 19 def OrGate(x1,x2): 20 theata = 0.3 21 w1 = 0.5 22 w2 = 0.5 23 sum = w1*x1 + w2*x2 24 if sum <= theata: 25 return 0 26 else: return 1
下面,想象着對感知機的公式作一個變體,讓θ = -b,那麼公式就變成了:深度學習
(公式1.2)
固然,這時候問題變成了,若是肯定了 b、ω1、ω2,也能夠肯定感知機模型,下面一樣道理,咱們快速寫出該模型的python代碼(只要讓 b= -θ 便可):
1 import numpy as np 2 3 def AndGateSecond(x1,x2): 4 X = np.array([x1,x2]) 5 w1,w2 = 0.5,0.5 6 b=-0.6 7 # print (np.array([w1,w2])*X) 8 sum = b + np.sum(np.array([w1,w2])*X) 9 if sum<=0 : 10 return 0 11 else: 12 return 1 13 14 def NotAndGateSecond(x1,x2): 15 X = np.array([x1,x2]) 16 w1,w2 = -0.5,-0.5 17 b=0.6 18 # print (np.array([w1,w2])*X) 19 sum = b + np.sum(np.array([w1,w2])*X) 20 if sum<=0 : 21 return 0 22 else: 23 return 1 24 25 def OrGateSecond(x1,x2): 26 X = np.array([x1,x2]) 27 w1,w2 = 0.5, 0.5 28 b = -0.3 29 # print (np.array([w1,w2])*X) 30 sum = b + np.sum(np.array([w1,w2])*X) 31 if sum<=0 : 32 return 0 33 else: 34 return 1
異或門,不能用感知機表示,下面用圖形的方式來解釋緣由。
y = ω1*x1 + ω2*x1 + b 能夠理解爲一條直線,二維空間。若是 ω1 = 1 , ω2 = 1 , b = -0.5 ,是知足或門的參數。下圖是該參數的直線,將三角和圓形符號區分開了。
三角形符號: (1,0) , (0,1) , (1,1) 圓形符號:(0,0)
那麼,異或門,實際上找到一條曲線,將下圖中的三角和圓形符號區分開。
很明顯,用直線沒法將上圖中三角和圓形符號區分開。 只能用曲線了:
感知機的侷限性就在於它只能表示由一條直線分割的空間。而沒法解決上邊異或門的曲線問題。
上一節中,提到了感知機的侷限性,沒法實現異或門。也就是說,在線性空間中,感知機沒法實現異或門。
可是,咱們能夠經過前邊3個感知機的組合來實現異或門,看下邊的真值表:
容易發現,咱們使用與非門、或門和與門組合完成了異或門的實現。這樣,python實現代碼也容易完成:
1 def NotOrGate(x1,x2): 2 s1=NotAndGateSecond(x1,x2) 3 s2=OrGateSecond(x1,x2) 4 y=AndGateSecond(s1,s2) 5 return y 6 7 NotOrGate(0,0),NotOrGate(1,0),NotOrGate(0,1),NotOrGate(1,1)
疊加了多層的感知機也稱爲多層感知機(multi-layered perceptron)。
圖形化表示異或門,以下: