本站原创文章,转载请说明来自《老饼讲解-深度学习》www.bbbdata.com
本节简单介绍pytorch的优化器,并讲述如何使用优化器
什么是pytorch的优化器
优化器指的是pytorch已经写好的一套参数训练算法
例如常见的SGD(随机梯度下降算法)、LBFGS(拟牛顿法)、Adam等等
对于简单的梯度下降算法,自己手写与调用pytorch的优化器差别不大,
但对于复杂的算法,调用优化器就会方便很多
在pytorch中训练一个模型,往往是直接使用pytorch的优化器进行训练
pytorch提供了各种各样的优化器,用于训练过程优化参数
也就是说,一般不直接用梯度调整参数,而是将参数(带梯度)交给优化器,让优化器利用梯度信息,对参数进行调整,
这是因为不同的优化器提供了不同的算法机制,比起直接用梯度调整会更加有效
pytorch的优化器有哪些
pytorch提供的优化器如下:
👉Adadelta
👉Adagrad
👉Adam
👉AdamW
👉SparseAdam
👉Adamax
👉ASGD
👉LBFGS
👉NAdam
👉RAdam
👉RMSprop
👉Rprop
👉SGD
具体的优化器的方法参考: https://pytorch.org/docs/stable/optim.html
本节讲解如何用pytorch的优化器来优化参数,并展示一个简单的代码例子
如何使用pytorch的优化器
使用pytorch的优化器主要包括三个步骤
👉1. 初始化优化器
👉2. 自行更新梯度
👉3. 调用优化器进行参数更新
下面详细介绍使用pytorch优化器时的这三个步骤
优化器的初始化
优化器初始化主要是指出要把哪些参数交给优化器进行优化,及设定优化算法中的超参数
以随机梯度下降SGD为例,初始化一个SGD优化器示例如下:
optimizer = torch.optim.SGD({w,b}, lr=0.01)
其中w和b是我们要优化的参数,而lr则是SGD的超参数-学习率
自行更新梯度
由于优化器更新参数时需要用到参数的梯度,所以需要先自行更新梯度
需要注意的是,pytorch的梯度更新是累加的,因此更新梯度前需要先将梯度清零
为了更方便梯度清零,优化器提供了一次性清零所有参数梯度的方法,如下:
optimizer.zero_grad()
通过zero_grad就会一次性把之前交给优化器管理的参数w和b的梯度都清零
调用优化器进行参数更新
优化器把算法的更新机制进行封装,直接调用就能按算法的机制对参数进行更新
如下,调用下述语句就会利用参数的梯度对参数进行更新
optimizer.step()
以梯度下降为例,optimizer.step()就相当于执行w=w-lr*dw这样的操作
✍️pytorch优化器的使用-总结
根据上述三大步骤的理解,使用优化器优化参数的形式如下:
初始化优化器
for 循环
----清空梯度
----更新梯度
----优化器更新参数
一个优化器优化参数的例子
以求解x取何值时,最小为例
如下使用SGD优化器对参数进行优化
import torch
x = torch.tensor([2],dtype=(float),requires_grad=True) # 初始化参数x
optimizer = torch.optim.SGD({x}, lr=0.1) # 初始化优化器,指明x是要优化的参数
for i in range(30): # 循环迭代
# ------更新本次的梯度------
optimizer.zero_grad() # 将优化器里所有待优化参数的梯度清空
y = x**2 # 目标函数
y.backward() # 计算新的梯度
# ------通过优化器更新参数------
optimizer.step() # 优化器利用当前梯度信息,对参数进行更新
print('当前第',str(i),'轮') # 打印当前第几步
print(' x:',x.item()) # 打印x
运行结果如下
当前第 0 轮
x: 1.6
当前第 1 轮
x: 1.28
当前第 2 轮
.....
.....
当前第 27 轮
x: 0.003868562622766814
当前第 28 轮
x: 0.0030948500982134514
当前第 29 轮
x: 0.002475880078570761
可以看到,在0处取得最小值,而优化器最终把x的值优化到已经接近0
End