PyTorch入门 — — autograd(一)

在阅读PyTorch入门后,我们可以理解:训练一个模型实际上就是寻找一组能够使得损失函数取值最小的参数值。在寻找该参数值时,我们需要计算该损失函数关于当前参数的梯度,因此如何求得梯度值至关重要。

一般来说,对于一个简单的目标函数,我们可以手动计算其梯度,但当表达式过于复杂、目标函数不断发生变化的时候,我们就很难通过求解数学方程来计算该复合函数的梯度。目前,我们大部分人更能接受4维以下的空间,而当这些曲线存在于更高维度空间时,曲线太过抽象让我们难以理解。

由此,PyTorch的autograd应运而生,他将复杂的数学知识抽象处理,仅仅几行代码便可以帮助我们计算出高维曲线的梯度。它抽象了复杂的数学,并帮助我们“神奇地”仅用几行代码即可计算出高维曲线的梯度。本文试图用相对条理且循序渐进的方式帮助大家理解autograd。

在深入介绍autograd前,我们需要先了解一些基本的PyTorch的概念:

Tensor:张量

简单来说,张量就是PyTorch中的一个n (n>=0)维的数组结构。除数组原有的属性外,张量还支持一些其他增强功能,使其具有独特性。例如:除CPU外,还可以加载它们到GPU上以进行更快的计算;也可以通过设置.requires_grad = True(自己定义的Tensor的默认属性为False,神经网络中表达权重的Tensor默认属性为True),以跟踪所有对于该张量的操作,便于后面通过调用.backward()自动计算梯度。

在PyTorch比较早期的版本中,可以使用torch.autograd.Variable类进行创建支持梯度计算和跟踪的张量,torch.autograd.Variable包含以下5个属性:data、grad、grad_fn、requires_grad、is_leaf。但较新的PyTorch版本已经不太推荐使用Variable类了,而转为使用 torch.Tensor,他在torch.autograd.Variable的基础上,又增加了dtype、shape、device三个属性。

import torch
import numpy as np


x = torch.randn(2, 2, requires_grad = True)


# 定义float类型的numpy数组
x = np.array([1., 2., 3.]) 
x = torch.from_numpy(x)
# 设置计算梯度功能可用
x.requires_grad_(True)

注意:根据PyTorch的设计规则,目前只能为浮点张量计算梯度。因此在上述实例中,我们先创建了一个float类型的numpy数组,再将其转为Tensor类型进行梯度计算。

autograd

autograd包为张量上的所有操作提供了自动求导的功能,他生成了一个动态循环图,并在该图上记录了张量所有执行的操作历史。此图的“叶”为输入张量,“根”为输出张量,梯度的计算过程是通过从根到叶跟踪图并使用链法则将每个梯度相乘。

·  END  ·

RECOMMEND

推荐阅读

 1. 效率提升的软件大礼包

 2. 那么多可选编程语言,Why Python?

 3. 学习Python,你选对书了吗?

 4. 深度学习 —— 入门PyTorch(一)

 5. 深度学习 —— 入门PyTorch(二)

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值