自动微分

自动微分

参考: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]])