pytorch笔记-自动求导

自动求导主要就是利用高数里面学过的 多元函数求导的链式求导法则。链式求导的计算一种好的方式就是使用画一个计算图来处理,这是高数教材还是考研辅导课上讲的东西。

计算图就类似学数据结构的时候的表达式符号栈一样,节点就是因变量和中间变量,路径就是函数(可能多个路径表示同一个函数),这个图无环,但是节点可以有多个输出,多值函数。计算图的知识花书里面将这个点讲得比较好。

求导的时候反过去链式传播,并且把对中间变量的导数,放到每个张量里面,加快计算速度。

PyTorch自动求导模块的系统组成可以从上面的原理来思考记忆:计算图的,节点就是Tensor对象,边就是Function对象,自动求导模块主要就这两个对象。
pytorch每次函数计算操作都产生一个新的tensor,而不是改变原来的tensor。这样计算图不会有循环的,不然算起来就是死循环了。通过函数形成的tensor会记录生成它的函数在.grad_fn上,其值就是函数对象Function,用户创建的tensor或者说叶子节点其值为None。

求导的累积特性:
同样根据链式求导法则原理,求导结果是多条求导路径的累加,这个反应到pytorch中就是.grad的累加。

当完成计算后通过调用 .backward(…)方法 ,自动计算所有的梯度, 这个张量的所有梯度将会自动积累到 .grad 属性。
注意累加是pytorch自动求导的重要特点,很多东西都和它有关,累加具体的说求导的反向传播过程中,多次经过x,每次的导数都会累加。包括x发出的多条路径求导,或者非标量多次求导,同一个标量多次求导等。

对同一个输出标量多次求导会报错,因为累加会导致一些不正确情况发生,强制多次求导的话,需要设置参数(retain_graph=True),看意思实现方式应该同一个标量求导后,他就会从计算图中脱离?保留之后就不会了。

在反向传播过程中,每传播一次之后要将梯度置0,就是因为链式求导的累加原理,目前pytorch的实现是不止到什么时候停止累加的。

然后是一些细节上的操作设置:
1、默认是不开启自动求导的,手动设置 .requires_grad 参数为 True,会追踪所有对于该张量的操作。意思是说如果从张量x发出两条路径,如y1= x1*x2, y2 = sin(x1) 都会被追踪。如果已经设置了.requires_grad=True但是你又不希望计算结果包含进行它, 那么可以将变量包裹在 with torch.no_grad()中。
2、根据求导的特性,如果多维的y对多维的x求导,是雅克比形式的,如果一次完成这种多对多求导,结果过于复杂,不好处理,所以pytorch中一次求导,只允许标量对 x 求导。如果y是多维张量,那么需要进行一定的设置。
3、前面说的,计算图不能有循环,所以计算过程的不能有变量自己的值改变的情形,改变的值必须赋值给新的变量。这是代码计算机制和数学表达式计算机制的不同 ,数学中进行一次计算时变量值不能变的,哈哈。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值