1.向量链式法则
- 标量链式法则:
- 拓展到向量:
---------------------向量链式法则-example-BEGIN---------------------
---------------------向量链式法则-example-END---------------------
2.自动求导
- 自动求导计算一个函数在指定值上的导数
- 有区别于:
- 符号求导
- 数值求导
3.计算图
- 将代码分解成操作子
- 将计算表示成一个无环图
- 显式构造:
1 | from mxnet import sym |
- 隐式构造:
1 | from mxnet import autograd,nd |
4.自动求导的两种模式
5.反向积累
- 构造计算图
- 前向:执行图,存储中间结果
- 反向:从相反方向执行图,去除不需要的枝
6.复杂度
- 计算复杂度:O(n),n是操作子个数
- 通常正向和反向的代价类似
- 内存复杂度:0(n),因为需要存储正向的所有中问结果
- 跟正向累积对比:
- O(n)计算复杂度用来计算一个变量的梯度
- 0(1)内存复杂度
7. Q&A
-
(1)隐式构造与显式构造的区别:
- 显示计算:先给公式再给之;隐式计算:先给值再给公式
- 可以理解为隐式构造是符号计算,显式构造是数值计算
- 就好比.py文件与.ipynb文件
-
(2)正向和反向都要计算:
---------------------- 计算过程-BEGIN ----------------------
前向传递:
-
输入 被送入网络。
-
隐藏层计算 ,其中 是权重, 是偏置。
-
输出层计算 ,其中 是输出层的权重。
-
计算损失 。
在这个过程中,我们从输入 开始,按照网络结构的顺序一直计算到损失函数 。
后向传递(梯度计算):
-
首先,根据损失函数 对 的梯度 进行计算。
-
然后,反向计算 关于 的梯度,即 。
-
接着,计算 关于 和 的梯度,即 和 。
-
最终,根据链式法则,我们可以计算出 ,即对输入 的梯度。
在后向传递过程中,我们从损失函数的梯度开始,反向通过网络的每一层,直到输入层,计算出每个参数对损失函数的影响
---------------------- 计算过程-END ----------------------
- (3)pytorch默认累计梯度:
---------------------- 累计梯度-BEGIN ----------------------
假设我们的模型是一个简单的线性回归模型,用于预测输出 。模型的公式是 ,其中 是权重, 是偏置, 是输入。
我们的目标是最小化模型输出和真实值之间的均方误差。均方误差的公式是 ,其中 是第 个样本的真实值, 是模型的预测值, 是样本数量。
现在,假设我们有以下4个样本的数据:
- 样本 1: ,
- 样本 2: ,
- 样本 3: ,
- 样本 4: ,
假设模型的初始参数是 和 。
- 计算每个样本的损失和梯度:
对于每个样本 ,我们首先计算预测值 ,然后计算损失 。接着,我们计算损失相对于 和 的梯度。
以样本 1 为例:
- 预测值:
- 损失:
- 的梯度:
- 的梯度:
类似地,我们为样本 2、3 和 4 计算损失和梯度。
- 梯度累计:
然后,我们累加所有样本的梯度。假设其他样本的梯度计算结果如下:
- 样本 2 的 和 梯度:-4, -4
- 样本 3 的 和 梯度:-5, -5
- 样本 4 的 和 梯度:-6, -6
累加梯度:
- 的总梯度:-3 - 4 - 5 - 6 = -18
- 的总梯度:-3 - 4 - 5 - 6 = -18
- 更新参数:
最后,我们使用累积的梯度来更新 和 。假设学习率为 0.01,更新公式为 。
- 更新 :
- 更新 :
通过这个过程,我们在没有足够内存一次处理所有样本的情况下,通过累积梯度来模拟大批量数据的训练效果。这样的方法有助于在资源受限的情况下有效地训练模型。
---------------------- 累计梯度-END ----------------------