在上一篇文章中,我们简要理解了计算机中常用的几种不同方式。
本章将深入介绍AI框架的核心函数的核心功能,并将自动微型细分分为前向差分和落后差分的两种实现模式。不同的实现模式具有不同的机制和计算逻辑。无论哪一个,无论哪种方式与雅克矩阵密不可分,所以我们也将了解雅克的原理。
雅克
在矢量演算中,雅各布矩阵是以某种方式排列的矩阵。它的等级称为雅各布级。
Jacobian矩阵代表了两个向量的可能部分引导。它是一个向量相对于另一个向量的梯度,它实现了N维矢量映射到M维矢量的映射。
在向量操作中,Jacobian矩阵是基于所有变量对所有变量的函数的数值矩阵。当输入的数量等于输出号时,它也称为雅各布等级。
假设输入向量输和输出向量∈,则将雅各布矩阵定义为:
根据分解后的基本操作指南和链条规则的不同顺序,自动微分可以分为两种模式:
两种自动微分数模型都通过递归方法找到了DY/DX,但根据链条规则的形式,它们并不相同。
前向梯度的累积积累将指定从内部到外部的遍历路径,即首先计算DW_1/DX,然后计算DW_2/DW_1。最后,计算DY/DW_2。略微计算。因此,可以计算前向模式的输出值和指南数值。
反向梯度积累恰恰相反。它将首先计算DY/DW_2,然后计算DW_2/DW_1,最后计算DW_1/DX。这是最熟悉的反向通信模式,这与模型误差的倒数差异非常一致。
也就是说,反向模式需要执行计算图的正向计算,获得输出值,然后进行反向传播。反向模式需要保存前向传输的中间变量值(例如)。这些中间变量值用于计算反向传播过程中的指导,因此反向模式的内存开销很大。
如图所示,面向前面的切线模式伴随模式AD分别计算雅各布矩阵的列和线。
切线模式AD(切线模式AD)可以在程序计算中传递链条规则:
需要与Jacobian矩阵中的单个输入相关的参数,即Jacobian矩阵的一列。
在链条规则(伴随模式AD)之后,用于获取:
您可以通过计算过程的遍历获得Jacobian矩阵。。这些辅助信息包括计算图的中间变量和计算过程。
我们以公式为例,首先将其转换为计算图:
在被转换为DAG(带有无环图)结构后,我们可以轻松地逐步计算函数的值,并在每个步骤中找到衍生物的数量。以下形式:
整个指导可以分解为一系列微型组合。
从计算图的起点开始,计算沿计算图的边缘的方向,并最终达到计算图的终点。IT根据计算图中每个节点的值及其衍生值的值基于计算图自变量的值,并保留中间结果。总是获取整个函数及其导数值的值。整个过程对应于一个 - 羽毛复合函数,以指导最内层的外层。
同样,以公式为例:
表面是向前-TO -mode模式的计算过程。在下表中,左半部分是从左到右的节点的值和计算过程的值。右半部分是x1每个节点的指导结果和计算过程。
在此示例中,我们希望计算函数是dy/dx1在x_1 = 2,x_2 = 5,也就是说:
可以看出,左侧是源程序分解后的基本操作集合,右侧是基于已知的指导规则和链条规则从上到下的每个基本操作的结果。
根据正向原始轨迹直接计算该公式,节点值的计算如下:如下:
在这一点上,已经获得了图中所有节点的值。在自动差分模式(正切向切轨)中,在计算节点值的同时,也将共同计算。假设$ delta y/ delta x_1 $,它从输入开始。
从计算过程的角度来看,自动微分数的前向模式实际上与我们在演算中学习的指导过程一致。
将上述过程作为解决雅克矩阵的问题。映射为:
在这种情况下,当计算每个自动微型划分时,初始输入设置为$ dot {x_i} = 1 $,其余部分设置为0。相应的jacobian矩阵定义为:
一旦进行正向计算,您就可以从Jacobian矩阵中找到一列数据列,例如$ dot {x_3} = 1 $对应于第三列。TangengentMode AD可以在jacobian矩阵中获得一个与单个输入相关的部分程序计算,即Jacobian矩阵的一列。
如下图所示,如果要在正模式下找到所有输入的指南,则需要计算n时间以查找所有列。
此外,设置$ dot {x} = r $,您可以直接计算正面的jacobian -vector产品以传播:
最后,我们可以将这种迭代的计算目标恢复到雅克中的I -lei,而不是矩阵中。
正向模式的优点:
正向模式的缺点:
反向自动微分数也基于基于链的法律。只能计算一个前过程,可以计算反向过程以计算所有参数的数量或梯度。
因为有必要将前进和向后的过程组合,所以反向自动微分数将使用特殊的数据结构来存储计算过程。
这种特殊的数据结构(例如Tensorflow或Mindspore)将所有操作存储在图中。此图片可以是带有DAG(DAG)的计算图;Pytroch使用胶带来自缩小每个操作的缩写,它们表达了功能和变量之间的关系。
反向模式是从向后计算的,并依次获得每个中间变量节点的部分指导数,直到达到自变量节点,以便获得每个输入的零件数。指南值是根据节点的后续节点计算的(前面的以下节点以扩展)。
指导多组合函数时,整个过程对应于从最外层的内部方向。这可以有效地计算每个节点的梯度计算,并且只需要注意计算图中当前节点的梯度计算每一次。
从下图可以看出,反向模式和正向模式是一对相反的过程。反向模式从最终结果开始,并使用最终输出指导每个节点。下面的虚线是反向模式。
向前和向后两种模式的过程表示如下。表的左列的浅色是前向计算函数值的过程。它与前方向计算相同。右侧的深色是反向计算值的过程。
反向模式的计算过程如图所示,其中:
根据链型指南规则,有:
可以看出,左侧是源程序分解后的基本操作集合,右侧是基于已知的指导规则和链条规则从底部到顶部的每个基本操作的结果。
到目前为止,我们已经计算了所有步骤的部分指导的值。是否需要计算$ edline {v} _1 $和$ overline {v} _2 $ .CALCULATE $。自变量x_1的最后位置。有多个路径。您需要在此路径上连接值以获取乘数值,然后添加此多路径的乘法值以添加值get,以获得最终结果。
从y到x_1有两条路径,其中:
因此,$ edielline {v} _1 = 0.5+5 = 5.5 $,同一件事是$ edline {v} _2 = 2.0-0.284 = 1.716 $
对于函数$ + edline {y} = f( + edline {x})$,其中$ f:mathbb {r}^{n} ightarrow mathbb {r}^{m} $,然后$ edline {y} $ of $ yiverline {x} $的梯度可以表示为jacobian matrix:
设置$ edline {v} $是函数$ l = g(edline})$的梯度:
Jacobian-vector积累是函数L:X_1的梯度:
也就是说,可以通过矩阵的后续节点的梯度值获得当前节点的乘积。
在前进模式的计算中,可以同时找到每个节点的每个节点的值以及节点的导度,但成本是为多个输入计算多次。
反向模式的优点:
反向模式的缺点:
切线模式伴随模式AD分别计算了Jacobian矩阵的列和线。
正向模式和反向模式之间的差异在于矩阵乘法的开头。
当输出尺寸小于输入维度时,反向模式下的乘法数小于正向模式。因此,当输出尺寸大于输入时,使用前方向模式是适当的微型划分;当输出尺寸远小于输入时,反向模式略有不同。
也就是说,背面 - 自动微观 - 更适合多参数。当多个参数时,自动微分差异时间的时间复杂性较低。只能找到反向模式的计算过程才能找到每个输入的输入的指南编号,这很容易放松。用于后续优化更新的Seek梯度。
因此,大多数AI框架在反向模式下都优先考虑,但是也有AI框架同事,例如Mindspore支持正面和反向实现模型。
一些公式可能不会被解析,您可以参考相同的CSDN Content->自动差异两个Modes_Zomi Sauce Blog -CSDN博客
[1]机器学习中的自动差异:调查:https://arxiv.org/abs/1502.057677
[2] Rirchard L. Burden和J. Douglas Faires。数值分析。布鲁克斯/科尔,2001年。
[3] Max E. Jerrell。自动差异和间隔算术,用于估计不平衡模型。计算经济学,10(3):295–316,1997.1997.1997.1997.1997.1997.1997.1997.1997.1997.1997.1997.1997.1997.1997.1997.1997.1997.1997.1997.1997.1997.1997.1997。1997.1997.1997.1997.1997.1997.1997.1997.1997。
[4] Johannes Grabmeier和Erich Kaltofen。计算机代数手册:基础,应用程序,系统。施普林格,2003年。
[5] G. W. Leibniz。Machina arithmetica在非添加剂tantum et saptractio sed eT乘法性零曲子,diviso vero paene nullo nullo animi labore peragantur中。1685年。1685。
[6] George F. Corliss。分化算术的应用,《计算观点》第19卷,第127-48页。学术出版社,波士顿,1988年。
[7] Arun Verma。自动分化的固定性。当前科学,78(7):804–7,2000。
[9]约翰·诺兰(John F. Nolan)。数字计算机上的分析分化。硕士论文,马萨诸塞州理工学院,1953年。
[11]罗伯特E。Weekrt。一个简单的自动导数评估程序。ACM的通信,7:463–4,1964。1964年。
[12] Andreas Griewank。关于自动差异。第83–108页,1989年。
[14] Zhihu列:自动差异:https://zhuanlan.zhihu.com/p/61103504
[15]知识列:许多计算方法第6章数值点和值微观 - 分数:https://zhuanlan.zhihu.com/p/14
[16] Zhihu专栏:技术共享|从自动微型划分到可用的微型编程语言设计https://zhuanlan.zhihu.com/p/393160344
[17]博客花园:自动差异差异差异https://www.cnblogs.com/rossixyz/p/
原始:https://juejin.cn/post/7100543454022729742