梯度下降优化算法(一)

708 阅读6分钟

一 背景

对于机器学习和深度学习较为熟悉的同学,应该大抵都听过这句话,机器学习=模型+策略+算法。其实笔者最开始学习的时候就基础过这个概念,但是这三个东西具体都是什么呢,也是经过一段时间才真正的领悟。

  • 模型:就是想要学习的函数、表达式或者是网络结构。
  • 策略:本质就是如何减少探索模型的推理值与实际值的Gap,包括训练数据、测试数据乃至未知数据。
  • 算法:本质就是通过优化算法减少上面介绍的推理值与实际值的Gap,通常是通过迭代式的渐进算法进行。

梯度下降是优化神经网络和许多其他机器学习算法的首选方法,但是在使用的时候进程当做黑盒使用,对内在的运行机制并不是很清晰。本篇文章探讨了时下最流行的基于梯度的优化算法,如Momentum,Adagrad和Adam等高级用法,下面就和大家娓娓道来。

梯度下降法是最流行的优化算法之一,也是迄今为止最常用的优化神经网络的方法。同时,每个最先进的深度学习库都包含各种算法的实现,以优化梯度下降(例如TensorFlow, Caffe,MxNet等)。然而,这些算法经常被用作黑盒优化器,因为很难找到对它们优缺点的实际解释。我们首先来看看梯度下降法的不同变体。然后我们将简要总结训练中的挑战。随后,我们将介绍最常见的优化算法,展示它们解决这些挑战的动机,以及这如何引出它们的更新规则。

二 梯度下降及其变体

梯度下降有三种变体,不同的是我们使用多少数据来计算目标函数的梯度。根据数据量的不同,我们在参数更新的准确性和执行更新所需的时间之间进行权衡。

Batch gradient descent(批处理梯度下降法)

针对整个数据集,将全部数据进行加载,计算整个函数的梯度值,并且进行参数的更新,由于需要加载全部的数据,所以对运行态的内存要求较高,在数据量巨大的情况下不太容易实现。由于我们需要计算整个数据集的梯度来执行一次更新,批处理梯度下降可能非常缓慢,对于不适合内存的数据集来说是棘手的,同时对于在线的服务的更新也是不适合的,无法使用Online Learning的方式进行实时的模型的更新与校正。

批处理梯度下降法的伪代码如下,大家可以看下:

for i in range(nb_epochs):
  params_grad = evaluate_gradient(loss_function, data, params)
  params = params - learning_rate * params_grad

Stochastic gradient descent(随机梯度下降法)

批处理梯度下降对整个样本执行相同的操作,在每个参数更新之前,为所有的样本计算梯度。SGD通过一条样本的一次执行,进而完成一次参数更新。因此,它通常更快,也可以用于在线学习。

SGD使用高方差进行频繁更新,导致目标函数像下图中那样剧烈波动。

当批量梯度下降收敛到参数所在局部的最小值时,SGD的波动一方面使它能够跳到新的、可能更好的局部最小值。另一方面,这最终使收敛到精确的最小值复杂化,因此SGD还需进一步进行调整。当我们缓慢地降低学习率时,SGD表现出与批量梯度下降相同的收敛行为,对于非凸优化和凸优化,几乎可以确定分别收敛到局部或全局最小值。 随机梯度下降法的伪代码如下:

for i in range(nb_epochs):
  np.random.shuffle(data)
  for example in data:
    params_grad = evaluate_gradient(loss_function, example, params)
    params = params - learning_rate * params_grad

Mini-batch gradient descent(Mini-batch梯度下降法)

小批量梯度下降是批量梯度下降法与随机梯度下降法的折中,针对每个小批量的数据进行梯度计算,并且进行参数的更新。

中国人讲究的是“中庸之道”,小批量梯度更新也是一种中庸吧,那么他有什么特性呢?

  1. 首先,由于使用了小批量而非随机单个的方式,减少了参数更新的方差,使得收敛更加稳定;
  2. 其次,可以利用高度优化的矩阵运算,先进的深度学习库,使计算梯度非常高效。

Mini Batch大小通常设置128,25,512等,另外也要看分布式的集群的大小,这个需要根据实际情况灵活配置。小批量梯度下降法是神经网络训练的典型选择算法。

三 优化算法的挑战

然而,小批量梯度下降,并不能保证良好的收敛,同时也提出了一些需要解决的挑战,需要来解决,路漫漫其修远兮,吾等将上下而求索。

  • 选择一个合适的学习速率是很困难的。太小的学习率会导致缓慢的收敛,而过大的学习率会阻碍收敛,导致损失函数在最小值附近波动甚至发散。
  • 尝试在训练期间通过例如退火算法来调整学习率,即根据预先定义的规则或当目标变化低于阈值时降低学习率。然而,这些规则和阈值必须提前定义,因此无法适应数据集的特征。
  • 此外,所有参数更新的学习率都是相同的。如果我们的数据很稀疏,并且我们的功能有非常不同的频率,我们可能不希望将所有功能都更新到相同的程度,而是针对很少出现的功能执行更大的更新。
  • 最小化神经网络中常见的高度非凸误差函数的另一个关键挑战是避免陷入它们众多的次最优局部极小值。困难实际上并非来自局部极小值,而是来自鞍点,即一个维度向上倾斜而另一个维度向下倾斜的点。这些鞍点通常被一个具有相同误差的平台所包围,这使得SGD很难逃脱,因为在所有维度中梯度都接近于零。

四 参考资料

五 自我介绍

个人介绍:杜宝坤,京东联邦学习从0到1构建者,带领团队构建了京东的联邦学习解决方案,实现了电商营销领域支持超大规模的工业化联邦学习解决方案,支持超大规模样本PSI隐私对齐、安全的树模型与神经网络模型等众多模型支持,并且实现了广告等业务侧的落地,开创了新的业务增长点,产生了显著的业务经济效益。 个人喜欢研究技术。基于从全链路思考与决策技术规划的考量,研究的领域比较多,从架构、数据到算法与算法框架均有涉及。欢迎喜欢技术的同学和我交流,邮箱:baokun06@163.com

未完待续,敬请期待!