阅读须知:前段时间到实验室干活儿,帮学长复现了几篇nlp的论文,花了几天草草了解了下pytorch,本专栏纯属个人理解+笔记,内容未必全面详实,若有详细了解pytorch的需求,建议查阅官方文档。
torch.optim模块中,包含了大部分现在已有的流行的优化方法。
使用:
optimizer=optim.Adam(model.parameters())
创建一个optimizer对象,这个对象会保存当前的状态,并根据梯度更新参数。
作用:
根据网络反向传播的梯度信息来更新网络的参数,以起到降低loss函数计算值,
从优化器的作用出发,要使得优化器能够起作用,需要两个主要东西:
- 优化器需要知道当前使用的是什么模型的参数空间。因此在训练文件中,正式开始训练前,需要把网络的参数放到优化器中。比如:optimizer=optim.Adam(model.parameters())。
- 需要知道反向传播的梯度信息。
使用流程:
首先,在创建优化器对象的时候,要传入网络模型的参数,并设置学习率等优化方法的参数。然后使用函数zero_grad将梯度置为零。接着调用函数backward来进行反向传播计算梯度。最后使用优化器的step函数来更新参数。
1 optimizer=optim.Adam(model.parameters())
2 fot epoch in range(num_epoches):
3 train_loss=0
4 for step,(seq, label) in enumerate(data_loader):
5 # 损失函数
6 loss=criterion(model(seq), label.to(device))
7 # 将梯度清零
8 opimizer.zero_grad()
9 # 损失函数backward进行反向传播梯度的计算
10 loss.backward()
11 train_loss +=loss.item()
12 # 使用优化器的step函数来更新参数
13 optimizer.step()
- SGD及其改进(加Momentum)
- 逐参数适应学习率方法,包括AdaGrad,RMSProp,Adam等
6种算法的介绍以及算法之间的比较:
https://blog.csdn.net/qq_36589234/article/details/89330342
pytorch十种优化函数:
https://blog.csdn.net/shanglianlm/article/details/85019633
参数:
class Adam(Optimizer):
#Implements Adam algorithm.
def __init__(self, params, lr=1e-3, betas=(0.9, 0.999), eps=1e-8,
weight_decay=0, amsgrad=False):
params(iterable)待优化参数的iterable或者是定义了参数组的dict
lr (float,可选):学习率(步长因子),默认le-3=0.001,控制了权重的更新比率.较大的值(如织0.3)在学习率更新前会有更快地初始学习,而较小的值如le-5会令训练收敛到更好的性能。
betas=[beta1,beta2],可选:用于计算梯度以及梯度平方的运行平均值的系数,默认为[0.9,0.999],beta1是一阶矩阵的指数衰减率,beta2是二阶矩阵的指数衰减率,该超参数在稀疏梯度(如在NLP或计算机视觉任务中)应该设置为接近1的数。
eps,epsion:该参数是非常小的数,为了增加数值计算的稳定性而加到分母里的项,默认le-8,为了防止在实现中除以零;
weight_decay,可选:权重衰减,L2乘法,默认0
特点:
1、结合了adagrad善于处理稀疏梯度和RMSprop善于处理非平稳目标的优点;
2、对内存需求较小
3、为不同的参数计算不同的自适应学习率
4、也适用于大多非凸优化--适用于大叔据集和高维空间。