浅显易懂!「高中数学」读懂梯度下降的数学原理
作者:CQITer小编 时间:2019-04-10 16:44
「过早优化是罪恶之源。」
——计算机科学家和数学家 Donald Ervin Knuth
敏捷(agile)是软件开发过程中的一个广为人知的术语。其背后的基本思想很简单:快速构建出来→发布它→获得反馈→基于反馈进行修改→重复这一过程。这种做法的目标是让产品亲近用户,并让用户通过反馈引导你,以实现错误最少的可能最优的产品。另外,改进的步骤也需要很小,并且也应该让用户能持续地参与进来。在某种程度上讲,敏捷软件开发过程涉及到快速迭代。而梯度下降的基本过程也差不多就是如此——尽快从一个解开始,尽可能频繁地测量和迭代。
目标
梯度下降算法是一个迭代过程,能让我们得到一个函数的最小值(这里先不提一些额外的注意事项)。下面的公式将整个梯度下降算法汇总成为了一行:

但我们是怎么得到这个公式的?实际上很简单,而且仅包含一些高中数学知识(小编:海外高中数学?捂脸)。我们希望能通过这篇文章在线性回归模型的背景中理解和再现这一公式。
一个机器学习模型
设有一些在一个 2D 空间中的数据点。假设这些数据与一组学生的身高和体重有关。我们希望预测这些量之间的某种关系,以使我们可以预测未来某个新学生的体重。这本质上是监督式机器学习技术的一个简单案例。
现在,让我们在空间中画一条任意的线,并使其穿过某些数据点。那么这条线的方程即为 Y = mX + b,其中 m 是斜率,b 是这条线在 Y 轴上的截距。

预测:
给定一组已知的输入和它们对应的输出。机器学习模型会尝试基于这些数据预测新输入的输出结果。

机器学习过程
误差(Error)即为两个预测结果之间的差异。

与其相关的概念是成本函数或损失函数。
成本函数
成本函数/损失函数评估的是我们的机器学习算法的性能表现。损失函数计算的是单个训练样本的误差,成本函数则是损失函数在整个训练集上的平均。因此,我会交替地使用这两个术语。
基本上而言,成本函数能告诉我们在给定了 m 和 b 的值时模型在预测方面的表现「有多好」。
比如说,如果数据集中共有 N 个点,而对于所有这 N 个数据点,我们希望最小化其误差。因此成本函数就将是总平方误差,即:

N 个数据点的成本函数
为什么我们要用平方差而不直接使用绝对差呢?因为平方差能让我们更轻松地推导出一条回归线。实际上,为了找到那条线,我们需要计算成本函数的一阶导数,而计算绝对值的倒数比计算平方值的导数要难得多。
1. 最小化成本函数
任何机器学习算法的目标都是最小化成本函数。
这是因为实际值和预测值之间的误差越低,就说明算法在学习上的表现就越好。因为我们希望得到最低的误差值,所以我们希望这些m 和 b 值所得到的误差尽可能最小。
2. 我们究竟如何最小化任意函数?
仔细观察,我们的成本函数是 Y=X² 的形式。在笛卡尔坐标系中,这是一个抛物线方程,可以画成下图形式:

抛物线
要最小化上述函数,我们需要找到能得到最低 Y值的 X 值,即红点位置。因为这是一张2D 图,所以定位其最小值很容易,但在更高维度上情况却非如此。在这些情况下,我们需要设计一个能定位最小值的算法,这个算法就是梯度下降。
梯度下降
梯度下降是最常用的优化算法之一,也是目前最常用的优化神经网络的方式。这是一种用于寻找函数最小值的迭代式优化算法。
1. 直观理解
假设你正沿着下面的图行走,而且目前正位于绿点位置。你的目标是到达最小值,即红点位置;但在你的位置处,你无法看到最小值在哪里。

可能的动作会是这样:
你可能向上或向下
如果你决定了要走的方向,为了到达目的地,你可能跨一大步,也可能走一小步。
本质上讲,为了到达最小值,你应该知道两件事:走哪条路和步子迈多大。



