优化问题是解决形如
的问题, g(x) g ( x ) 是损失函数, h(x) h ( x ) 是正则化约束, X X 是可行域。
我们令
,对 f(x) f ( x ) 已知信息的多少可把这个问题分为
- 2阶问题:已知 f(x) f ( x ) 的函数值、1阶、2阶导数(值、梯度、hessen矩阵)
- 1阶问题:已知 f(x) f ( x ) 的函数值、1阶导数(值、梯度)
- 0阶问题:只知道 f(x) f ( x ) 的函数值(值)
- -1阶问题:只知道 f(x) f ( x ) 的估计值 F[f(x),ξ] F [ f ( x ) , ξ ]
当可行域 X X 为整个空间时,优化问题被成为无约束的最优化问题;当可行域 受到限制时,优化问题被成为有约束的最优化问题。
无约束最优化问题的解法
我们希望得到 minxf(x) m i n x f ( x ) ,我们把 f(x) f ( x ) 泰勒展开可得
1阶问题中用于神经网络的常见算法
当 ∇f(x) ∇ f ( x ) 已知时,我们可知,将 x x 往与 相反的方向走一小步 Δ Δ , f(x+Δ) f ( x + Δ ) 会下降,那么我们可以得到递推公式
η η 为步长大小。观察递推公式,我们可知可以从步长 η η 和梯度 ∇f(xt) ∇ 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’)
添加上步的更新分量到当前,可以一定程度上避免陷入局部最小值或自鞍点。直观的理解就是给运动加上了惯性。与梯度下降相比,加速收敛,提高精度(减少收敛过程中的振荡)。递推公式为
γ γ 一般设置为0.9。
Nesterov Momentum Optimizer
tf.train.MomentumOptimizer(learning_rate, momentum, use_nesterov=True, name=’Momentum’)
添加上步的更新分量到当前,并预测下一时刻的动量来修正。递推公式为