另一个问题,就是针对性处理对结果影响更大/更小的权重,让重要的迭代的迭代更谨慎,而不重要的获得更快衰减。以保证优势权重,剔除不必要影响。
自适应梯度算法(AdaGrad/AGA [Adaptive Gradient Algorithm])
迭代公式:
gt,iGt,iθt+1,i=∇θJ(θi)=τ=1∑tgτ,i2=θt,i−Gt,i+ϵη˙gt,i 以 Gt,i 为当前索引为 [i] 的参数,所对应从 1 到时刻 t 的 所有梯度平方和。
自适应梯度算法(AdaGrad/AGA [Adaptive Gradient Algorithm]) 是将 SGD 的统一学习速率修改为,有一定预测成分在内的,参数对应独立更新的处理方式。这样处理的好处是,每一个不同参数都会根据当前自身变化和总模型结果关系的差异,独立的进行变更,变化大的会更快,变化小的会更慢。减少了手动调节学习速率的次数。
缺点也比较明显:
前期需手工设置一个全局的初始学习率,过大值会导致惩罚变化不明显,过小会提前停止
中后期自适应分母会不断累积导致学习速率不断收缩,趋于非常小从而可能提前结束训练
因此,我们有了改进版 RMSprop 法。
均方根传播法(RMSprop)
迭代公式:
gt,iΔθt,iθt+1,i=∇θJ(θi),E[g2]t,i=γE[g2]t−1,i+(1−γ)gt,i2=−E[g2]t,i+ϵηgt,i=−RMS[g]t,iηgt,i=θt,i+Δθt,i=θt,i−E[g2]t,i+ϵηgt,i 以 E[g2]t,i 为当前索引为 [i] 的参数,所对应从 1 到时刻 t 的所有梯度均方和,有:
RMS[g]t,i=E[g2]t,i+ϵ 因为学习速率变化采用的是 梯度均方和(RMS)。所以,某一维度变化较大时,RMS 较大;变化较小时,RMS 较小。这样就保证了各个维度的变化速率是基于同一个变化量级的,同时也避免了 AdaGrad 中后期的学习速率极速下降,过早停止的问题。而且,因为 RMS 采用近似算法,极大降低了内存消耗(毕竟不需要记录每一次的迭代值了)
不过,RMSprop 可以看出,仍然依赖于全局学习速率 的设定,那么是否能够继续改进不依赖呢?
如果对比两个方法的过程中单位差异,或许能找到答案。
AdaGrad 和 RMSprop 单位问题
我们知道,很多单位是有实际价值的。比如是米(meter),天(day)等,就有具体物理含义。所以,对于迭代使用的加速度 Δθt ,一个很自然的期望是,的单位和是保持一致的。
但是:
Δx∝g∝∂x∂f∝x1 有 Δx 和 g 为同单位,而与 x 的单位互逆。即 x−1 表示的瞬时变化才与 Δx 和 g 为同单位。
也就是说,对于 AdaGrad 和 RMSprop 来说,Δθt 权重变化量最终得到的结果,其单位和 θt 单位并不一致,而是对应时间单位的倒数。而我们要的 权重 θt 是时间单位的。
如果我们用牛顿法使 Δx=Ht−1gt , Ht 为 Hessian 矩阵,即所有参数指定 t 时刻二阶偏导数方阵,有:
Δx∝H−1g∝∂2x∂2f∂x∂f∝x1 上述变化后,便能将 x 、 Δx 和 g 单位一致化。但是 Hessian 矩阵计算量太大,我们没办法直接使用。所以,我们还需要模拟退火牛顿法,有:
Δx=∂2x∂2f∂x∂f⇒Δxt=−E[g2]t+ϵ∑τ=1t−1Δxτ 上式在 ∞ 位置近似等价。
如此,既可以保证单位,又能简化运算。同时我们发现,Δθt 的更新在这种拟合下,后续迭代不再依赖于全局学习速率 η 。
于是,便有了 AdaDelta 算法。
自适应梯度算法改进版(AdaDelta/ADGA [Adaptive Delta Gradient Algorithm])
迭代公式:
gt,iΔθt,iθt+1,i=∇θJ(θi),E[g2]t,i=γE[g2]t−1,i+(1−γ)gt,i2=−RMS[g]t,iRMS[Δθ]t−1,igt,i=θt,i+Δθt,i=θt,i−RMS[g]t,iRMS[Δθ]t−1,igt,i 以 E[g2]t,i 为当前索引为 [i] 的参数,所对应从 1 到时刻 t 的所有梯度均方和,有:
RMS[g]t,i=E[g2]t,i+ϵ 相较于前两种,AdaDelta 具有优势:
结合了 AdaGrad 善于处理稀疏梯度和 RMSprop 善于处理非平稳目标的优点
是一种相对理想的,针对强弱重点的梯度优化算法了。
目前,我们所有的处理方式都是秩针对性的解决单一问题。那么有没有什么方法,可以结合两类的优点呢?既解决鞍点,又能自适应学习速率呢?
当然有,那就是 Adam 自适应实时评估算法。
Last updated