Pytorch——autograd的介绍(上)

978 阅读5分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第21天,点击查看活动详情


在上几篇的文章,我们介绍了Tensor的创建Tensor的属性和算术运算in-place操作和广播机制和运算统计学方法、分布函数、随机抽样、矩阵分解张量裁剪、索引与数据筛选、组合与拼接、切片变形、填充&傅里叶变换和pytorch的简单编程技巧

今天我们来介绍autograd的方法,包括梯度与机器学习中的最优解,Variable is Tensor,如何计算梯度


前言

Variable & autograd

autograd:自动计算梯度

也正是有了变量,也就是所谓的参数,我们才能够进行求导的这样一个运算,在介绍Pytorch中的自动求导的机制之前,我们先来回顾一下在高数中我们之前学过的关于导数的基本的简单的概念。

  • 1.1 导数、方向导数、偏导数、梯度的概念

  • 什么是导数?

    • 导数(一元函数)是变化率、是切线的斜率、是瞬时速度
    • 在物理学中: 2.png
  • 什么是方向导数?

    • 函数在A点的无线个切线的斜率的定义。每一个切线都代表一个变化的方向。
    • 通常描述为超平面或者曲面
  • 什么是偏导数?

    • 多元函数降维的时候的变化,比如:二元函数固定y,只让x单独变化,从而看成是关于x的一元函数的变化来研究
    • 3.png
  • 什么是梯度?

    • 函数在A点无数个变化方向中变化最快的那个方向
    • 4.png
    • 每一个谷底对应的点都是极值点,我们在求最优解的时候,经常会陷入一个局部最优的问题,就是我们并没有找到真正的最低点,找到了一个局部来说相对较低的一个点,这种就是一个局部最优解,也就极小值中的某一个值
  • 那么我们在去找最大或者最小值的时候,如何快速的使我们的解快速的去收敛呢?

    • 这个时候我们通常会沿着梯度下降的方向去寻找最优解,所谓梯度,就是指在当前的点上回存在无数个方向,而变化最快的方向就定义为梯度
    • 所谓梯度下降法就是沿着梯度下降最快的方向去寻找最优解的方法,而梯度在计算的时候通常会采用偏导数的方式,
    • 其中对于当前的函数,存在三个方向,这三个方向就对应这三个变量,在每个变量上变化最快的方向就是导数的方向,所以分别对x,y,z求导,如果有更多的变量,再对更多的变量依次求导,将这些偏导数放到一起,就构成了我们在寻找最优解的时候变化最快的方向,也就是所谓的梯度
  • 1.2 梯度与机器学习中的最优解

  • 梯度是在解决机器学习中经常用到的概念,梯度下降法也是在解决机器学习问题中经常会用到的手段。

  • 梯度描述了函数曲线中某一点下降最快的方向,那么在机器学习中,我们就希望沿着这些下降最快的方向去进行迭代和收敛找到算法的最优解

  • 在机器学习中,每一个算法的建立,都有相应的理论基础和优化函数,作为这个方法的优化目标,在机器学习中,对这些方法进行分类的话,可以分成:

    • 有监督学习:
      • 拿到的样本不仅包括了样本的属性,还有所谓的标签,标签就是想要预测的结果,
      • 对于有监督学习就是,根据有标签的数据来解决构建出来的优化函数,它的参数使得最终我们可以用这组参数以及我们构建出来的优化函数来根据输入样本x来预测出最终的标签y
      • 常见的算法LDA、SVM、deep learning
    • 无监督学习:
      • 我们在学习的时候是没有标签y的,只有样本x,常见的算法就是聚类、PCA
    • 半监督学习
      • 弱标签(标签是不准确的)
      • 伪标签(有可能有错误的标签或者是通过聚类获取的标签)
      • 一部分有标签,一部分没有标签
      • 介于有监督和无监督之间
      • 在大数据的环境下,去获取有标签的数据成本是非常高的,如果通过一些半监督的手段,将大数据利用起来,如果能够达到一个比较好的效果,那么不管是在学术界还是在工业界,贡献都是非常大的
  • 优化的目标:

    • 找到参数w,经过f(w,x)预测出的结果,使得它和标签y尽可能的接近,
    • 我们很难保证它是百分百接近的,因为我们在采集样本的时候,本身就会有一些偏差,
    • 或者它最本质的特征有可能是拿不到,那么我们就很难保证预测出来的y和真实的y百分百一致。
    • 这种一致性在数学上就描述为loss
    • loss = |f(w,x)-y|
    • 最优解的位置就是loss最低的位置
    • 我们沿着下降最快的方向不停的调整我们的点,最后就能够最快的找到loss的最低点。这个点就是导数为0的点。如果这个函数是没有办法求导的,那么我们就可以用到梯度下降
  • 1.3 Variable is Tensor

  • 每个tensor通过requires_grad来设置是否计算梯度

    • 默认是False,True是计算
    • 用来冻结某些层的参数
  • 1.4 如何计算梯度

  • 链式法则:两个函数组合起来的复合函数,导数等于里面函数带入外函数值的导数乘以里面函数之导数

下一篇文章将介绍autograd中的几个重要概念

9JQ4ZCQY3M({Q$KEN%9BFQX.png