梯度下降
在September 03, 2024上更新 2分钟阅读

## 介绍
想象一下,我们有一个函数 $f(x)$,我们想找到它的最小值。你会怎么办 ?
简单吧?我们只需要解下面的方程:
$$f’(x) = 0$$
问题是,找到 $f’$ 的公式并不总是那么容易,因为它们往往非常复杂,尤其是在我们处理复杂函数的深度学习中。所以我们需要找到另一种方法,可以为我们提供函数的最小值,而不需要找到导数$f’$的公式。
让我们建立一些直觉
假设我们有一个函数 f 和相应的图:
让我们从随机点 $x_{0}$ 开始。目标是移动该点并使其越来越接近 $x*$,使得 $f’($x*$) = 0$。所以问题可以分为两部分:
-
我们应该向哪个方向移动点$x$?左还是右?
-
我们应该移动它多少?
方向
让我们建立一些直觉来回答第一个问题。请看以下几点:
注意:
-
当点 $x_{0}$ 位于最佳点 $x*$ 的右侧时,其切线上升。
-
当点 $x_{0}$ 位于最佳点 $x*$ 的右侧时,其切线向下。
直线的方向由其斜率的符号确定:
-
一条线向上$\暗示$斜率$a$是正。
-
一条线向下$\暗示$斜率$a$是负。
注意: \
函数在某一点 $x_{0}$ 的切线斜率不大于该点 $f’(x_{0})$ 的导数:
$$ tangent(x*{0}): g(x) = f’(x*{0}).(x-x*{0}) + f(x*{0}) $$
因此,作为问题 “我们应该将 $x_{0}$ 移到哪里?” 的答案:
-
$f’(x_{0}) < 0$ $\implies$ $x_{0}$ 位于 $x*$ $\implies$ 右侧 我们需要将 $x_{0}$ 移至左侧。
-
$f’(x_{0}) > 0$ $\implies$ $x_{0}$ 位于 $x*$ $\implies$ 的左侧 我们需要将 $x_{0}$ 移至右侧。
步骤
现在第二个问题,我们应该移动 $x_{0}$ 多少?
看看下面的例子:
我们可以得出结论:
-
$x_{0}$ 接近 $x*$ => 切线斜率小 => $f’(x_{0})$ 小。
-
$x_{0}$ 距离 $x*$ 较远 => 切线斜率较大 => $f’(x_{0})$ 较大。
通过回答这两个问题,我们得出的结论是,只有了解点 $x_{0}$ 的导数才能让我们深入了解最优点 $x_{0}$ 的方向和距离。
梯度下降
梯度下降是前两个问题答案的表述。它是一种优化迭代算法,从随机初始点 $x_{0}$ 开始近似函数的最小值 $x*$。算法表述如下:
$$ x*{n+1} = x*{n} - lr \times \frac{\mathrm{d} f}{\mathrm{d} x_{n}} $$
在哪里:
-
$ \frac{\mathrm{d} f}{\mathrm{d} x*{n}} $ 不超过 $f$ 在点 $x*{n}$ 的导数。
-
$lr$ 是一个正常数,决定步长有多大。
请注意:
-
$x_{n}$ 在 $x*$ => $\frac{\mathrm{d} f}{\mathrm{d} x_{n}} > 0 $ => $ x_{n+ 的右侧1} = x_{n} - 正 $ => $x_{n}$ 向左移动。
-
$x_{n}$ 位于 $x*$ => $\frac{\mathrm{d} f}{\mathrm{d} x_{n}} 的左侧 < 0$ => $ x*{n +1} = x*{n} + 正 $ => $x_{n}$ 向右移动。
-
$x_{n}$ 接近 $x*$ => $\frac{\mathrm{d} f}{\mathrm{d} x_{n}}$ 接近 $0$ => 对 $x_{ 进行小幅更新n}$。
测验
-
梯度下降何时停止迭代:
-
当 $x_{n}$ 足够小时。
-
当 $x_{n}$ 接近 $x_{0}$ 时。
-
当 $\frac{\mathrm{d} f}{\mathrm{d} x_{n}} = 0 $. XXX
-
我们如何选择$x_{0}$:
-
我们随机挑选。 XXX
-
我们把它放在$x{n}$附近。
-
这取决于问题。
-
为什么我们需要梯度下降:
-
因为计算机不够强大,无法计算导数。
-
因为深度学习模型的导数公式很难找到。 XXX
-
因为函数有多个局部最小值。