机器学习中梯度降低算法的实际应用和技巧

当在现实生活中的遇到问题时,咱们老是但愿找到最佳的解决方案。制造软件产品也是同样的道理,最优化的程序才是最理想的产品。python

最优化意味着得到最佳输出。它既是一个数学的重要分支,也在现实生活中有着重要的做用。现代的计算机科学和人工智能科学把最优化做为一个重要的领域来研究。咱们也认为人工智能的一些算法,就是模拟了人类寻求实际问题最优解的过程。例如,利用人工智能算法设计软件,配合外部的电子设备例如摄像头识别人脸;利用数据挖掘和神经网络算法来寻找投资的最佳时机等等,都是利用了最优化的原理。算法

机器学习中的最优化和其余学科的应用比起来有轻微的差别。通常来讲,在优化的同时,咱们确切地知道数据的外观以及咱们想要改进的地方。 可是在机器学习中,咱们不知道“新数据”是怎么样的,更别提对其进行优化了。为了解决这个问题,在机器学习中,咱们对训练数据(training data)执行优化,并检查由此新创造出的验证数据(validation data)。bash

最优化的普遍应用网络

  • 机械学:设计航空航天产品的表面;
  • 经济学:成本最小化;
  • 物理学:量子计算中的优化时间;
  • 决定最佳运输路线,货架空间优化等等。

许多流行的机器算法都依赖于线性回归,k最近邻,神经网络等技术。优化的应用是无限的,所以它成为了学术界和工业界普遍研究的课题。在本文中,咱们将介绍一种称为梯度降低(Gradient Descent)的优化技术。 这是机器学习时最经常使用的优化技术。app


1.什么是梯度降低?机器学习

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

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

如今咱们来用数学术语来描述一下这个场景。
测试

假设咱们想要找出学习算法的最佳参数(θ0)和(θ1)。与上面的爬山示例相似,当咱们绘制成本空间J(θ)函数的3D图像时发现了相似的山脉和山谷。当z轴表明成本J(θ),x轴和z轴分别对应参数θ0和θ1时,丘陵由红色地区表明成本高,而山谷以蓝色地区表明成本低。成本空间不过是算法在某个参数选择特定值时的表现。优化

如今主要有两种类型的梯度降低算法:

1.1 数据摄入基准法

  1. 全批梯度降低算法(Full Batch)
  2. 随机梯度降低算法(Stochastic)

全批梯度降低算法一次使用全部数据来计算梯度,而随机梯度降低算法能够在计算梯度时进行采样。

1.2 分化技巧基准法

  1. 一阶微分
  2. 二阶微分

梯度降低须要经过成本函数J(θ)的微分方程来计算梯度。咱们可使用一阶微分或二阶微分。


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

梯度降低是一种适用于大多数状况的技术。但也有时候梯度降低也不能正常工做,或彻底不能工做。发生这种状况时有三个主要缘由:

2.1 来自数据的挑战

  • 若是数据的排列方式会形成非凸优化问题(non-convex optimization problem),使用梯度降低来执行优化会很是困难。
  • 即便在优化凸优化问题时,也可能存在许多最小值。最低点称为全局最小值(Global Minima),其他点称为局部最小值(Local Minima)。咱们的目标是在避免局部最小值的同时到达全局最小值。
  • 还有鞍点(Saddle Point)问题。这是数据中梯度为零但不是最优势的点。目前并无具体的方法来避免这一点,这仍然是一个很是活跃的研究领域。

2.2 来自梯度的挑战

  • 若是梯度降低执行的不正确,则可能致使像梯度消失(vanishing gradient)或梯度爆炸(exploding gradient)之类的问题。这些问题会在梯度太小或过大时发生,致使算法不会收敛(Converge)。

2.3 来自实际应用难度的挑战

  • 大多数神经网络从业人员不大关注实际应用。可是网络的资源利用率之类的事情也是很是重要的。在实施梯度降低时,具体须要多少资源是很是重要的。若是内存对于应用程序来讲过小就必定会失败。
  • 此外,梯度降低算法对于浮点和硬件/软件的要求也很高。


3.梯度降低算法的变体

最经常使用的梯度降低算法及其实施。

3.1 Vanilla(香草)梯度降低法

这是梯度降低技术的最简单形式。香草意味着纯粹/没有任何掺假。其主要特色是经过采用成本函数的梯度向最小值方向不断迈出小步。它的伪代码以下:

update = learning_rate * gradient_of_parameters
parameters = parameters - update复制代码

咱们经过获取旧参数的梯度来不断更新参数。把它乘以一个学习速率(learning_rate,一个常数),代表咱们想要达到最低点的速度。学习速率是一个超参数(hyper-parameter),在选择它的大小时应该十分当心谨慎。


3.2动量梯度降低(Gradient Descent with Momentum)

经过调整Vanilla算法,能够在每次进行下一步以前注意前一步骤。

update = learning_rate * gradient
velocity = previous_update * momentum
parameter = parameter + velocity – update
复制代码

在这里,update与香草梯度降低法相同。 可是引入了一个名为velocity的新术语,它考虑了以前的update和一个称为momentum的常量。

3.3 Adagrad

Adagrad使用自适应技术进行学习速率的更新。 这个算法根据之前全部迭代的梯度变化状况来改变学习速率。伪代码以下:

grad_component = previous_grad_component + (gradient * gradient)
rate_change = square_root(grad_component)+epsilon
adapted_learning_rate = learning_rate * rate_change
update = adapted_learning_rate * gradient
parameter = parameter – update
复制代码

其中,epsilon是一个常量,用于保持学习速率的变化率。

3.4 Adam

Adam是一种基于Adagrad的自适应技术,进一步缓解了它的不足。 换句话说,它就是 Momentum + Adagrad。伪代码以下:

adapted_gradient = previous_gradient + 
 ((gradient – previous_gradient) * (1 – beta1))
gradient_component = (gradient_change – previous_learning_rate)
adapted_learning_rate = previous_learning_rate + 
 (gradient_component * (1 – beta2))
update = adapted_learning_rate * adapted_gradient
parameter = parameter – update
复制代码

其中,beta1和beta2是常量,用于检查梯度和学习速率的变化。


4.梯度降低算法的实际应用

使用python进行梯度降低的基本应用。

接下来咱们使用梯度降低优化来找到深度学习模型的最佳参数,并将其用于图像识别问题。 咱们的问题是:识别来自给定的28×28图像里的数字。准备的图片中,有一部分图像用于训练,其他部分用于测试模型。

以下是定义Vanilla梯度降低的主要代码:

params = [weights_hidden, weights_output, bias_hidden, bias_output]
def sgd(cost, params, lr=0.05):
 grads = T.grad(cost=cost, wrt=params)
 updates = []
 for p, g in zip(params, grads):
 updates.append([p, p - g * lr])
 return updates
updates = sgd(cost, params)
复制代码

咱们来拆分理解一下这段代码。定义函数sgd做为cost,params和lr的因变量,它和如前所述的J(θ)同出一辙;而以前的θ0,θ1在这里是深度学习算法的参数和学习速率。 咱们将默认学习速率设置为0.05,但该值可随时被更改。

def sgd(cost, params, lr=0.05):
复制代码


而后咱们定义了关于成本函数J(θ)的参数的梯度。 在这里,咱们使用theano库来找到相应梯度,而且咱们将theano做为T导入

grads = T.grad(cost=cost, wrt=params)
复制代码

最后把全部可能的参数更新,这里应使用Vanilla梯度降低。

for p, g in zip(params, grads):
 updates.append([p, p - g * lr]
复制代码

咱们可使用这个函数来为神经网络找到最佳参数。 在使用这个函数时,该神经网络出色地完成了任务,以下所示:

Prediction is: 8
复制代码

在这个应用中,梯度降低法为深度学习算法找到了最优参数。


5.应用梯度降低的实用技巧

上面提到的每一个梯度降低算法都有其优势和缺点。下面的一些小提示可能会帮助您选择正确的算法。

  • 为了快速创建原型,请使用Adam / Adagrad等自适应技术。他们很短时高效,而且不须要太多的超参数调整。
  • 要得到最佳效果,您应该使用Vanilla梯度降低法或Momentum。虽然计算速度超级慢,可是这些结果大多比自适应技术得来的结果更准确。
  • 若是数据很小而且适合一次迭代,则可使用二阶技术,如l-BFGS。由于二阶技术对于足够小的数据的处理很是快速和准确。

神经网络没法成功学习的缘由有不少。可是若是能够找到算法出错的地方,对将来的工做仍是很是有帮助的。

在应用梯度降低法时,有如下几点常见注意事项:

  • 错误率 - 应该在特定迭代后检查训练错误率、测试错误率,并确保它们都成减少趋势。若是错误率并未减少,算法颇有可能出了问题。
  • 隐藏层中的梯度流 - 检查是否有梯度消失或梯度爆炸的问题。
  • 学习速率 - 使用自适应技术时应该检查。

但愿您阅读本文后,将熟练掌握有关梯度降低及其变体的基础知识。但愿你以为我对这些算法的实际应用的解读也有所帮助!

相关文章
相关标签/搜索