原文:
克補 爆炸篇 25s (youtube.com)
必应视频 (bing.com)https://www.bing.com/videos/riverview/relatedvideo?&q=PyTorch+autograd&qpvt=PyTorch+autograd&mid=1B8AD76943EFADD541E01B8AD76943EFADD541E0&&FORM=VRDGAR
前面只要有一个node的requires_grad为True,则后面所有node都要为True:
forward阶段,ctx里存放其backward操作需要的值,也就是forward时的部分input或output值;
requires_grad为False的(Tensor b),不会计算其梯度;
requires_grad为True,且is_leaf为Tree的,会将梯度累积到其grad成员上;
优化:如果is_leaf=False,则说明不需要该Tensor的grad,所以,grad_fn直接将output梯度传递给下一个grad_fn了,绕开对该Tensor的grad的更新;(节省一步梯度加和操作的时间,也节省一个grad数据存储空间)
用_version号来防止backward时用到的activation在之前发生改动;如果_version号跟本次backward源头的_version号不同了,则报错;
我:Pipeline并行,如果直接做,就会有这种报错出现;
如果是Add操作这种,压根不需要某些activation的值,所以这种值发生改动,不影响backward传递参数,因此就不会报错
每个运算,是一个独立的operator,对应backward也是独立的:
Tensor.detach(),用在什么情况:想保留结果值,但又想把原始计算图垃圾回收释放掉;新Tensor和老Tensor共享数据内存(data),但不在hold指向计算图的reference了(grad_fn=None)