jax可微分编程的笔记
1.1.1 求导的基本概念
所谓的导数是一个从集合F到自身的映射.
有时,我们也将一个从函数到函数的映射称为一个操作,
这里的操作在物理学中也被称作一个算符.
但在计算机中的操作符相当于数学中的一个函数,而非从
函数到函数的映射.
应该指出的是,如果我们将求导(包括偏导数)这样的操作
视一个由程序所定义的操作grad,那么,grad操作的
输入和输出都将是相同的类型的函数。换言之,一个求导
操作应该被视作一个从函数的集合Fmn到其自身的映射;
容易看出,这样的映射是确定并且唯一的。求导作为一种
操作的唯一性,是对其进行程序实现的数学前提。
1.1.2 梯度操作
梯度操作是一个从函数集Fn1到Fnn的映射。
从几何的角度来看,f:Rn->R给出了一个n维空间之中的标量场。
它将n维空间中的一个点对应到一个实数;则grad f 对应着一个
n维空间之中的矢量场,它将n维空间中的一个点对应到一个n维
的矢量。映射的结果 grad f(x) 属于 n 维空间,给出了n维空间
中标量场f在点x=(x1,x2,....xn)上增长最快的方向。有时,我也会
认为梯度操作 grad:Fn1->Fnn本身是n维的。
而从程序实现的角度来看,它等价于对多元函数同时进行了n次偏导数
的操作。
1.1.3 雅可比矩阵
矩阵形式记法,使得诸如链式求导法则,这样的过程,可以被简单的
写成矩阵相乘。
1.2 手动求导
优点是不会引入额外的计算误差,同时程序运行性能有保证。
缺点程序编写易出错,代码难以扩展和复用。
1.3 数值微分
优点:原理简单,程序易于实现
缺点:有误差的引入的可能,输入的函数的参数数量有限制。
1.4.1 计算图
在编译原理中,可能通过计算图的构建,实现中缀表达表,和
前缀表达式,后缀表达式之间的相互转化。
应该指出的是,计算图在符号微分和自动微分中所扮演的地位是
本质性的。
1.4.2 计算图的构建
由于求导操作作用于乘法时,表达式的长度将显著地增长,因此,
在递归深度较大时,我们常常会面临表达式的长度的指数级膨胀,
这是符号微分在实际场景中所面临的困境之一。
1.4.3 SymPy库简介
SymPy库能够为我们保留到精确的分数,根号,及无理数Pi,这是
符号计算在解决实际问题时的一大应用。
不过,符号微分在实现对程序框架的设计提出了过高的要求:
所有的表达式必须是“闭合的”,即表达式中不得有条件语句和
循环语句等