二、感知機與多層網絡
3、感知機與邏輯操作
(1)線性模型
感知機只有輸出層神經元進行激活函數處理,即只擁有一層功能神經元,其學習能力十分有限。有些邏輯運算(與、或、非問題)可以看成線性可分任務。若兩類模式是線性可分的,即存在一個線性超平面能將它們分開,則感知機的學習過程一定會收斂而求得適當的權向量w;否則感知機學習過程會發生振盪,w難以穩定下來,不能求得合適的解。
利用感知機可以實現一些邏輯操作,也就是我們可以為感知機找到一組權值和閾值,實現操作。
1)邏輯或
2)邏輯與
3)與非操作
(2)非線性模型
感知機是線性模型,對於線性可分的任務能夠找到分類邊界,但對於線性不可分的任務,需考慮多層功能神經元。
異或運算可以通過其他邏輯運算實現。單個神經元智能實現線性任務,將多個神經元進行堆疊就可以實現非線性任務。輸出層和輸入層之間的一層神經元,被稱為隱層或隱含層,隱含層和輸出層神經元都是擁有激活函數的功能神經元。
也就是說,若將三個神經元進行疊加,便能夠解決異或問題。在上圖中,輸出層和輸出層之間的一層神經元,被稱為隱層或隱含層。
感知機與邏輯運算代碼實現:
#邏輯與 import numpy as np import matplotlib.pyplot as plt X0 = np.array([[0,0], [0,1], [1,0]]) X1 = np.array([[1,1]]) ones = -np.ones((X0.shape[0],1)) X0 = np.hstack((ones,X0)) ones = -np.ones((X1.shape[0],1)) X1 = np.hstack((ones,X1)) X = np.vstack((-X0,X1)) W = np.ones((X.shape[1],1)) flag = True while(flag): flag = False for i in range(len(X)): x = X[i,:].reshape(-1,1) if np.dot(W.T,x)<=0: W = W + x flag = True plt.grid() plt.scatter(X0[:,1],X0[:,2],c = 'r',marker='o',s=500) plt.scatter(X1[:,1],X1[:,2],c = 'g',marker='*',s=500) p1=[0,1] p2=[(W[0]-p1[0]*W[1])/W[2],(W[0]-p1[1]*W[1])/W[2]] plt.plot(p1,p2) plt.show() print(W) #邏輯或非 import numpy as np import matplotlib.pyplot as plt X1 = np.array([[0,0]]) X0 = np.array([[0,1], [1,0], [1,1]]) ones = -np.ones((X0.shape[0],1)) X0 = np.hstack((ones,X0)) ones = -np.ones((X1.shape[0],1)) X1 = np.hstack((ones,X1)) X = np.vstack((-X0,X1)) Y = np.array([[0],[0],[0],[0],[1],[1],[1],[1]]) W = np.ones((X.shape[1],1)) flag = True while(flag): flag = False for i in range(len(X)): x = X[i,:].reshape(-1,1) if np.dot(W.T,x)<=0: W = W + x flag = True plt.grid() plt.scatter(X0[:,1],X0[:,2],c = 'r',marker='o',s=500) plt.scatter(X1[:,1],X1[:,2],c = 'g',marker='*',s=500) p1=[0,1] p2=[(W[0]-p1[0]*W[1])/W[2],(W[0]-p1[1]*W[1])/W[2]] plt.plot(p1,p2) plt.show() print(W) #邏輯或 import numpy as np import matplotlib.pyplot as plt X0 = np.array([[0,0]]) X1 = np.array([[0,1], [1,0], [1,1]]) ones = -np.ones((X0.shape[0],1)) X0 = np.hstack((ones,X0)) ones = -np.ones((X1.shape[0],1)) X1 = np.hstack((ones,X1)) X = np.vstack((-X0,X1)) Y = np.array([[0],[0],[0],[0],[1],[1],[1],[1]]) W = np.ones((X.shape[1],1)) flag = True while(flag): flag = False for i in range(len(X)): x = X[i,:].reshape(-1,1) if np.dot(W.T,x)<=0: W = W + x flag = True plt.grid() plt.scatter(X0[:,1],X0[:,2],c = 'r',marker='o',s=500) plt.scatter(X1[:,1],X1[:,2],c = 'g',marker='*',s=500) p1=[0,1] p2=[(W[0]-p1[0]*W[1])/W[2],(W[0]-p1[1]*W[1])/W[2]] plt.plot(p1,p2) plt.show() print(W) #異或 import numpy as np import matplotlib.pyplot as plt X0 = np.array([[0,0], [1,1]]) X1 = np.array([[0,1], [1,0]]) plt.grid() plt.scatter(X0[:,0],X0[:,1],c = 'r',marker='o',s=500) plt.scatter(X1[:,0],X1[:,1],c = 'g',marker='*',s=500) plt.show()
4、多層前饋神經網絡
更一般的,常見的神經網絡是形如下圖的層級結構,由輸入層,隱藏層,輸出層構成。
特點:每層神經元與下層神經元完全互連,神經元之間不存在同層連接,也不存在跨層連接。
這樣網絡也稱為前饋神經網絡。
當隱藏層只有一層時,該網絡為兩層神經網絡,由於輸入層未做任何變換,可以不看做單獨的一層。實際中,網絡輸入層的每個神經元代表了一個特征,輸出層個數代表了分類標簽的個數(在做二分類時,如果采用sigmoid分類器,輸出層的神經元個數為1個;如果采用softmax分類器,輸出層神經元個數為2個),而隱藏層層數以及隱藏層神經元是由人工設定。
神經網絡的學習過程,就是根據訓練數據來調整神經元之間的連接權以及每個功能神經元的閾值,換言之,神經網絡學到的東西,蘊涵在連接權和閾值中。