为了应对稀疏特征在训练过程中参数难以更新的问题,各位大牛们提出了自适应学习率的方法。下面就对这些优化算法进行一个学习总结。
-
Adagrad
Adagrad 的核心是加入了一个正则化因子,使得数据较为稀疏的特征的梯度变大,在数据较为稠密的特征的梯度减小,对于不同的参数自动改变梯度的大小。
普通 SGD 的更新公式为:
θ t + 1 i = θ t i − μ ⋅ g t , θ i θ_{t+1}^i = θ_t^i - μ·g_{t,θ^i} θt+1i=θti−μ⋅gt,θi
而在 Adagrad 中加入了正则化因子,更新公式为:
θ t + 1 i = θ t i − ( μ ∑ j = 1 t g j , θ i 2 + ε ) ⋅ g t , θ i θ_{t+1}^i = θ_t^i - (\frac{μ}{\sqrt{\sum_{j=1}^{t}g_{j,θ^i}^2+ε}})·g_{t,θ^i} θt+1i=θti−(∑j=1tgj,θi2+εμ)⋅gt,θi
其中,
∑ j = 1 t g j , θ i 2 + ε \sqrt{\sum_{j=1}^{t}g_{j,θ^i}^2+ε} ∑j=1tgj,θi2+ε 表示对 θ i θ^i θi 前 t t t 次迭代的梯度的平方进行求和, ε ε ε 表示一个无穷小量,为了防止分母为 0;
θ t i θ_t^i θti 代表第 i i i 个参数的第 t t t 次迭代; g t , θ i g_{t,θ^i} gt,θi 代表参数 θ i θ_i θi 的第 t t t 次迭代时的梯度;
此时学习率变为: μ ∑ j = 1 t g j , θ i 2 + ε \frac{μ}{\sqrt{\sum_{j=1}^{t}g_{j,θ^i}^2+ε}} ∑j=1tgj,θi2+εμ,我们来看一下它是如何对学习速率进行调整的:
对于数据稀疏的特征来讲,参数每次迭代更新的梯度始终非常小,几乎为 0,那么之前轮次的梯度的和依然很小,当 μ μ μ 除以一个很小的数时值会得到放大,那么此时他的学习速率就变大了。
对于数据稠密的特征来讲,参数每次迭代更新的梯度较大,那么之前轮次的梯度的和会较大,当 μ μ μ 除以一个较大的数时值会得到缩小,那么此时他的学习速率就变小了。
(这种分母求和的形式实现了退火过程)。
所以他可以对于不同的参数以不同的学习速率进行更新,得到了自适应的效果。
但是它仍然存在问题,分母为前几次的累加和,那么在经过一定次数的迭代后分母的值会变的较大,不管是对于稀疏还是稠密的特征,它们的学习速率都会变得很小,会使得更新速度停滞,不得不提前结束训练。
为了解决这个问题,人们提出了 RMSprop 方法。
-
RMSprop
值得注意的是,RMSprop 与 AdaDelta 是同一种方法。
对于 Adagrad 的问题,RMSprop 将分母梯度累加的形式替换成了 RMS(Root Mean Square),即均方根。
均方根的增长速度要比梯度累加要慢,所以可以进行更多次的迭代,不至于早早结束训练。
RMSprop 的更新公式为:
θ t + 1 i = θ t i − ( μ E [ g t , θ i 2 ] + ε ) ⋅ g t , θ i θ_{t+1}^i = θ_t^i - (\frac{μ}{\sqrt{E[g_{t,θ^i}^2]}+ε})·g_{t,θ^i} θt+1i=θti−(E[gt,θi2]+εμ)⋅gt,θi
E [ g t , θ i 2 ] + ε {\sqrt{E[g_{t,θ^i}^2]}+ε} E[gt,θi2]+ε 为新的正则化因子。
其中,
E [ g t , θ i 2 ] = p ⋅ 1 t − 1 ⋅ ∑ j = 1 t − 1 g t − 1 , θ i 2 + ( 1 − p ) ⋅ g t , θ i 2 = p ⋅ E [ g t − 1 , θ i 2 ] + ( 1 − p ) ⋅ g t , θ i 2 \begin{aligned} E[g_{t,θ^i}^2]=&p·\frac{1}{t-1}·\sum_{j=1}^{t-1}g_{t-1,θ^i}^2+(1-p)·g_{t,θ^i}^2\\ =&p·E[g_{t-1,θ^i}^2]+(1-p)·g_{t,θ^i}^2 \end{aligned} E[gt,θi2]==p⋅t−11⋅j=1∑t−1gt−1,θi2+(1−p)⋅gt,θi2p⋅E[gt−1,θi2]+(1−p)⋅gt,θi2
当 p = 0.5 p=0.5 p=0.5 时, E [ g t , θ i 2 ] E[g_{t,θ^i}^2] E[gt,θi2] 为前 t t t 次梯度的均值。
E [ g t , θ i 2 ] E[g_{t,θ^i}^2] E[gt,θi2] 这种形式:对变量平方求期望的形式也称为二阶矩(对变量求期望的形式称为一阶矩)。
由此,分母的正则化因子不会过快的增长,所以又可以继续训练了。
从经验上来讲,参数可以如此设定: ε = 0.001 , p = 0.9 ε=0.001,p=0.9 ε=0.001,p=0.9
-
Adam
接下来总结一下 Adam 方法,这种方法像是 RMSprop + Momentum。
式子中 i i i 是为了区别不同的参数 θ i \theta_i θi.
m t i = β 1 m t − 1 i + ( 1 − β 1 ) g t , θ i m_t^i = \beta_1m_{t-1}^i+(1-\beta_1)g_{t,\theta_i} mti=β1mt−1i+(1−β1)gt,θi
v t i = β 2 v t − 1 i + ( 1 − β 2 ) g t , θ i 2 v_t^i = \beta_2v_{t-1}^i+(1-\beta_2)g_{t,\theta_i}^2 vti=β2vt−1i+(1−β2)gt,θi2
m t i m_t^i mti 是一阶矩,是对 E [ g t , θ i ] E[g_{t,\theta_i}] E[gt,θi] 的估计,相当于 Momentum;
v t i v_t^i vti 是二阶矩,是对 E [ g t , θ i 2 ] E[g_{t,\theta_i}^2] E[gt,θi2] 的估计,相当于 RMSprop;
为了考虑 m t i , v t i m_t^i,v_t^i mti,vti 在 0 初始值的情况,Adam 加入了偏差校正:
m t i ^ = m t i 1 − β 1 t \hat{m_t^i}=\frac{m_t^i}{1-\beta_1^t} mti^=1−β1tmti
v t i ^ = v t i 1 − β 2 t \hat{v_t^i}=\frac{v_t^i}{1-\beta_2^t} vti^=1−β2tvti
使得 m t i ^ , v t i ^ \hat{m_t^i},\hat{v_t^i} mti^,vti^ 近似为对 E [ g t , θ i ] , E [ g t , θ i 2 ] E[g_{t,\theta_i}],E[g_{t,\theta_i}^2] E[gt,θi],E[gt,θi2] 的无偏估计。
注意:这里的 β 1 t , β 2 t \beta_1^t,\beta_2^t β1t,β2t 是指 β 1 , β 2 \beta_1,\beta_2 β1,β2 的 t t t 次方!
最终 Adam 的更新公式为:
θ t + 1 i = θ t i − ( μ v t i ^ + ε ) ⋅ m t i ^ θ_{t+1}^i = θ_t^i - (\frac{μ}{\sqrt{\hat{v_t^i}+ε}})·\hat{m_t^i} θt+1i=θti−(vti^+εμ)⋅mti^
从经验上来讲,参数可以如此设定: β 1 = 0.9 , β 2 = 0.999 , ϵ = 1 0 − 8 β_1=0.9,β_2=0.999,ϵ=10^{−8} β1=0.9,β2=0.999,ϵ=10−8
在以上算法对稀疏数据的学习效果较好。
Adam 为最常用的优化算法,收敛较快。