Loading...

1.向量链式法则

  • 标量链式法则:


  • 拓展到向量:



---------------------向量链式法则-example-BEGIN---------------------


---------------------向量链式法则-example-END---------------------



2.自动求导

  • 自动求导计算一个函数在指定值上的导数
  • 有区别于:
    • 符号求导
    • 数值求导

3.计算图

  • 将代码分解成操作子
  • 将计算表示成一个无环图


  • 显式构造:
1
2
3
4
from mxnet import sym
a = sym.var()
b = sym.var()
c = 2 * a +b
  • 隐式构造:
1
2
3
4
from mxnet import autograd,nd
with autograd.record():
a=nd.ones((2,1))
b=nd.ones((2,1))

4.自动求导的两种模式


5.反向积累

  • 构造计算图
  • 前向:执行图,存储中间结果
  • 反向:从相反方向执行图,去除不需要的枝


6.复杂度

  • 计算复杂度:O(n),n是操作子个数
    • 通常正向和反向的代价类似
  • 内存复杂度:0(n),因为需要存储正向的所有中问结果
  • 跟正向累积对比:
    • O(n)计算复杂度用来计算一个变量的梯度
    • 0(1)内存复杂度

7. Q&A

  • (1)隐式构造与显式构造的区别:

    • 显示计算:先给公式再给之;隐式计算:先给值再给公式
    • 可以理解为隐式构造是符号计算,显式构造是数值计算
    • 就好比.py文件与.ipynb文件
  • (2)正向和反向都要计算:



---------------------- 计算过程-BEGIN ----------------------

前向传递:

  1. 输入 x\boldsymbol{x} 被送入网络。

  2. 隐藏层计算 h=f(Wx+b)\boldsymbol{h}=\boldsymbol{f}(\boldsymbol{W}\boldsymbol{x}+\boldsymbol{b}),其中 W\boldsymbol{W} 是权重,b\boldsymbol{b} 是偏置。

  3. 输出层计算 y=vh\boldsymbol{y}=\boldsymbol{v}\boldsymbol{h},其中 v\boldsymbol{v} 是输出层的权重。

  4. 计算损失 L(y,目标值)L(\boldsymbol{y},\text{目标值})

在这个过程中,我们从输入 x\boldsymbol{x} 开始,按照网络结构的顺序一直计算到损失函数 LL


后向传递(梯度计算):

  1. 首先,根据损失函数 LLy\boldsymbol{y} 的梯度 Ly\frac{\partial L}{\partial \boldsymbol{y}} 进行计算。

  2. 然后,反向计算 y\boldsymbol{y} 关于 h\boldsymbol{h} 的梯度,即 yh\frac{\partial \boldsymbol{y}}{\partial \boldsymbol{h}}

  3. 接着,计算 h\boldsymbol{h} 关于 W\boldsymbol{W}x\boldsymbol{x} 的梯度,即 hW\frac{\partial \boldsymbol{h}}{\partial \boldsymbol{W}}hx\frac{\partial \boldsymbol{h}}{\partial \boldsymbol{x}}

  4. 最终,根据链式法则,我们可以计算出 Lx\frac{\partial L}{\partial \boldsymbol{x}},即对输入 x\boldsymbol{x} 的梯度。

在后向传递过程中,我们从损失函数的梯度开始,反向通过网络的每一层,直到输入层,计算出每个参数对损失函数的影响

---------------------- 计算过程-END ----------------------



  • (3)pytorch默认累计梯度:


---------------------- 累计梯度-BEGIN ----------------------

假设我们的模型是一个简单的线性回归模型,用于预测输出 yy。模型的公式是 y=wx+by = wx + b,其中 ww 是权重,bb 是偏置,xx 是输入。

我们的目标是最小化模型输出和真实值之间的均方误差。均方误差的公式是 L=1ni=1n(yiy^i)2L = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2,其中 yiy_i 是第 ii 个样本的真实值,y^i\hat{y}_i 是模型的预测值,nn 是样本数量。

现在,假设我们有以下4个样本的数据:

  • 样本 1: x=1x = 1, y=2y = 2
  • 样本 2: x=2x = 2, y=3y = 3
  • 样本 3: x=3x = 3, y=4y = 4
  • 样本 4: x=4x = 4, y=5y = 5

假设模型的初始参数是 w=0.5w = 0.5b=0b = 0


  1. 计算每个样本的损失和梯度:

对于每个样本 ii,我们首先计算预测值 y^i=wxi+b\hat{y}_i = wx_i + b,然后计算损失 Li=(yiy^i)2L_i = (y_i - \hat{y}_i)^2。接着,我们计算损失相对于 wwbb 的梯度。

以样本 1 为例:

  • 预测值: y^1=0.5×1+0=0.5\hat{y}_1 = 0.5 \times 1 + 0 = 0.5
  • 损失: L1=(20.5)2=2.25L_1 = (2 - 0.5)^2 = 2.25
  • ww 的梯度: L1w=2×(0.52)×1=3\frac{\partial L_1}{\partial w} = 2 \times (0.5 - 2) \times 1 = -3
  • bb 的梯度: L1b=2×(0.52)×1=3\frac{\partial L_1}{\partial b} = 2 \times (0.5 - 2) \times 1 = -3

类似地,我们为样本 2、3 和 4 计算损失和梯度。


  1. 梯度累计:

然后,我们累加所有样本的梯度。假设其他样本的梯度计算结果如下:

  • 样本 2 的 wwbb 梯度:-4, -4
  • 样本 3 的 wwbb 梯度:-5, -5
  • 样本 4 的 wwbb 梯度:-6, -6

累加梯度:

  • ww 的总梯度:-3 - 4 - 5 - 6 = -18
  • bb 的总梯度:-3 - 4 - 5 - 6 = -18

  1. 更新参数:

最后,我们使用累积的梯度来更新 wwbb。假设学习率为 0.01,更新公式为 w:=w学习率×梯度w := w - \text{学习率} \times \text{梯度}

  • 更新 ww: w:=0.50.01×(18)=0.68w := 0.5 - 0.01 \times (-18) = 0.68
  • 更新 bb: b:=00.01×(18)=0.18b := 0 - 0.01 \times (-18) = 0.18

通过这个过程,我们在没有足够内存一次处理所有样本的情况下,通过累积梯度来模拟大批量数据的训练效果。这样的方法有助于在资源受限的情况下有效地训练模型。

---------------------- 累计梯度-END ----------------------