为了更好地理解反向传播算法的具体求解过程,让我们通过一个简化的示例来说明。我们将考虑一个非常基础的神经网络结构,它包含一个输入层、一个隐藏层和一个输出层。假设我们的网络只有1个输入节点、1个隐藏节点和1个输出节点,使用Sigmoid激活函数,以及一个简单的均方误差损失函数。
网络结构与假设
- 输入层到隐藏层的权重为
w1
,偏置为b1
。 - 隐藏层到输出层的权重为
w2
,偏置为b2
。 - 输入
x=0.5
,期望输出(标签)y=0.8
,学习率α=0.5
。
前向传播
-
计算隐藏层的输入:
[ z1 = w1 * x + b1 ]
假设初始权重w1=0.6
, 偏置b1=0.3
,则
[ z1 = 0.6 * 0.5 + 0.3 = 0.6 ] -
应用激活函数 (假设Sigmoid):
[ a1 = σ(z1) = \frac{1}{1 + e^{-z1}} = \frac{1}{1 + e^{-0.6}} ≈ 0.647 ] -
计算输出层的输入:
[ z2 = w2 * a1 + b2 ]
假设初始权重w2=0.4
, 偏置b2=0.2
,则
[ z2 = 0.4 * 0.647 + 0.2 ≈ 0.459 ] -
应用输出层的激活函数 (假设也为Sigmoid,但通常输出层根据任务选择不同的激活函数,这里简化处理):
[ y_{pred} = σ(z2) = \frac{1}{1 + e^{-z2}} ≈ 0.612 ]
计算损失
- 使用均方误差作为损失函数:
[ L = \frac{1}{2}(y - y_{pred})^2 = \frac{1}{2}(0.8 - 0.612)^2 ≈ 0.0167 ]
反向传播
-
计算输出层误差:
[ δ2 = (y_{pred} - y) * σ’(z2) = (0.612 - 0.8) * σ’(0.459) ]
其中,σ'(z) = σ(z)(1 - σ(z))
,则
[ δ2 ≈ (0.612 - 0.8) * (0.612)(1 - 0.612) ≈ -0.098 ] -
计算隐藏层误差:
[ δ1 = w2 * δ2 * σ’(z1) = 0.4 * (-0.098) * σ’(0.6) ]
[ δ1 ≈ -0.098 * 0.647 * (1 - 0.647) ≈ -0.025 ] -
更新权重和偏置:
- 输出层到隐藏层权重
w2
的更新:
[ w2 = w2 - α * δ2 * a1 = 0.4 - 0.5 * (-0.098) * 0.647 ≈ 0.424 ] - 输出层偏置
b2
的更新:
[ b2 = b2 - α * δ2 = 0.2 - 0.5 * (-0.098) ≈ 0.249 ] - 输入层到隐藏层权重
w1
的更新:
[ w1 = w1 - α * δ1 * x = 0.6 - 0.5 * (-0.025) * 0.5 ≈ 0.6125 ] - 隐藏层偏置
b1
的更新:
[ b1 = b1 - α * δ1 = 0.3 - 0.5 * (-0.025) ≈ 0.3125 ]
- 输出层到隐藏层权重
迭代
这个过程会重复多次,每次更新权重和偏置,直到损失函数收敛到一个可接受的水平或者达到预设的迭代次数。
请注意,这只是一个非常基础且简化的示例,实际的神经网络可能包含更多的层和节点,以及更复杂的激活函数和损失函数。此外,实际应用中通常会使用矩阵运算来同时处理多个样本,以提高效率。