作为系列的第一篇文章,本文介绍Pytorch中的SGD、ASGD、Rprop、Adagrad,其中主要介绍SGD和Adagrad。因为这四个优化器出现的比较早,都存在一些硬伤,而作为现在主流优化器的基础又跳不过,所以作为开端吧。
我们定义一个通用的思路框架,方便在后面理解各算法之间的关系和改进。首先定义待优化参数 ,目标函数,学习率为 ,然后我们进行迭代优化,假设当前的epoch为,参数更新步骤如下:
计算目标函数关于当前参数的梯度:
(1)
- 根据历史梯度计算一阶动量和二阶动量:
(2)
(3)
计算当前时刻的下降梯度:
(4)
- 根据历史梯度计算一阶动量和二阶动量:
根据下降梯度进行更新:
(5) 下面介绍的所有优化算法基本都能套用这个流程,只是式子(4)的形式会有变化。
一、 torch.optim.SGD 随机梯度下降
该类可实现 SGD 优化算法,带动量 的SGD 优化算法和带 NAG(Nesterov accelerated gradient)的 SGD 优化算法,并且均可拥有 weight_decay(权重衰减) 项。