引言
很多初学者一上来就接触 TensorFlow 或 PyTorch,虽然能快速搭建模型,但往往只停留在调库层面。如果不理解背后的数学推导和计算过程,遇到复杂问题时就容易束手无策。
因此,亲手从零实现一个神经网络是深入理解深度学习的必经之路。本文将不依赖任何高级框架,仅使用 Python 和 NumPy,带你一步步构建一个能解决 XOR(异或)问题的神经网络,彻底搞懂前向传播、反向传播以及参数更新的底层逻辑。
核心原理梳理
1. 神经元模型
神经网络的灵感来自生物神经元。每个神经元接收输入信号,经过加权求和并加上偏置,最后通过激活函数输出结果:
y = f(w1x1 + w2x2 + ... + b)
其中 xi 是输入特征,wi 代表权重(决定输入的重要性),b 是偏置项,f 则是激活函数。激活函数的作用相当于非线性开关,让网络具备学习复杂关系的能力。
2. 网络结构
我们构建一个最基础的三层网络:
- 输入层:2 个节点(对应 XOR 的两个比特)
- 隐藏层:3 个节点
- 输出层:1 个节点(预测结果 0 或 1)
3. 前向传播
数据从输入层流向输出层,计算公式如下:
- 隐藏层输入:Z1 = X * W1 + b1
- 隐藏层输出:A1 = sigmoid(Z1)
- 输出层输入:Z2 = A1 * W2 + b2
- 输出层输出:A2 = sigmoid(Z2)
这里的 A2 即为最终预测值。
4. 误差与反向传播
为了优化模型,我们需要最小化损失函数。这里采用平方误差: L = 0.5 * (y - y_hat)^2
核心目标是利用梯度下降算法调整权重,使误差逐渐减小。权重更新公式为: W = W + η * (∂L/∂W)
其中 η 是学习率,∂L/∂W 是误差对权重的导数(梯度)。反向传播的本质就是利用链式法则,将输出层的误差逐层传递回隐藏层,从而计算出每一层参数的梯度。
代码实现
环境要求 Python 3.x 及 numpy 库。下面这段代码完整实现了上述逻辑,包含数据定义、初始化、训练循环及可视化部分。
import numpy as np
import matplotlib.pyplot as plt
# 固定随机种子,确保实验可复现
np.random.seed(42)
# ========== 1. 数据集定义 ==========
# XOR 问题的输入与期望输出
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
y = np.array([[0], [1], [1], [0]])
# ========== 2. 激活函数定义 ==========
def sigmoid():
/ ( + np.exp(-x))
():
x * ( - x)
input_size =
hidden_size =
output_size =
lr =
epochs =
W1 = np.random.uniform(-, , (input_size, hidden_size))
b1 = np.zeros((, hidden_size))
W2 = np.random.uniform(-, , (hidden_size, output_size))
b2 = np.zeros((, output_size))
losses = []
epoch (epochs):
hidden_input = np.dot(X, W1) + b1
hidden_output = sigmoid(hidden_input)
final_input = np.dot(hidden_output, W2) + b2
final_output = sigmoid(final_input)
error = y - final_output
epoch % == :
loss = np.mean(np.(error))
losses.append(loss)
()
d_output = error * sigmoid_derivative(final_output)
d_hidden = np.dot(d_output, W2.T) * sigmoid_derivative(hidden_output)
W2 += np.dot(hidden_output.T, d_output) * lr
b2 += np.(d_output, axis=, keepdims=) * lr
W1 += np.dot(X.T, d_hidden) * lr
b1 += np.(d_hidden, axis=, keepdims=) * lr
()
(final_output)
plt.plot(losses)
plt.title()
plt.xlabel()
plt.ylabel()
plt.show()

