前言

数学的学习跟数学的计算是要分开的,现在回头再去看大学的高数和线性代数,如果只是学习的话,其实一门课程3天,也就学完了。

学校的课程之所以上那么久,其实是为了考试,也就是为计算准备的。计算有意义的,在有计算机的情况下,计算的意义并不是很大。

所以,如果大学数学没学好,只要花一星期,就能补回来。甚至你没上过大学,只要你上过初中,同样,只需要一个星期就能学会高数和线性代数。

但,问题是,没有人这样给你上课,也没有这样资料让你学习。至少国内是没有这样学习的信息,国内全是耽误我们学习效率的学习模式。

Gradient

上一篇介绍了一点梯度,正向传播,逆向传播。这里再详细介绍一下。

不要被这些名词吓住了,名词的本质都是总结,而总结的名词,其实是最阻碍我们学习的,我们要讨厌它,但不用害怕它。

先看一下requires_grad这个参数的使用,代码如下:

print("============求梯度1==============")
a = torch.randn(3) #这里是randn 不是rand torch.randn:生成服从标准正态分布(均值为0,标准差为1)的随机数。 torch.rand:生成服从均匀分布(在区间 [0, 1) 之间)的随机数。
print(a)
b=a+2
print(b) # 输出tensor是a+2计算后的结果
x = torch.randn(3,requires_grad=True) #这里是randn 不是rand
print(x)
y=x+2
print(y) # 输出tensor是x+2计算后的结果,同时记录了函数,grad_fn=<AddBackward0> 表示是加法函数 grad=gradient fn=Function

这里a和x分别是开启了requires_grad和没有开始requires_grad的模式。如下图:



开启了requires_grad的x,多了一个属性requires_grad=True。

经过y=x+2计算的y,多了一个属性grad_fn=< AddBackward0 >,这里grad=gradient fn=Function,就是梯度函数的意思;里面的Add是加法的意思。

而这个y=x+2,这个计算就是前向传播,前向传播就是这一堆我们定义的函数。

正态分布简介

上面提到了正态分布,这里简单解释一下。

正态分布 若以0为中心,称为均值为0。若均值为0,标准差为1,数据点在不同区间内的分布遵循68-95-99.7规则

均值0,标准差1(数据在68%[-1, 1]95%[-2, 2]99.7%[-3, 3])。即数据以0为中心,向两边扩散,68%的数据点位于均值的1个标准差范围内(即[-1, 1]区间)95%的数据点位于均值的2个标准差范围内(即[-2, 2]区间)。99.7%的数据点位于均值的3个标准差范围内(即[-3, 3]区间)。

均值0,标准差2,数据在68%[-2, 2]95%[-4, 4]99.7%[-6, 6])。

标量函数和逆向传播

上面我们使用了前向传播,并设置y=x+2这样的函数,现在我们在增加一个前向传播函数:z=yy2,然后再设置标量函数,最后在执行逆向传播。

注1:在使用backward前,必须给一个scale value(标量值,即常数C) 比如z=z.mean(),或者给一个权度tensor,这里先介绍传递标量函数。

注2:标量函数就是前向传播中的计算损失的损失函数。

注3:标量函数其实是一个标量,或称常量,或称常熟,或称值,或者称一个数。(这里要是说传递的是一个数,那就low了,但要说传了一个标量,就明显较高大上了,这就是名词阻碍我们学习的最完美体现了)。

x = torch.randn(3,requires_grad=True)
print(x)
y=x+2
z=y*y*2
print(z) # 这里会增加属性,grad_fn=<MulBackward0> ,这里的mul表示是乘法
z=z.mean() # 指定标量函数
#这里必须指定标量函数,如果删除z=z.mean() 这句话会提示 grad can be implicitly created only for scalar outputs
print(z) # 属性grad_fn=<MeanBackward0>,Mean表示平均值函数
z.backward() #逆向传播 如果requires_grad=False,则执行z.backward()回抛异常,因为没有记录grad_fn
print(x.grad)

运行如下图:

代码简介如下

x 是启用了自动求导的张量。

y = x + 2,y 仍是一个启用了自动求导的张量。

t = y * y * 2,t 是一个启用了自动求导的张量。

z = t.mean(),z 是标量(因为 mean() 返回的是张量的平均值,结果是标量)。

调用 z.backward(),计算 z 对 x 的梯度,并将其存储在 x.grad 中。

此时,x.grad 中存储的是 z 对 x 的梯度,即 dz/dx;梯度的结构是跟x的结构一样的。

梯度清0

在第二次计算梯度(调用backward())之前需要清零梯度。

如果在第二次调用 backward() 之前没有清零梯度,那么第二次调用 backward() 计算出的梯度会叠加在第一次计算出的梯度上。

print("============清零grad==============")
weights =torch.ones(4,requires_grad=True)
for epoch in range(3):
model_output =(weights*3).sum()#设置标量值,这里是连写了,分开就是a=weight*3 model_output=a.sum()
model_output.backward()
print(model_output.grad)
model_output.zero_()#可以注释这一行,看看不清零的效果

加权

在计算梯度(调用backward())之前没有设置标量或权度,就会报错。

上面说过了标量,现在来介绍加权。

代码如下:

x = torch.randn(3,requires_grad=True)
print(x)
y=x+2
z=y*y*2
v = torch.tensor([1.0,2.0,3.0],dtype=torch.float32)
z.backward(v)
print(x.grad)

这里再z.backward()调用前,增加了一个赋值权度的操作。

所谓赋值权度就是使用z.backward()时传递一个参数,这个参数就是一个张量(tensor);这个tensor的结构要求和x一样。

在计算梯度时,会把梯度的计算结果,x,权度tensor,全提出来,然后相乘。

因为梯度,x,权度tensor的结构是相同的,对应元素相乘,应该比较好理解。

具体计算

y=x+2 dy/dx=y导=1

z=2y² dz/dy=z导=4y

dz/dx=(dz/dy)(dy/dx)=14y=4y

因为y=x+2所以 4y=4(x+2)

加权后是三个元素分别是 14(x1+2) 24(x2+2) 34(x3+2)

带入x即可得到梯度。

如下图,4
(0.8329+2)=11.3316,下图是11.3317,这里应该是有个进位。

传送门:

零基础学习人工智能—Python—Pytorch学习(一)

基础学习就先到这。


注:此文章为原创,任何形式的转载都请联系作者获得授权并注明出处!



若您觉得这篇文章还不错,请点击下方的【推荐】,非常感谢!

https://www.cnblogs.com/kiba/p/18348414

零基础学习人工智能—Python—Pytorch学习(二)的更多相关文章

  1. 如何零基础开始自学Python编程

    转载——原作者:赛门喵 链接:https://www.zhihu.com/question/29138020/answer/141170242 0. 明确目标 我是真正零基础开始学Python的,从一 ...

  2. 零基础快速掌握Python系统管理视频课程【猎豹网校】

    点击了解更多Python课程>>> 零基础快速掌握Python系统管理视频课程[猎豹网校] 课程目录 01.第01章 Python简介.mp4 02.第02章 IPython基础.m ...

  3. 零基础的人该怎么学习JAVA

    对于JAVA有所兴趣但又是零基础的人,该如何学习JAVA呢?对于想要学习开发技术的学子来说找到一个合适自己的培训机构是非常难的事情,在选择的过程中总是  因为这样或那样的问题让你犹豫不决,阻碍你前进的 ...

  4. 零基础学完Python的7大就业方向,哪个赚钱多?

    “ 我想学 Python,但是学完 Python 后都能干啥 ?” “ 现在学 Python,哪个方向最简单?哪个方向最吃香 ?” “ …… ” 相信不少 Python 的初学者,都会遇到上面的这些问 ...

  5. 零基础自学人工智能,看这些资料就够了(300G资料免费送)

    为什么有今天这篇? 首先,标题不要太相信,哈哈哈. 本公众号之前已经就人工智能学习的路径.学习方法.经典学习视频等做过完整说明.但是鉴于每个人的基础不同,可能需要额外的学习资料进行辅助.特此,向大家免 ...

  6. 零基础自学用Python 3开发网络爬虫

    原文出处: Jecvay Notes (@Jecvay) 由于本学期好多神都选了Cisco网络课, 而我这等弱渣没选, 去蹭了一节发现讲的内容虽然我不懂但是还是无爱. 我想既然都本科就出来工作还是按照 ...

  7. 零基础怎么学Python编程,新手常犯哪些错误?

    Python是人工智能时代最佳的编程语言,入门简单.功能强大,深获初学者的喜爱. 很多零基础学习Python开发的人都会忽视一些小细节,进而导致整个程序出现错误.下面就给大家介绍一下Python开发者 ...

  8. 零基础如何使用python处理字符串?

    摘要:Python的普遍使用场景是自动化测试.爬取网页数据.科学分析之类,这其中都涉及到了对数据的处理,而数据的表现形式很多,今天我们来讲讲字符串的操作.   字符串是作为任意一门编程语言的基础,在P ...

  9. 零基础如何入门Python

    编程零基础如何学习Python 如果你是零基础,注意是零基础,想入门编程的话,我推荐你学Python.虽然国内基本上是以C语言作为入门教学,但在麻省理工等国外大学都是以Python作为编程入门教学的. ...

  10. 零基础如何学Python爬虫技术?

    在作者学习的众多编程技能中,爬虫技能无疑是最让作者着迷的.与自己闭关造轮子不同,爬虫的感觉是与别人博弈,一个在不停的构建 反爬虫 规则,一个在不停的破译规则. 如何入门爬虫?零基础如何学爬虫技术?那前 ...

随机推荐

  1. vue2 实现可拖拽悬浮球

    实现效果 相关代码 点击查看代码 <template> <div class="float-box"> <div class="button ...

  2. GIS数据获取:气象数据免费下载网站

      本文对目前主要的气象数据获取网站加以整理与介绍.   本文为"GIS数据获取整理"专栏中第二篇独立博客,因此本文全部标题均由"2"开头.本文对目前主要的气象 ...

  3. mysql这个垃圾迁移数据费劲半天

    mysql垃圾得很!  对于一些小系统还可以.大型系统自己找麻烦--必须有高昂的人工费! 没有高昂的人工(必须有好的程序员和工程师才能解决一些复杂的问题),构建基于大量数据的应用,非常麻烦. 而这些费 ...

  4. NB-IoT,LoRA,WIFI,蓝牙,Zigbee,MQTT,CoAP之间的关系

    --- title: file_name date: 2020-06-22 07:26:20 categories: tags: - iot - wifi - Bluetooth - MQTT - c ...

  5. 川普真会说中文?连嘴型都同步,VideoReTalking AI数字人下载介绍

    你能想到这种画面吗?霉霉在节目中用普通话接受采访,特朗普在老家用中文脱口秀,蔡明老师操着一口流利的英文调侃潘长江老师.. 这听起来似乎很魔幻,可如今全部由VideoReTalking实现了 你只需要传 ...

  6. Java常用JDK类库和第三方类库

    以下是收集的一些有用的第三方库,Java开发人员可以在其应用程序中使用它们来完成许多有用的任务.为了使用这些库,Java开发人员也应该熟悉这些类库. jdk自带的常用类库 java.lang包 jav ...

  7. HBase 在统一内容平台业务的优化实践

    作者:来自 vivo 互联网服务器团队-Leng Jianyu.Huang Haitao HBase是一款开源高可靠性.扩展性.高性能和灵活性的分布式非关系型数据库,本文围绕数据库选型以及使用HBas ...

  8. oeasy教您玩转vim - 13 - # 大词小词

    大词小词 回忆上节课内容 我们上次学习了 e e 代表 end 词尾 自有跳跃 还可以成倍次数的跳跃 但其实我是想以一个一个属性地跳跃,有没有方法呢? 查询帮助 没思路的话我们还是得继续查询 :h w ...

  9. .Net Core MemoryCache 缓存

    缓存是一种开发时常用的性能优化手段,.Net自带内存缓存(MemoryCache)可以很方便的使用,下面列出简单用法. 首先通过NuGet添加 Microsoft.Extensions.Hosting ...

  10. C# 算术表达式求值(后缀法),看这一篇就够了

    一.种类介绍 算术表达式有三种:前缀表达式.中缀表达式和后缀表达式.一般用的是中缀,比如1+1,前后缀就是把操作符移到前面和后面,下面简单介绍一下这三种表达式. 1.前缀表示法 前缀表示法又叫波兰表示 ...