昇思25天学习打卡营第6天|函数式自动微分

今天是第6天,内容是函数式自动微分,大脑快要干冒烟了~~
函数式自动微分章节内容主要包括函数与计算图、微分函数与梯度计算、Stop Gradient、Auxiliary data、神经网络梯度计算五部分。

神经网络的训练主要使用反向传播算法,模型预测值(logits)与正确标签(label)送入损失函数(loss function)获得loss,然后进行反向传播计算,求得梯度(gradients),最终更新至模型参数(parameters)。自动微分能够计算可导函数在某点处的导数值,是反向传播算法的一般化。自动微分主要解决的问题是将一个复杂的数学运算分解为一系列简单的基本运算,该功能对用户屏蔽了大量的求导细节和过程,大大降低了框架的使用门槛。
MindSpore使用函数式自动微分的设计理念,提供更接近于数学语义的自动微分接口grad和value_and_grad

1.函数与计算图

计算图是用图论语言表示数学函数的一种方式,也是深度学习框架表达神经网络模型的统一方法,将根据下面的计算图构造计算函数和神经网络.
在这里插入图片描述
在这个模型中, 𝑥 为输入, 𝑦 为正确值, 𝑤 和 𝑏 是我们需要优化的参数。

2.微分函数与梯度计算
为了优化模型参数,需要求参数对loss的导数: ∂loss/∂𝑤 和 ∂loss/∂𝑏,此时调用mindspore.grad函数,来获得function的微分函数。这里使用了grad函数的两个入参,分别为:

fn:待求导的函数。
grad_position:指定求导输入位置的索引。

由于我们对 𝑤 和 𝑏 求导,因此配置其在function入参对应的位置(2, 3)。

3.Stop Gradient
通常情况下,求导时会求loss对参数的导数,因此函数的输出只有loss一项。当我们希望函数输出多项时,微分函数会求所有输出项对参数的导数。此时如果想实现对某个输出项的梯度截断,或消除某个Tensor对梯度的影响,需要用到Stop Gradient操作。

案例介绍了将function改为同时输出loss和z的function_with_logits,获得微分函数并执行。

4.Auxiliary data

Auxiliary data意为辅助数据,是函数除第一个输出项外的其他输出。通常我们会将函数的loss设置为函数的第一个输出,其他的输出即为辅助数据。
grad和value_and_grad提供has_aux参数,当其设置为True时,可以自动实现前文手动添加stop_gradient的功能,满足返回辅助数据的同时不影响梯度计算的效果。

5.神经网络梯度计算
神经网络构造是继承自面向对象编程范式的nn.Cell。接下来通过Cell构造同样的神经网络,利用函数式自动微分来实现反向传播。

首先继承nn.Cell构造单层线性变换神经网络。这里我们直接使用前文的 𝑤 、 𝑏 作为模型参数,使用mindspore.Parameter进行包装后,作为内部属性,并在construct内实现相同的Tensor操作。通过实例化模型和损失函数。需要使用函数式自动微分,需要将神经网络和损失函数的调用封装为一个前向计算函数。完成后,使用value_and_grad接口获得微分函数,用于计算梯度。

说实话,没看懂~,需要找个3D视频对函数做更形象的分解呈现,可能比看文字或代码对小白来说会更好一些,以下是完整链接,供参考:
函数式自动微分链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值