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

图示+例子 深入理解 前向反向传播

详细解析神经网络中的前向传播、反向传播以及计算图的原理与应用,帮助你更好地理解深度学习模型是如何优化和学习的。

1 前向传播:计算神经网络输出

前向传播是神经网络训练中的基础过程,它将输入数据通过神经网络的各层计算,最终得到模型的预测结果。其过程可以通过以下几步进行理解:

  1. 输入数据传递:从输入层到隐藏层进行计算。假设输入为 x∈Rdx \in \mathbb{R}^dxRd,权重为 W(1)∈Rh×dW^{(1)} \in \mathbb{R}^{h \times d}W(1)Rh×d,计算得到中间变量 z=W(1)xz = W^{(1)}xz=W(1)x

  2. 激活函数处理:将中间变量 zzz 通过激活函数 ϕ\phiϕ 处理,得到隐藏层的激活向量 h=ϕ(z)h = \phi(z)h=ϕ(z)

  3. 输出层计算:输出层将隐藏层的激活向量 hhh 乘以权重 W(2)∈Rq×hW^{(2)} \in \mathbb{R}^{q \times h}W(2)Rq×h,得到最终的输出 o=W(2)ho = W^{(2)}ho=W(2)h

  4. 损失计算:通过损失函数 l(o,y)l(o, y)l(o,y) 计算网络输出 ooo 与真实标签 yyy 的差距。

通过这些步骤,网络能够根据输入数据给出预测结果。

2 反向传播:更新神经网络权重

反向传播是神经网络训练中的关键过程,它计算损失函数相对于模型权重的梯度,并通过这些梯度来更新权重。反向传播的基本原理基于微积分中的链式法则,具体步骤如下:

  1. 目标函数的梯度:首先,计算目标函数相对于损失项 LLL 和正则化项 sss 的梯度。

  2. 梯度传递:从输出层开始,逐层通过链式法则传递梯度,依次计算每层的参数梯度。

  3. 更新权重:根据梯度下降算法,用计算出的梯度来更新每层的权重。

通过反向传播,神经网络能够在训练过程中不断调整参数,最小化损失函数,进而优化模型。

3 使用计算图理解前向和反向传播

在这里插入图片描述

📊 这是简单神经网络的计算图,计算图是前向传播和反向传播的可视化工具,它展示了神经网络中各个变量和操作符之间的依赖关系。白色方块张量变量,例如 x、z、h、o、L、s、J、y 。蓝色方块可训练参数,例如W1, W2。 浅蓝圆圈操作符,例如“×”矩阵乘、“ϕ”激活、“ℓ₂”正则、“+”求和、“l”损失

通过计算图,我们可以更直观地理解网络的运算流程。箭头方向 = 数据流向

  • 横向:沿网络层次从左→右传递数值
  • 纵向(向上):把正则项与损失一路汇聚到目标 J
  1. 输入 → 隐藏层线性变换
    z=W(1)xz = W^{(1)} xz=W(1)x (× 节点)
  2. 激活
    h=φ(z)h = \varphi(z)h=φ(z) (ϕ 节点,ReLU/σ 等)
  3. 隐藏 → 输出层线性变换
    o=W(2)ho = W^{(2)} ho=W(2)h (× 节点)
  4. 计算数据损失
    L=l(o,y)L = l(o, y)L=l(o,y) (l 节点,交叉熵/均方误差等)
  5. 计算 L2 正则
    s=λ2(∥W(1)∥F2+∥W(2)∥F2)s = \frac{\lambda}{2}\big(\|W^{(1)}\|_{F}^{2}+\|W^{(2)}\|_{F}^{2}\big)s=2λ(W(1)F2+W(2)F2) (ℓ₂ 节点)
  6. 合并目标函数
    J=L+sJ = L + sJ=L+s (+ 节点)
  • “数据损失 L” 和 “正则损失 s” 是两股并行支流;在最后 + 号处才汇合成全局目标 J。

  • J 标量输出(右上角的白方块)意味着整张图最终只流出一个数——训练要最小化的目标函数。

步骤目标上游梯度局部梯度全局梯度
① 汇合损失J=L+sJ=L+sJ=L+s1∂J/∂L=1,∂J/∂s=1∂J/∂L=1,∂J/∂s=1J/L=1,J/s=1——
② 到输出层o=W(2)ho=W^{(2)}ho=W(2)h∂J/∂o∂J/∂oJ/oh⊤h^{\top}h∂J/∂W(2)=∂J/∂o  h⊤∂J/∂W^{(2)} = ∂J/∂o\;h^{\top}J/W(2)=J/oh
③ 过隐藏层h=ϕ(z)h=ϕ(z)h=ϕ(z)∂J/∂h∂J/∂hJ/hϕ′(z)ϕ′(z)ϕ(z)∂J/∂z=(∂J/∂h)⊙ϕ′(z)∂J/∂z = (∂J/∂h)⊙ϕ′(z)J/z=(J/h)ϕ(z)
④ 回到输入侧权重z=W(1)xz=W^{(1)}xz=W(1)x∂J/∂z∂J/∂zJ/zx⊤x^{\top}x∂J/∂W(1)=∂J/∂z  x⊤∂J/∂W^{(1)} = ∂J/∂z\;x^{\top}J/W(1)=J/zx

📊 每一行就是“上游梯度 × 局部梯度 = 本层梯度”,和水管倒流一样简单;正则项只是在②、④行把 λW 的额外水流并进来。

反向传播如何在计算图上“倒流”?

  • 起点:从最顶端标量 J 的导数 ∂J/∂J=1\partial J / \partial J = 1J/J=1 开始。

  • 沿每条边反向走:到达一个操作圆圈时,把当前“上游梯度”乘以该节点的局部导数,再沿着所有输入边分发到更下游。

    • 例如到 + 节点:梯度在两条输入边 (L, s) 上各复用一份
    • ℓ₂ 节点:局部导数是 λW(i)\lambda W^{(i)}λW(i),立刻得到正则对权重的梯度;
    • × 节点:需要用矩阵微积分结果,把梯度分别乘以另一侧输入的转置。
  • 终点:落到蓝色权重方块 W1, W2时,累积好的 ∂J/∂W(i)\partial J/\partial W^{(i)}J/W(i) 交给优化器(SGD、Adam…)进行梯度更新。

一句话本质:反向传播就是链式法则的向量化实现,而计算图把“谁乘谁”与“何时乘”全都形象化了。

4 最简单的例子来演示整套流程

名称数值说明
输入 xxx2.0例如房子的面积
真实标签 yyy3.0真实房价(归一化后)
权重 www0.5初始猜测斜率
偏置 bbb0.1初始猜测截距
损失函数 LLL12(y^−y)2\tfrac12(\hat y-y)^221(y^y)2取 MSE 的 12\tfrac1221 形式,便于推导

📊 用一条直线拟合一个点(再小不过的神经网络)来演示整套流程。设定场景与初始数值,模型只有 1 个权重 w 和 1 个偏置 b,目标是让预测值尽量接近真实标签 y。

前向传播:先算出预测值和损失

  1. 线性计算
    y^=w⋅x+b=0.5×2+0.1=1.1 \hat y = w\cdot x + b = 0.5\times 2 + 0.1 = 1.1 y^=wx+b=0.5×2+0.1=1.1
  2. 损失计算
    L=12(y^−y)2=12(1.1−3)2=12×3.61=1.805 L = \tfrac12(\hat y - y)^2 = \tfrac12(1.1-3)^2 = \tfrac12\times 3.61 = 1.805 L=21(y^y)2=21(1.13)2=21×3.61=1.805

反向传播:再算出梯度,用来修正 w、b
从损失往回一步步链式求导:

推导结果(数值)
∂L∂y^\frac{\partial L}{\partial\hat y}y^L(y^−y)(\hat y - y)(y^y)−1.9-1.91.9
∂y^∂w\frac{\partial \hat y}{\partial w}wy^xxx2.02.02.0
∂y^∂b\frac{\partial \hat y}{\partial b}by^111111
最终梯度
∂L∂w\frac{\partial L}{\partial w}wL∂L∂y^⋅∂y^∂w\frac{\partial L}{\partial\hat y}\cdot\frac{\partial\hat y}{\partial w}y^Lwy^(−1.9)×2=−3.8(-1.9)\times 2 = -3.8(1.9)×2=3.8
∂L∂b\frac{\partial L}{\partial b}bL∂L∂y^⋅∂y^∂b\frac{\partial L}{\partial\hat y}\cdot\frac{\partial\hat y}{\partial b}y^Lby^−1.9)×1=−1.9-1.9)\times 1 = -1.91.9)×1=1.9

📊 误差 −1.9-1.91.9 说明预测低了。权重梯度 -3.8:面积系数 w 应往 大方向 调(负号+学习率会变成加)。偏置梯度 -1.9:整体截距也应往上调。

参数更新

以学习率 η=0.1\eta=0.1η=0.1 为例)

wnew=w−η∂L∂w=0.5−0.1(−3.8)=0.88 w_{\text{new}} = w - \eta \frac{\partial L}{\partial w}= 0.5 - 0.1(-3.8) = 0.88 wnew=wηwL=0.50.1(3.8)=0.88

bnew=b−η∂L∂b=0.1−0.1(−1.9)=0.29 b_{\text{new}} = b - \eta \frac{\partial L}{\partial b}= 0.1 - 0.1(-1.9) = 0.29 bnew=bηbL=0.10.1(1.9)=0.29

经过更新后,新的权重w应该从0.5改为0.88,新的偏置b应该从0.1改为0.29

bnew=b−η∂L∂b=0.1−0.1(−1.9)=0.29 b_{\text{new}} = b - \eta \frac{\partial L}{\partial b}= 0.1 - 0.1(-1.9) = 0.29 bnew=bηbL=0.10.1(1.9)=0.29

经过更新后,新的权重w应该从0.5改为0.88,新的偏置b应该从0.1改为0.29

这样就完成一次 “前向算输出 → 反向算梯度 → 调整参数” 的完整迭代。

http://www.dtcms.com/a/283598.html

相关文章:

  • NodeJS Express+Sequelize实现单个模块的增删改查功能
  • 数据集相关类代码回顾理解 | utils.make_grid\list comprehension\np.transpose
  • Wi-Fi 渗透测试 – 第一部分(网络基础)
  • 卷积神经网络CNN的Python实现
  • 学习软件测试的第十七天
  • 日语学习-日语知识点小记-构建基础-JLPT-N3阶段(6):语法+单词)
  • github上传大文件(多种解决方案)
  • ESP32 S3 基于 Arduino 实现局域网视频流传输全解析
  • 激活函数LeakyReLU
  • C语言:第07天笔记
  • Python+Selenium自动化
  • Kotlin集合聚合
  • --- bean 的六种作用域 ---
  • Hadoop(三)
  • Doris基础-架构、数据模型、数据划分
  • SpringBoot集成Minio存储文件,开发图片上传等接口
  • 【机器学习【6】】数据理解:数据导入、数据审查与数据可视化方法论
  • 【JavaScript】从事件流到事件委托
  • 6.删除-demo
  • akamai3简单分析
  • 【无标题】LighthouseGS:面向全景式移动拍摄的室内结构感知三维高斯泼溅
  • OJ题目里面的复杂图形的输出类型的汇总展示(巧妙地利用对称性offset偏移量)
  • “重复”定义函数的睿智(Python/与ai助手“智普清言”深度交流)
  • 如何进行选择。
  • 第四章 OB SQL调优
  • OpenVela之 Arch Timer 驱动框架使用指南
  • GESP2025年6月认证C++四级( 第三部分编程题(2)排序)
  • 机器学习中Precision(查准率)和Recall(查全率)
  • 第2章通用的高并发架构设计——2.3 高并发读场景方案2:本地缓存
  • nftables的配置与使用