本文将结合源码与代码示例详细解析Optimizer的五大方法。
优化器主要用在模型训练阶段,用于更新模型中可学习的参数。torch.optim提供了多种优化器接口,比如Adam、RAdam、SGD、ASGD、LBFGS等,是所有这些优化器的父类。
2.1 公共方法
是所有优化器的父类,它主要具有以下几类公共方法:
方法名 | 官方注解 | 说明 |
---|---|---|
Add a param group to the Optimizer's param_groups. | 给优化器添加模型中可学习的参数组。 | |
Performs a single optimization step (parameter update) | 进行一次参数更新。 | |
Sets the gradients of all optimized torch.Tensor to zero. | 将上次记录的梯度信息置零,避免梯度累加。 | |
Returns the state of the optimizer as a dict. | 以字典形式返回优化器的状态信息。 | |
Loads the optimizer state. | 加载以字典形式存储的优化器状态信息。 |
2.2 行为解析
以下将结合源码 (注:小喵的torch版本为1.4.0) 与示例代码来解析各种方法的行为。为了方便理解,小喵在相关源码中都添加了必要的注释。
2.2.1 __init___初始化
下面是的初始化函数源码:
初始化函数用于初始化优化器,需传入两个参数:
-
:模型的可学习参数。
-
:(全局)默认优化器超参,如学习率等。
允许两种传入格式,其一是网络全局参数,即网络的所有可学习参数,它们共用一套优化器参数:
其二是参数组,每组参数可以指定自己的优化器参数,即可使用不同的优化策略:
补充知识:named_parameters()返回关于网络层参数名字和参数,parameters()仅返回网络层参数。
2.2.2 add_param_group参数组设置
在初始化函数中,调用了方法往中添加分组参数,的源码如下: