优化问题是解决形如
的问题,g(x)g(x)是损失函数,h(x)h(x)是正则化约束,XX是可行域。
我们令
,对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),ξ]
当可行域XX为整个空间时,优化问题被成为无约束的最优化问题;当可行域 受到限制时,优化问题被成为有约束的最优化问题。
无约束最优化问题的解法
我们希望得到minxf(x)minxf(x),我们把f(x)f(x)泰勒展开可得
1阶问题中用于神经网络的常见算法
当∇f(x)∇f(x)已知时,我们可知,将xx往与 相反的方向走一小步ΔΔ,f(x+Δ)f(x+Δ)会下降,那么我们可以得到递推公式
ηη为步长大小。观察递推公式,我们可知可以从步长ηη和梯度∇f(xt)∇f(xt)进行优化。
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’)
添加上步的更新分量到当前,并预测下一时刻的动量来修正。递推公式为