反向传播(Backpropagation)算法的原理与计算过程
题目描述:反向传播是训练神经网络的核心算法,用于高效计算损失函数对网络各层权重的梯度。我们将以一个包含输入层、单隐藏层和输出层的简单神经网络为例,详细推导反向传播的计算步骤。
解题过程:
- 网络结构与前向传播
我们考虑一个三层网络:
- 输入层:2个神经元(x₁, x₂)
- 隐藏层:2个神经元(使用Sigmoid激活函数)
- 输出层:1个神经元(使用Sigmoid激活函数)
前向传播步骤:
a) 输入层到隐藏层:
z₁ = w₁₁x₁ + w₁₂x₂ + b₁
z₂ = w₂₁x₁ + w₂₂x₂ + b₂
a₁ = σ(z₁) = 1/(1+e^{-z₁})
a₂ = σ(z₂) = 1/(1+e^{-z₂})
b) 隐藏层到输出层:
z₃ = w₃₁a₁ + w₃₂a₂ + b₃
ŷ = σ(z₃) = 1/(1+e^{-z₃})
-
损失函数定义
使用均方误差损失:
L = ½(y - ŷ)²
其中y是真实标签,ŷ是预测值 -
反向传播梯度计算
关键思想:使用链式法则从输出层向输入层反向传播误差
a) 输出层梯度:
∂L/∂ŷ = ŷ - y
∂ŷ/∂z₃ = ŷ(1-ŷ) # Sigmoid函数导数
∴ ∂L/∂z₃ = (∂L/∂ŷ)(∂ŷ/∂z₃) = (ŷ-y)ŷ(1-ŷ)
b) 隐藏层到输出层权重梯度:
∂L/∂w₃₁ = (∂L/∂z₃)(∂z₃/∂w₃₁) = ∂L/∂z₃ · a₁
∂L/∂w₃₂ = ∂L/∂z₃ · a₂
∂L/∂b₃ = ∂L/∂z₃ # 偏置项的梯度
c) 隐藏层神经元梯度:
∂L/∂a₁ = (∂L/∂z₃)(∂z₃/∂a₁) = ∂L/∂z₃ · w₃₁
∂L/∂a₂ = ∂L/∂z₃ · w₃₂
d) 隐藏层线性组合梯度:
∂a₁/∂z₁ = a₁(1-a₁) # Sigmoid导数
∂a₂/∂z₂ = a₂(1-a₂)
∴ ∂L/∂z₁ = (∂L/∂a₁)(∂a₁/∂z₁) = ∂L/∂a₁ · a₁(1-a₁)
∂L/∂z₂ = ∂L/∂a₂ · a₂(1-a₂)
e) 输入层到隐藏层权重梯度:
∂L/∂w₁₁ = (∂L/∂z₁)(∂z₁/∂w₁₁) = ∂L/∂z₁ · x₁
∂L/∂w₁₂ = ∂L/∂z₁ · x₂
∂L/∂w₂₁ = ∂L/∂z₂ · x₁
∂L/∂w₂₂ = ∂L/∂z₂ · x₂
-
权重更新公式
使用梯度下降法:
w₃₁ ← w₃₁ - η·∂L/∂w₃₁
w₃₂ ← w₃₂ - η·∂L/∂w₃₂
其他权重同理更新,其中η是学习率 -
算法总结
反向传播的核心优势在于通过链式法则实现了梯度的高效计算,避免了重复计算。实际应用中通常使用矩阵运算批量处理数据,并配合各种优化算法(如动量法、Adam等)提高训练效率。