- 地址:
- 海南省海口市
- 邮箱:
- admin@youweb.com
- 电话:
- 0898-08980898
- 传真:
- 1234-0000-5678
?
Adam优化算法(Ada optimization algorithm),
在深度学习的历史上,包括许多知名研究者在内,提出了优化算法,并很好地解决了一些问题。Adam优化算法基本上就是将momentum和rmsprop结合在一起,那么来看看如何使用Adam算法。Adam代表的是adaptive moment estimation,本质上是带有动量项的RMSprop,它利用梯度的一阶矩阵估计和二阶矩估计动态调整每个参数的学习率。它的优点主要在于经过偏置校正后,每一次迭代学习率都有个确定范围,使得参数比较平稳。
Adam函数实现在torch.optim.adam.py
参数:
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、也适用于大多非凸优化--适用于大叔据集和高维空间。
在深度学习中根据不同优化算法有不同的优化器optimzier,其作用就是根据网络反向传播的梯度信息来更新网络的参数,以起到降低loss函数计算值,这也是机器学习里面最一般的方法论。
从优化器的作用出发,要使得优化器能够起作用,需要两个主要东西:
1、优化器需要知道当前的网络或者别的什么模型的参数空间,这也就是为什么在训练文件中,正式开始训练之前需要将网络的参数放到优化器中,比如使用pytorch的话总会出现类似如下的代码:
2、需要知道反向传播的梯度信息,我们还是从代码入手,如下所示是pytorch中SGD优化算法的step()函数具体写法
从上面的代码可以看到step()这个函数使用的是参数空间(param_groups)中的grad,也就是当前参数空间对应的梯度,这也解释了为什么optimzier使用之前需要zero清零一下,如果不清零,那么使用的这个grad就得通上一个mini-batch有关,这不是我们需要的结果。再回过头来看,我们知道optimizer更新参数空间需要基于反向梯度,因此,当调用optimizer.step()的时候应当是loss.backward()的时候,
loss.backward()在前,然后跟一个step.
那么为什么optimizer.step()需要放在每一个batch训练中,而不是epoch训练中,这是因为现在的mini-batch训练模式是假定每一个训练集就只有mini-batch这样大,因此实际上就可以将每一次mini-batch看作是一次训练,一次训练更新一次参数空间,因而optimizer.step()放在这里。只有用了optimizer.step(),模型才会更新
?