Wang Haihua
🍈 🍉🍊 🍋 🍌
在大多数实际问题中,仅用代数方法是找不到临界点的。例如,考虑以下函数:
$$ f(x) = x \mathrm{e}^x + x $$临界点方程为:
$$ \mathrm{e}^x (1 + x) + 1 = 0 $$我们不能用简单的代数来解决,此时我们可以采用数值解法(Numerical methods for optimization)
在本文中,我们将介绍一种常用迭代方法近似求解这类问题——梯度下降算法(Steepest descent algorithm)。基本思想是从猜测$x_0$开始,然后使用更新规则使我们更接近临界点。
寻找局部极小值最简单的数值方法是最速下降法(steepest descent method),也叫梯度下降法 (gradient descent)。
这种算法的过程是:
首先函数初始化点$x_0$。如果$f(x)$在$x_0$处的导数等于0,那么已经处于临界点。否则,我们可以用导数的值来知道当我们离开$ x0 $时函数是增加还是减少。
如果导数$\dfrac{df (x_0)}{dx}$是负的,那么当我们移到$x_0$的右边时,函数$f(x)$会变小。相反,如果导数是正的,如果我们想让函数变小,我们需要移动到$x_0$左边。
我们按上述规律不断移动,函数的值会越来越小,直到我们能到达一个最小值点(当然,如果函数是单调递减的话,那永远达不到最小值点)。 这种迭代方法如下图所示:
注意,步长$\eta$需要足够小,否则我们可能会“跳过”局部最小值的位置。
考虑如下方程
$$ f(x) = x \mathrm{e}^x + x $$我们无法得到临界点的简单公式,因此需要使用最速下降法。函数的导数为:
$$ \frac{f(x)}{d x} = \mathrm{e}^x (1 + x) + 1 $$因此,更新规则是:
$$ x_{t+1} = x_t - \eta \mathrm{e}^{x_t} (1 + x_t) + 1 $$