深度学习基石:解读Rumelhart 1986年反向传播神经网络原始文献

1次阅读
没有评论

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

image.webp

背景:反向传播算法的历史地位

1986 年 Rumelhart 等人发表的《Learning representations by back-propagating errors》是深度学习发展史上的里程碑。当时神经网络面临两大困境:

深度学习基石:解读 Rumelhart 1986 年反向传播神经网络原始文献

  • 无法有效训练多层网络
  • 缺乏系统性的权重调整方法

这篇论文首次完整提出了误差反向传播算法(Backpropagation),解决了多层感知机的训练难题。其核心思想是:

  1. 通过前向传播计算输出
  2. 比较输出与真实值的误差
  3. 将误差反向传播到各层
  4. 利用梯度下降更新权重

文献精读:原始算法解析

网络结构设计

论文中的经典三层结构(输入层 - 隐藏层 - 输出层)成为后续模型的基础模板:

graph LR
    A[输入层] --> B[隐藏层]
    B --> C[输出层]

数学推导(关键步骤)

  1. 前向传播
    $$h_j = \sigma(\sum_i w_{ji}x_i)$$
    $$y_k = \sigma(\sum_j w_{kj}h_j)$$

  2. 误差计算
    $$E = \frac{1}{2}\sum_k(t_k – y_k)^2$$

  3. 权重更新(输出层→隐藏层):
    $$\Delta w_{kj} = -\eta \frac{\partial E}{\partial w_{kj}} = \eta(t_k – y_k)y_k(1-y_k)h_j$$

  4. 权重更新(隐藏层→输入层):
    $$\Delta w_{ji} = -\eta \frac{\partial E}{\partial w_{ji}} = \eta[\sum_k(t_k – y_k)y_k(1-y_k)w_{kj}]h_j(1-h_j)x_i$$

算法对比

特性 反向传播 Hebbian 学习
监督信号 需要 不需要
多层训练 支持 仅单层
收敛速度 较慢 不稳定

Python 实现(NumPy 版)

import numpy as np

def sigmoid(x):
    return 1/(1+np.exp(-x))

def bp_train(X, y, hidden_units=3, lr=0.1, epochs=1000):
    # 权重初始化(小随机值)W1 = np.random.randn(X.shape[1], hidden_units) * 0.01
    W2 = np.random.randn(hidden_units, 1) * 0.01

    for epoch in range(epochs):
        # 前向传播
        h = sigmoid(X.dot(W1))
        y_pred = sigmoid(h.dot(W2))

        # 误差计算
        loss = np.mean(0.5*(y - y_pred)**2)

        # 反向传播
        d_out = (y_pred - y) * y_pred * (1 - y_pred)
        d_hidden = d_out.dot(W2.T) * h * (1 - h)

        # 权重更新
        W2 -= lr * h.T.dot(d_out)
        W1 -= lr * X.T.dot(d_hidden)

    return W1, W2

关键注释

  • sigmoid梯度计算:y*(1-y)来自导数特性
  • 学习率lr:典型值 0.1-0.01
  • 权重初始化:避免全零或过大值

现代深度学习中的演进

框架优化

  • TensorFlow:自动微分(autograd)
  • PyTorch:动态计算图

梯度消失解决方案

  1. 使用 ReLU 代替 sigmoid:
    $$f(x) = max(0,x)$$
  2. 残差连接(ResNet)
  3. 批量归一化(BatchNorm)

实践避坑指南

  • 学习率选择
  • 简单任务:0.1
  • 复杂任务:0.001-0.01
  • 配合学习率衰减

  • 权重初始化

  • Xavier 初始化:w = np.random.randn(fan_in, fan_out) / sqrt(fan_in)
  • He 初始化:适用于 ReLU

  • 收敛判断

  • 连续 5 个 epoch 验证集损失无改善
  • 早停(early stopping)机制

思考题

  1. 如何将 BP 算法扩展到 CNN?
  2. 卷积核作为可训练权重
  3. 通过 im2col 实现高效计算

  4. Adam 优化器 vs 原始 SGD:

  5. 自适应学习率
  6. 动量加速
  7. 梯度二阶矩估计

结语

精读原始文献有助于理解算法本质。虽然现代框架已封装了反向传播,但掌握底层原理仍是调试模型、解决疑难问题的关键。建议读者尝试用纯 Python 实现一次完整 BP 流程,这比直接调用 model.fit() 收获更大。

正文完
 0
评论(没有评论)