当前位置: 首页 > news >正文

深度学习:反向传播算法(Backpropagation)

本节目标:

  • 理解神经网络是如何“学会”调整参数的
  • 掌握反向传播算法(BP)的核心原理与数学推导
  • 理解链式法则(Chain Rule)在多层网络中的作用
  • 分析反向传播过程中的常见问题(如梯度消失/爆炸)
  • 理解PyTorch中自动求导的工作机制

一、什么是反向传播算法?

 反向传播(Backpropagation)是神经网络中用于计算损失函数对每个参数梯度的算法。

该算法是深度学习训练的核心步骤,用于回答“当前网络输出错了多少,哪一层的参数该如何调整”

二、反向传播的工作流程概览

神经网络训练过程可分为三个阶段:

阶段描述
前向传播从输入出发,逐层计算输出\hat{y}
损失计算计算预测值与真实标签的差距L(\hat{y},y)
反向计算反向计算每个参数的梯度(偏导数)
参数更新使用优化器(如SGD/Adam)更新参数值

 

三、数学原理:链式法则是关键

设神经网络由层级函数组合而成:

                                                         y=f_3(f_2(f_1(x)))

若损失函数为L=\iota (y,\hat{y}) ,则对于每一层参数\theta的梯度:

                                                    \frac{\partial L}{\partial \theta } = \frac{\partial L}{\partial f _3}\cdot \frac{\partial f_3}{\partial f_2}\cdot \frac{\partial f_2}{\partial f_1}\cdot \frac{\partial f_1}{\partial \theta }

上述为链式法则,即“输出对参数的导数 = 输出对中间变量的导数 × 中间变量对参数的导数” 

四、一个三层神经网络反向传播示例

以最简单的三层网络(输入层-隐藏层-输出层)为例:

网络结构:

z_1 = W_1x+b_1

a_1 = ReLU(z_1)

z_2 = W_2a_1+b_2

\hat{y}=Softmax(z_2)

假设损失函数为交叉熵:

L=-y\cdot log(\hat{y})

目标:计算\frac{\partial L}{\partial W_1}\frac{\partial L}{\partial W_2}

我们从后往前,逐层链式求导(即反向传播)

1.输出层导数:

\frac{\partial L}{\partial z_2}=\hat{y}-y

2.二层权重导数

\frac{\partial L}{\partial W_2} = \frac{\partial L}{\partial z_2}\cdot a^T_1

3.一层激活反传:

4.一层权重导数:

五、梯度下降与反向传播结合

完整训练流程如下:

输入数据 → 前向传播 → 计算损失 → 反向传播 → 优化器更新参数 → 下一轮训练

六、常见问题:梯度消失与梯度爆炸

梯度消失(Gradient Vanishing)

出现位置:深层网络,激活函数饱和(如Sigmoid)

表现:前面几层梯度变得非常小,网络无法学习

解决:

  • 使用ReLU/GELU替代Sigmoid/Tanh
  • 使用残差连接(如ResNet)
  • 使用BatchNorm/LayerNorm

梯度爆炸(Gradient Explosion)

出现位置:深层或递归网络(RNN)

表现:权重变得非常大,loss为nan

解决:

  • 梯度裁剪(gradient clipping)
  • 参数初始化优化(如Xavier,He)
  • 更稳健的优化器(如Adam)

七、PyTorch中的反向传播机制

自动求导机制(Autograd)

import torchx = torch.tensor(2.0, requires_grad=True)
y = x**2 + 3*x + 5
y.backward()
print(x.grad)  # 输出 dy/dx

神经网络训练流程中:

loss.backward()       # 自动计算所有参数的梯度
optimizer.step()      # 根据梯度更新参数
optimizer.zero_grad() # 清零梯度(防止累加)

八、图解记忆法:反向传播流程

输入 x↓
前向传播(W·x + b → 激活)↓
输出层(Softmax)↓
损失函数(CrossEntropy)↓
反向传播(从输出层依次往前算梯度)↓
更新参数(W, b)

 

九、实战建议

场景建议
Loss 一直不下降检查反向传播是否执行了 backward()step()
loss = nan可能梯度爆炸,尝试梯度裁剪
学习率过大会导致 loss 上下跳动甚至发散
梯度全为0可能 ReLU 死神经元或前向没有连接好参数
不确定梯度是否正确可用 torch.autograd.gradcheck() 进行检查

十、小结

概念功能
链式法则逐层计算梯度的核心
backward()自动触发梯度传播
optimizer.step()根据梯度调整参数
optimizer.zero_grad()清零上一轮残留梯度
梯度裁剪防止梯度爆炸
激活函数选择防止梯度消失
http://www.dtcms.com/a/309745.html

相关文章:

  • 力扣:2477. 到达首都的最少油耗
  • 从资源闲置到弹性高吞吐,JuiceFS 如何构建 70GB/s 吞吐的缓存池?
  • 11. 五种 IO 模型与阻塞 IO
  • 操作系统-lecture4(进程的调度)
  • GaussDB 数据库设计规范
  • Windows CMD命令大全
  • 乐观锁是数据库和多线程编程中常用的一种控制并发的方法
  • 性能测试-性能测试中的经典面试题一
  • 深度解读 CSGHub:开源协议、核心功能与产品定位
  • 网络编程接口bind学习
  • HTTPS的工作原理
  • 微信小程序服务器配置指南:从入门到高可用架构的腾讯云方案
  • CS231n-2017 Lecture8深度学习框架笔记
  • linux编译基础知识-编译时路径和运行时路径
  • 基于python实现的高效文件压缩工具:Zstandard、LZ4、Brotli 一站式解决方案
  • wsl配置文件(wsl: 检测到 localhost 代理配置,但未镜像到 WSL。NAT 模式下的 WSL 不支 持 localhost 代理。)
  • 世代距离(GD)和反转世代距离(IGD)详析
  • Python入门Day14:面向对象编程初步(OOP入门)
  • 国内短剧CPS系统开发:技术架构与商业化实践
  • 离线智能破局,架构创新突围:RockAI与中国AI的“另一条车道”
  • MySQL CPU占用过高排查指南
  • 动作捕捉技术重塑具身智能开发:高效训练与精准控制的新范式
  • k8s之NDS解析到Ingress服务暴露
  • vscode cursor配置php的debug,docker里面debug
  • 嵌入式学习的第四十天-51单片机
  • Vue模板语法详解:从基础到进阶的响应式绑定指南2
  • 【AI论文】大语言模型量化的几何原理:将GPTQ视为Babai最近平面算法
  • 开发者体验如何度量?
  • springboot在线法律服务平台-计算机毕业设计源码45635
  • Context API