自动微分的b站视频
学习的教程网址
问题解决方法的博客
符号微分
数值微分
自动微分(AD),包括前向自动微分和后向自动微分两种模式
上图的推导如下:
v
‾
5
=
∂
y
∂
v
5
=
∂
y
∂
y
=
y
‾
\begin{aligned} \overline{v}_5 &=\frac{\partial{y}}{\partial{v_5}}=\frac{\partial{y}}{\partial{y}}=\overline{y} \end{aligned}
v5=∂v5∂y=∂y∂y=y
根据链式法则
v
‾
4
=
∂
y
∂
v
4
=
∂
y
∂
v
5
∂
v
5
∂
v
4
=
v
‾
5
∂
v
5
∂
v
4
\begin{aligned} \overline{v}_4 &=\frac{\partial{y}}{\partial{v_4}}=\frac{\partial{y}}{\partial{v_5}}\frac{\partial{v}_5}{\partial{v_4}}=\overline{v}_5\frac{\partial{v}_5}{\partial{v_4}} \end{aligned}
v4=∂v4∂y=∂v5∂y∂v4∂v5=v5∂v4∂v5
因此反向传播(BP)可以用于更新网络参数(参考文章)[https://blog.csdn.net/bitcarmanlee/article/details/78819025]
grad在反向传播过程中是累加的(accumulated),这意味着每一次运行反向传播,梯度都会累加之前的梯度,所以一般在反向传播之前需把梯度清零。
我们不允许张量对张量求导,只允许标量对张量求导,求导结果是和自变量同形的张量。所以必要时我们要把张量通过将所有张量的元素加权求和的方式转换为标量,举个例子,假设y由自变量x计算而来,w是和y同形的张量,则y.backward(w)的含义是:先计算l = torch.sum(y * w),则l是个标量,然后求l对自变量x的导数
上图的计算过程用代码实现如下:
import torch
from torch.autograd import Variable
x1 = Variable(2 * torch.ones(1), requires_grad=True)
x2 = Variable(5 * torch.ones(1), requires_grad=True)
y = torch.log(x1) + x1*x2 - torch.sin(x2)
y.backward()
print(x1.grad)
print(x2.grad)
print(y)
计算结果如下: