当在现实生活中的遇到问题时,我们总是希望找到最佳的解决方案。制造软件产品也是一样的道理,最优化的程序才是最理想的产品。最优化意味着获得最佳输出。它既是一个数学的重要分支,也在现实生活中有着重要的作用。现代的计算机科学和人工智能科学把最优化作为一个重要的领域来研究。我们也认为人工智能的一些算法,就是模拟了人类寻求实际问题最优解的过程。例如,利用人工智能算法设计软件,配合外部的电子设备例如摄像头识别人脸;利用数据挖掘和神经网络算法来寻找投资的最佳时机等等,都是利用了最优化的原理。机器学习中的最优化和其他学科的应用比起来有轻微的差异。一般来说,在优化的同时,我们确切地知道数据的外观以及我们想要改进的地方。 但是在机器学习中,我们不知道“新数据”是怎么样的,更别提对其进行优化了。为了解决这个问题,在机器学习中,我们对训练数据执行优化,并检查由此新创造出的验证数据。许多流行的机器算法都依赖于线性回归,k近邻,神经网络等技术。优化的应用是无限的,因此它成为了学术界和工业界广泛研究的课题。在本文中,我们将介绍一种称为梯度下降的优化技术。这是机器学习时最常用的优化技术。

1. 什么梯度下降

我们来看一下经典的登山示例:假设你在山顶,你必须到达山谷最低点的一个湖。 但是你被蒙住眼睛,看不到你的目标。那么,你会采取什么方法到达湖边?

最简单的方法是检查你附近的地面,找到土地向下倾斜的方向。 这是你该迈出第一步的方向。沿着下坡路线一直走,很有可能你会到达湖泊。下图表示你走过的路:

现在我们来用数学术语来描述一下这个场景。假设我们想要找出学习算法的最佳参数(θ0)和(θ1)。与上面的登山示例类似,当我们绘制成本空间J(θ)函数的3D图像时发现了类似的山脉和山谷。当z轴代表成本J(θ),x轴和z轴分别对应参数θ0和θ1时,丘陵由红色地区代表成本高,而山谷以蓝色地区代表成本低。成本空间不过是算法在某个参数选择特定值时的表现。
现在主要有两种类型的梯度下降算法:
1)数据摄入基准法
全批梯度下降算法(Full Batch)
随机梯度下降算法(Stochastic)
全批梯度下降算法一次使用所有数据来计算梯度,而随机梯度下降算法可以在计算梯度时进行采样。
2)分化技巧基准法
一阶微分
二阶微分
梯度下降需要通过成本函数J(θ)的微分方程来计算梯度。我们可以使用一阶微分或二阶微分。

2. 执行梯度下降法所面临的挑战

梯度下降是一种适用于大多数情况的技术。但也有时候梯度下降也不能正常工作,或完全不能工作。发生这种情况时有三个主要原因:
(1)来自数据的挑战
如果数据的排列方式会造成非凸优化问题,使用梯度下降来执行优化会非常困难。
即使在优化凸优化问题时,也可能存在许多最小值。最低点称为全局最小值,其余点称为局部最小值。我们的目标是在避免局部最小值的同时到达全局最小值。
还有鞍点问题。这是数据中梯度为零但不是最优点的点。目前并没有具体的方法来避免这一点,这仍然是一个非常活跃的研究领域。

(2)来自梯度的挑战
如果梯度下降执行的不正确,则可能导致像梯度消失或梯度爆炸之类的问题。这些问题会在梯度过小或过大时发生,导致算法不会收敛(Converge)。

(3)来自实际应用难度的挑战
大多数神经网络从业人员不大关注实际应用。但是网络的资源利用率之类的事情也是非常重要的。在实施梯度下降时,具体需要多少资源是非常重要的。如果内存对于应用程序来说太小就一定会失败。
此外,梯度下降算法对于浮点和硬件/软件的要求也很高。

3. 梯度下降算法的变体

最常用的梯度下降算法及其实施。
(1) Vanilla(香草)梯度下降法
这是梯度下降技术的最简单形式。香草意味着纯粹/没有任何掺假。其主要特点是通过采用成本函数的梯度向最小值方向不断迈出小步。我们通过获取旧参数的梯度来不断更新参数。把它乘以一个学习速率(learning_rate,一个常数),表明我们想要达到最低点的速度。学习速率是一个超参数(hyper-parameter),在选择它的大小时应该十分小心谨慎。

(2)动量梯度下降(Gradient Descent with Momentum)
通过调整Vanilla算法,可以在每次进行下一步之前注意前一步骤。

(3)Adagrad
Adagrad使用自适应技术进行学习速率的更新。 这个算法根据以前所有迭代的梯度变化情况来改变学习速率。

(4)Adam
Adam是一种基于Adagrad的自适应技术,进一步缓解了它的不足。 换句话说,它就是 Momentum + Adagrad。

希望您阅读本文后,将熟练掌握有关梯度下降及其变体的基础知识。希望你觉得我对这些算法的实际应用的解读也有所帮助