使用 Python 從零開始建立感知器 (Perceptron)
感知器:神經網路的基本單元
感知器是最簡單的人工神經元,是所有現代神經網路的基礎構建單元。它接收輸入,應用權重 (weight) 與偏置 (bias),並根據結果是否超過特定閾值來產生二元(是/否)輸出。本質上,感知器是一個線性分類器,透過根據錯誤不斷迭代調整參數來學習如何將數據分為兩類。
感知器如何做出決策
感知器透過權衡信號來模擬生物神經元,以決定是否應該「觸發」。決策過程遵循特定的數學公式:
output = 1 if (weight * input + bias) > 0, else 0
決策函數的關鍵組成部分
- 輸入 (x): 被評估的數據點。
- 權重 (w): 決定分配給特定輸入的重要性程度。在多輸入系統中,不同的權重允許模型優先考慮某些因素而非其他因素。
- 偏置 (b): 改變決策邊界的數值。它允許模型即使在輸入為零或理想邊界不在原點時也能做出決策。
- 分類器: 組合公式
(weight * input + bias) > 0被稱為決策函數。
決策邊界與偏置的角色
決策邊界是感知器將輸出從 0 切換到 1 的確切點。從數學上講,這發生在 weight * input + bias = 0 的地方。解出輸入值,邊界位於 -bias / weight。
為什麼偏置至關重要
如果沒有偏置,決策邊界將永久固定在零。這意味著模型只能解決分類界線正好位於 0 的問題。
例如,如果一個模型正在訓練以判斷學生是否通過考試(假設及格分數為 50),沒有偏置的感知器將會失敗。由於所有考試分數都是正數,正權重會將所有人標記為「及格」,而負權重會將所有人標記為「不及格」。偏置允許邊界從零滑動到實際的閾值(例如 50),使模型能夠在這種任務中達到 100% 的準確度。
學習過程:訓練、週期 (Epochs) 與學習率
感知器透過在每次做出錯誤預測時調整其權重與偏置來學習。這種迭代過程稱為訓練。
更新規則
當預測錯誤時,模型會計算誤差 (result - prediction) 並將參數向正確的方向推動:
weight += learning_rate * error * inputbias += learning_rate * error
訓練參數
- Epoch: 完整遍歷整個訓練數據集一次。通常需要多個 Epoch 才能讓權重與偏置收斂到正確的值。
- 學習率 (Learning Rate): 控制調整大小的乘數。較小的學習率穩定但緩慢,而較大的學習率可能導致過衝 (overshooting) 與不穩定。
使用數據歸一化優化性能
數據歸一化是在訓練之前將輸入值縮小到一個小且一致的範圍(例如 0 到 1)的過程。這對於兩個原因至關重要:
- 穩定性: 較大的輸入值可能導致權重更新時產生劇烈波動,導致訓練過程中的「跳躍」效應。歸一化可確保更平滑的收斂。
- 公平性: 當使用多個輸入時,具有較大尺度(例如以千為單位的薪資)的特徵可能會在數學上壓倒具有較小尺度(例如二元 0 或 1)的特徵,導致模型忽略較小但可能重要的特徵。
Python 實作
以下是設計用於學習數字是正數還是負數的感知器完整實作。
import random
learning_rate = 0.1
EPOCHS = 100
weight = random.uniform(-1, 1)
bias = random.uniform(-1, 1)
# Training data: positive numbers are True, negative numbers are False
data = [(i * 0.1, True) for i in range(1, 501)]
data += [(i * 0.1, False) for i in range(-500, 0)]
random.shuffle(data)
for epoch in range(EPOCHS):
for value, result in data:
prediction = (weight * value + bias) > 0
if prediction != result:
error = result - prediction # +1 or -1
weight += learning_rate * error * value
bias += learning_rate * error
decision_boundary = -bias / weight
print(f"weight = {weight:.3f}")
print(f"bias = {bias:.3f}")
print(f"decision boundary = {decision_boundary:.3f}")
技術視角與背景
雖然感知器在今天已是簡單的軟體結構,但它在硬體與理論方面都有深厚的根源。
"在機器學習的早期階段...像這樣的網路通常是在硬體 [例如 ADALINE] 中實作與訓練的。如今,那個『小腦袋』可能會改用運算放大器 (op-amps) 在麵包板上構建而成。"
此外,感知器代表了從傳統軟體(依賴顯式的 IF 語句)到機器學習的轉變——在機器學習中,IF 邏輯是由模型透過數據而非由程式設計師硬編碼所發現的。