感知器是一種基本的神經網路模型,用於二分類問題。它模擬了人腦神經元的工作原理,通過調整權重和偏差值來達到預測和分類的目的。
圖手畫得有點醜,請見諒

感知器流程
輸入
- 資料的輸入:
- 輸入層接受資料的輸入,每個輸入對應一個特徵,還有一個固定的偏差神經元。
- 資料經過每個神經元時,會乘上相應的權重,然後加上偏差值。
- 經過輸出神經元做出決策:
- 輸出層的神經元接收所有輸入層神經元的加權和。
- 根據加權和,輸出神經元進行決策,通常通過激活函數(如閥值函數、Sigmoid函數等)轉換成輸出值。
- 根據預測結果和真實結果的差距,使用損失函數計算誤差,並通過優化器進行權重和偏差值的更新。
輸出神經元
- 激活函數: 常見的激活函數有Sigmoid函數、ReLU函數、Tanh函數等,它們將加權和轉換為一個標準範圍內的輸出值(如0到1或-1到1)。
- 二分類問題: 感知器主要用於二分類問題,即預測輸出為0或1。
- 預測結果和真實結果的差距: 通過損失函數衡量預測結果和真實結果之間的差距,這個差距用來指導模型的更新。
損失函數
- 均方誤差 (Mean Squared Error, MSE): 常用的損失函數,計算預測值和真實值之間的平方差的平均值。
- 交叉熵損失 (Cross-Entropy Loss): 用於分類問題,特別是多分類問題,計算預測的概率分佈和真實分佈之間的差異。
優化器
- 梯度下降法 (Gradient Descent): 最常用的優化算法,根據損失函數的梯度來更新權重和偏差值,使損失函數最小化。
- 學習率 (Learning Rate): 控制每次更新的步伐大小,學習率過大可能導致不穩定,過小則可能收斂過慢。
- 批量梯度下降 (Batch Gradient Descent): 使用整個訓練集來計算梯度。
- 隨機梯度下降 (Stochastic Gradient Descent, SGD): 每次使用一個樣本來計算梯度,更新權重。
- 小批量梯度下降 (Mini-Batch Gradient Descent): 每次使用一小部分樣本來計算梯度,更新權重。
儲存的模型
- 模型儲存: 訓練完成後,將最終的權重和偏差值儲存起來。這些值可以在預測時使用,而不需要重新訓練模型。
- 模型持久化: 常見的儲存方法有使用Pickle、HDF5等格式,或儲存為特定框架(如TensorFlow、PyTorch)的模型文件。
程式範例
用簡單的程式範例,來說明感知器學習到分類的結果。import numpy as np
import matplotlib.pyplot as plt
#data
X = np.array([[1,3,3],
[1,4,31],
[1,1,1],
[1,0,2]])
#真實資料
y = np.array([[1],
[1],
[-1],
[-1]])
lr =0.11 # 學習率learning rate : 修正的步伐
out = 0 # 預測值 Y
#權重
w = (np.random.random([3,1])-0.5)*2 # 3*1個亂數
def update():
global X, y, w,lr
out = np.sign(np.dot(X, w)) # 計算預測值
w_c = lr * (X.T.dot(y-out))/int(X.shape[0]) # 計算權重修正值
w = w + w_c
return w,out
for i in range(20):
w,out = update()
x1=[3,3]
y1=[4,31]
x2=[1,1]
y2=[0,2]
#印出權重的變化圖
k = -w[1]/w[2]
d = -w[0]/w[2]
print('k=',k)
print('d=',d)
xdata = (0,5)
plt.figure()
plt.plot(xdata, xdata*k+d,'r')
plt.scatter(x1,y1,c='b')
plt.scatter(x2,y2,c='y')
plt.show()
print(f'最後的結果 out :{out}')
# 驗證學習到的w
# 新的資料 將原本的x資料相反
new_X = np.array([[1,1,1],
[1,0,2],
[1,3,3],
[1,4,31]])
#驗證
out = np.sign(np.dot(new_X, w))
print(f'y : {y}')
print(f'out(預測結果) : {out}')

終端機輸出
在最後新資料X,前兩行與後兩行交換,看終端機輸出最後預測的結果也是跟預測結果剛好是兩兩相反,代表學習到的w是有訓練好的。
程式碼詳細說明
global X, y, w, lr
:X
(輸入特徵矩陣)、y
(真實標籤向量)、w
(權重向量)和lr
(學習率)是全局變數,意味著這些變數在函數外部已經被定義,並且在函數內部可以直接使用和修改。
out = np.sign(np.dot(X, w))
:np.dot(X, w)
計算輸入特徵矩陣X
和權重向量w
的點積,得到感知器的輸出值(未經激活函數處理)。np.sign(...)
將點積結果轉換為符號函數的輸出,即將輸出值轉換為 -1 或 1(對於二分類問題)。out
是感知器的預測輸出。
w_c = lr * (X.T.dot(y - out)) / int(X.shape[0])
:y - out
計算真實標籤y
和預測輸出out
之間的差距X.T.dot(y - out)
計算特徵矩陣的轉置X.T
和損失函數結果的點積。- 乘以學習率
lr
縮放,控制每次更新的步伐大小。 - 除以
int(X.shape[0])
(即輸入樣本數量),計算平均差值,這樣更新的幅度不會因樣本數量變化而過大。 w_c
是權重的修正值,表示應該如何調整權重。
w = w + w_c
:- 更新權重向量
w
,加上修正值w_c
,使得模型朝著減少差值的方向進行調整。
- 更新權重向量
總結
程式範例目的是通過一個簡單的更新規則來調整感知器的權重,使得模型的預測結果更接近真實值。每次更新權重時,計算出當前模型的預測值,然後根據預測值與真實值之間的差距來修正權重。
學習率 lr
控制了每次更新的幅度,以避免過大的步伐導致訓練不穩定或者過小的步伐導致收斂過慢。