感知機是什麼?
感知機接受多個輸入信號,輸出一個信號
感知機的信號只有“流/不流”兩種取值,0對應“不傳遞信號”,1對應“傳遞信號”。
輸入信號在被送往神經元時,會被分別乘以固定的權重。神經元會計算傳送過來的信號的總和,只有當這個總和超過某個界限值時,纔會輸出1。這也稱爲“神經元被激活”。
上述內容用數學式來表示,就是:
y=0(w1x1+w2x2<=θ)
1 (w1x1+w2x2>θ)
簡單邏輯電路
與門 and gate:與門是具有兩個輸出和一個輸入的門電路。 與門僅在兩個輸入均爲1時輸出1,其他時候輸出0
與非門 NAND gate
或門
感知機的實現
與門的實現
def AND(x1,x2):
w1,w2,theta = 0.5,0.5,0.7
tmp = w1*x1+w2*x2
if tmp <= theta:
return 0
elif tmp > theta:
return 1
導入權重和偏置
y=0(b+w1x1+w2x2<=0)
1(b+w1x1+w2x2>0)
偏置的值決定了神經元被激活的容易程度
感知機的侷限性
異或門,僅當x1和x2中的一方爲1時,纔會輸出1.
一條直線無法分開 真值表中的4個點
曲線分割的空間稱爲非線性空間,直線分割的空間稱爲線性空間。
多層感知機
異或門的實現
AND函數。NAND函數。OR函數。疊加
def XOR(x1, x2):
s1= NAND(x1,x2)
s2= OR(x1,x2)
y=AND(s1,s2)
return y
反向傳播網絡
#定義激活函數
import numpy as np
def sigmoid(x, deriv=Flase)
if deriv==True:
return x*(1-x)
return 1/(1+np.exp(-x))
#網絡結構
w0 = np.random.random(( , ))
w1 = np.random.random(( , ))
#前向傳播
l0 = x
l1 = sigmoid(np.dot(l0, w0))
l2 = sigmoid(np.dot(l1,w1))
l2_error = l2 - y
#反向傳播
l2_delta = l2_error * sigmode(l2, deriv=True)
l1_error = np.dot(l2_delta, w1.T)
l1_delta = l1_error*sigmode(l1, deriv=True)
#更新參數
w1-=l1.T .dot( l2_delta)
w0-=l0.T .dot( l1_delta)