©作者 | JermyLu

学校 | 中国科学院大学

研究方向 | 自然语言处理与芯片验证

引言

众所周知,Tensorflow、Pytorch 这样的深度学习框架能够火起来,与其包含自动微分机制有着密不可分的联系,毕竟早期 Pytorch≈Numpy+AutoGrad,而 AutoGrad 的基础就是自动微分机制。

常见的梯度求解方法包括:数值微分(Numerical Differentiation)、符号微分(Symbolic Differentiation)和自动微分(Automatic Differentiation)。

数值微分

在数学中,求解梯度 = 求解函数偏导数,而导数是用极限来定义的,如下所示:

其中, 表示参数 的一个很小的变化量,上式是导数的双边定义形式。如果函数 是初等函数,则可使用求导法则得到其导数。如果不能得到函数导数的解析式,则必须使用数值微分方法求解该函数在某个点的导数。

数值微分方法简单,但计算量巨大,而且会造成截断误差(Truncation Error)和舍入误差(Round-off Error)。

当用数值微分方法求解梯度时,需要用极限即无穷过程求解。然而,无穷过程在计算机中是不存在的,计算机需要将无穷过程求解截断为有限过程求解。例如,导数定义中 是一个无穷过程,在实际计算中 (不能等于 0,等于 0 就不存在变化量了),而可能令 ,这就带来了截断误差。

舍入误差是指运算得到的精确值无法被计算机存储,只能以近似值代替产生的差异。例如,当实数 超过了双精度浮点数可以表示的范围之后,计算机无法精确表示 ,而只能以其近似值 代替,就产生了舍入误差。因此,数值微分方法不适用于神经网络梯度反向传播。

符号微分

符号微分是通过建立符号表达式求解微分的方式,即借助符号表达式和求导公式,推导出目标函数关于自变量的微分表达式,最后代入数值即可得到微分结果。例如,对于表达式 ,其微分表达式 ,然后将具体数值 和 代入,即可得到 。

使用符号微分方法时,必须将目标函数转为一个完整的数学表达式,这个过程中会出现表达式膨胀(Expression Swell)的问题,大大增加系统存储和处理表达式的负担。

例如 ,则

在深层神经网络模型中,神经元数量和参数量极大,完整的损失函数的表达式会非常冗长(比示例复杂的多得多,长的多得多),不易存储和管理;再者,完整写出损失函数的微分表达式也是一项庞大的工作量;最重要的一点,在神经网络的梯度反向传播过程中,只需要微分的(中间)结果值,而不是微分表达式。因此,符号微分方法也不适用于神经网络梯度反向传播。

自动微分

自动微分是一种“原子化”的符号微分,其将一个复杂的数学运算过程分解为一系列简单的基本算子,如对数函数、三角函数等,然后对这些基本算子进行符号微分得到中间结果,再应用于整个函数。

首先,我们了解一下链式法则。

单变量函数链式法则:

若 是 的函数, 是 的函数, 是 的函数,则 。

多变量函数链式法则:

若 是 的函数, 都是 的函数,则 , 类似。

接下来,我们以三层全连接层神经网络为例,解释自动微分机制。

定义:输入层输出为 ;隐层输出为 ;输出层输出为 ;标签为 ,损失函数使用 范式,即 ;隐层激活函数为 记为 ,输出层激活函数为 记为 。

因此:令 ,则 ;令 ,则 ,为了方便起见,不考虑偏置项。

这个三层神经网络中,参数只包含 和 ,而梯度反传参数更新,更新的就是 和 。因此,梯度计算的目标是 与 。

反向传播是由输出层开始计算梯度,之后逆向传播到每一层网络,直至到达输入层。

输出层发生的计算为 ,即输出层的输入 先经过线性变换右乘 转换为中间状态 ,之后 经过 激活函数变为 。最后, 和 计算得到损失函数值 。

该部分网络的前向计算中,上述过程的计算次序为 ,而反向计算中节点访问次序与之相反。

1. 计算 ,即计算损失函数 关于网络输出结果 的梯度,并将梯度向前传递。

2. 计算 记为 , 即 函数相对于其输入 的梯度,并将梯度向前传递。

3. 得到 之后,下一步的目标是计算 与 。

  1. 梯度 需要继续向前一层传递,用于计算其他变量的梯度;梯度 会作为参数 的梯度计算结果,用于模型参数的更新。

接下来,我们来分析隐藏层发生的计算 ,其中 分别表示隐藏层的输出、中间结果、输入和参数。该部分网络的前向计算中,上述过程的计算次序为 ,而反向计算中节点访问次序与之相反。

1. 计算 , 已知,而 即 激活函数相对于其输入 的梯度,有 ,即可获得该梯度记为 ,并向前传递。

2. 得到 之后,下一步计算 与 :

  1. 梯度 需要继续向前一层传递,用于计算其他变量的梯度;梯度 会作为参数 的梯度计算结果,用于模型参数的更新。

综合输出层和隐藏层的反向传播方法,再根据神经网络有向计算图的拓扑结构,逆向访问每一个节点执行上述梯度计算过程即可得到神经网络中任意位置和任意参数的梯度信息。

总结

链式法则+反向传播+有向图拓扑结构,构成了自动微分机制的基础。

更多阅读

#投 稿 通 道#

 让你的文字被更多人看到 

如何才能让更多的优质内容以更短路径到达读者群体,缩短读者寻找优质内容的成本呢?答案就是:你不认识的人。

总有一些你不认识的人,知道你想知道的东西。PaperWeekly 或许可以成为一座桥梁,促使不同背景、不同方向的学者和学术灵感相互碰撞,迸发出更多的可能性。

PaperWeekly 鼓励高校实验室或个人,在我们的平台上分享各类优质内容,可以是最新论文解读,也可以是学术热点剖析科研心得竞赛经验讲解等。我们的目的只有一个,让知识真正流动起来。

谈谈自动微分(Automatic Differentiation)相关推荐

  1. 如何在python中表示微分_Python实现自动微分(Automatic Differentiation)

    什么是自动微分 自动微分(Automatic Differentiation)是什么?微分是函数在某一处的导数值,自动微分就是使用计算机程序自动求解函数在某一处的导数值.自动微分可用于计算神经网络反向 ...

  2. 自动微分(Automatic Differentiation)

    目录 什么是自动微分 手动求解法 数值微分法 符号微分法 自动微分法 自动微分Forward Mode 自动微分Reverse Mode 参考引用 现代深度学习系统中(比如MXNet, TensorF ...

  3. 自动微分(Automatic Differentiation)简介

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

  4. 计算机求导方法:自动微分(Automatic Differentiation)

    目录 1 Manual Differentiation (手动微分) 1.1 计算方法 1.2 缺陷 2 Symbolic Differentiation (符号微分) 2.1 计算方法 2.2 缺陷 ...

  5. 自动微分 ​​​​​​​​​​​​​​Automatic Differentiation

    目录 一.概述 二.原理 2.1 前向模式 2.2 后向模式 2.3 前向 VS 反向 三.Pytorch自动微分举例 四.Ref 记录自动微分的知识点. 一.概述 计算机实现微分功能, 有以下四种方 ...

  6. 自动微分(Auto differentiation)

    1.自动微分是干什么的: 自动微分现在已经是深度学习框架的标配,我们写的任何模型都需要靠自动微分机制分配模型损失信息,从而更新模型.简言之,就是在模型更新计算梯度的时候会用到自动微分. 在数学和计算机 ...

  7. 深度学习利器之自动微分(2)

    深度学习利器之自动微分(2) 文章目录 深度学习利器之自动微分(2) 0x00 摘要 0x01 前情回顾 0x02 自动微分 2.1 分解计算 2.2 计算模式 2.3 样例 2.4 前向模式(For ...

  8. 【自动微分原理】具体实现方式

    第一篇自动微分原理文章中我们大概初步谈了谈从手动微分到自动微分的过程,第二篇自动微分正反模式中深入了自动微分的正反向模式具体公式和推导. 实际上第二章了解到正反向模式只是自动微分的原理模式,在实际代码 ...

  9. 深度学习利器之自动微分(1)

    深度学习利器之自动微分(1) 文章目录 深度学习利器之自动微分(1) 0x00 摘要 0.1 缘起 0.2 自动微分 0x01 基本概念 1.1 机器学习 1.2 深度学习 1.3 损失函数 1.4 ...

最新文章

  1. 【每日一算法】杨辉三角 II
  2. JAVA SE学习day14:解析XML
  3. 知乎热议:计算机专业钱景究竟如何?
  4. css实现图片动画效果
  5. python爬取贴吧所有帖子-Python实现的爬取百度贴吧图片功能完整示例
  6. Ubuntu 16.04 安装 caffe
  7. beanutils工具类_Apache Commons 工具类介绍及简单使用
  8. SAP ABAP关键字在Chrome浏览器里高亮显示的实现原理 - How is ABAP keyword highlight implemented in Chrome
  9. android 4.4以上能够实现的沉浸式状态栏效果
  10. pygame只能编写游戏_游戏框架搭建
  11. 理论与哲学就是梳理无限感性经验和知性知识的工具
  12. 经常被问到的十个 Java 面试题?你Get了吗?
  13. 2017.5 期中考试 完挂
  14. 武汉大学计算机学院创业老师,胡瑞敏 - 教师简历 CV- 武汉大学计算机学院
  15. 未能加载文件或程序集Tianyige.SqlServerDAL问题解决
  16. 基于华为云IoT设计的智能门锁
  17. 简历在线制作计算机,简历在线生成,在线生成PDF或word格式简历
  18. 空间索引 - Redis/MongoDB/PostgreSQL/MySQL空间索引使用报告
  19. VIP视频会员,无限制看剧对人的自制力,产生了严重的考验和折磨
  20. Unity简单麻将胡牌算法

热门文章

  1. Altium designer原理图库中元件变动后在原理图中同步更新方法
  2. html 抓取 post 请求,javascript – 获取HTML Form Post方法的返回值
  3. java datainputstream_Java DataInputStream readUnsignedByte()方法
  4. java聚合excel_java操作excel
  5. python哪个代码是正确的字典_Python - 字典(dict) 详解 及 代码
  6. 财务学python有什么用_学习Python对财务工作者有哪些用途?
  7. 二分图最大匹配模板 HDU1083
  8. scrapy基础知识之制作 Scrapy 爬虫 一共需要4步:
  9. webstorm 设置jsp支持
  10. 如何用堆栈和循环结构代替递归调用--递归转换为非递归的10条军规