共计 1521 个字符,预计需要花费 4 分钟才能阅读完成。
神经网络训练基础概念
在开始具体计算之前,我们先快速回顾下神经网络训练的三个核心概念:

- 前向传播 :输入数据通过各层权重计算,最终得到预测值的过程
- 损失函数 :衡量预测值与真实值差异的函数(如均方误差 MSE)
- 反向传播 :根据损失值,从输出层反向计算各层权重梯度的过程
具体数值示例
假设我们有一个极简神经网络:
– 输入层:2 个节点(x1=0.5, x2=0.3)
– 隐藏层:2 个节点(使用 Sigmoid 激活)
– 输出层:1 个节点(线性输出)
初始权重矩阵为:
W1 = [[0.1, 0.2], # 输入层到隐藏层的权重
[0.3, 0.4]]
W2 = [[0.5], # 隐藏层到输出层的权重
[0.6]]
真实值 y_true = 0.8
损失值计算(前向传播)
-
计算隐藏层输入:
h_in = x·W1 = [0.5*0.1+0.3*0.3, 0.5*0.2+0.3*0.4] = [0.14, 0.22] -
应用 Sigmoid 激活:
h_out = [1/(1+e^-0.14), 1/(1+e^-0.22)] ≈ [0.535, 0.555] -
计算输出层预测值:
y_pred = h_out·W2 = 0.535*0.5 + 0.555*0.6 ≈ 0.6245 -
计算均方误差损失:
loss = (y_true - y_pred)^2 / 2 = (0.8-0.6245)^2 / 2 ≈ 0.0154
反向传播梯度推导
-
计算输出层梯度:
∂loss/∂W2 = (y_pred - y_true) * h_out ≈ (0.6245-0.8) * [0.535, 0.555] = [-0.1755*0.535, -0.1755*0.555] ≈ [-0.0939, -0.0974] -
计算隐藏层梯度(链式法则):
∂loss/∂W1 = (y_pred-y_true)*W2 * h_out*(1-h_out) * x具体计算过程较长,建议分步推导
权重更新(学习率 η =0.1)
应用梯度下降公式:
W_new = W_old - η * ∇W
更新后的权重:
W2 ≈ [[0.5 - 0.1*(-0.0939)], ≈ [[0.5094],
[0.6 - 0.1*(-0.0974)]] [0.6097]]
Python 代码实现
import numpy as np
def sigmoid(x):
return 1 / (1 + np.exp(-x))
# 初始化
x = np.array([0.5, 0.3])
W1 = np.array([[0.1, 0.2], [0.3, 0.4]])
W2 = np.array([[0.5], [0.6]])
y_true = 0.8
lr = 0.1
# 前向传播
h_in = np.dot(x, W1)
h_out = sigmoid(h_in)
y_pred = np.dot(h_out, W2)
loss = 0.5 * (y_true - y_pred)**2
# 反向传播
dy = y_pred - y_true
dW2 = dy * h_out.reshape(-1, 1)
dh = dy * W2.T * h_out * (1 - h_out)
dW1 = np.dot(x.reshape(-1, 1), dh)
# 权重更新
W1 -= lr * dW1
W2 -= lr * dW2
print(f"Updated W1:\n{W1}")
print(f"Updated W2:\n{W2}")
常见错误与调试
- 维度不匹配 :确保所有矩阵乘法的维度对齐
- 梯度消失 :使用 ReLU 等激活函数替代 Sigmoid
- 学习率过大 :导致权重更新震荡,建议从 0.01 开始尝试
- 忘记转置 :注意反向传播时的矩阵转置操作
关键要点总结
- 反向传播本质是链式法则的连续应用
- 梯度计算需要从输出层向输入层反向进行
- 每次迭代包含完整的前向 - 反向传播过程
- 学习率对训练效果影响巨大
延伸思考
- 如果增加隐藏层数量,反向传播流程会如何变化?
- 不同的损失函数会对梯度计算产生什么影响?
- 如何验证反向传播实现的正确性?
- 除了梯度下降,还有哪些优化算法可供选择?
正文完
发表至: 未分类
近两天内
