神经网络实战:从权重更新到反向传播的完整推导与实现

1次阅读
没有评论

共计 1521 个字符,预计需要花费 4 分钟才能阅读完成。

image.webp

神经网络训练基础概念

在开始具体计算之前,我们先快速回顾下神经网络训练的三个核心概念:

神经网络实战:从权重更新到反向传播的完整推导与实现

  1. 前向传播 :输入数据通过各层权重计算,最终得到预测值的过程
  2. 损失函数 :衡量预测值与真实值差异的函数(如均方误差 MSE)
  3. 反向传播 :根据损失值,从输出层反向计算各层权重梯度的过程

具体数值示例

假设我们有一个极简神经网络:
– 输入层: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

损失值计算(前向传播)

  1. 计算隐藏层输入:

    h_in = x·W1 = [0.5*0.1+0.3*0.3, 0.5*0.2+0.3*0.4] = [0.14, 0.22]

  2. 应用 Sigmoid 激活:

    h_out = [1/(1+e^-0.14), 1/(1+e^-0.22)] ≈ [0.535, 0.555]

  3. 计算输出层预测值:

    y_pred = h_out·W2 = 0.535*0.5 + 0.555*0.6 ≈ 0.6245

  4. 计算均方误差损失:

    loss = (y_true - y_pred)^2 / 2 = (0.8-0.6245)^2 / 2 ≈ 0.0154

反向传播梯度推导

  1. 计算输出层梯度:

    ∂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]

  2. 计算隐藏层梯度(链式法则):

    ∂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}")

常见错误与调试

  1. 维度不匹配 :确保所有矩阵乘法的维度对齐
  2. 梯度消失 :使用 ReLU 等激活函数替代 Sigmoid
  3. 学习率过大 :导致权重更新震荡,建议从 0.01 开始尝试
  4. 忘记转置 :注意反向传播时的矩阵转置操作

关键要点总结

  1. 反向传播本质是链式法则的连续应用
  2. 梯度计算需要从输出层向输入层反向进行
  3. 每次迭代包含完整的前向 - 反向传播过程
  4. 学习率对训练效果影响巨大

延伸思考

  1. 如果增加隐藏层数量,反向传播流程会如何变化?
  2. 不同的损失函数会对梯度计算产生什么影响?
  3. 如何验证反向传播实现的正确性?
  4. 除了梯度下降,还有哪些优化算法可供选择?
正文完
 0
评论(没有评论)