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

【机器学习深度学习】反向传播机制

目录

一、一句话定义

二、类比理解

三、为什重要?

四、用生活例子解释:神经网络 = 烹饪机器人

4.1 第一步:尝一口(前向传播)

4.2 第二步:倒着推原因(反向传播)

五、 换成人工智能流程说一遍

六、图示类比:找山顶(最优参数)

七、总结一句人话

八、PyTorch代码示例:亲眼看到每一层的梯度

九、梯度 = 损失函数对参数的偏导数

十、类比总结


反向传播(Backpropagation)是神经网络中训练过程的核心机制,它就像“模型的老师”,帮助模型知道哪里做错了,怎么改正。为了更好的理解它,这里用通俗类比 + 结构讲解 + 数学一瞥三步走方式:


一、一句话定义

反向传播是一种利用链式法则,逐层计算损失函数对各层参数(权重)梯度的方法,用于更新神经网络的参数。


二、类比理解

 模型就像在考试,“反向传播”是批改试卷

 想象你正在训练一个“学生”来考试(神经网络):

  • 考试题:输入特征(比如图像)

  • 答案:真实标签(比如这是只猫🐱)

  • 学生写答案:神经网络的前向传播,得到预测结果

  • 老师批改试卷:比较学生答案和标准答案 → 得到误差(损失)

  • 老师反复讲解错误步骤:根据误差一步步“倒着推”回去,看是哪里做错了、哪个参数有问题

  • 给出修改建议:告诉每层“你该往哪个方向调整权重”,这就是梯度

  • 学生改正:更新参数 = 梯度下降 + 学习率控制

这个讲解错误 → 分发责任 → 参数修改 的过程,就是反向传播机制


三、为什重要?

  • 没有反向传播,模型不知道哪里做错、怎么改

  • 它让复杂的深度网络高效训练成为可能

  • 自动微分(autograd) 紧密配合,在 PyTorch、TensorFlow 中自动实现


四、用生活例子解释:神经网络 = 烹饪机器人

你训练一个“烹饪机器人”去煮拉面,目标是做出你最喜欢的味道(目标值),但它一开始啥都不会,只是随机放盐、加水、煮时间。

4.1 第一步:尝一口(前向传播)

机器人做出一碗面,把你喜欢的味道(真实标签)和当前煮出来的味道(模型预测)比较一下,发现:“好咸!” → 这是误差(损失)。

4.2 第二步:倒着推原因(反向传播)

你开始反思:

  • 是不是 放盐放多了? → 盐权重太大

  • 是不是 加水太少了? → 水权重太小

  • 是不是 煮太久? → 时间权重也得改

你根据这“错误反馈”,倒着推回去判断每个步骤出错的程度,就像:

  • 盐的锅 → 错得最多 → 调整幅度大

  • 时间锅 → 错得少 → 微调一下

  • 水锅 → 也有点锅 → 适当改改

这就像神经网络在用“反向传播”去告诉各层参数:

“你们在这次预测里,谁错得多?谁需要调得多?”


五、 换成人工智能流程说一遍

1.前向传播:模型输入特征(如图像),输出预测(如猫概率 0.6)

2.损失函数计算:真实标签是猫(1),模型预测错了 → 损失=0.4

3.反向传播

  • 损失=0.4 是怎么造成的?

  • 是哪个权重、哪一层导致输出偏差?

  • 用链式法则从输出层一直“往回推”,逐层找出“是谁的锅”

4.得到梯度:每个权重知道了“我该往哪边调?调多少?”

5.更新参数:根据学习率调整权重,模型变得更聪明


六、图示类比:找山顶(最优参数)

你现在站在一座山上(参数空间),目标是走到山顶(最优解)
前向传播 = 你往前试探了一步
损失 = 你这一步高了还是低了?
反向传播 = 你回头总结:刚才这一步是哪里走错了?
→ 该往哪调,往哪儿走,走多远?


七、总结一句人话

反向传播=模型做错了题,老师倒着讲解每一层是怎么导致错误的,然后每一层的“权重”都根据自己的“责任大小”去做调整。


八、PyTorch代码示例:亲眼看到每一层的梯度

import torch
import torch.nn as nn# 简单的数据:y = 2x + 3,添加一点噪声
x = torch.unsqueeze(torch.linspace(-1, 1, 10), dim=1)  # shape [10, 1]
y = 2 * x + 3 + 0.1 * torch.randn(x.size())# 定义一个两层神经网络:Linear -> ReLU -> Linear
model = nn.Sequential(nn.Linear(1, 2),  # 第一层:输入1 -> 输出2nn.ReLU(),nn.Linear(2, 1)   # 第二层:输入2 -> 输出1
)# 损失函数和优化器
criterion = nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)# 训练一步,观察梯度
y_pred = model(x)                    # 前向传播
loss = criterion(y_pred, y)         # 计算损失
print(f"前向传播完成,损失 = {loss.item():.4f}")loss.backward()                     # 反向传播(计算梯度)print("\n=== 各层参数及其梯度 ===")
for name, param in model.named_parameters():print(f"{name}:\n 权重/偏置值:\n{param.data}")print(f" 梯度:\n{param.grad}\n")

【运行结果】 

model.0.weight:
 权重/偏置值:
tensor([[0.23],
            [0.14]])
 梯度:
tensor([[0.51],
            [0.26]])

【解读分析】 

 这里运行了一个简单神经网络:

model = nn.Sequential(nn.Linear(1, 2),  # 输入 1 个数,输出 2 个特征nn.ReLU(),nn.Linear(2, 1)   # 把 2 个特征转为 1 个输出
)

这说明 model.0 是第一层的线性变换,即:

把输入 xxx(一个数)映射到两个神经元输出 → 有两个权重


【输出解释】

model.0.weight:权重/偏置值:
tensor([[0.23],[0.14]])梯度:
tensor([[0.51],[0.26]])

model.0.weight 是第一层的权重

✅ 第一部分:权重解释

tensor([[0.23],[0.14]])

表示第一层的两个神经元的权重分别是:

  • 第一个神经元的权重 = 0.23

  • 第二个神经元的权重 = 0.14

也就是说:

  • 如果输入 x=1.0,

  • 那么第一层输出是:

✅ 第二部分:梯度解释(关键点)

tensor([[0.51],[0.26]])

这是 每个权重的梯度,也就是反向传播告诉每个参数“你错了多少”

  • 第一个神经元的权重误差影响程度 = 0.51

  • 第二个神经元的权重误差影响程度 = 0.26

也就是说:

如果我们要减小损失函数,让模型更准,那第一个神经元的权重要 往负梯度方向调整 0.51 × 学习率,第二个权重要调 0.26 × 学习率。

  • param.grad 就是这个权重的梯度(反向传播后产生)

通过它你可以清晰看到每层参数的梯度是多少,知道反向传播真的在起作用!


九、梯度 = 损失函数对参数的偏导数

它的含义可以总结为:

你改动这个权重一点点,损失函数会怎么变?

所以:

  • 梯度大 → 这个参数对误差影响大 → 要重点调整

  • 梯度小 → 影响小 → 小调或者不调


十、类比总结

项目类比
权重决策参数,比如调味量
前向输出最终预测结果
梯度“你调多了/少了”的批评建议程度
学习率 × 梯度你该往回修正的量(用于更新权重)

相关文章:

  • 做网站的女生多么免费网站提交入口
  • 音乐网站毕业设计代码2022最新永久地域网名
  • 搜狗优化好的网站买卖交易平台
  • 做教程网站资源放哪里有怎么申请域名建网站
  • 免费网站制作 最好直接打开百度
  • 网站图片展示源代码公司网站设计图
  • ArkTS与仓颉开发语言:鸿蒙编程的双子星
  • 脉内频率捷变LFM信号
  • 【sklearn】K-means、密度聚类、层次聚类、GMM、谱聚类
  • IntersectionObserver 详细介绍(实现加载下一页效果)
  • 代码随想录|图论|01图论基础
  • 项目需求评审报告参考模板
  • cherry-pick除了使用命令,有没有什么工具可以使用,或者更高效的方法
  • OSS生命周期管理自动化:7天冷归档+30天低频访问的合规存储策略(结合企业级数据分级场景)
  • 从代码学习深度学习 - 情感分析:使用循环神经网络 PyTorch版
  • 【运维系列】Plane 开源项目安装和配置指南
  • 爬虫004----网页解析库
  • css 文字跳跃动画
  • prometheus 配置邮件告警
  • iostat中的util原理
  • 大模型项目实战:业务场景和解决方案
  • 数学:关于向量计算的三角形法则
  • GoAdmin代码生成器实践
  • 中断控制与实现
  • APP测试-APP启动耗时
  • Android 9.0(API 28)后字重设置