老饼讲解-深度学习 机器学习 神经网络 深度学习
pytorch模型

【介绍】pytorch建模-模型训练

作者 : 老饼 发表日期 : 2023-07-28 10:52:16 更新日期 : 2024-04-01 19:07:26
本站原创文章,转载请说明来自《老饼讲解-深度学习》www.bbbdata.com







    01. pytorch的优化器简介    




本节简单介绍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 






     02. 如何使用pytorch的优化器     




本节讲解如何用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 







联系老饼