深度学习入门:详解BP算法中的正向传播与反向传播过程

1次阅读
没有评论

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

image.webp

背景介绍

BP(Backpropagation)算法是训练神经网络的核心方法,它通过不断调整网络参数来最小化预测误差。就像教小孩认图卡,我们告诉网络每次猜测的错误程度(损失函数),它就能自己调整 ” 脑回路 ”(权重参数)。理解这个过程是掌握深度学习的钥匙。

深度学习入门:详解 BP 算法中的正向传播与反向传播过程

核心概念

正向传播:信息的流动

想象信号像水流过管道:

  1. 加权求和 :每个神经元接收上游信号 $x_i$,用权重 $w_i$ 调节后汇总
    $$z = \sum_{i} w_i x_i + b$$

  2. 激活函数 :通过非线性函数(如 ReLU)产生输出
    $$a = \sigma(z)$$
    就像给水流加上阀门,控制流量大小

反向传播:错误的修正

发现预测错误后,网络需要知道:

  1. 损失函数导数 :预测值 $\hat{y}$ 与真实值 $y$ 的差距
    $$\frac{\partial L}{\partial \hat{y}}$$

  2. 链式法则 :从输出层倒推各层责任
    $$\frac{\partial L}{\partial w} = \frac{\partial L}{\partial a} \cdot \frac{\partial a}{\partial z} \cdot \frac{\partial z}{\partial w}$$
    像查监控录像,找出哪个阀门(权重)没调好

代码实现

import numpy as np

# 定义 ReLU 激活函数
def relu(x):
    return np.maximum(0, x)

# 单个样本的前向计算
def forward(x, w1, w2):
    z1 = np.dot(w1, x)  # 第一层加权和
    a1 = relu(z1)       # 第一层激活
    z2 = np.dot(w2, a1) # 输出层加权和
    return z2, a1

# 反向传播计算梯度
def backward(x, y, z2, a1, w2):
    error = z2 - y  # 输出误差

    # 输出层梯度
    grad_w2 = error * a1  

    # 隐藏层梯度(链式法则)grad_w1 = error * w2 * (a1 > 0) * x  
    return grad_w1, grad_w2

常见问题

梯度消失 / 爆炸

  • 原因 :深层网络连续相乘导致梯度指数级变化
  • 消失:权重更新几乎停止(如 sigmoid 函数饱和区)
  • 爆炸:权重剧烈波动(如初始值过大)

  • 解决方案

  • 使用 ReLU 等非饱和激活函数
  • 梯度裁剪(设定阈值)
  • 合理的权重初始化(如 Xavier 方法)

学习率设置

  • 太大:参数在最优解附近震荡
  • 太小:训练速度缓慢
  • 经验法则
  • 初始尝试 0.001-0.1 范围
  • 使用学习率衰减策略

可视化原理

 输入层      隐藏层       输出层
  ○ ---w1---> ○ ---w2---> ○
      (前向)       (前向)
  <---δw1---- <---δw2---- 
      (反向)       (反向)

最佳实践

参数初始化

  • 全零初始化 :导致所有神经元相同(禁用)
  • 随机初始化 :推荐 Xavier 方法
    w = np.random.randn(n,m) * np.sqrt(2/(n+m))

批量训练技巧

  • Mini-batch:平衡效率与稳定性
    for batch in dataset:
        grad = average([backward(x,y) for x,y in batch])
        w -= lr * grad

延伸思考

尝试不同激活函数的影响:
1. Sigmoid:观察梯度消失现象
2. LeakyReLU:解决 ” 神经元死亡 ” 问题
3. Swish:Google 提出的新激活函数

总结

理解 BP 算法就像学习骑自行车——开始可能摇摇晃晃(调试参数),一旦掌握平衡(理解梯度流动),就能自由探索深度学习的广阔天地。建议从简单的全连接网络开始实践,逐步挑战更复杂的网络结构。

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