【机器学习中的数学】梯度

先来看梯度的定义

梯度:是一个向量,其方向上的方向导数最大,其大小正好是此最大方向导数。方向导数就是某个方向上的导数。

简单来说,梯度这个向量指向了自变量应该改变的方向,使得因变量增长最快

从具体定义上来看,梯度实际上就是多变量微分的一般化。

我们可以看到,梯度向量的每个维度值其实就是目标函数对每个变量的微分,然后用逗号分割开,用<>包括起来。

下面我们来看一个单变量函数梯度的例子。

这是 $y = x^2$ 的图像。在这个例子中只有一个自变量 $x$,那么按照我们上面的定义,梯度就是对该自变量 $x$ 求微分,即 $\frac{d(x^2)}{dx} = 2x$ ,换句话说,梯度向量 $G$ 是一个一维向量 $<2x,>$ , 具体的值取决于此时 $x$ 的值。假设我们此时在 $(1, 1)$ 点,那么此时的梯度向量 $G = <2,>$。 $2 > 0$ 代表自变量 $x$ 应向 $x$ 轴正方向移动,使得因变量 $y$ 增长最快。

那么对于多变量函数呢?其实也是一样的。

比如我们定义中的这个多变量函数

这里的梯度 $G = <-5, -2, 12>$该则么理解呢?因为 $-5 < 0, -2 < 0, 12 > 0$, 所以要想使函数值 $J$ 增长最快,$θ_1, θ_2$ 应该向其负方向移动,而 $θ_3$ 应该向正方向移动。但是!$θ_1, θ_2, θ_3$ 移动的幅度必须按照 $ 5: 2: 12$这个比例,以保证三个自变量整体的移动是符合梯度方向的。

梯度下降 (Gradient Descent)

梯度下降是神经网络中常用的一个算法。

神经网络的本质可以概括为,一个输入列向量,左乘若干个变换矩阵,得到结果即是输出向量, 如下图(p.s. 不是很严谨,因为没有考虑激活函数,但是这里不影响)。

而变换矩阵中的每一个元素就是神经网络中每一条连接的权重值。神经网络训练的目标就是要找到每个合适的权重值,使得输入向量经过一系列变换后,可以得到我们希望的输出向量。

为了达到这个目的,我们构建对于这些权重$θ_1, θ_2…$的损失函数 $J(θ)$,并找到使$J(θ)$取最小值时的自变量值。

在神经网络中,梯度下降的公式如下

在这里,对于自变量向量 $θ$,$θ^0$ 是其更新前的值,而 $θ^1$ 通过一次梯度下降更新后的值。
$▽J(θ)$是梯度,表示函数值上升最快的自变量变化方向,前面的负号则表示我们要往梯度的反方向,即函数值下降最快的方向前进。 $α$ 是学习速率(Learning Rate),与梯度向量相乘,用来调节我们一次要走的步长。(也就是说,梯度向量中单个维度具体的值意义不大,因为我们可以通过学习率$α$调节要走的步长,但是梯度向量中每个维度值之间的顺序和比例关系很重要,因为代表了梯度方向)

最后我们来看一个多变量函数的梯度下降的例子(例子取自深入浅出–梯度下降法及其实现 - chi的文章 - 知乎

我们假设有一个目标函数

$$J(θ) = θ^2_1 + θ^2_2$$

现在要通过梯度下降法计算这个函数的最小值。我们通过观察就能发现最小值其实就是 (0,0)点。但是接下来,我们会从梯度下降算法开始一步步计算到这个最小值!
我们假设初始的起点为:

$$θ^0 = (1, 3)$$

初始的学习率为:

$$ α = 0.1 $$

函数的梯度为:

$$▽J(θ) = <2θ_1, 2θ_2>$$

进行多次迭代:

我们发现,已经基本靠近函数的最小值点

参考