微分
求导--dy/dx
手动微分: 手动推导计算微积分
符号微分:
数值微分: 高次方程高维数据的复合函数
目前常见的微分方式有手动微分、符号微分、数值微分和自动微分
核心概念
张量数据结构.--自动微分机制 -- 动态计算图
自动微分
自动微分有时称作演算式微分,是一种可以借由计算机程序计算一个函数导数的方法
自动微分的核心思想是将计算机程序中的一个复杂运算操作分解为一个有限的基本操作合集,
且合集中基本操作的求导规则均为已知的。
在完成每一个基本操作的求导后,使用链式求导法则将结果组合得到整体程序的求导结果
closed-form表达式的概念,closed-form表达式是由初等函数经过有限次的初等运算复合而成的,不包含编程语言中的循环、条件等结构的表达式。
表达式膨胀”
数值微分就是根据导数的原始定义,使用有限差分近似的方式来求解梯度的方法。
自动微分的实现依赖于表达式追踪机制,表达式追踪是自动微分的基础
依照目标函数f(x)来编写程序;
开始计算,利用表达式追踪机制来记录每一次计算过程中的中间变量,在这个函数中,主要是求导的公式和结果;
利用链式求导法则组合各部分中间变量,生成梯度结果。
自动微分机制
梯度是多元函数分别对各个自变量求偏导数,并把求得的偏导数组合形成的向量
pytorch自动微分机制
Pytorch一般通过
反向传播 backward方法 实现这种求梯度计算。该方法求得的梯度将存在对应自变量张量的grad属性下。
除此之外,也能够调用torch.autograd.grad函数来实现求梯度计算
1.利用backward方法求导数
backward方法通常在一个标量张量上调用,该方法求得的梯度将存在对应自变量张量的grad属性下。
如果调用的张量非标量,则要传入一个和它同形状的gradient参数张量。
相当于用该gradient参数张量与调用张量作向量点乘,得到的标量结果再反向传播
Pytorch本身在求完梯度后会自动挂载到Tensor.grad属性上
mindspore
MindSpore提供纯函数式编程的支持,配合mindspore.numpy及mindspore.scipy提供的数值计算接口
MindSpore针对AI模型训练设计了函数式+面向对象融合编程范式,
构造正向函数,连接神经网络和损失函数;使用函数变换,获得梯度计算(反向传播)函数;
函数式自动微分接口更底层
pytorch与mindspore
numpy-ndarray
np.array
dtype. shape ndarray.ndim ndarray.size
Pytorch--torch.dtype, torch.device, and torch.layout Tensor.ndim
数组包装成具有梯度等信息的张量(Tensor)
Tensor可配置requires_grad
A torch.Tensor is a multi-dimensional matrix containing elements of a single data type.
dtype=torch.int32
requires_grad=True so that torch.autograd records operations on them for automatic differentiation.
mindspore.Tensor 张量,即存储多维数组(n-dimensional array)的数据结构
dtype shape init internal const_arg
图算融合
AKG张量编译器和图算一体优化编译器,是MindSpore框架的重要编译软件
算子融合是面向深度学习编译器中的一种关键图优化技术
参考
图算融合论文分享:Apollo https://zhuanlan.zhihu.com/p/622494022
20天吃掉那只Pytorch https://github.com/lyhue1991/eat_pytorch_in_20_days
https://github.com/lyhue1991/eat_pytorch_in_20_days/blob/master/2-1,%E5%BC%A0%E9%87%8F%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84.ipynb
https://www.mindspore.cn/docs/zh-CN/r2.0/design/programming_paradigm.html
https://www.mindspore.cn/tutorials/zh-CN/r2.0/index.html
聊聊梯度累加(Gradient Accumulation) https://zhuanlan.zhihu.com/p/595716023