优化问题综述(一)无约束最优化问题的解法中用于神经网络的常见算法

优化问题是解决形如

m i n x g ( x ) + h ( x ) , s . t . , x X

的问题, g ( x ) 是损失函数, h ( x ) 是正则化约束, X 是可行域。
我们令 f ( x ) = g ( x ) + h ( x ) ,对 f ( x ) 已知信息的多少可把这个问题分为

  • 2阶问题:已知 f ( x ) 的函数值、1阶、2阶导数(值、梯度、hessen矩阵)
  • 1阶问题:已知 f ( x ) 的函数值、1阶导数(值、梯度)
  • 0阶问题:只知道 f ( x ) 的函数值(值)
  • -1阶问题:只知道 f ( x ) 的估计值 F [ f ( x ) , ξ ]

当可行域 X 为整个空间时,优化问题被成为无约束的最优化问题;当可行域 X 受到限制时,优化问题被成为有约束的最优化问题。

无约束最优化问题的解法

我们希望得到 m i n x f ( x ) ,我们把 f ( x ) 泰勒展开可得

f ( x + Δ ) = f ( x ) + f ( x ) T Δ + Δ T 2 f ( x ) Δ + O ( Δ 3 )

1阶问题中用于神经网络的常见算法

f ( x ) 已知时,我们可知,将 x 往与 f ( x ) 相反的方向走一小步 Δ f ( x + Δ ) 会下降,那么我们可以得到递推公式

x t + 1 = x t η f ( x t )

η 为步长大小。观察递推公式,我们可知可以从步长 η 和梯度 f ( x t ) 进行优化。

Gradient Descent Optimizer

tf.train.GradientDescentOptimizer(learning_rate, name=’GradientDescent’)

最朴素的算法,直接利用梯度递推公式进行优化,步长可为定值或指数衰减。
他的缺点很明显:

  • 很难选择出合适的学习率
  • 相同的学习率并不适用于所有的参数
  • 在神经网络中,非凸问题关键是要避免陷入局部最小值或自鞍点,梯度下降法并不能很好的解决

Momentum Optimizer

tf.train.MomentumOptimizer(learning_rate, momentum, use_nesterov=False, name=’Momentum’)

添加上步的更新分量到当前,可以一定程度上避免陷入局部最小值或自鞍点。直观的理解就是给运动加上了惯性。与梯度下降相比,加速收敛,提高精度(减少收敛过程中的振荡)。递推公式为

V ( t ) = γ V ( t 1 ) + ( 1 γ ) f ( x t )

x t + 1 = x t η V ( t )

γ 一般设置为0.9。

Nesterov Momentum Optimizer

tf.train.MomentumOptimizer(learning_rate, momentum, use_nesterov=True, name=’Momentum’)

添加上步的更新分量到当前,并预测下一时刻的动量来修正。递推公式为

V ( t ) = γ V ( t 1 ) + ( 1 γ ) f ( x t η V ( t 1 ) )

x t + 1 = x t η V ( t )

Adagrad

tf.train.AdagradOptimizer(learning_rate, initial_accumulator_value=0.1, name=’Adagrad’)

对稀疏参数(例如神经网络中有些激活函数激活的概率很低,那相应通路上的参数就很难进行更新)进行大幅更新和对频率参数小幅更新,适合处理稀疏数据。递推公式:

x t + 1 , i = x t , i η G t , i + ϵ g t , i , G t , i = τ = 1 t g τ , i 2

g t , i 是梯度的第 i 个分量。梯度较大的减小步长,防止跑过,梯度较小增加步长,加速。缺点步长总是在衰减。
直观的理解各分量步长不同可以想象优化的loss函数等高线并不是一个球,而是一个椭球,当然最快的下降线路并不是沿等高线的法线(梯度方向),而是有个偏斜,Adagrad就是解决这个问题的。

Adadelta

tf.train.AdadeltaOptimizer(learning_rate=0.001, rho=0.95, epsilon=1e-08, name=’Adadelta’)

训练初中期,加速效果很好,后期会抖动,不需要设置步长。递推公式为:

G t , i = γ G t 1 , i + ( 1 γ ) g τ , i 2

x t + 1 , i = x t , i τ = 1 t Δ x τ , i 2 G t , i + ϵ g t , i

Adadelta的直观理解是使得更新的 Δ x 的量纲与 x 相同,而且 g τ , i 2 G t , i 的影响指数衰减,所以采用这种形式。

RMSprop

tf.train.RMSPropOptimizer(learning_rate, decay=0.9, momentum=0.0, epsilon=1e-10, name=’RMSProp’)

与Adadelta对于 G t , i 处理想法相同, g τ , i 2 G t , i 的影响指数衰减。

G t , i = 1 2 G t 1 , i + 1 2 g τ , i 2

x t + 1 , i = x t , i η G t , i + ϵ g t , i

Adam

tf.train.AdamOptimizer(learning_rate=0.001, beta1=0.9, beta2=0.999, epsilon=1e-08, name=’Adam’)

相当于给梯度加入了动量。

梯度的一阶矩估计: m t = μ m t 1 + ( 1 μ ) g t
梯度的二阶矩估计: n t = μ n t 1 + ( 1 γ ) g t 2
校正: m ^ t = m t 1 μ t , n ^ t = n t 1 γ t
校正的原因是因为初始时 m t = n t = 0 m t 会偏小,放大修正。
递推公式: x t + 1 = x t α m ^ t n ^ t + ϵ

Adam的变体

Adamax: n t = m a x ( γ n t 1 , | g t | ) , x t + 1 = x t α m ^ t n t + ϵ
对梯度的学习率范围有了更好的约束

Nadam:带有Nesterov动量项的Adam
梯度: g ^ t = g t 1 μ t
梯度的一阶矩估计: m t = μ m t 1 + ( 1 μ ) g t , m ^ t = m t 1 μ t , m ¯ t = ( 1 μ ) g ^ t + μ m ^ t
梯度的二阶矩估计: n t = μ n t 1 + ( 1 γ ) g t 2 , n ^ t = n t 1 γ t
递推公式: x t + 1 = x t α m ¯ t n ^ t + ϵ

Adam+GD

由于GD一般训练时间更长,容易陷入鞍点, 但在好的初始化和学习率调度方案下,结果更可靠。
更为复杂的方法收敛速度快,但是在最优点附近没有GD收敛的效果好。
那么我们可以先Nadam到最优点附近,再切换SGD,具体做法是
先用Nadam进行优化,每隔150步学习速率衰减10倍,计算Nadam及等效学习速率,当学习速率几乎不变时,切换GD,GD的学习速率为Nadam此时的等效学习速率。

  • Inputs: Objective function f , initial point θ 0 , learning rate α = 10 3 , accumulator
    ( β 1 , β 2 ) = ( 0.9 , 0.999 ) , ϵ = 10 9 , phase=Adam
  • Initialize: k = 0 , m 0 = 0 , n 0 = 0 , λ 0 = 0
  • while stopping criterion not met do
    • k = k + 1
    • Compute stochastic gradient g k = f ( θ k 1 )
    • If phase=SGD then
      • v k = β 1 v k 1 + g k
      • θ k = θ k 1 ( 1 β 1 ) η v k
      • continue
    • End if
    • m k = β 1 m k 1 + ( 1 β 1 ) g k
    • α k = β 2 α k 1 + ( 1 β 2 ) g t 2
    • p k = α k 1 β 2 k 1 β 1 k m k α k + ϵ
    • if p k T g k 0 then
      • γ k = p k T p k p k T g k
      • λ k = β 2 λ k 1 + ( 1 β 2 ) γ k
      • if k > 1 and | λ k 1 β 2 2 λ k 1 | < ϵ then
        • phase = SGD
        • $v_k=0
        • η = λ k 1 β 2 2
      • end if
    • else
      • λ k = λ k 1
    • end if
  • end while
  • return θ k

一般形式

梯度的一阶矩估计: m t
梯度的二阶矩估计: n t
递推公式: x t + 1 = x t α m t n t + ϵ

两招加速:动量(Nesterov),二阶矩

可视化

可视化

加了二阶矩的优化算法看起来比只加动量的从收敛速度和最终精度来看,都要好一些。

tf中的其他Optimizer

tf.train.SyncReplicasOptimizer # 多个Optimizer同步
tf.train.FtrlOptimizer # FTRL算法,加L1正则的感觉
tf.train.ProximalGradientDescentOptimizer # 加L1,L2正则
tf.train.ProximalAdagradOptimizer # 加L1,L2正则

猜你喜欢

转载自blog.csdn.net/SrdLaplace/article/details/82221493
今日推荐