Pytorch 学习 第二篇文章 AutoGrad

1. autograd是什么?

  1. 基于Tensor的所有操作都支持autograd操作。
  2. 它是一种define-by-run框架。
    何为define-by-run框架,官网的解释是反向传播由你的代码定义,并且每一次迭代都可以不同,是不是很酷炫。

2. Pytorch反向传播的四大基石

  • requires_grad
  • grad
  • backward()
  • Function

  Pytorch是一个深度学习框架,所以还是按照深度学习的例子来讲比较好,来一一讲解这四个基石。
  第一点:w=w+ ∇w,神经网络的参数w正是通过该公式不断迭代学习,最终达到收敛的。
  第二点,w是一个多维的向量,它在Pytorch中就是一个Tensor对象。在某些情形下我们不会让所有层的Tensor都迭代更新学习(例如,“锁层”的情形下),因此一个Tensor对象需要一个属性来让用户设置需不需要更新学习这一层的参数,这就是requires_grad属性(True/False),当其为True时,Pytorch会“记录”在该Tensor对象基础之上的操作,从而当进入到反向传播阶段时,计算它每次更新的梯度值。梯度值在每次计算之后存放在对应Tensor的grad属性中。而Function机制用来实现记录操作的功能。

  Tensor的requires_grad参数如何设置:
  情形1:在初次构件Tensor对象时,就指明(如果不指明,默认为False)x=torch.ones(2,2,requires_grad=True)
  情形2:在使用的过程中想将其设置为False
   y.detach_()#注意上以章节讲过,在Pytorch中,带’_’的函数一般都为in place操作。
  情形3:若x变量requires_grad的状态为True,则默认在其上的所有操作获得的中间变量的requires_grad都为True:
   一种是用情形2里面提到的方法,另外一种是通过增加一个代码块,来打消这种默认

   print((x ** 2).requires_grad)

  第三点,当有Tensor变量执行**backward()**时,开始反向计算梯度

3. Pytorch如何进行反向传播

3.1 backgrad()之gradient参数

  这节不是去推那几个反向传播的公式,更确切的,本节是对Pytorch的反向传播是如何使用的一个疑惑点的解决。
Pytorch 学习 第二篇文章 AutoGrad_第1张图片
  先阅读以上官网截图中的一段话,这段话的意思是y=f(x),如果y是一个标量(scalar,只含有一个元素)则罢,若y是一个矢量,在反向传播的时候,不能从y开始向前反向传播。更形象的说:
Pytorch 学习 第二篇文章 AutoGrad_第2张图片

  那如果Y是矢量时,怎么办呢?答案就是再必须往前走一步,借助外界的力量,让一个标量来作为前向的结束。
Pytorch 学习 第二篇文章 AutoGrad_第3张图片
  Pytorch里面是通过让矢量Y和一个和它shape相同的Tensor V进行乘加得到标量L的。
y.backward(v)

3.2 为什么Pytorch中一定要让一个标量来作为前向的结束呢?

  这个疑惑困扰了我一个小时,后来想通了,英语还是有待提高。首先将目光聚焦在从上面大截图中,截取的两句话,关键词用红色标注。
在这里插入图片描述

  关键就在于vector和matrix这两个英文单词的区别。这两句话的意思是,Pytorch的自动求梯度,仅支持雅可比数组,但当y是一个矢量时,它相对于x的梯度时一个雅可比矩阵,pytorch是不支持的。

3.3 Facebook这么牛的公司,为啥不支持一下Jacobian matrix?

  是因为没法支持。用草稿纸写一下就知道,如果前向的时候以一个矢量Y结尾,就开始进行反向传播,此时待学习参数矢量X中的每一个元素的待更新的梯度值该如何表示,答案是没法表示,因为此时针对于每一个元素的梯度更新值会是一个[∂y1/∂x11, ∂y2/∂x11,…∂yN/∂x11]的形式,x11是没有办法更新的。

3.4 那万一遇到极端情况,就是以矢量Y结尾怎么办呢?

  答案是不会遇到,看一看图中最后的变量是用什么表示的L对的,就是为了对应Loss,深度学习中前向的结束百分之百会是以一个标量loss结束。
初稿完成于2018年最后一天,舞之蹈之

你可能感兴趣的:(pytorch系统学习)