开始之前,补充一个关于梯度的图,方便记忆输入输出的形状
计算图
自动求导的两种模式
正向积累
- 存储中间结果
反向积累(又叫反向传递)
-
去除不需要的枝
关于复杂度:
自动微分
深度学习框架通过自动计算导数,即自动微分(automatic differentiation)来加快求导。
实际中,根据我们设计的模型,系统会构建一个***计算图***(computational graph), 来跟踪计算是哪些数据通过哪些操作组合起来产生输出。
自动微分使系统能够随后反向传播梯度。
这里,反向传播(backpropagate)意味着跟踪整个计算图,填充关于每个参数的偏导数。
一个简单的例子
假设想对函数𝑦=2𝐱⊤𝐱关于列向量𝐱求导。 首先,创建变量x
并为其分配一个初始值。
import torch
x = torch.arange(4.0)
x
tensor([0., 1., 2., 3.])
在我们计算𝑦关于𝐱的梯度之前,我们需要一个地方来存储梯度。
重要的是,我们不会在每次对一个参数求导时都分配新的内存。 因为我们经常会成千上万次地更新相同的参数,每次都分配新的内存可能很快就会将内存耗尽。
注意,一个标量函数关于向量𝐱的梯度是向量,并且与𝐱具有相同的形状。
x.requires_grad_(True) # 等价于x=torch.arange(4.0,requires_grad=True)
x.grad # 默认值是