感知器原理及线性分类技术实现
在說起感知器之前,需要先說一下神經網絡的定義:
神經網絡是由具有適應性的簡單單元組成的廣泛并行互聯的網絡,它的組織能夠模擬生物神經系統對真實世界物體所作出的交互反應。
感知器(M-P神經元模型)
????????感知器(Perceptron)由兩層神經元組成,如圖所示,輸入層接收外界輸入信號后傳遞給輸出層,輸出層是M-P神經元,亦稱“閾值邏輯單元”。在M-P神經元模型中,神經元接收到來自n個其他神經元傳遞過來的輸入信號,這些輸入信號通過帶權重的連接進行傳遞,神經元接收到的總輸入值將與神經元的閾值進行比較,然后通過“激活函數”(activation function)處理以產生神經元的輸出。
????????理想中的激活函數是下圖所示的階躍函數,它將輸入值映射為輸出值“0”或“1”,顯然“1”對應于神經元興奮,“0”對應于神經元抑制。然而,階躍函數具有不連續、不光滑等不太好的性質,因此實際常用Sigmoid函數作為激活函數,如圖所示,它把可能在較大范圍內變化的輸入值擠壓到(0,1)輸出范圍內,因此,有時也稱為“擠壓函數”。
把許多個這樣的神經元按一定的層次結構連接起來,就得到了神經網絡。
感知器能很容易地實現邏輯與、或、非的運算,注意到
????????????
假定函數f為圖(a)中的階躍函數,且x1,x2的取值為0或1,下面通過有兩個輸入神經元的感知器來實現邏輯與、或、非的運算。
- “與”(x1∧x2):令w1=w2=1,θ=2,則
????????
????????僅在x1=x2=1時,y=1;
- “或”(x1∨x2):令w1=w2=1,θ=0.5,則
????????、
????????當x1=1或x2=1時,y=1;
- “非”(?x1):令w1=-0.6,w2=0,θ=-0.5,則
????????
????????當x1=1時,y=0;當x1=0時,y=1;
更一般地,給定訓練數據集,權重wi(i=1,2,.... , n)以及閾值θ可通過學習得到,閾值θ可看作一個固定輸入為-1.0的啞結點所對應的連接權重w(n+1),這樣,權重和閾值的學習就可統一為權重的學習。
感知器權重(w)更新策略
感知器學習規則非常簡單,對訓練樣例(x,y),若當前感知器的輸出為,則感知器權重將這樣調整:
????????其中η∈(0, 1)稱為學習率(learning rate),從上式可看出,若感知器對訓練樣例(x,y)預測正確,即,則感知器不發生變化,否則將根據錯誤的程度進行權重調整。
單層感知器的缺陷
????????需要注意的是,單層感知器只有輸出層神經元進行激活函數處理,即只擁有一層功能神經元(functional neuron),其學習能力非常有限,事實上,上述與、或、非問題都是線性可分的問題,可以證明,若兩類模式是線性可分的,即存在一個線性超平面能將它們分開,感知器的學習過程一定會收斂(converge)而求得適當的權向量w=(w1;w2;.... ;wn;w(n+1));否則感知器學習過程將會發生振蕩,w難以穩定下來,不能求得合適的解。即使是非常簡單的非線性可分問題也不能解決,如:異或問題。
多層網絡
????????要解決非線性可分問題,需要考慮使用多層功能神經元。例如圖5.5中這個簡單的兩層感知器就能解決異或問題,在圖中,輸出層與輸入層之間的一層神經元,被稱為隱層或隱含層(hidden layer),隱含層和輸入層神經元都是擁有激活函數的功能神經元。
????????更一般地,常見的神經網絡是形如圖5.6所示的層級結構,每層神經元與下一層神經元全互連,神經元之間不存在同層連接,也不存在跨層連接,這樣的神經網絡結構通常稱為“多層前饋神經網絡”,其中輸入層神經元接收外界輸入,隱層與輸入層神經元對信號進行加工,最終結果由輸出層神經元輸出;換言之,輸入層神經元僅是接受輸入,不進行函數處理,隱層與輸出層包含功能神經元。因此,圖5.6(a)通常被稱為“兩層網絡”,即稱為單隱層網絡,只需包含隱層,即可稱為多層網絡。神經網絡的學習過程,就是根據訓練數據來調整神經元之間的“連接權”以及每個功能神經元的閾值;換言之,神經網絡“學”到的東西,蘊含在連接權與閾值中。
利用感知器實現線性分類
接下來通過單層感知器來實現對樣本的線性分類,這里選用的激活函數為符號函數:
為了處理方便,這里將x=0的情況歸為sgn(0)=1,即
????????
# 導入一些需要的包 import random import numpy as np import matplotlib.pyplot as plt # 定義自定義的符號函數 def sign(vec):if vec >= 0:return 1else:return -1 # 訓練權重和閾值 def train(train_num, train_datas, lr): # lr為學習率w = [0, 0]b = 0for i in range(train_num):x = random.choice(train_datas) # 從序列中獲取一個隨機元素x1, x2, y = x # 把隨機選取的樣本的分量依次賦值給x1,x2,yif(y*sign((w[0]*x1 + w[1]*x2 + b)) <= 0): # 訓練算法,如果符號函數與輸出結果不一致,則更新權重和閾值w[0] += lr*y*x1w[1] += lr*y*x2b += lr*yreturn w, b # 最終返回訓練完成的權重和閾值 # 通過畫圖來查看模型對樣本分類的好壞 def plot_points(train_datas, w, b):plt.figure() # 創建圖表x1 = np.linspace(0, 8, 100)x2 = (-b-w[0]*x1)/w[1] # 分類直線滿足的方程plt.plot(x1, x2, color='r', label='y1 data') # 畫出分類直線datas_len = len(train_datas) # 看有幾行,幾個樣本for i in range(datas_len):if(train_datas[i][-1]==1): # 正樣本用圓點標記,向量的最后一個分量[-1],也可以用[2]plt.scatter(train_datas[i][0], train_datas[i][1], s=50)else:plt.scatter(train_datas[i][0], train_datas[i][1], marker='x',s=50) # 負樣本用x標記plt.show() # 畫圖在上段程序中,對于已經訓練好的權重和閾值,滿足:
所以有
# 執行程序 if __name__=='__main__':train_data1 = [[1, 3, 1], [2, 2, 1], [3, 8, 1], [2, 6, 1]] # 正樣本train_data2 = [[2, 1, -1], [4, 1, -1], [6, 2, -1], [7, 3, -1]] # 負樣本train_datas = train_data1 + train_data2 # 樣本集print(train_datas)w, b = train(train_num=50, train_datas=train_datas, lr=0.01) # 訓練50次plot_points(train_datas, w, b) # 畫出樣本點及分類直線顯示結果:
在以后的博客中,逐漸涉及多層神經網絡的構建與應用,深入其中,更能體會到神經網絡的奧妙。
?
參考:
1、機器學習/周志華著.--北京:清華大學出版社,2016(2017.3重印)
?
?
轉載于:https://my.oschina.net/u/3888421/blog/2253176
總結
以上是生活随笔為你收集整理的感知器原理及线性分类技术实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iMac 是什么?苹果2021新款 iM
- 下一篇: 衡量人体健康的“十大新标杆”