1.0 基本用法
- 优化器主要是在模型训练阶段对模型可学习参数进行更新, 常用优化器有 SGD,RMSprop,Adam等
- 优化器初始化时传入传入模型的可学习参数,以及其他超参数如 ,等
- 在训练过程中先调用 清空梯度,再调用 反向传播,最后调用 更新模型参数
简单使用示例如下所示:
1.1 PyTorch 中的优化器
所有优化器都是继承父类 ,如下列表是 PyTorch 提供的优化器:
- SGD
- ASGD
- Adadelta
- Adagrad
- Adam
- AdamW
- Adamax
- SparseAdam
- RMSprop
- Rprop
- LBFGS
1.2 父类Optimizer 基本原理
是所有优化器的父类,它主要有如下公共方法:
- add_param_group(param_group): 添加模型可学习参数组
- step(closure): 进行一次参数更新
- zero_grad(): 清空上次迭代记录的梯度信息
- state_dict(): 返回 dict 结构的参数状态
- load_state_dict(state_dict): 加载 dict 结构的参数状态
1.2.1 初始化 Optimizer
初始化优化器只需要将模型的可学习参数(params)和超参数(defaults)分别传入优化器的构造函数,下面是的初始化函数核心代码:
1.2.2 add_param_group
该方法在初始化函数中用到,主要用来向 添加不同分组的模型参数
利用 add_param_group 函数功能,可以对模型不同的可学习参数组设定不同的超参数,初始化优化器可传入元素是 dict 的 list,每个 dict 中的 key 是 或者其他超参数的名字如 ,下面是一个实用的例子:对模型的层参数设置不同的学习率
1.2.3 step
此方法主要完成一次模型参数的更新
- 基类 定义了 step 方法接口,如下所示
- 子类如 SGD 需要实现 step 方法,如下所示:
- step 方法可传入闭包函数 closure,主要目的是为了实现如和等优化算法,这些算法需要对模型进行多次评估
- Python 中闭包概念:在一个内部函数中,对外部作用域的变量进行引用(并且一般外部函数的返回值为内部函数),那么内部函数就被认为是闭包
下面是 closure 的简单示例:
1.2.4 zero_grad
- 在反向传播计算梯度之前对上一次迭代时记录的梯度清零,参数 设置为 时会直接将参数梯度设置为 ,从而减小内存使用, 但通常情况下不建议设置这个参数,因为梯度设置为 和 在 PyTorch 中处理逻辑会不一样。
1.2.5 state_dict() 和 load_state_dict
这两个方法实现序列化和反序列化功能。
- state_dict(): 将优化器管理的参数和其状态信息以 dict 形式返回
- load_state_dict(state_dict): 加载之前返回的 dict,更新参数和其状态
- 两个方法可用来实现模型训练中断后继续训练功能