优化指的是改变 x x 以最大化或最小化某个函数 f(x) f ( x ) 的任务.我们通常以最小化 f(x) f ( x ) 指代大多数的最优化问题,最大化可以通过最小化 −f(x) − f ( x ) 来实现。
目标函数(objective function)
或者准则(criterion)
。在机器学习领域众多优化算法中,基于梯度的优化算法,是比较常用的一类。
首先,回忆一下微积分中 导数,偏导数,方向导数与梯度的关系。
对于一个一元函数 y=f(x) y = f ( x ) , 梯度就是导数。
函数在某一点的导数 f′(x) f ′ ( x ) 表示的是点 x x 处的斜率,它表明了输入的微小变化如何影响输出的变化: f(x+ε)≈f(x)+εf′(x) f ( x + ε ) ≈ f ( x ) + ε f ′ ( x ) 。导数对我们很有用,因为它可以告诉我们如何更改 x x 来略微的改善 y y , 具体而言,我们想要找到 y y 的最小值,沿着导数的负方向移动一个足够小的 ε ε , 得到的 f(x−ε(f′(x))) f ( x − ε ( f ′ ( x ) ) ) 肯定是比 f(x) f ( x ) 要小的,我们就这样沿着导数的负方向一步一步挪来减小 f(x) f ( x ) , 去接近最低点。这种技术就是 梯度下降(gradient descent)
。
当 f′(x)=0 f ′ ( x ) = 0 时,导数无法提供往哪个方向移动的信息,这样的点被称为临界点(critical point)
或者驻点(stationary point)
。一个临界点,可能是一个 局部极小点(local minimum)
, 也可能是一个 局部极大点(local maximum)
, 还有一类是既不极大也不极小,而是一边极大一边极小的鞍点(saddle point)
.
梯度下降法可以找到局部最小点,但我们的目标是找到函数定义域上的全局最小点(global minimum)
。 函数本身可能有一个也可能有多个全局最小点,也有可能存在不是全局最优的全局极小点,更确切地说,在深度学习领域中,我们要优化的目标函数可能含有许多不是最优的全局极小点,或者还有很多处于非常平坦区域的鞍点。尤其是当输入是多维的情况下,所有这些情况会使得优化变得非常困难。我们通常寻找使得 f(x) f ( x ) 非常小的点,不一定是那个精准的全局最小点,但是它足够小,已经满足我们的要求。
以上说了一维的情况了解概况,但是在实际中我们经常最小化的是具有多维输入的函数 f:Rn→R f : R n → R . 为了使得最小化
的概念有意义,我们必须保证输出是一个标量。
这时候我们就要用到 偏导数,方向导数和梯度的概念。之前我们已经知道,梯度向量指向上坡,负梯度方向指向下坡。我们在负梯度方向上移动 x x 可以减小 y y .这被称为 最速下降法(method of steepest descent)
或 梯度下降(gradient descent)
. 应用最速下降法,在 x x 点处建议的下一个更新的点是 x′=x−ε∇xf(x) x ′ = x − ε ∇ x f ( x ) . 其中 ε ε 是 学习率(learning rate)
, 是一个确定移动步长大小的正标量
。 ε ε 的选择是一个技术活儿,有几种不同的策略来找到最佳的 ε ε .
最速下降法在梯度的每一个元素都为 0 0 的时候收敛(或者在实践中,很接近 0 0 时)。 在有些情况下,我们也许能够避免运行迭代求解,而是通过解方程 ∇xf(x)=0 ∇ x f ( x ) = 0 直接跳到临界点。
以上说的梯度下降法,都是针对连续空间中的优化问题,但是其背后的解决问题的思路 – 不断地向更好的情况移动一小步
–可以拓展到离散空间。 例如,递增带有离散参数的目标函数被称作爬山算法(hill climbing)
.