共计 1824 个字符,预计需要花费 5 分钟才能阅读完成。
背景介绍
1986 年,Rumelhart、Hinton 和 Williams 在《Nature》上发表论文,首次系统阐述了反向传播算法(Backpropagation)。这一算法彻底改变了神经网络训练的方式,使得多层感知机(MLP)能够有效学习非线性特征。在此之前,单层感知机受限于线性可分问题,而反向传播通过链式法则实现了误差从输出层向隐藏层的逐层传递,为现代深度学习奠定了基础。
如今,从图像识别到自然语言处理,几乎所有深度神经网络都依赖反向传播进行参数优化。理解这一算法,是掌握深度学习核心原理的关键第一步。
核心概念
前向传播 vs 反向传播
- 前向传播 :输入数据通过各层权重和激活函数逐层计算,最终得到预测输出。公式表示为:
$$a^{(l)} = f(z^{(l)}), \ z^{(l)} = W^{(l)}a^{(l-1)} + b^{(l)}$$ - $a^{(l)}$:第 $l$ 层的激活值
-
$f(\cdot)$:激活函数(如 Sigmoid)
-
反向传播 :根据预测输出与真实标签的误差,利用链式法则计算每一层参数的梯度。关键步骤包括:
- 计算输出层误差 $\delta^{(L)} = \nabla_a J \odot f'(z^{(L)})$
- 逐层回传误差 $\delta^{(l)} = ((W^{(l+1)})^T \delta^{(l+1)}) \odot f'(z^{(l)})$
- 更新权重梯度 $\nabla_{W^{(l)}} J = \delta^{(l)} (a^{(l-1)})^T$

代码实现
以下用 NumPy 实现一个单隐藏层的反向传播过程,注释详细说明计算逻辑:
import numpy as np
# 定义 Sigmoid 激活函数及其导数
def sigmoid(x):
return 1 / (1 + np.exp(-x))
def sigmoid_derivative(x):
return x * (1 - x)
# 初始化参数
input_size = 3
hidden_size = 4
output_size = 1
# He 初始化权重
W1 = np.random.randn(input_size, hidden_size) * np.sqrt(2. / input_size)
W2 = np.random.randn(hidden_size, output_size) * np.sqrt(2. / hidden_size)
# 前向传播
def forward(X):
z1 = np.dot(X, W1)
a1 = sigmoid(z1)
z2 = np.dot(a1, W2)
a2 = sigmoid(z2)
return z1, a1, z2, a2
# 反向传播
def backward(X, y, z1, a1, z2, a2):
# 计算输出层误差
delta2 = (a2 - y) * sigmoid_derivative(a2) # dJ/dz2
# 计算隐藏层误差
delta1 = np.dot(delta2, W2.T) * sigmoid_derivative(a1) # dJ/dz1
# 计算梯度
dW2 = np.dot(a1.T, delta2)
dW1 = np.dot(X.T, delta1)
return dW1, dW2
# 示例数据
X = np.array([[0, 0, 1], [1, 1, 1], [1, 0, 1]])
y = np.array([[0], [1], [1]])
# 训练循环
for epoch in range(1000):
z1, a1, z2, a2 = forward(X)
dW1, dW2 = backward(X, y, z1, a1, z2, a2)
# 更新权重(学习率 0.1)W1 -= 0.1 * dW1
W2 -= 0.1 * dW2
常见问题
梯度消失 / 爆炸
- 成因 :
- 深层网络中,梯度连乘可能导致数值指数级减小(消失)或增大(爆炸)
-
尤其在使用 Sigmoid 激活函数时,其导数最大仅 0.25,加剧消失问题
-
解决方案 :
- 使用 ReLU 激活函数:$f(x) = max(0, x)$,导数为 1(正区间)
- 梯度裁剪:限制梯度绝对值不超过阈值
- 批归一化(BatchNorm):稳定层间输入分布
最佳实践
- 参数初始化 :使用 Xavier 或 He 初始化,避免初始梯度过大 / 过小
- 学习率调参 :结合学习率衰减(如指数衰减)和动量优化(如 Adam)
- 梯度检查 :用数值梯度验证反向传播实现正确性
延伸思考
- 如何将反向传播扩展到卷积神经网络(CNN)和循环神经网络(RNN)?
- 在分布式训练中,异步反向传播会带来哪些挑战?
理解反向传播后,读者可以尝试实现更复杂的网络结构,或探索其与优化理论(如二阶方法)的联系。这一算法虽诞生于 80 年代,但至今仍是深度学习研究的核心课题之一。
正文完
发表至: 未分类
近一天内
