目录
老饼讲解:一步一步上手深度学习

【训练】认识一下-pytorch优化器

作者 : 老饼 发表日期 : 2025-09-29 20:39:23 更新日期 : 2026-05-20 13:19:37
老饼讲解-简单易懂,干货满满,爽过嗦螺!


在之前,我们训练时一直都是自己写公式来更新参数,但实际中更普遍的做法是调用pytorch优化器来更新参数。

优化器是个什么?我刚开始时对这名字有点蒙圈,其实就是优化算法(训练算法)对象类。简单来说就是pytorch将各种优化算法都封装成类对象,然后我们要使用时,直接调用它就可以对参数进行更新了。

说再多,也不如玩一玩来得实在,让我们开始吧!

一、优化器使用示例与解说

我们直接展示一个使用优化器训练模型的代码示例,然后逐步讲解优化器是怎么使用的,我想,这样应该是最容易上手的方式。

1.1. 优化器的使用-示例代码

为了简单起见,这里以逻辑回归模型的训练为例,展示优化器的使用例子。

优化器使用示例代码如下:

# 本代码用于展示pytorch优化器的使用
# 本代码来自《老饼讲解-深度学习》www.bbblearn.com
import torch

# 数据                                       
x = torch.tensor([[2.5, 1.3, 6.2, 1.3, 5.4, 6 ,4.3, 8.2]
               ,[-1.2,2.5,3.6,4,3.4,2.3,7.2,3.9]],dtype=(float)).T      # 样本的输入数据
y = torch.tensor([0,0,1,0,1,1,1,1],dtype=(float))                       # 样本的标签

# 训练模型
w  = torch.tensor([2,2],dtype=(float),requires_grad=True)               # 初始化模型系数w
b  = torch.tensor([1],dtype=(float),requires_grad=True)                 # 初始化模型系数b
optimizer = torch.optim.SGD({w,b}, lr=0.01)                             # 初始化优化器
for i in range(1000):
    L = (torch.log(1+torch.exp(x@w+b))-y*(x@w+b)).sum()                 # 损失函数
    print('第',str(i),'轮的Loss:',L.item())                            # 打印当前损失函数值
    optimizer.zero_grad()                                               # 更新梯度之前先清空梯度
    L.backward()                                                        # 用损失函数更新模型系数的梯度
    optimizer.step()                                                    # 用优化器更新参数
print('--------最终结果-------')
print('w:', w)                                                          # 打印模型系数w
print('b:',b)                                                           # 打印模型系数b

好了,示例简单来说,就是训练一个逻辑回归,然后打印训练好的模型参数,这里我们就不展示代码的运行结果了。毕竟这代码仅是为了让我们下面方便理解如何使用优化器。

1.2.优化器使用-代码解说

好了,我们一起来看下代码,就知道优化器是怎么使用的了。段码片段-优化器使用

第5-7行先导入数据,然后10、11行初始化参数,这些没什么好说的。

第12行,我们的主角优化器来了。这里我们通过torch.optim.SGD()初始化一个SGD优化器,然后第一个参数{w,b}是我们要之后要进行优化的参数,我们把它传给优化器,让它帮我们管理起来。而第二个可行参数lr=0.01就是SGD算法所要用到的学习率了,我们设为0.01。

除了SGD,pytorch还提供了LBFGS、Rprop、Adam、Adamax等等优化算法,不同的优化算法,就会有不同的训练超参数,具体的更多优化器方法参考: https://pytorch.org/docs/stable/optim.html

好了,第13行我们就开始循环训练了。

第14行计算损失函数,计算损失函数当然是为了backward来计算梯度,但是如我们所知,backward前需要清空梯度,这里我们就不需要自己对参数一个一个去清空了,可以让优化器帮我们一次性全部清空。

第16行的optimizer.zero_grad()就是告诉优化器要清空梯度啦,然后它就把之前我们交它管理的{w,b}的梯度都清空完。

接下来第17行就backward了,这样w,b的梯度就更新了。

好了,第18行,更新参数。以前我们都是用梯度自己按公式来更新参数,现在不需要了,我们只要更新好梯度,然后用optimizer.step()告诉优化器,现在要更新参数啦!然后优化器就会去拿参数的梯度,然后按算法的相关公式更新参数。最后19-21是打印训练好的参数,这就完了。

二、pytorch的优化器-小结

好了,经过上面的代码例子,相信已经初步知道pytorch的优化器是什么,怎么用了。由于初次接触,这里我带大家再回顾总结一下,不用谢。

首先,我们这节接触了优化器的初始化函数与两个常用方法,如下:

1. 优化器初始化-函数:optimizer = torch.optim.SGD({w,b}, lr=0.01)

优化器是一个类对象,所以要初始化了才能使用,在初始化时,就要把需要优化的参数交给优化器,并设置好相关的超参数。

2. 参数更新-方法:optimizer.step()

告诉优化器,要更新梯度啦,然后优化器管理的参数就会读取参数的梯度,然后更新参数。所以,在step()之前 ,我们需要先把梯度更新好。

3. 梯度清空-方法:optimizer.zero_grad() 

清空所有优化器管理的所有参数的梯度,backward前记得调用一下就好了。

总的来说,就是把所有要优化的参数交给优化器,然后统一清空梯度、统一调用优化器内置的参数更新公式进行参数更新,这样可以使模型的训练代码更方便、更简单。

总结

这节我们又接触了pytorch的优化器,又更专业一些啦~!总的来说,使用优器化,有两方面好处:

1. 可以将需要优化的参数统一管理起来,清空梯度、更新参数可以一句代码就搞定。

2. 不需要我们自己去写参数更新的相关公式,这让我们使用不同的优化算法也方便得多,不需理解得那么深刻就能大概地使用了。

优化器当然还有许多其它的功能、玩法,但还是那句话,玩到时再来说。好了,下课。



图标 评论
添加评论