新闻资讯
torch.optim.Optimizer的常见使用
发布时间:2024-04-07
  |  
阅读量:
字号:
A+ A- A

Pytorch中定义了所有优化器的基类即torch.optim.Optimizer(),它是所有优化器的基类。所以如果有必要,那么改写优化器时就要继承此类。

在初始化optimizer优化器时,第一个参数就是模型中的可微分参数,该参数必须是可迭代的,因为后续模型训练时候要更新嘛,一般是torch.Tensor或者字典对象。在自定义优化器时,子类需要重写基类中的成员函数_step()和_update_hyper_param(),目的是实现具体的优化算法和更新超参数的功能(要不你训练一遍以后模型怎么更新参数,就是靠这个)。其中,_step()通常用来计算参数的梯度并更新参数值,_update_hyper_param()方法用来更新优化器自身的超参数,比如学习率lr。需要注意的是,在使用Optimizer时, 传递的参数需要有序,并且保持一致, 对于无序的集合或者字典, 在运行时候可能会导致优化器在不同的运行中表现不一致(这块说的比较官方,但pytorch的源码解释部分是这么说的)。

本文的重点是要记录optimizer常见使用,比如SGD, Adam。

在使用时,通常是实例化模型后,创建优化器,然后将模型中的可训练参数传进优化器方便后续模型迭代训练的参数更新,所以常见的代码片段主要是:

 


目前的优化器参数总共有8个,我以SGD,Adam为例,分别是:

SGD:dict_keys(['params', 'lr', 'momentum', 'dampening', 'weight_decay', 'nesterov', 'maximize', 'initial_lr'])

Adam:dict_keys(['params', 'lr', 'betas', 'eps', 'weight_decay', 'amsgrad', 'maximize', 'initial_lr'])

可以看出它是一个字典类型,关键字已经定义好,值就是需要定义的地方,params当然就是模型的参数,一般情况下,其他的常见使用需要定义的就是'lr', 'momentum','weight_decay'(因为我就使用过这三个)。具体的默认值可以自行print或者debug查看。

我也对网上的实验例子进行了测试,感觉就是将参数放在了优化器里面,然后在模型后续训练过程中就可以进行模型参数的训练更新了,但是因为是测试,优化器里的params显然没有更新,所以只是将参数放进优化器,放置优化器的前后实际是一样的。

 

如果要动态修改学习率,一般方法是:

 

这里其实就是将lr择出来,然后根据具体情况再进行设置。比如,在某个确定的时间点进行设定:

 

还有一种方法是使用调度器实现:常见的调度器有

torch.optim.lr_scheduler.StepLR

torch.optim.lr_scheduler.ReduceLROnPlateau

torch.optim.lr_scheduler.LamdaLR

 

当需要更细粒度的调参,即针对网络的某层进行学习率的调整,那么

 

提取特定层,然后为其指定层的学习率:

 

参考:

https://blog.csdn.net/xxmy7/article/details/125967239?spm=1001.2014.3001.5506

平台注册入口