自动微分
自动微分¶
参考:Automatic Differentiation with torch.autograd & 自动求导 — 动手学深度学习
深度学习框架一般都默认支持自动微分机制(automatic differentiation)。以 \(y = \mathbf{x}^T \mathbf{x}\) 为例,下面求解:\(\nabla_{\mathbf{x}} y\)。首先,设置初始值:
import torch
x = torch.tensor([[1.], [2], [3], [4]]) # 注意,仅仅支持浮点数
x # 一个列向量
tensor([[1.],
[2.],
[3.],
[4.]])
在计算梯度之前,需要存储申请记录梯度:
# 等价于 `x = torch.tensor([[1.], [2], [3], [4]], requires_grad=True)`
x.requires_grad_(True)
x.grad # 默认值是 None
这样,可以计算 \(y\)(@
是矩阵运算的简写):
y = x.T @ x
y
tensor([[30.]], grad_fn=<MmBackward>)
接着,可以进行反向传播计算 \(\mathbf{x}\) 的梯度:
y.backward()
x.grad
tensor([[2.],
[4.],
[6.],
[8.]])
由于 \(\nabla_{\mathbf{x}} y = 2 {\mathbf{x}}\),下面可以进行验证:
x.grad == 2 * x
tensor([[True],
[True],
[True],
[True]])