优化算法总结

SGD(Stochastic Gradient Descent):随机梯度下降,每一次计算mini-batch的平均梯度,然后更新参数

降低方差类

SAG(Stochastic Average Gradient):随机平均梯度,该算法的梯度更新公式为:
w k + 1 = w k − α k k ∑ j = 1 k g i j ( w j ) w^{k+1}=w^{k}-\frac{\alpha_{k}}{k} \sum_{j=1}^{k} g_{i_{j}}(w^{j}) wk+1=wkkαkj=1kgij(wj)
不同于SGD,SAG额外记录了一张以往的梯度更新表,在迭代的过程中,不断地记录当前参数下的梯度,且在当前步进行参数更新时,选取的梯度是过去所记录的所有梯度的平均值。

SVRG(Stochastic Variance Reduction Gradient):随机方差下降,该算法旨在减小梯度的方差,其梯度更新公式如下:
w k = w k − 1 − α ( g i ( w k − 1 ) − g i ( w ~ ) + μ ~ ) w^{k}=w^{k-1}-\alpha (g_{i}(w^{k-1})-g_{i}(\tilde{w})+\tilde{\mu}) wk=wk1α(gi(wk1)gi(w~)+μ~)
其伪代码为:
优化算法总结_第1张图片

相比于SAG,SVRG不需要存储以往的所有梯度,而是只需要记录上一次的梯度 w ~ \tilde{w} w~,因此减少了内存消耗,但是在每一个阶段,SVRG都需要计算一次全局平均梯度 μ ~ \tilde{\mu} μ~,增大了计算量。

增加收敛速率类

Momentum:考虑物理学中的动量,将之前的梯度数据也参与到当前的梯度计算中,可以加快收敛速度,其迭代公式为:
v k = γ v k − 1 − α g ( w k − 1 ) w k = w k − 1 + v k v_{k}=\gamma v_{k-1} - \alpha g(w_{k-1})\\ w_{k}=w_{k-1}+v_{k} vk=γvk1αg(wk1)wk=wk1+vk
其中 v 0 v_{0} v0初始为0,动量系数 γ \gamma γ一般设置为0.9。动量系数大于1,则会发生梯度爆炸;动量系数太接近于1,历史梯度方向对梯度更新方向的影响会过大,若方向发生转折,就无法快速的转弯;动量系数过小,则收敛速度较慢。

NAG(Nesterov’s Accelerated Gradient):该算法相比于Momentum多了一个“超前”的眼光,即每一步迭代都先按照历史梯度(动量)的方向超前走一步,然后计算该“超前点”的梯度来作为该步的当前梯度。其迭代公式为:
v k = γ v k − 1 − α g ( w k − 1 + γ v k − 1 ) w k = w k − 1 + v k v_{k}=\gamma v_{k-1}-\alpha g(w_{k-1}+\gamma v_{k-1})\\ w_{k}=w_{k-1}+v_{k} vk=γvk1αg(wk1+γvk1)wk=wk1+vk
Adagrad(Adaptive Gradient):自适应梯度算法,该算法能够在训练中自动对学习率进行调整。其迭代公式为:
w i k + 1 = w i k − α G i , t + ϵ g i ( w k ) w_{i}^{k+1}=w_{i}^{k}-\frac{\alpha}{\sqrt{G_{i, t}}+\epsilon} g_{i}(w^{k}) wik+1=wikGi,t +ϵαgi(wk)
t t t代表每一次迭代, ϵ \epsilon ϵ一般是一个极小值常数,用来防止分母为0。 G i , t G_{i,t} Gi,t表示了前 t t t个迭代步参数 w i w_{i} wi梯度的平方累加。把之前的梯度累加的平方根作为正则项,其作用为:训练前期,正则项较小,则放大了梯度,加速了梯度下降过程;训练后期,正则项较大,缩小了梯度,减慢了梯度下降过程。

Adam(Adaptive Moment Estimation):该算法可以看作是RMSprop和Momentum的结合,其迭代公式为:
m k = β 1 m k − 1 + ( 1 − β 1 ) g ( w k ) v k = β 2 v k − 1 + ( 1 − β 2 ) [ g ( w k ) ] 2 M k = m k 1 − β 1 k ( β 1 k 中 的 k 为 k 次 方 的 意 思 ) V k = v k 1 − β 2 k ( β 2 k 中 的 k 为 k 次 方 的 意 思 ) w k = w k − 1 − α V k + ϵ M k m^{k} = \beta_{1} m^{k-1} + (1 - \beta_{1}) g(w^{k})\\ v^{k} = \beta_{2} v^{k-1} + (1 - \beta_{2}) [g(w^{k})]^{2}\\ M^{k} = \frac{m^{k}}{1 - \beta_{1}^{k}}\quad(\beta_{1}^{k}中的k为k次方的意思)\\ V^{k} = \frac{v^{k}}{1 - \beta_{2}^{k}}\quad(\beta_{2}^{k}中的k为k次方的意思)\\ w^{k} = w^{k-1} - \frac{\alpha}{\sqrt{V^{k}} + \epsilon}M^{k} mk=β1mk1+(1β1)g(wk)vk=β2vk1+(1β2)[g(wk)]2Mk=1β1kmk(β1kkk)Vk=1β2kvk(β2kkk)wk=wk1Vk +ϵαMk
实现代码为:
优化算法总结_第2张图片

Adam利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率,在经过偏置的校正后,每一次迭代后的学习率都有个确定的范围,使得参数更新较为平稳。

你可能感兴趣的:(算法,机器学习,人工智能)