四、优化器Optim
- 优化器基类(Optimizer):pytorch中所有的优化器都是Optimizer的子类
- 定义的常用方法
zero_grad()
step(closure)
state_dict()
load_state_dict(state_dict)
add_param_group(param_group)
- 定义的常用方法
- 参数组(Param_groups)
- optimizer对参数的管理是基于组的概念,可以为每一组参数配置特定的lr,momentum,weight_decay等
- 参数组在optimizer中表现为一个list(self.param_groups),其中每个元素时dict,表示一个参数及其相应配置,在dict中包含’params’、’weight_decay’、’lr’、’momentum’等字段
zero_grad()
- 将梯度清零,由于PyTorch不会自动清零梯度,所以在每一次更新会进行此操作
state_dict()
- 获取模型当前的参数,以一个有序字典形式返回。这个有序字典中,key 是各层参数名,value 就是参数。
load_state_dict(state_dict)
- 将state_dict中的参数加载到当前网络
add_param_group()
- 给optimizer管理的参数组中增加一组参数,可为该组参数定制lr、momentum、weight_decay等
step(closure)
- 执行一步权值更新,其中可传入参数closure(一个闭包)
4.1 torch.optim.SGD
torch.optim.SGD(params, lr, momentum=0, dampening=0, weight_decay=0, nesterov=False)
- SGD 指stochastic gradient descent,即随机梯度下降,随机选取部分数据集参与计算,是梯度下降的 batch 版本
4.2 torch.optim.ASGD
torch.optim.ASGD(params, lr=0.01, lambd=0.0001, alpha=0.75, t0=1000000.0, weight_decay=0)
- ASGD 也称为 SAG,表示随机平均梯度下降(Averaged Stochastic Gradient Descent),简单地说 ASGD 就是用空间换时间的一种 SGD
4.3 torch.optim.Rprop
torch.optim.Rprop(params, lr=0.01, etas=(0.5, 1.2), step_sizes=(1e-06, 50))
- 实现 Rprop 优化方法(弹性反向传播),该优化方法适用于 full-batch,不适用于 mini-batch
4.4 torch.optim.Adagrad
torch.optim.Adagrad(params, lr=0.01, lr_decay=0, weight_decay=0, initial_accumulator_value=0)
- 实现 Adagrad 优化方法(Adaptive Gradient),Adagrad 是一种自适应优化方法,是自适应的为各个参数分配不同的学习率。这个学习率的变化,会受到梯度的大小和迭代次数的影响。梯度越大,学习率越小;梯度越小,学习率越大。缺点是训练后期,学习率过小,因为 Adagrad 累加之前所有的梯度平方作为分母。
4.5 torch.optim.Adadelta
torch.optim.Adadelta(params, lr=1.0, rho=0.9, eps=1e06, weight_decay=0)
- 实现 Adadelta 优化方法。Adadelta 是 Adagrad 的改进。Adadelta 分母中采用距离当前时间点比较近的累计项,这可以避免在训练后期,学习率过小。
4.6 torch.optim.RMSprop
torch.optim.RMSprop(params, lr=0.01, alpha=0.99, eps=1e08, weight_decay=0, momentum=0, centered=False)
- 实现 RMSprop 优化方法,RMS 是均方根(root meam square)的意思。RMSprop 和 Adadelta 一样,也是对 Adagrad 的一种改进。RMSprop 采用均方根作为分母,可缓解 Adagrad 学习率下降较快的问题,并且引入均方根,可以减少摆动
4.7 torch.optim.Adam(AMSGrad)
torch.optim.Adam(params, lr=0.001, betas=(0.9, 0.999), eps=1e08, weight_decay=0, amsgrad=False)
- 实现 Adam(Adaptive Moment Estimation))优化方法。Adam 是一种自适应学习率的优化方法,Adam 利用梯度的一阶矩估计和二阶矩估计动态的调整学习率。Adam 的优点主要在于经过偏置校正后,每一次迭代学习率都有个确定范围,使得参数比较平稳。
4.8 torch.optim.Adamax
torch.optim.Adamax(params, lr=0.002, betas=(0.9, 0.999), eps=1e08, weight_decay=0)
- 实现 Adamax 优化方法。Adamax 是对 Adam 增加了一个学习率上限的概念,所以也称之为 Adamax。
4.9 torch.optim.SparseAdam
torch.optim.SparseAdam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08)
- 针对稀疏张量的一种“阉割版”Adam 优化方法。
4.10 torch.optim.LBFGS
torch.optim.LBFGS(params, lr=1, max_iter=20, max_eval=None, tolerance_grad=1e-05, tolerance_change=1e-09, history_size=100, line_search_fn=None)
- 实现 L-BFGS(Limited-memory Broyden–Fletcher–Goldfarb–Shanno)优化方法。L-BFGS 属于拟牛顿算法。L-BFGS 是对 BFGS 的改进,特点就是节省内存。