1、Variable
-
Variable的构造函数需要传入Tensor,同时有两个可选参数:
- requests_grad :是否求导.默认为False.
- volatile:如果设置为True,则构建在该variable上的图都不会求导,优先级大于 requests_grad。默认为False。在不需反向传播的情况下可以设置此参数,节省内存。 variable.backward()主要有一下参数:
-
grad_variables:形状与variable一致。对于
y=a+b;z=y.sum()
:z
为标量,可以省略此参数, 默认为1。y.backward()
等价于z.backward(y_grad)
- retain_graph:保持反向传播过程中的参数不清空,可以用来 多次反向传播。
- create_graph: 对反向传播过程在次创建图,可通过 backward of backward实现 高阶求导。
2、计算图
PyTorch会随着变量赋值,动态生成计算图。在Variable的grad_fn中记录了该变量是哪个操作的输出,在反向传播过程中,autograd可以沿着这个图从根节点溯源,并按照backward
函数求出各个变量的梯度。
-
在反向传播过程中非叶子节点的导数计算完成后即被清空。如果想查看这个变量的梯度,有两张方法:
- 使用autograd.grad函数
- 使用hook 对于
-
grad函数:
t.autograd.grad(z,y)
,隐式调用backward() - hook:
y=a+b;z=y.sum()
:
def f_hook(grad):
print(grad)
hook_handle = y.register_hook(f_hook)
hook_handle.remove() # 用完之后移除hook
3、扩展autograd
绝大多数的函数都可以自动实现反向求导,对于自己写的复杂的不能自动反向求导的函数,可以通过继承autograd.Function
实现forward
函数和backward
函数的形式手动实现反向求导。