pytorch 之 Autograd、Optimization

157 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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)

上述代码定义了如下的计算图,其中 wb 需要优化,因此在定义变量时将 requires_grad 设置为 True,也可以在定义变量后采用 x.requires_grad_(True) 方式

image.png

反向传播计算梯度

loss.backward()
print(w.grad)
print(b.grad)

对损失函数进行一次反向传播,即可拿到损失函数对设置了自动求导的参数的导数
对于一张计算图,只能进行一次反向传播,若想进行多次反向传播需采用如下方式

loss.backward(retain_graph=True)

关闭梯度追踪

对上述计算,z 由 w,b 计算得来,其 z.requires_grad 为 True
在微调预训练模型或仅需要进行前向计算时,对于不想追踪的变量,可以采用如下方式关闭梯度追踪

  1. 将不需要追踪的代码放入 with torch.no_grad(): 代码块内
with torch.no_grad():
    z = torch.matmul(x, w)+b
  1. 将不需要追踪的变量 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() 通过反向传播得到的梯度更新参数