Autograd
PyTorch中的autograd
在整个PyTorch框架中,所有的神经网络都是一个autograd package(自动求导工具包)
autograd package提供了一个对Tensor上的所有操作进行自动微分的功能
关于torch.Tensor
torch.Tensor是整个package中的核心类,如果将属性 .requires_grad 设置为 true,他将追踪这个类上的所有操作,当代码要进行反向传播时,直接调用 .backward() 就可以自动计算所有的梯度,在这个Tensor上的所有梯度将被累加进属性 .grad 中。
如果想终止一个Tensor在计算图中的追踪回溯,只需要执行 .detach() 就可以将该Tensor从计算图中撤下,在未来的回溯计算中也不会在计算该Tensor。
除了 .detach() 如果想终止对计算图的回溯,也就是不再进行方向传播求导的过程,也可以采用代码块的形式 with torch.no_grad(): ,这种操作非常适用于对模型进行预测的时候,因为预测阶段不需要对梯度进行计算。
关于torch.Function
Function类是和Tensor类同等重要的一个核心类,它和Tensor共同构成一个完整的类
每一个Tensor拥有一个 grad.fn 属性,代表引用了哪个具体的Function创建了该Tensor
1 |
|
用户自定义的Tensor,其grad_fn=None.
一些更复杂的操作:
1 |
|
.mean() 方法表示求均值
使用inplace操作符可以改变Tensor的 requires_grad 属性:
1 |
|
关于梯度Gradients
在PyTorch中,反向传播是依靠 .backward() 实现的,下面是一个使用例子:
1 |
|
这里我们首先要弄清 $out$ 是如何得到的.
我们把 $out$ 视为一个多元函数,将 $x$ 视为一个多元变量,那么:
$$out = \frac{3(x+2)^{2}}{4}$$
对 $out$ 求 $x$ 的导数:
$$out’ = \frac{3(x+2)}{2}$$
将x代入,便得到结果.
- 关于自动求导的属性设置:可以通过设置 .requires_grad=True 来执行自动求导,也可以通过代码块的限制来停止自动求导.
1 |
|
- 可以通过 .detach() 获得一个新的Tensor,拥有相同内容但不需要自动求导.
1 |
|