优化器的进化
训练一个policy gradient模型时,发现如果使用SGD,模型练不起来,很容易就出问题,而使用Adam则会好很多,这里回顾一下Adam的原理:
梯度下降法的梯度迭代公式为:
\[ θ_t ← θ_{t-1} – μg_t \]
其中 \( g_t \) 为t时刻函数对θ的偏导,μ为学习率。
如此一来,在模型训练时就需要指定μ这个超参数,且模型中所有的参数将以一个恒定不变且相等的学习率进行更新。这样其实有两个缺点:
- 模型在训练初期梯度一般较大,而在末期一般较小,那么学习率设置得过小就会收敛很慢,而设置过大则可能在局部最优点左右横跳
- 不同的特征对模型的重要性不同,例如对于稀疏特征矩阵来说,那些趋近于0的位置表示与特征相关性较低,那么它们的梯度一般来说也较低,假如使用同样的学习率来更新这个参数的话,可能更新得很慢,比较浪费计算资源。
为了解决上述问题一,可以使用程序自动设置学习率,为了解决问题二,可以给每个参数单独设置一个学习率。两者结合可以得到新的迭代公式:
\[ θ_t ← θ_{t-1} – \frac {μ}{η(g_w)}g_t \]
发现学习率下多除了一个 \( η(g_w) \),它是学习参数w的函数,如此一来,每个参数都有单独的学习率了(仍然需要指定一个基础学习率μ,但它不用那么小心的选值了)
进一步地,Adagrad算法使用参数w的历史梯度来确定这个\( η(g_w) \):
\[ θ_t ← θ_{t-1} – \frac {μ}{\sqrt {\sum_{k=0}^t {G_w}_k+ε}}g_t \]
其中,\( \sum_{k=0}^t {G_w}_k \) 是t时刻之前,w参数的所有梯度平方和,ε是一个很小的数防止除0
如此一来,如果一个参数w的历史梯度越大,它的学习率就越小(这是符合直觉的,历史梯度越大,则说明这个参数代表的特征越重要,对于这种重要的特征,更新起来应该慎重,步步为营。而那些历史梯度小的参数,则应该避免无用地更新,最好能用大的学习率直接一步到位)
但这还是会出现之前所说的问题,一个参数的梯度是在动态变化的,可能开始很大,后面就很小了,那么如果一股脑使用所有的历史梯度来评估下一次的学习率,还是有些不太合适,如果仅用当前时刻t的前k步的历史梯度可能会好一点,但这样又缺乏对过往梯度的全面考量,如此一来 RMSProp 出现了,它引入了一个折扣因子的概念,让之前的历史梯度都乘以一个折扣因子α的 n 次方,这里的n就是历史梯度与当前时刻的时间跨度:
\[ θ_t ← θ_{t-1} – \frac {μ}{\sqrt {\sum_{k=0}^t α^{t-k}{G_w}_k+ε}}g_t \]
如此一来,对于学习率这个超参数的自动化调整就很好了,adam更进一步,加上了 Momentum 的方法:让当前梯度的更新增量不仅依赖于梯度的计算结果,还依赖于前一步梯度更新的结果,比如前一步更新的梯度很大,但计算这一步的梯度却很小,那如果仅仅让梯度更新很小一步可能并不合适,如果一个人考试,之前一直考得很好,突然一次没考好,你并不能认为这次没考好就是他的真实成绩,所以在梯度更新时,让它当前时刻的更新再加上上一时刻的更新,有时可以较小收敛到局部最优的概率。
\[ θ_t ← θ_{t-1} – μ_{w}g_t + λm_t \ WHERE \ m_t = λm_{t-1} – μ_{w}g_{t-1} \]
所以,Adam=Monentum + RMSProp
什么是收敛
早期认为模型收敛实际上是走到了极值点附近,然后模型会在极值点左右反复震荡,模型不再更新,但实际上这种想法是错误的。
现在几乎所有的模型所说的收敛,都是收敛在鞍点附近,之所以模型不再更新,是因为这个鞍点特别平坦,特别大,模型想要走出这片区域需要耗费很长时间(梯度很小),而在此之前,我们就认为模型收敛而停止训练了

为什么呢?这是人的惯性思维导致的认知错误,在三维空间下,很容易想象出一个坑坑洼洼的曲面,这些坑有些深有些浅,而我们则认为使用梯度下降法很容易陷入到其中某个小坑去——即使它不是最深的坑。但实际上在多维空间中,鞍点要远远多于极值点(n个数量级的多),而鞍点附近的一阶偏导数也是接近0的,所以模型更有可能跑到鞍点上。
为什么高维空间下鞍点远多于极值点?假设参数空间中有k个一阶导数为0的点,假设其中1/2的点二阶导数大于0(即极小值点),则其中有\( (1/2)^k \)个极小值点,而剩下的\( 1 – (1/2)^k \)都是鞍点,可想而知,鞍点的数量是远大于极值点的
参考:
https://blog.csdn.net/bu_fo/article/details/119888296
https://zhuanlan.zhihu.com/p/29920135
https://www.zhihu.com/question/68109802