什么叫梯度?

在给梯度下一个准确的定义的时候,我们先来假设这样几种情况:(1)有一块金属板,下面有一处定点加热。然而,有一只蚂蚁正好在金属板的上面。随着加热的进行,金属板的温度会越来越高,蚂蚁会往凉快的地方爬行。众所周知,越是远离加热源,金属板的问题最低。那么问题来了,蚂蚁应该往哪个方向爬行,才能到达相对最凉快的地方呢? 注意:这个方向就是我们要说的梯度方向。而这个方向应该是冷热变化最大的方向(2)有一个人在山顶,它要下山,但是山上有雾,可见度不高。但是太阳要下山,为了最快速度的下山,那么就得找所处位置最陡峭的路下山。那么假设我们能够知道当前位置最陡峭的地方,找到地方之后,往山下走一段。但是最陡峭的地方是变化的,所以我们得走一段路,找一次方向。这其实很困难。如果频繁测量方向,非常耗时,如果测量的过少,又有可能偏离轨道。所以需要找到一个合适的频率,来确保下山的方向不错误,同时又不至于耗时太多。


百度百科对于梯度的解释:表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向此变化最快,变化率最大

下面从微分说起:微分其实可以认为是函数的变化率

单变量微分其实非常简单,就是dy/dx.

多变量微分相对复杂一点,因为涉及到链式法则,但是梯度实际上就是多变量微分的一般化

比如   f(x,y,z)=3x+6y+9z  .那么我们可以很容易算出

那么这里的梯度就是<3,6,9>。为什么要用<>括起来,那是因为梯度是一个向量,向量有方向,梯度的方向就指出了函数在给定点的上升最快的方向。注意:这里说的是上升最快的方向。这也就说明了为什么我们需要梯度我们需要到达山底,就需要在每一步观测到此时最陡峭的地方。当蚂蚁需要爬到凉快的地方,就需要在每一步观测此时冷热变换最大的地方。梯度就恰巧告诉了我们这个方向。

正因为,我们需要走一步看一步,所以我们可以得出这样一个公式:

其中θ 是关于J的变量,θ ’是下一步应该走到的位置,α是学习率,ᐁf是所在位置的梯度

这里的α就是用来控制步长的,如果太大容易走不到最低点,太小的话走到最低点的速度又慢。那么为什么是减号呢? 是因为刚我们提到梯度是上升最快的方向,但是我们现在是要求梯度的下降。所以加了一个符号,将方向调转了过来。

我们以为例,初始 θ=1,α=0.4

显然可得到

这里每次参与运算的都是上一次计算出来的θ。


如何用代码来实现梯度的运算呢?下面以pytorch为例

首先需要介绍以下Variable类,这个类有前向传播,反向传播,自动求导等功能。十分好用。在使用Variable的时候需要从torch.autograd中导入。

from torch.autograd import Variable

我们来看它是如何求梯度的,我们对以下程序进行一个说明。(程序选自 https://www.jianshu.com/p/c7e642877b0e)

import torch
from torch.autograd import Variable# 定义三个Variable变量
x = Variable(torch.Tensor([1, 2, 3]), requires_grad=True)
w = Variable(torch.Tensor([2, 3, 4]), requires_grad=True)
b = Variable(torch.Tensor([3, 4, 5]), requires_grad=True)# 构建计算图,公式为:y = w * x^2 + b
y = w * x * x + b# 自动求导,计算梯度
y.backward(torch.Tensor([1, 1, 1]))print(x.grad)
print(w.grad)
print(b.grad)

运行完这个程序之后,我们可以得到

tensor([ 4., 12., 24.]) 对应x.grad

tensor([1., 4., 9.])对应w.grad

tensor([1., 1., 1.])对应b.grad

接下来,我们来详细讲解代码是如何求各个指标的梯度的。

一定要先写成这种形式。这样便于我们理解。接下来求关于x的梯度,w的梯度,b的梯度。根据上面对梯度的解释:x的梯度=∂y/∂x     ;  w的梯度=∂y/∂w      ;       b的梯度=∂y/∂b。但是x,y,b,w都是向量,并不是我们正常求梯度的标量。这怎么求梯度呢?

pytorch的backward很好的解决了这个问题。我们来看看backward 的定义:

backward(variables, grad_variables=None, retain_graph=None, create_graph=False) 

这里面有一个参数 grad_variables,就是用来解决这个问题。这个参数的解释是:对variable的梯度。仅当variable不是标量且需要求梯度的时候使用。

好了,到了这里,可能我们还是看不懂,他是这么求梯度的。

其实很简单:先求和,再偏导

问题此时就转换为 如何求和!

最简单的做法就是把里面的每一项相加。

那么我们就可以得到

接着,我们就能得出

然后我们分别将这些具体的值带进去,就是前面计算机跑出来的结果。

我们现在回过头来看,这种形式我们可以改写成

这里的[1,1,1]就是grad_variables的值!

那可能又要问了,如果我输入的不是[1,1,1]呢,比如输入的是[1,1,0]。同样的我们把[1,1,0]带入运算。

后面依然是分别求偏导。可以也可以得到正确的结果。

grad_variables的作用其实可以简单地理解成在求梯度时的权重,因为可能不同值的梯度对结果影响程度不同,所以pytorch弄了个这种接口,而没有固定为全是1

鸣谢:

https://zhuanlan.zhihu.com/p/83172023

https://www.jianshu.com/p/c7e642877b0e

pytorch学习(二)梯度:什么叫梯度?什么叫梯度下降相关推荐

  1. Pytorch学习(二)—— nn模块

    torch.nn nn.Module 常用的神经网络相关层 损失函数 优化器 模型初始化策略 nn和autograd nn.functional nn和autograd的关系 hooks简介 模型保存 ...

  2. pytorch学习笔记(二):自动求梯度

    文章目录 前言 1 概念 2 Tensor 3 梯度 前言 在深度学习中,我们经常需要对函数求梯度(gradient).PyTorch提供的autograd包能够根据输入和前向传播过程自动构建计算图, ...

  3. PyTorch学习笔记(二)——回归

    PyTorch学习笔记(二)--回归 本文主要是用PyTorch来实现一个简单的回归任务. 编辑器:spyder 1.引入相应的包及生成伪数据 import torch import torch.nn ...

  4. PyTorch框架学习二——基本数据结构(张量)

    PyTorch框架学习二--基本数据结构(张量) 一.什么是张量? 二.Tensor与Variable(PyTorch中) 1.Variable 2.Tensor 三.Tensor的创建 1.直接创建 ...

  5. 深度学习二(Pytorch物体检测实战)

    深度学习二(Pytorch物体检测实战) 文章目录 深度学习二(Pytorch物体检测实战) 1.PyTorch基础 1.1.基本数据结构:Tensor 1.1.1.Tensor数据类型 1.1.2. ...

  6. PyTorch学习笔记(二):PyTorch简介与基础知识

    往期学习资料推荐: 1.Pytorch实战笔记_GoAI的博客-CSDN博客 2.Pytorch入门教程_GoAI的博客-CSDN博客 本系列目录: PyTorch学习笔记(一):PyTorch环境安 ...

  7. Pytorch | 学习笔记(二)

    注:本系列博客在于汇总帖,类似自用笔记,方便复习回顾,博文中的引用都注明出处,点赞收藏原博主 一.加载数据和tensorboard 1.加载数据:Dataset和DataLoader 2.tensor ...

  8. pytorch学习笔记十二:优化器

    前言 机器学习中的五个步骤:数据 --> 模型 --> 损失函数 --> 优化器 --> 迭代训练,通过前向传播,得到模型的输出和真实标签之间的差异,也就是损失函数,有了损失函 ...

  9. 深度学习 | pytorch(二)

    文章目录 十.基本运算 1.加减乘除add / minus / multiply / divid 2.matmul (1)2d tensor matmul (2)>2d tensor matmu ...

最新文章

  1. 数据采集与网站统计实现全过程
  2. 新Rider预览版发布,对F#的支持是亮点
  3. mysql怎么多表备份_学习MySQL多表操作和备份处理
  4. 服务化改造的云上利器 | 阿里云 EDAS 重大升级发布
  5. SwiftUI资源列表
  6. 对JSON格式的城市按照拼音首字母排序
  7. 快速定制开发CAD电路图(电气原理图)详细流程及源码 浮云E绘图
  8. 两道CTF Reverse题目(windows平台)
  9. Android源码目录简介
  10. “唯一艺术数字藏品“小程序被下架,数字藏品服务边界在哪
  11. python中sub是什么意思_在Python中split(),sub(),subn()功能?
  12. HTML人物介绍、个人设计web前端大作业、贝聿铭人物介绍(带报告3000字)
  13. win10关闭快速启动_注意:win10系统快速启动功能虽然好用,但也会带来一些麻烦...
  14. Luogu P4168 [Violet]蒲公英(分块)
  15. python 处理文本(.txt文件)
  16. 【转】DICOM通讯(ACSE->DIMSE->Worklist)
  17. 【详细】Python基础(一)
  18. 使用WGET参数介绍大全
  19. 商标分类表45类明细图解及下载(更新)
  20. 操作系统---内存管理

热门文章

  1. 世间什么才是最珍贵的?
  2. 小飞鱼平台介绍——小飞鱼开发者服务平台业务介绍
  3. android指南针校准 代码_Android指南针app的实现原理总结
  4. 易语言打开摄像头_api摄像头拍照源代码 调用API函数创建视频设备
  5. # 初步认识 VR / AR
  6. c51单片机音乐门铃C语言程序,基于51单片机的无线音乐门铃设计
  7. AD中T型节点添加泪滴失败,原因是T型走线有问题
  8. 什么蓝牙耳机好用?2022蓝牙耳机排行榜
  9. B站向快视频发律师函;2017年网络直播用户4.22亿;委内瑞拉预售“石油币”丨价值早报
  10. 小米系硬件查询保修日期