理解前向传播与反向传播:可微 EDA 论文阅读基础

本文章最后编辑于

核心概念:流水线

不要把复杂的函数看作一个整体公式,而是要把它们拆解成由 “加、减、乘、除” 构成的计算图流水线。

前向传播:算函数结果

  • 本质:将当前变量的具体值带入计算图,从左向右,一步步计算并保存所有的中间变量,直到得出最终的函数结果。
  • 意义:评估当前的状态。

后向传播:算移动方向

  • 本质:利用微积分的链式法则从右向左,将最终结果产生的“梯度”,一层层按比例分配回最初的输入变量上。
  • 意义:计算出每一个变量对最终结果的影响力(偏导数)。

具体示例

以 $f(x, y) = x^2 + xy + x + y$ 为例,其对应的计算图为: f1

假设我们的目标是最小化 $f(x, y)$,各变量初始值分别为:

  • $x$: 2.00
  • $y$: 3.00
  • $\eta$: 0.05

$\eta$ 为学习率,决定每一步应该迈多大

梯度只是告诉了我们移动方向,其本身不一定是一个合适的移动距离,例如某个地方梯度很大,如果直接按照梯度大小更新,可能一步跨得太远;某个地方梯度很小,又可能几乎不动,这就会导致震荡,所以我们需要学习率来缩放梯度。

一个合适的学习率有助于快速且稳定的靠近最优解。现在通常是“先人为给一个初始学习率,再让优化器(Adam, AdamW等)自动调整”。

前向传播

从左到右依次传播,得到最终的函数结果: f2

反向传播

从右到左依次传播,一层层按比例分配回最初的输入变量上,计算出每个变量对最终结果的影响力: f3

详细推导过程为: f4

根据梯度公式:$\nabla f(x, y)=\left(\frac{\partial f}{\partial x}, \frac{\partial f}{\partial y}\right)$,计算出当前点的梯度为:$\nabla f(2, 3)=(8.00, 3.00)$,根据偏导数的定义,可知该梯度表示在当前点上:

  • 沿 $x$ 正方向,函数值每单位大约增加 $8.00$
  • 沿 $y$ 正方向,函数值每单位大约增加 $3.00$

根据方向导数的定义可知,沿着梯度方向$(8.00, 3.00)$移动可以使得函数增长最快!

更新变量值

  1. 移动步长 = 学习率 $\times$ 梯度,那么在当前点的移动步长$Curr_{step} = 0.05 \times (8.00, 3.00) = (0.40, 0.15)$
  2. 根据最终目标来更新变量值:
    • 想要函数最大化,那么就应该往梯度方向进行移动:$(x_{t+1}, x_{t+1}) = (x_{t}, x_{t}) + Curr_{step} = (2.40, 3.15)$
    • 想要函数最小化,那么就应该往梯度反方向进行移动:$(x_{t+1}, x_{t+1}) = (x_{t}, x_{t}) - Curr_{step} = (1.60, 2.85)$

重复上述传播,更新过程即可让函数最大化/最小化。

0%