本文介绍了五种微分方式,最后两种才是自动微分。

前两种方法求出了原函数对应的导函数,后三种方法只是求出了某一点的导数。

假设原函数是$f(x,y) = x^2y + y +2$,需要求其偏导数$\frac{\partial f}{\partial x}$和$\frac{\partial f}{\partial y}$,以便应用于梯度下降等算法。

1、手工求导

该方法比较简单,就是自备纸笔,应用基本的求导规则,以及链式求导法则,人工求导。缺点是对于复杂函数容易出错。幸运的是,这一计算过程可由计算机帮我们完成,这就是符号微分。

2、符号微分(Symbolic Differentiation)

如图D-1所示,使用符号微分的方法,计算函数$g(x,y) = 5 + xy$的偏导数。该图左侧代表函数$g(x,y)$,右侧代表$g(x,y)$关于$x$的偏导数$\frac{\partial g}{\partial x} = 0 + (0 \times x + y \times 1) = y$(同样的,可以求得$\frac{\partial g}{\partial y}$)。

图D-1 符号微分

该算法首先求叶子节点关于$x$的偏导数,然后沿着树向上,求得其他节点关于自变量的偏导数。这与手工求导所使用的规则是一样的。

如果函数复杂,该算法生成的树将十分庞大,性能不高。而且无法对很随意的代码求导,例如:

def my_func(a, b):
z = 0
for i in range(100):
z = a * np.cos(z + i) + z * np.sin(b - i)
return z

3、数值微分(Numerical Differentiation)

这是根据导数的定义来求解的。函数$h(x)$在$x_0$点的导数为:

$h'(x) = \lim_{\varepsilon \rightarrow 0} \frac{h(x_0 + \varepsilon) - h(x_0)}{\varepsilon}$

我们取一个很小的$\varepsilon$,带入公式进行计算即可。该方法所得结果不够精确,参数过多时计算量也比较大。但是计算起来很简单,可用于校验手工算出的导数是否正确。

如果有1000个参数,至少需要调用$h(x)$1001词,来求得所有偏导数。

4、前向自动微分(Forward-Mode Autodiff)

该算法依赖一个虚数(dual numbers,这让我想起来oracle的虚表。难度dual可以表示虚无的意思?) $\varepsilon$,满足$\varepsilon^2 = 0$但是$\varepsilon \neq 0$(姑且理解为一阶无穷小吧)。

由于$\varepsilon$是无穷小,因此满足$h(a + b \varepsilon) = h(a) + b \times h'(a)\varepsilon$。因此,算出$h(a + \varepsilon) $可以同时得到$h(a)$和$h'(a)$,如图D-2所示。

图D-2 前向自动微分

上图值计算了$\frac{\partial f}{\partial x}(3,4)$,同样的方法可以算的$\frac{\partial f}{\partial y}(3,4)$。

如果有1000个参数,需要遍历上图1000次,来求得所有偏导数。

5、反向自动微分(Reverse-Mode Autodiff)

这是TensorFlow所采用的自动微分算法。如图D-3所示,该算法首先前向(也就是从输入到输出)计算每个节点的值,然后反向(从输出到输入)计算所有的偏导数。

图D-3 反向自动微分

反向计算时应用链式求导法则:

$\frac{\partial f}{\partial x} = \frac{\partial f}{\partial n_i} \times \frac{\partial n_i}{\partial x}$

由于$n_7$就是输出节点,$f = n_7$,因此$\frac{\partial f}{\partial n_7} = 1$。

该算法强大且精确,尤其是输入很多,输出很少时。假如函数有10个输出(不管输入是1千,2万还是更多),求得所有偏导数需要对上图遍历11次。

各个算法比较:

附录D——自动微分(Autodiff)的更多相关文章

  1. (转)自动微分(Automatic Differentiation)简介——tensorflow核心原理

    现代深度学习系统中(比如MXNet, TensorFlow等)都用到了一种技术——自动微分.在此之前,机器学习社区中很少发挥这个利器,一般都是用Backpropagation进行梯度求解,然后进行SG ...

  2. pytorch学习-AUTOGRAD: AUTOMATIC DIFFERENTIATION自动微分

    参考:https://pytorch.org/tutorials/beginner/blitz/autograd_tutorial.html#sphx-glr-beginner-blitz-autog ...

  3. 自动微分(AD)学习笔记

    1.自动微分(AD) 作者:李济深链接:https://www.zhihu.com/question/48356514/answer/125175491来源:知乎著作权归作者所有.商业转载请联系作者获 ...

  4. <转>如何用C++实现自动微分

    作者:李瞬生转摘链接:https://www.zhihu.com/question/48356514/answer/123290631来源:知乎著作权归作者所有. 实现 AD 有两种方式,函数重载与代 ...

  5. PyTorch自动微分基本原理

    序言:在训练一个神经网络时,梯度的计算是一个关键的步骤,它为神经网络的优化提供了关键数据.但是在面临复杂神经网络的时候导数的计算就成为一个难题,要求人们解出复杂.高维的方程是不现实的.这就是自动微分出 ...

  6. 【tensorflow2.0】自动微分机制

    神经网络通常依赖反向传播求梯度来更新网络参数,求梯度过程通常是一件非常复杂而容易出错的事情. 而深度学习框架可以帮助我们自动地完成这种求梯度运算. Tensorflow一般使用梯度磁带tf.Gradi ...

  7. PyTorch 自动微分示例

    PyTorch 自动微分示例 autograd 包是 PyTorch 中所有神经网络的核心.首先简要地介绍,然后训练第一个神经网络.autograd 软件包为 Tensors 上的所有算子提供自动微分 ...

  8. PyTorch 自动微分

    PyTorch 自动微分 autograd 包是 PyTorch 中所有神经网络的核心.首先简要地介绍,然后将会去训练的第一个神经网络.该 autograd 软件包为 Tensors 上的所有操作提供 ...

  9. MindSpore:自动微分

    MindSpore:自动微分 作为一款「全场景 AI 框架」,MindSpore 是人工智能解决方案的重要组成部分,与 TensorFlow.PyTorch.PaddlePaddle 等流行深度学习框 ...

随机推荐

  1. Linux - 简单好用的计算器 bc

    如果在文本模式当中,突然想要作一些简单的加减乘除,偏偏手边又没有计算器!这个时候要笔算吗? Linux有提供一支计算程序,那就是bc.你在命令列输入bc后,屏幕会显示出版本信息, 之后就进入到等待指示 ...

  2. "《算法导论》之‘线性表’":基于数组实现的单链表

    对于单链表,我们大多时候会用指针来实现(可参考基于指针实现的单链表).现在我们就来看看怎么用数组来实现单链表. 1. 定义单链表中结点的数据结构 typedef int ElementType; cl ...

  3. TCP连接建立系列 — 服务端接收ACK段(二)

    本文主要分析:三次握手中最后一个ACK段到达时,服务器端的处理路径. 内核版本:3.6 Author:zhangskd @ csdn blog 创建新sock 协议族相关的操作函数,我们要看的是TCP ...

  4. Java中的50个关键字

    form:http://blog.csdn.net/luoweifu/article/details/6776240 Java中的50个关键字 关键字也称为保留字,是指java语言中规定了特定含义的标 ...

  5. Oracle数据库容灾备份技术探讨

    Oracle数据库容灾备份技术探讨 三种Oracle灾备技术 对于Oracle数据库的灾备技术,我们可以从Data Guard,GoldenGate和CDP角度去考虑. Oracle Data Gua ...

  6. Android网络请求框架之Retrofit实践

    网络访问框架经过了从使用最原始的AsyncTask构建简单的网络访问框架(甚至不能称为框架),后来使用开源的android-async-http库,再到使用google发布的volley库,一直不懈的 ...

  7. BCD码转十进制C语言实现

    #include <stdio.h> #include <stdlib.h> #define uchar unsigned char uchar BCD_Decimal(uch ...

  8. The 12th tip of DB Query Analyzer, powerful in text file process

    MA Gen feng ( Guangdong Unitoll Services incorporated, Guangzhou 510300) Abstract   It's very powerf ...

  9. linux下让irb实现代码自动补全的功能

    我不知道其他系统上irb是否有此功能,但是在ubuntu上ruby2.1.2自带的irb默认是没有代码自动补全功能的,这多少让人觉得有所不便.其实加上也很简单,就是在irb里加载一个模块:requir ...

  10. NopCommerce开源项目中很基础但是很实用的C# Helper方法

    刚过了个五一,在杭州到处看房子,不知道杭州最近怎么了,杭州买房的人这么多,房价涨得太厉害,这几年翻倍翻倍地涨,刚过G20,又要亚运会,让我这样的刚需用户买不起,也买不到房子,搞得人心惶惶,太恐怖了,心 ...