AI 框架基础技术之自动求导机制 (Autograd)

发布于 2021-09-09 16:31 ,所属分类:数学资料学习库

0 前言

可以把神经网络看作一个复合数学函数,网络结构设计决定了多个基础函数如何复合成复合函数,网络的训练过程确定了复合函数的所有参数。为了获得一个“优秀”的函数,训练过程中会基于给定的数据集合,对该函数参数进行多次迭代修正,重复如下几个步骤:


1. 前向传播

2. 计算损失

3. 反向传播(计算参数的梯度)

4. 更新参数


这里第 3 步反向传播过程会根据输出的梯度推导出参数的梯度,第 4 步会根据这些梯度更新神经网络的参数,这两步是神经网络可以不断优化的核心。反向传播过程中需要计算出所有参数的梯度,这当然可以由网络设计者自己计算并且通过硬编码的方式实现,但是网络模型复杂多样,为每个网络都硬编码去实现参数梯度计算将会耗费大量精力。因此,AI 框架中往往会实现自动求导机制,以自动完成参数的梯度计算,并在每个 iter 中自动更新梯度,使得网络设计者可以将注意力放到网络结构的设计中,而不必关心梯度是如何计算的。


本文的内容基于我们自研的 AI 框架 SenseParrots,介绍框架自动求导的实现方式。本次分享将分为如下两部分:


自动求导机制介绍

SenseParrots 自动求导实现


1自动求导机制介绍


从数学层面上看求导这个问题,又包括一阶导和高阶导,求导方式主要有:数值求导、符号求导、自动求导;其中自动求导又分为 forward mode 和 reverse mode,AI 框架中的自动求导通常基于 reverse mode。


reverse mode,即依据链式法则的反向模式,指在进行梯度计算过程中,从最后一个节点开始,依次向前计算得到每个输入的梯度。基于 reverse mode 进行梯度计算,可以有效地把各个节点的梯度计算解耦开,每次只需要计算图中当前节点的梯度计算。


基于 reverse mode 进行梯度计算的过程可以分为三步,以下列复合函数计算为例:


y=x1+x2

z=y*x3


1. 首先创建前向的计算图:



2. 然后计算前向传播的值,即y、z。

3. 基于该前向计算图,相应的得到反向计算图,在进行反向传播时,基于给定的输出z的梯度dz,依次计算:




需要注意的是,最后一个计算 "+=" 是一个 inplace 的计算,即以


由此得到了完整的计算图,并且完成了相关信息的关联,完整的计算图如下:



2.4 基于输出的梯度信息对输入自动求导


z.backward(torch.ones_like(z))


在基于动态图的 AI 框架中,反向求导过程通常是由上述的 .backward (梯度)函数触发的。SenseParrots 的反向求导过程,首先根据给定的输出梯度,更新最终输出的梯度值;然后对计算图中节点进行拓扑排序,获得满足依赖关系的 GradFn 的执行顺序;依次执行 GradFn 中所记录 Function 的反向计算函数,根据输出的梯度,计算并更新输入的梯度。


首先看一下上述例子,其中


4. 执行 GF2,以 GF3 计算之后的


5. 执行GF1,以


6. 依次执行 LeafGF1、LeafGF2。


7. 执行队列为空,反向求导过程结束,默认情况下计算图会被清空,非叶子节点的梯度信息清空。由此得到了需要的计算梯度。


3 招聘信息


SenseParrots 是商汤自研的面向工业级应用的通用人工智能训练框架,旨在解决业务模型生产过程中的实际问题,助力人工智能技术赋能产业,实现算法落地应用,有效衔接生产环境。


在 SenseParrots 团队里,你可以提升开发技术、探索前沿方向、认识一群优秀可爱的小伙伴儿~这里有值得探索又充满挑战的前沿技术,这里有耐心指导你的 Mentor,这里有志同道合、迎接挑战、力求突破的小伙伴儿,这里有支持鼓励你向前的 PM 小姐姐们!


来小 P 家吧,做最值得探索又充满挑战的前沿技术!


目前深度学习编译开发、大规模训练技术突破、深度学习框架开发、深度学习技术应用、模型部署(量化转换)、前后端、项目、产品、运营等等岗位的实习/校招/全职均在招募!


简历投递:parrotshr@sensetime.com


注:本文转载自知乎文章,已由作者授权转载,未经允许,不得二次转载。

原文链接:

https://zhuanlan.zhihu.com/p/347385418



相关资源