5. 自动微分
- 深度学习框架通过自动计算导数,即自动微分(automatic differentiation)来加快求导。根据设计好的模型,系统会构建一个计算图(computational graph),来跟踪计算是哪些数据通过哪些操作组合起来产生输出。自动微分使系统能够随后反向传播梯度。这里,反向传播(backpropagate)意味着跟踪整个计算图,填充关于每个参数的偏导数。
5.1
- 对函数$y=2\mathbf{x}^{\top}\mathbf{x}$关于列向量$\mathbf{x}$求导
1 | import torch |
tensor([0., 1., 2., 3.])
tensor([0., 1., 2., 3.], requires_grad=True)
tensor(28., grad_fn=<MulBackward0>)
None
tensor([ 0., 4., 8., 12.])
tensor([ 1., 5., 9., 13.])
tensor([1., 1., 1., 1.])
5.2 非标量变量的反向传播
1 | # 对非标量调用backward需要传入一个gradient参数,该参数指定微分函数关于self的梯度。 |
tensor([0., 2., 4., 6.])
5.3 分离计算
- 将某些计算移动到记录的计算图之外。(作为常数处理)
- 假设$y=f(x), z=g(x,y)$。我们想计算z关于x的梯度,但由于某种原因,希望将y视为一个常数,并且只考虑到x在y被计算后发挥的作用。
1 | x.grad.zero_() |
tensor([0., 1., 4., 9.])
tensor([ 0., 3., 12., 27.])
5.4 python控制流的梯度计算
1 | def f(a): |
tensor(True)