
误差反向传播算法 3 层网络手算从 Sigmoid 激活到梯度下降完整推导神经网络的核心在于通过调整权重和偏置来最小化预测误差。本文将带您一步步推导三层神经网络输入层、隐藏层、输出层的误差反向传播过程使用Sigmoid激活函数和平方误差损失函数通过具体数值示例演示完整的权重更新流程。1. 神经网络结构与前向传播我们构建一个三层神经网络结构如下输入层2个神经元x₁, x₂隐藏层2个神经元h₁, h₂输出层1个神经元y权重初始化随机值# 输入层到隐藏层权重 w1 [[0.15, 0.20], [0.25, 0.30]] # 隐藏层到输出层权重 w2 [[0.40], [0.45]] # 偏置项 b1 [0.35, 0.35] b2 [0.60]前向传播计算步骤隐藏层输入h1_input x1*w1[0][0] x2*w1[1][0] b1[0] h2_input x1*w1[0][1] x2*w1[1][1] b1[1]隐藏层输出Sigmoid激活def sigmoid(x): return 1 / (1 math.exp(-x)) h1_out sigmoid(h1_input) h2_out sigmoid(h2_input)输出层计算y_input h1_out*w2[0][0] h2_out*w2[1][0] b2[0] y_out sigmoid(y_input)示例计算输入x₁0.05, x₂0.10计算步骤神经元h₁神经元h₂加权输入0.050.15 0.100.20 0.35 0.37750.050.25 0.100.30 0.35 0.3925Sigmoid输出0.59320.5968输出层最终结果y_input 0.5932*0.40 0.5968*0.45 0.60 1.1059 y_out sigmoid(1.1059) 0.75142. 误差计算与反向传播原理采用平方误差损失函数E 1/2 * (target - y_out)^2假设目标值target0.8则当前误差E 0.5*(0.8 - 0.7514)^2 0.00118反向传播的核心是通过链式法则计算误差对各参数的梯度输出层权重梯度∂E/∂w2 ∂E/∂y_out * ∂y_out/∂y_input * ∂y_input/∂w2隐藏层权重梯度∂E/∂w1 ∂E/∂y_out * ∂y_out/∂y_input * ∂y_input/∂h_out * ∂h_out/∂h_input * ∂h_input/∂w1Sigmoid函数的导数特性σ(x) σ(x)*(1-σ(x))3. 输出层权重更新推导计算输出层权重w2[0][0]的梯度误差对输出的偏导∂E/∂y_out -(target - y_out) -(0.8 - 0.7514) -0.0486输出对输入的偏导∂y_out/∂y_input y_out*(1-y_out) 0.7514*(1-0.7514) 0.1868输入对权重的偏导∂y_input/∂w2[0][0] h1_out 0.5932组合得到完整梯度∂E/∂w2[0][0] -0.0486 * 0.1868 * 0.5932 -0.00539设学习率η0.5权重更新w2[0][0] 0.40 - 0.5*(-0.00539) 0.4027同理计算w2[1][0]的更新∂E/∂w2[1][0] -0.0486 * 0.1868 * 0.5968 -0.00542 w2[1][0] 0.45 - 0.5*(-0.00542) 0.45274. 隐藏层权重更新推导以w1[0][0]为例连接x₁到h₁的权重误差传递到h₁∂E/∂h1_out ∂E/∂y_out * ∂y_out/∂y_input * ∂y_input/∂h1_out -0.0486 * 0.1868 * 0.40 -0.00363h₁输出对输入的偏导∂h1_out/∂h1_input h1_out*(1-h1_out) 0.5932*(1-0.5932) 0.2415h₁输入对权重的偏导∂h1_input/∂w1[0][0] x1 0.05组合得到完整梯度∂E/∂w1[0][0] -0.00363 * 0.2415 * 0.05 -0.0000438权重更新w1[0][0] 0.15 - 0.5*(-0.0000438) ≈ 0.15002其他权重更新类似权重原始值梯度计算更新后值w1[0][1]0.25-0.003630.24150.05≈0.25002w1[1][0]0.20-0.003630.24150.10≈0.20004w1[1][1]0.30-0.003630.24150.10≈0.300045. 完整训练流程与数学验证经过一轮反向传播后网络参数更新如下更新后的权重w1 [[0.15002, 0.25002], [0.20004, 0.30004]] w2 [[0.4027], [0.4527]]重新前向传播验证隐藏层计算h1_input 0.05*0.15002 0.10*0.20004 0.35 ≈ 0.37751 h1_out sigmoid(0.37751) ≈ 0.5932输出层计算y_input 0.5932*0.4027 0.5968*0.4527 0.60 ≈ 1.1079 y_out sigmoid(1.1079) ≈ 0.7517误差变化原始误差: 0.00118 更新后误差: 0.5*(0.8-0.7517)^2 ≈ 0.00117关键观察虽然单次更新后误差减小不明显但持续迭代会显著改善。实际训练中通常需要数百至数千次迭代。6. 反向传播的矩阵化表示对于大规模网络采用矩阵运算更高效。定义δⁱ 为第l层的误差项Wⁱ 为第l层权重矩阵aⁱ 为第l层激活输出通用反向传播公式输出层误差δᴸ ∇aC ⊙ σ(zᴸ)隐藏层误差δˡ (Wˡ⁺¹)ᵀδˡ⁺¹ ⊙ σ(zˡ)权重梯度∂C/∂Wˡ δˡ(aˡ⁻¹)ᵀ偏置梯度∂C/∂bˡ δˡ其中⊙表示Hadamard乘积逐元素相乘。7. 实现细节与常见问题学习率选择过大可能导致震荡甚至发散过小收敛速度慢经验值范围0.001到0.1梯度消失问题 Sigmoid函数在输入绝对值较大时导数接近0导致深层网络训练困难。解决方案使用ReLU等替代激活函数残差连接批归一化参数初始化技巧Xavier初始化W ~ N(0, sqrt(2/(n_in n_out)))He初始化W ~ N(0, sqrt(2/n_in))以下是一个简单的Python实现片段import numpy as np def sigmoid(x): return 1/(1np.exp(-x)) def dsigmoid(y): return y*(1-y) # 前向传播 def forward(x, W1, W2, b1, b2): h sigmoid(np.dot(x, W1) b1) y sigmoid(np.dot(h, W2) b2) return h, y # 反向传播 def backward(x, y, target, h, y_out, W1, W2, lr0.5): # 输出层误差 dy (y_out - target) * dsigmoid(y_out) # 隐藏层误差 dh np.dot(dy, W2.T) * dsigmoid(h) # 更新权重 W2 - lr * np.outer(h, dy) W1 - lr * np.outer(x, dh) return W1, W2通过这种系统性的推导和实现读者可以深入理解神经网络如何通过误差反向传播自动学习特征表示。虽然现代深度学习框架已实现自动微分但掌握底层数学原理对于模型调试和优化至关重要。