本文將手把手帶你用 Python + Numpy 實現一個最基礎的人工神經網絡(Artificial Neural Network, ANN)。不依賴任何深度學習框架,適合入門理解神經網絡的本質。
一、項目目標
構建一個三層神經網絡(輸入層、隱藏層、輸出層),用于解決一個簡單的二分類任務,例如根據兩個輸入特征判斷輸出是 0 還是 1。
二、基本結構說明
我們將構建如下結構的神經網絡:
復制編輯
輸入層(2個神經元) → 隱藏層(4個神經元) → 輸出層(1個神經元)
-
激活函數:使用 Sigmoid
-
損失函數:均方誤差
-
學習方式:批量梯度下降 + 手動反向傳播
三、準備數據
我們使用一個簡單的數據集(可類比于 AND/OR 操作):
import numpy as np# 輸入數據:4組樣本,每組2個特征
X = np.array([[0, 0],[0, 1],[1, 0],[1, 1]
])# 標簽:這里我們嘗試模擬邏輯或(OR)操作
y = np.array([[0], [1], [1], [1]])
四、初始化網絡參數
np.random.seed(0)# 網絡結構:2 → 4 → 1
input_size = 2
hidden_size = 4
output_size = 1# 權重初始化(正態分布)
W1 = np.random.randn(input_size, hidden_size)
b1 = np.zeros((1, hidden_size))W2 = np.random.randn(hidden_size, output_size)
b2 = np.zeros((1, output_size))
五、激活函數
def sigmoid(x):return 1 / (1 + np.exp(-x))def sigmoid_derivative(x):# 輸入為 sigmoid 的輸出值return x * (1 - x)
六、訓練循環
我們進行 10000 次迭代,手動實現前向傳播、損失計算和反向傳播。
learning_rate = 0.1
for epoch in range(10000):# --- 正向傳播 ---z1 = np.dot(X, W1) + b1a1 = sigmoid(z1)z2 = np.dot(a1, W2) + b2a2 = sigmoid(z2) # 預測值# --- 損失計算(均方誤差)---loss = np.mean((y - a2) ** 2)# --- 反向傳播 ---error_output = y - a2d_output = error_output * sigmoid_derivative(a2)error_hidden = d_output.dot(W2.T)d_hidden = error_hidden * sigmoid_derivative(a1)# --- 參數更新 ---W2 += a1.T.dot(d_output) * learning_rateb2 += np.sum(d_output, axis=0, keepdims=True) * learning_rateW1 += X.T.dot(d_hidden) * learning_rateb1 += np.sum(d_hidden, axis=0, keepdims=True) * learning_rateif epoch % 1000 == 0:print(f"Epoch {epoch}, Loss: {loss:.4f}")
七、模型測試
print("預測結果:")
print(a2.round())
輸出如下,接近 OR 操作的結果 [0, 1, 1, 1]
:
預測結果:
[[0.][1.][1.][1.]]
八、總結與拓展
通過這篇文章,我們實現了一個從零開始的神經網絡:
-
完整構建了網絡結構(無需框架)
-
實現了正向傳播與反向傳播
-
成功對二分類任務進行了擬合
拓展建議:
-
改用 ReLU 激活函數;
-
增加網絡層數,提升模型表達能力;
-
用 Softmax 處理多分類問題;
-
嘗試用真實數據集,如鳶尾花(Iris)或 MNIST。
這類“純手寫”的 ANN 實戰項目非常適合用來理解深度學習的本質機制。如果你打算繼續深入,可以嘗試逐步遷移到 PyTorch 或 TensorFlow 框架實現更復雜的模型。