PyTorch学习系列教程:Tensor如何实现自动求导
导读
今天本文继续PyTorch学习系列。虽然前几篇推文阅读效果不是很好(大体可能与本系列推文是新开的一个方向有关),但自己选择的路也要坚持走下去啊!
前篇推文介绍了搭建一个深度学习模型的基本流程,通过若干个Epoch即完成了一个简单的手写数字分类模型,效果还不错。在这一过程中,一个重要的细节便是模型如何学习到最优参数,答案是通过梯度下降法。实际上,梯度下降法是一类优化方法,是深度学习中广泛应用甚至可称得上是深度学习的基石。本篇不打算讲解梯度下降法,而主要来谈一谈Tensor如何实现自动求导,明白这一过程方能进一步理解各种梯度下降法的原理。
讲解Tensor如何实现自动求导,本文分别从理论分析和代码实践的角度加以陈述:Tensor中的自动求导:与梯度相关的属性,前向传播和反向传播
自动求导探索实践:以线性回归为例,探索自动求导过程
01 Tensor中的自动求导分析Tensor是PyTorch中的基础数据结构,构成了深度学习的基石,其本质上是一个高维数组。在前序推文中,实际上提到过在创建一个Tensor时可以指定其是否需要梯度。那么是否指定需要梯度(requires_grad)有什么区别呢?实际上,这个参数设置True/False将直接决定该Tensor是否支持自动求导并参与后续的梯度更新。具体来说,Tensor数据结构中,与梯度直接相关的几个重要属性间的关系如下:
原创拙图,权当意会
透过上面这个类图,大概想表达以下含义:在一个Tensor数据结构中,最核心的属性是data,这里面存储了Tensor所代表的高维数组(当然,这里虽然称之为高维,但实际上可以是从0维开始的任意维度);
通过requires_grad参数控制两个属性,grad和grad_fn,其中前者代表当前Tensor的梯度,后者代表经过当前Tensor所需求导的梯度函数;当requires_grad=False时,grad和grad_fn都为None,且不会存在任何取值,而只有当requires_grad=True时,此时grad和grad_fn初始取值仍为None,但在后续反向传播中可以予以赋值更新
backward(),是一个函数,仅适用于标量Tensor,即维度为0的Tensor
is_leaf:标记了当前Tensor在所构建的计算图中的位置,其中计算图既可看做是一个有向无环图(DAG),也可视作是一个树结构。当Tensor是初始节点时,即为叶子节点,is_leaf=True,否则为False。
目前,Tensor支持自动求导功能对数据类型的要求是仅限于浮点型:"As of now, we only support autograd for floating pointTensortypes ( half, float, double and bfloat16) and complexTensortypes (cfloat, cdouble). "——引自PyTorch官方文档了解了Tensor所具有上述属性和方法,那么它是如何实现自动求导的呢?这就又要涉及到前向传播和反向传播这两个重要概念。简单来说,如果将神经网络的每层比作一系列函数映射(f1, f2, ..., fn)的话,那么:前向传播,就是依据计算流程实现数据(data)的计算和计算图的构建:
反向传播,反向传播就是依据所构建计算图的反方向递归求导和赋值梯度:
相关阅读
-
世界热推荐:今晚7:00直播丨下一个突破...
今晚19:00,Cocos视频号直播马上点击【预约】啦↓↓↓在运营了三年... -
NFT周刊|Magic Eden宣布支持Polygon网...
Block-986在NFT这样的市场,每周都会有相当多项目起起伏伏。在过去... -
环球今亮点!头条观察 | DeFi的兴衰与...
在比特币得到机构关注之后,许多财务专家预测世界将因为加密货币的... -
重新审视合作,体育Crypto的可靠关系才能双赢
Block-987即使在体育Crypto领域,人们的目光仍然集中在FTX上。随着... -
简讯:前端单元测试,更进一步
前端测试@2022如果从2014年Jest的第一个版本发布开始计算,前端开发... -
焦点热讯:刘强东这波操作秀
近日,刘强东发布京东全员信,信中提到:自2023年1月1日起,逐步为...