开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看活动详情
本文是 pytorch 官方教程学习笔记,涉及 Autograd 和 Optimization 相关内容
Autograd
代码和图片来源:pytorch官方教程Autograd部分
为参数设置梯度追踪
import torch
x = torch.ones(5) # input tensor
y = torch.zeros(3) # expected output
w = torch.randn(5, 3, requires_grad=True)
b = torch.randn(3, requires_grad=True)
z = torch.matmul(x, w)+b
loss = torch.nn.functional.binary_cross_entropy_with_logits(z, y)
上述代码定义了如下的计算图,其中 w 和 b 需要优化,因此在定义变量时将 requires_grad 设置为 True,也可以在定义变量后采用 x.requires_grad_(True) 方式
反向传播计算梯度
loss.backward()
print(w.grad)
print(b.grad)
对损失函数进行一次反向传播,即可拿到损失函数对设置了自动求导的参数的导数
对于一张计算图,只能进行一次反向传播,若想进行多次反向传播需采用如下方式
loss.backward(retain_graph=True)
关闭梯度追踪
对上述计算,z 由 w,b 计算得来,其 z.requires_grad 为 True
在微调预训练模型或仅需要进行前向计算时,对于不想追踪的变量,可以采用如下方式关闭梯度追踪
- 将不需要追踪的代码放入
with torch.no_grad():代码块内
with torch.no_grad():
z = torch.matmul(x, w)+b
- 将不需要追踪的变量 detach
z = z.detach()
动态图和静态图
pytorch 的计算图是动态图
动态图的计算和构建是同时进行的,灵活易调节
静态图是先构建计算图再进行计算,速度快
Optimization
超参数
主要有下面 3 个,learning_rate 控制参数优化速度,batch_size 指一次正向、反向传播所用的数据量大小,epochs 指训练次数,即一个数据集的使用次数
learning_rate = 1e-3
batch_size = 64
epochs = 5
反向传播优化
optimizer.zero_grad()
loss.backward()
optimizer.step()
参数的梯度默认是累加的,每次反向传播前需要重置,即 optimizer.zero_grad()
optimizer.step() 通过反向传播得到的梯度更新参数