作者 | Nasir Hemed

编译 | Rachel

出品 | AI科技大本营(id:rgznai100)

【导读】在本文中,作者对常用的三种机器学习优化算法(牛顿法、梯度下降法、最速下降法)进行了介绍和比较,并结合算法的数学原理和实际案例给出了优化算法选择的一些建议。

阅读本文的基础准备

  • 线性代数

  • 多变量微积分

  • 对凸函数的基本知识

我们都知道,机器学习中最重要的内容之一就是优化问题。因此,找到一个能够对函数做合理优化的算法始终是我们关注的问题。当前,我们使用最多的优化算法之一是梯度下降算法。在本文中,我们会对梯度下降算法以及一些其他的优化算法进行介绍,并尝试从理论角度来理解它们。本文介绍的核心算法包括:

  • 牛顿法(Newton’s Method)

  • 最速下降法(Steep Descent)

  • 梯度下降法(Gradient Descent)

如果想对这些算法有更多了解,你可以阅读斯坦福大学的《凸函数优化—:第三部分》教材。在本文中,我们主要关注二次函数和多项式函数。

对待优化函数的基本假设

一般而言,我们假设我们处理的函数的导数都是连续的(例如,f ∈ C¹)。对于牛顿法,我们还需要假设函数的二阶导数也是连续的(例如, f ∈ C²)。最后,我们还需要假设需要最小化的函数是凸函数。这样一来,如果我们的算法集中到一个点(一般称为局部最小值),我们就可以保证这个值是一个全局最优。

牛顿法

  • 单变量函数的情况


x_n = starting pointx_n1 = x_n - (f'(x_n)/f''(x_n))while (f(x_n) != f(x_n1)): x_n = x_n1 x_n1 = x_n - (f'(x_n)/f''(x_n))

牛顿法的基本思想是,需要优化的函数f在局部可以近似表示为一个二次函数。我们只需要找到这个二次函数的最小值,并将该点的x值记录下来。之后重复这一步骤,直到最小值不再变化为止。

  • 多变量函数的情况

对于单变量的情况,牛顿法比较可靠。但是在实际问题中,我们处理的单变量情形其实很少。大多数时候,我们需要优化的函数都包含很多变量(例如,定义在实数集ℝn的函数)。因此,这里我们需要对多变量的情形进行讨论。

假设x∈ ℝn,则有:

x_n = starting_pointx_n1 = x_n - inverse(hessian_matrix) (gradient(x_n))while (f(x_n) != f(x_n1)):x_n = x_n1  x_n1 = x_n - inverse(hessian_matrix) (gradient(x_n))

其中,gradient(x_n)是函数位于x_n点时的梯度向量,hessian_matrix是一个尺寸为 nxn 的黑塞矩阵(hessian matrix),其值是函数位于x_n的二阶导数。我们都知道,矩阵转换的算法复杂度是非常高的(O(n³)),因此牛顿法在这种情形下并不常用。

梯度下降

梯度下降是目前为止在机器学习和其他优化问题中使用的最多的优化算法。梯度算法的基本思想是,在每次迭代中向梯度方向走一小步。梯度算法还涉及一个恒定的alpha变量,该变量规定每次跨步的步长。下面是算法示例:

alpha = small_constantx_n = starting_pointx_n1 = x_n - alpha * gradient(x_n)while (f(x_n) != f(x_n1)): # May take a long time to converge  x_n = x_n1  x_n1 = x_n - alpha * gradient(x_n)

这里,alpha是在每次迭代中更新x_n时都需要使用的变量(一般称为超参数)。下面我们对alpha值的选择进行简单分析。

如果我们选择一个很大的alpha,我们很可能会越过最优点,并离最优点越来越远。事实上,如果alpha的值过大,我们甚至会完全偏离最优点。

当alpha的值过大时,10次迭代后的梯度下降情况

另外,如果我们选择的alpha值过小,则可能需要经过非常多次迭代才能找到最优值。并且,当我们接近最优值时,梯度会接近于0。因此 ,如果alpha的值过小,我们有可能永远都无法到达最优点。

当alpha的值过小时,10次迭代后的梯度下降情况

因此,我们可能需要多尝试一些alpha的值,才能找到最优的选择。如果选择了一个合适的alpha值,我们在迭代时往往能节省很多时间。

当alpha的值合理时,10次迭代后的梯度下降情况

最速下降法

最速下降法和梯度下降法非常相似,但是最速下降法对每次迭代时要求步长的值为最优。下面是最速下降法的算法示例:

x_n = starting_pointalpha_k = get_optimizer(f(x_n - alpha * gradient(x_n)))x_n1 = x_n - alpha_n * gradient(x_n)while (f(x_n) != f(x_n1)):  x_n = x_n1   alpha_k = get_optimizer(f(x_n - alpha * gradient(x_n)))  x_n1 = x_n - alpha_n * gradient(x_n)

其中,x_n和x_n1是ℝn上的向量,是算法的输入,gradient是函数 f 在点x_n的梯度,alpha_k的数学表示如下:

因此,在对原始函数进行优化时,我们需要在每一次迭代中对一个内部函数进行优化。这样做的优点是,这个内部优化函数是一个单变量函数,它的优化不会非常复杂(例如,我们可以使用牛顿法来作为这里的函数)。但是在更多情形下,在每一步中优化这个函数都会带来比较昂贵的花销。

  • 二次式函数的特殊情形

对于均方误差函数:

其中,是单位矩阵,y=Qw + b 。为了简化讨论,这里我们只考虑寻找权重w最优值的情形(假设b是连续的)。将等式 y=Qw + b 带入上式并进行一定整理后,我们可以得到如下等式:

现在我们重新查看一下 g(α), 我们会发现,如果我们使用点 αk 处的梯度,由于其为最优值,该梯度应当为0。因此我们有如下等式:

对上式进行简化,并将 f 的梯度带入后,我们可以得到对于 αk 的表示如下:

这就是在二次函数情形下 αk 的值。

  • 对二次函数的收敛性分析

对于定义在 ℝ² 上的二次函数,最速下降法一般用来在非常接近最优值时使用,使用步数不超过十步。

二维中的最速下降在4次迭代后的情形

在上图中,每一次迭代中的改变方向都是垂直的。在3到4次迭代后,我们可以发现导数的变化基本可以忽略不计了。

  • 为什么最速下降法应用很少?

最速下降法算法远远满足了超参数调优的需求,并且保证能找到局部最小值。但是为什么该算法应用不多呢?最速下降法的问题在于,每一步都需要对 aplha_k 进行优化,这样做的成本相对高昂。

例如,对于二次函数,每次迭代都需要计算多次矩阵乘法以及向量点乘。但对于梯度下降,每一步只需要计算导数并更新值就可以了,这样做的成本远远低于最速下降算法。

最速下降算法的另一个问题是对于非凸函数的优化存在困难。对于非凸函数,aplha_k 可能没有固定的值。

对于梯度下降法和最速下降法的对比

在这一部分,我们对梯度下降法和最速下降法进行对比,并比较它们在时间代价上的差异。首先,我们对比了两种算法的时间花销。我们会创建一个二次函数:f:ℝ²⁰⁰⁰→ℝ (该函数为一个2000x2000的矩阵)。我们将对该函数进行优化,并限制迭代次数为1000次。之后,我们会对两种算法的时间花销进行对比,并查看 x_n 值与最优点的距离。

我们先来看一下最速下降法:

0 Diff: 117727672.56583363 alpha value: 8.032725864804974e-06 100 Diff: 9264.791000127792 alpha value: 1.0176428564615889e-05 200 Diff: 1641.154644548893 alpha value: 1.0236993350903281e-05 300 Diff: 590.5089467763901 alpha value: 1.0254560482036439e-05 400 Diff: 279.2355946302414 alpha value: 1.0263893422517941e-05 500 Diff: 155.43169915676117 alpha value: 1.0270028681773919e-05 600 Diff: 96.61812579631805 alpha value: 1.0274280663010468e-05 700 Diff: 64.87719237804413 alpha value: 1.027728512597358e-05 800 Diff: 46.03102707862854 alpha value: 1.0279461929697766e-05 900 Diff: 34.00975978374481 alpha value: 1.0281092917213468e-05 Optimizer found with x = [-1.68825261 5.31853629 -3.45322318 ... 1.59365232 -2.85114689 5.04026352] and f(x)=-511573479.5792374 in 1000 iterationsTotal time taken: 1min 28s

下面是梯度下降法的情况,其中 alpha = 0.000001:

0 Diff: 26206321.312622845 alpha value: 1e-06 100 Diff: 112613.38076114655 alpha value: 1e-06 200 Diff: 21639.659786581993 alpha value: 1e-06 300 Diff: 7891.810685873032 alpha value: 1e-06 400 Diff: 3793.90934664011 alpha value: 1e-06 500 Diff: 2143.767760157585 alpha value: 1e-06 600 Diff: 1348.4947955012321 alpha value: 1e-06 700 Diff: 914.9099299907684 alpha value: 1e-06 800 Diff: 655.9336211681366 alpha value: 1e-06 900 Diff: 490.05882585048676 alpha value: 1e-06 Optimizer found with x = [-1.80862488 4.66644055 -3.08228401 ... 2.46891076 -2.57581774 5.34672724] and f(x)=-511336392.26658595 in 1000 iterationsTotal time taken: 1min 16s

我们可以发现,梯度下降法的速度比最速下降法略快(几秒或几分钟)。但更重要的是,最速下降法采取的步长比梯度下降法更加合理,尽管梯度下降法的α的值并非最优。在上述示例中, 对于梯度下降算法,f(xprex) 和 f(curr) 在第900次迭代时的差为450。而最速下降法在很多次迭代前就已经达到这个值了(大约在第300次到第400次迭代之间)。

因此,我们尝试限制最速下降法的迭代次数为300,输出如下:

0 Diff: 118618752.30065191 alpha value: 8.569151292666038e-06 100 Diff: 8281.239207088947 alpha value: 1.1021416896567156e-05 200 Diff: 1463.1741587519646 alpha value: 1.1087402059869253e-05 300 Diff: 526.3014997839928 alpha value: 1.1106776689082503e-05 Optimizer found with x = [-1.33362899 5.89337889 -3.31827817 ... 1.77032789 -2.86779156 4.56444743] and f(x)=-511526291.3367646 in 400 iterationsTime taken: 35.8s

可以发现,最速下降法的速度实际更快。在此情形中,我们在每次迭代使用更少的步数就能逼近最优值。事实上,如果你的目标是估计最优值,最速下降法会比梯度下降法更合适。对于低维度的函数,10步的最速下降法就会比经过1000次迭代的梯度下降法更接近最优值。

下面这个例子中,我们使用了一个定义在 ℝ³⁰→ℝ 上的二次函数。10步后,最速下降法的得到函数值为 f(x) = -62434.18。而梯度下降法在1000步后得到的函数值为 f(x) = -61596.84。可以发现,最速下降法在10步后的结果就优于梯度下降法在1000步后的结果。

需要记住的是,这种情形仅在处理二次函数的时候适用。整体而言,在每次迭代中都找到 αk的最优值是较为困难的。对函数 g(α) 求最优值并不总能得到 αk 的最优值。通常,我们会使用迭代的算法来对优化函数求最小值。在这种情形下,最速下降法与梯度下降法相比就比较慢了。因此,最速下降法在实际应用中并不常见。

总结

在本文中,我们学习了三种下降算法:

  • 牛顿法(Newton's method)

牛顿法提供了对函数的二阶近似,并在每一步都对函数进行优化。其最大的问题在于,在优化过程中需要进行矩阵转换,对于多变量情形花销过高(尤其是向量的特征较多的时候)。

  • 梯度下降(Gradient Descent)

梯度下降是最常用的优化算法。由于该算法在每步只对导数进行计算,其花销较低,速度更快。但是在使用该算法时,需要对步长的超参数进行多次的猜测和尝试。

  • 最速下降法(Steepest Descent)

最速下降法在每步都对函数的梯度向量寻找最优步长。它的问题在于,在每次迭代中需要对相关的函数进行优化,这会带来很多花销。对于二次函数的情形,尽管每步都涉及很多矩阵运算,最速下降法的效果仍然更优。

相关笔记可参阅:

https://colab.research.google.com/gist/nasirhemed/0026e5e6994d546b4debed8f1ed543c0/a-deeper-look-into-descent-algorithms.ipynb

原文链接:

https://towardsdatascience.com/a-deeper-look-at-descent-algorithms-13340b82db49

(本文为AI科技大本营编译文章,转载请微信联系1092722531

长三角开发者联盟

代码就是力量,长三角的开发者联合起来!

加入「长三角开发者联盟」将获得以下权益

长三角地区明星企业内推岗位
CSDN独家技术与行业报告
CSDN线下活动优先参与权
CSDN线上分享活动优先参与权

我们希望你是:位于长三角地区(上海、江苏、浙江等)优秀开发者。

扫码添加联盟小助手,回复关键词“长三角4”,加入「长三角开发者联盟」。

推荐阅读:

  • 特斯拉全新自动驾驶芯片最强?英伟达回怼,投资者用脚投票

  • 用Python实现OpenCV特征提取与图像检索 | Demo

  • 用Python做数据分析,这些基本数据分析技术你知道吗?

  • Jupyter/IPython笔记本集合 !(附大量资源链接)-上篇

  • 西安奔驰女车主哭诉维权背后, 区块链究竟能否还消费者以尊严?

  • 深入浅出Docker 镜像 | 技术头条

  • 微软 GitHub 旗帜鲜明抵制 996!

  • 源码泄露是裁员报复还是程序员反抗 996?

  • 她说:为啥程序员都特想要机械键盘?这答案我服!

❤点击“阅读原文”,了解更多活动信息。

机器学习萌新必备的三种优化算法 | 选型指南相关推荐

  1. java中如何启动一个新的线程三种方法

    java开启新线程的三种方法: 方法1:继承Thread类 1):定义bai一个继承自Java.lang.Thread类的du类A. 2):覆盖zhiA类Thread类中的run方法. 3):我们编写 ...

  2. C语言快速排序算法及三种优化方式

    C语言快速排序算法及三种优化方式 C语言快速排序算法及三种优化方式 原理 快速排序复杂度分析 1 时间复杂度 2 空间复杂度 快速排序代码实现 1 普通快速排序 2 快速排序优化1-三数取中优化不必要 ...

  3. sai2笔刷_SAI如何安装笔刷?板绘萌新必备

    SAI如何安装笔刷?板绘萌新必备!板绘刚入门的朋友,在入手了板子后,却不知道驱动怎么下载?怎么安装?数位板怎么连接?sai的笔刷如何导入?鉴于驱动安装.数位板连接这些小知识之前都分享过了,所以今天告诉 ...

  4. 2021年征兵没有高考成绩查询,2021年征兵政策新调整,三种情况无法通过政审,快看看是不是自己...

    原标题:2021年征兵政策新调整,三种情况无法通过政审,快看看是不是自己 文/彩玉说教育 很多同学小时候都有一个共同的愿望,那就是长大后要去当兵,而有些同学实现了,有些同学却将愿望转成了其他的目标和方 ...

  5. 排序--Bubble的三种优化

    BubbleSort      冒泡排序是许多人接触的第一种排序方式,由于这种方式比较简单,所以大部分人也没有深入研究,所以写出的代码是这样的: void BubbleSort(int *arr, i ...

  6. python 鱼骨图_数据分析必备的三种思考模型

    原标题:数据分析必备的三种思考模型 新人学习数据分析有个误区,认为Excel很Low,SQL做久了又是表哥表姐,学习python又陷入无尽的工具包中不能自拔,迷茫到找项目学习,结果是分析又不得要领,说 ...

  7. 机器学习、深度学习中常用的优化算法详解——梯度下降法、牛顿法、共轭梯度法

    一.梯度下降法 1.总述: 在机器学习中,基于基本的梯度下降法发展了三种梯度下降方法,分别为随机梯度下降法,批量梯度下降法以及小批量梯度下降法. (1)批量梯度下降法(Batch Gradient D ...

  8. python 三种聚类算法(K-means,AGNES,DBScan)

    python实现鸢尾花三种聚类算法(K-means,AGNES,DBScan) 更新时间:2019年06月27日 14:44:44   作者:weixin_42134141 这篇文章主要介绍了pyth ...

  9. 近似装箱问题(三种联机算法实现)

    [0]README 0.1) 本文总结于 数据结构与算法分析, 源代码均为原创, 旨在 理解 "近似装箱问题(三种联机算法实现)" 的idea 并用源代码加以实现: 0.2) 近似 ...

最新文章

  1. 清华大学王建民:在大数据的思维下,人人都是冰冷的数据包?
  2. revit导出lumion插件_建筑工程BIM建模入门级教程——REVIT的几种渲染方式
  3. 剑指offer: 不用加减乘除做加法
  4. centos下crontab的使用
  5. ArcGIS实验教程——实验十四:空间数据库的建立
  6. IF-ERRORLEVEL使用方法
  7. python xml etree word_使用python格式化插入的元素xml.etree模块,包括新行
  8. qt mysql乱码_Qt连接mysql 并且 解决中文乱码问题
  9. 阿里安全十余年发展的关键词:敬畏、努力
  10. php静态类 使用场景,【php】PHP静态方法和非静态方法的使用场景
  11. 标签生成html怎么转换,如何进行HTML到XML转换以生成封闭标签?
  12. c# PropertyGrid 自定义属性排序
  13. 爬虫必备的防止反爬虫策略
  14. 检错码与纠错码,一码归一码
  15. android 静默安装实现,Android 中静默安装实现详解
  16. Ubuntu 18.04 桌面美化全攻略
  17. Gym:102500E:Expeditious Cubing【精度精度】
  18. ds12c887程序C语言,时钟芯片DS12C887使用说明详解.doc
  19. 网络系统管理 - C模块 - Centos7.9 - Iptables
  20. java application_运行java application时,总是报错

热门文章

  1. Android官方提供的支持不同屏幕大小的全部方法
  2. Red5安装与入门 与FMS配置
  3. linux系统目录结构介绍
  4. Java面试题大汇总,2021年附答案解析
  5. 电动车逆变器的基础知识
  6. github下载速度改善
  7. Android Drawable 详解(教你画画!)
  8. spark之scala快速入门
  9. hive中array嵌套map以及行转列的使用
  10. Mac下安装Node.js