机器学习之——自动求导

作者:叶虎

小编:张欢

随机梯度下降法(SGD)是训练深度学习模型最常用的优化方法。在前期文章中我们讲了梯度是如何计算的,主要采用BP算法,或者说利用链式法则。但是深度学习模型是复杂多样的,你不大可能每次都要自己使用链式法则去计算梯度,然后采用硬编程的方式实现。

而目前的深度学习框架其都是实现了自动求梯度的功能,你只关注模型架构的设计,而不必关注模型背后的梯度是如何计算的。不过,我们还是想说一说自动求导是如何实现的。

这里我们会讲几种常见的方法,包括数值微分(Numerical Differentiation),符号微分(Symbolic Differentiation),前向模式(Forward Mode)和反向模式(Reverse Mode)。

数值微分

数值微分方式应该是最直接而且简单的一种自动求导方式。从导数的定义中,我们可以直观看到:

当h接近0时,导数是可以近似计算出来的。可以看到上面的计算式几乎适用所有情况,除非该点不可导。可是数值微分却有两个问题,第一个就是求出的导数可能不准确,这毕竟是近似表示,比如要求f(x)=x^2在零点附近的导数,如果h选取不当,你可能会得到符号相反的结果,此时误差就比较大了。第二个问题是对于参数比较多时,对深度学习模型来说,上面的计算是不够高效的,因为每计算一个参数的导数,你都需要重新计算f(x+h)。但是数值运算有一个特殊的用武之地就是在于可以做梯度检查(Gradient check),你可以用这种不高效但简单的方法去检查其他方法得到的梯度是否正确。



符号模式

符号微分适合符号表达式的自动求导,符号微分技术广泛应用在数学软件如Matlab、Maple及Mathematica等。符号微分的原理是基于下面的简单求导规则:

当我们将符号表达式用表达式树表示时,可以利用加法规则和乘法规则进行自动求导。比如我们要求符号表达式f(x)=2x+x^2,可以展开成如下图的表达式树:

利用求导规则,可以求出:

基于表达式树和求导规则,我们可以得到最终的导数。有一点要注意的是,符号微分不一定会得到简化的导数,因为计算机可能并不能进行智能的简化。所以,如果表达式树结构较复杂时,得到的导数表达式会相当复杂,也许出现表达式爆炸现象。



前向模式

前向模式最简单明了,其基于的是二元数(dual numbers)。我们先来讲解一下二元数,其基本格式如下所示:

其中a和b都是实数,而

是无穷小量,你可以认为其无限接近0,但是并不等于0,并且

,这是借鉴了微积分中的概念。所以,你可以认为

是一个接近5的数。对于二元数,其满足简单的加法和乘法规则:

对于二元数,其更重要的一个特性是:

这意味着,我们只需要计算出

,就可以得到

以及其对应的导数

。所以,一个前向计算过程可以同时得到函数值与其导数,这就是前向模式的原理。举例来说,如果要计算f(x)=2x+x^2在x=2处的函数值与导数,其计算过程如下所示:



反向模式

最后要说的就是反向模式,反向模式就是我们常说的BP算法,其基于的原理是链式法则。我们仅需要一个前向过程和反向过程就可以计算所有参数的导数或者梯度,这对于拥有大量训练参数的神经网络模型梯度的计算特别适合,所以常用的深度学习框架如Tensorflow其自动求导就是基于反向模式。方向模式具体的实现细节可以参考之前的文章。

参考资料

1. Automatic Differentiation in Machine Learning: a Survey, https://arxiv.org/pdf/1502.05767.pdf

2. Hands-On Machine Learning with Scikit-Learn and TensorFlow, Aurélien Géron, 2017.

原文发布于微信公众号 - 机器学习算法全栈工程师(Jeemy110)

原文发表时间:2017-10-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Python中为长短期记忆网络扩展数据

用于序列预测问题的数据可能需要在训练神经网络(如长短期记忆递归神经网络)时进行缩放。

2167
来自专栏菩提树下的杨过

机器学习笔记(1):线性回归

初次接触机器学习的朋友们,建议先把这篇概念性的科普文章,精读5遍以上:神经网络浅讲:从神经元到深度学习 下列代码来自 https://zh.gluon.ai/c...

19510
来自专栏ATYUN订阅号

【深度学习】AI如何用文字表达情绪——使用人工神经网络进行带情感识别的文本分类

本文将带你尝试,不使用文本复杂的矩阵转换将文本分类。本文是对3种方法的综合描述和比较,这些方法被用来对下面这些数据的文本进行分类。完整的代码可以在下面链接找到。...

2273
来自专栏机器学习算法全栈工程师

15分钟入门NLP神器—Gensim

作为自然语言处理爱好者,大家都应该听说过或使用过大名鼎鼎的Gensim吧,这是一款具备多种功能的神器。 Gensim是一款开源的第三方Python工具包,用于...

1115
来自专栏人工智能LeadAI

学习笔记 | 吴恩达之神经网络和深度学习

机器学习 机器学习研究的是计算机怎样模拟人类的学习行为,以获取新的知识或技能,并重新组织已有的知识结构使之不断改善自身。简单的说,就是计算机从数据中学习规律和模...

3754
来自专栏北京马哥教育

Python数据挖掘 | 实战案例之预测糖尿病

豌豆贴心提醒,本文阅读时间7分钟 今天给大家讲解一个实战案例:如何根据现有数据预测糖尿病。在这个案例开始之前,希望大家回忆一下大学里讲过的线性回归的知识,...

3469
来自专栏程序员Gank

神经网络和深度学习(吴恩达-Andrew-Ng):一二周学习笔记

机器学习: 机器学习研究的是计算机怎样模拟人类的学习行为,以获取新的知识或技能,并重新组织已有的知识结构使之不断改善自身。简单的说,就是计算机从数据中学习规律和...

2151
来自专栏机器学习原理

机器学习(6)——决策树前言:

前言: 通过第前面的学习介绍了机器学习回归模型创建的流程,并且知道了机器学习要做的事情是找到目标函数,优化它,通过每次迭代都使目标函数值最小,最优解就是目标函数...

39210
来自专栏ATYUN订阅号

如何在Python中扩展LSTM网络的数据

您的序列预测问题的数据可能需要在训练神经网络时进行缩放,例如LSTM递归神经网络。 当网络适合具有一定范围值(例如10s到100s的数量)的非标度数据时,大量...

3555
来自专栏华章科技

你是合格的机器学习数据科学家吗?来挑战这40题吧!(附解答)

目前机器学习是最抢手的技能之一。如果你是一名数据科学家,那就需要对机器学习很擅长,而不只是三脚猫的功夫。作为 DataFest 2017 的一部分,Analyt...

592

扫码关注云+社区