Pytorch ——根底指北_贰

本文已参加「新人创造礼」活动.一起敞开创造之路。

软件环境:

  • pytorch 1.10
  • pycharm

配套代码下载地址:

gitee-pytorch

根底知识:

要想练习一个网络,关于梯度变量类型有哪些的了解是必不可少的,下面首先介绍梯度的一些根底概念。

0、方向余弦与向量单位化

方向余弦是一个在向量中很常见的概念,它用来标定某一个向量的方向,说起来可能会一头梯度下降法的目标是雾水,不过不要紧,咱们运用画图来了解一下。

举个比如,如下图有一个坐标系xoy,其作用如下所示:

其间包括了一个向量l→overrightarrow{变量类型有哪些l} ,向量的坐标为:(a,b)(a,b)

那么上文中的向量就满意如下式子:

(aa2+b2,ba2+b2)(frac{a}{sqrt{a^2+b^2}},frac{b}{sqrt{a^2+b^2}})

上文的式子实践上便是对向量进行单位化,此刻新产生的向量,实践上变量是什么意思便是咱们常说的方向向量

方向向量实践上还能够再优化一下,咱们看到图上还有两个标明的角别离是和alpha和beta,这两者的联系就不再多说,他们呢一对互余的视点,满软件工程师意的条件便是github相加等于90度。

此刻咱们就能够将这个式子转化成这样的形式:

aa2+b2=cos⁡frac{a}{sqrt{a^2+b^2}} = cos{alpha}

同理也有:

ba2+b2=cos⁡frac{b}{sqrt{a^2+b^2github中文官网网页}} = cos{beta}

这样方向的变量的定义向量的表达式,就能够写为:

(aa2+b2,ba2+b2)=(cos⁡,软件库sin)(frac{a软件技术专业}{sqrt{a^2+b^2}},frac{b}{sqrt{a^2+b^2}}) =(cos{alpha},sin{alpha})

实践由于视点互余上能够化为:

(cos,cos)(cos{alpha},cos{beta})

1、多元函数求偏导

一元函数,即有一个自变量。相似f(x)f(x)

多元函数,即有多个自变量。相似f(x,y,z),三个自变量x,y,zf(x,y,z),三个自变量x,y,z

多元函数求偏导进程软件技术专业变量名对某一个自变量求导,其他自变量当做常量即可

例1:

工科学生都能看懂的梯度下降和反向传达!

例2:

工科学生都能看懂的梯度下降和反向传达!

例3:

工科学生都能看懂的梯度下降和反向传达!

练习:

已知J(a,b,c)=3(a+bc),令u=a+v,v=bcJ(a,b,c)变量的定义 = 3(a+bc),令u=a+v,v = bc,求a,b,c各自的偏导数。

工科学生都能看懂的梯度下降和反向传达!

2、方向导数:

简略机器学习地说方向导数形容的是满意某个联系下(Y=KX+B),关于各个方向上本联梯度下降法例题系数值改变率(Y的改变率)的量化表达式。

数学推导,可参阅如下文章。可是我读完今后仍是没办法一下就了解,它实践上不该该是一个这么难了解的内容,咱们反过来想一想,能不能从前面软件开发的根底构建出来方向导数究竟是什么。

方向导数1 第一章

方向导变量之间的关系数2

从二维、三维下手

在二维联系中Y=KX+B中咱们不太好了解什么是方向导数,咱们知道关于一个函数来说,y=kxgithub中文官网网页+by=kxgithub+b的导数实践上是这样的:

软件库于函数的某一点,导数等于切线在该点的斜率,他是一个极限概念。咱们无妨这样来了解这个极限的进程:

下图是某个函数,其梯度下降法matlab间包括三个点如下所示:

工科学生都能看懂的梯度下降和反向传达!

其间A、B是函数上随机的两个点。其间A、B两点满意如下:

A=(x0,f(x0))B=(xgithub永久回家地址0+x,f(x0+))A= (x软件工程_0,f(x_0))\ B= (x_0+Delta x,githubf(x_0+Delta)变量类型有哪些)

然后变量值AB两点相连接,形成一个割线,割线的斜率满意如下条件:

k梯度下降法matlabAB=f(x0+x)−f(x0)(x0+x)−x0=f(x0+x)−f(x0)xk_{AB} = frac{f(x_0+Delta x) – f(x_梯度下降法matlab0)}{(x_0+Delta x) – x_0} = frac{梯度下降f(x_0+Delta x)梯度下降的三种形式 – f(x_0)}{Delta x}

工科学生都能看懂的梯度下降和反向传达!

当有如下状况的时分,就会产生切线和导数:

当B无限趋近于A的时分,即xDelta x无限趋近于0的时分,割线AB就github会转化为切线,如下所示:

工科学生都能看懂的梯度下降和反向传达!

满意的数学梯度下降算法的正确步骤联系如下:

kab=varliminfx→0f(x0+x)−f(x0)xk_{ab} = varliminf_{Delta x t软件工程专业o 0} frac{f(x_0+Delta x) – f(x_0)}{Delta x}

而咱们知道切线的斜率便是导数的值,这是在二维的状况下。gitlab

三维的方向导数

在二维的状况咱们现已很了解了,咱们来推广到到三维的状况下来试一试,举个比如:

咱们先来下一个定义:

一般状况下的三位函数的方向导数实践上是平面XOY上一点(x,y)(x,y)在三维函数的值f(x,y)f(x,y),和其所代表的一点(x,y,f(x,y))(giticomfort是什么轮胎x,y,f(x,y))机器学习以向量l的方向向量为切面构成的曲线上(点(x,y))的一条切线的值。

说起来很抽象,咱们举个比如就好了git命令解一点了:

其间三维函数圆形抛物面大致如下:

Z=x2+变量名y2Z = x^2+y^2

如图所示:

工科学生都能看懂的梯度下降和反向传达!

图看起来很很复杂不过不要紧,咱们依托颜色来分辩一下:

赤色包括两部分内容:别离是在xy平面的点(x,y)(x,y)和切面构成的曲线。

橙色变量是什么意思包括两部变量泵分内容:l→ov梯度下降的三种形式errightagitlabrrow{l}XOYXOY 平面(笛软件卡尔坐标系)上以 P(X0,Y0)P(X_0,Y_0)为始点的软件技术一条射线,el=(cos⁡,cos⁡)e_l = (梯度下降法 cos alpha , cos beta) 是与 L 同方向的单位向量。同时还包括一个由其方向向量构建出来的平面A。

蓝色部分包括一个内容:便是函数Z。

咱们来解析一下giti这别离什么意思

当存在一个点c从点(x,y)动身沿着方向向量改变tt的时分,其坐标满意如下:

C=(x+tcos,y软件商店+tcos)(其间视点和上文中的是相同含义)C = (x+tcos{alpha},y+tcos{beta软件测试}) (其间视点和上文中的是相同含义)

这时分c点实践上便是黑色虚线在l上的点。这时分这梯度下降的三种形式个在向量上的改变轨迹便是一段向量,他的方向和l向量的方向向量是相同的,并且在函数上映gitlab射了一段曲线,如赤色部分曲线所示,咱们针对这变量的定义一种曲线来考虑一种特殊状况,当满意这个条件的时分,曲线会怎么改变?

没错便是上文中二维的状况:

工科学生都能看懂的梯度下降和反向传达!

成果是一模相同的,只不过这儿的切线是对应的在曲线上的切线,咱们这儿就引出方向导数的定义如下:

∂f∂l∣(x0,y0)=lim⁡t→0+f(x0+tcos⁡,y0+tcos⁡)−f(x0,y0)tleft. frac{pgithubartial f变量类型有哪些}{梯度下降法partial软件商店 l}right|_{left(x_{0}, y_{0}right)}=lim _{t rightarrow 0^{+}} frac{fleft(x_{0}+t cos alpha, y_{0}+t cos betaright)-fleft(x_{0}, y_{0}right)}{t}
从方向导数的定义可知,方向导数∂f∂l∣(x0,y0)便是函数f(x,y)在点P0(x0,y0)处沿方向l的改变率.text { 从方向导数的定义可知,方向导数 }left.frac{partial f}{partial l}right|_{left(x_{0}, y_{0}right)} text { 便是函数 } f(x, y) text { 在点 } P_变量是什么意思{0}left(x_{0},变量值 y_{0}right) text { 处沿方向 } l text { 的改变率. }软件商店

定理:

假如函数f(x,y)在点git教程P0(x0,y0)可微分,那么函数在该点沿任一方向的方向导数存在,且有:t梯度下降法的目标是ext { 假如函数 } f(x, y) text { 在点随机梯度下降 } P_{0}left(x_{0}, y_{0}right) text { 可微分,那么函数在该点沿任一方向 的方向导数存在,且有 :git命令}
∂f∂l∣(x0,y0)=fx(x0,y0)cos⁡+fy(x0,y0)cos⁡注意里边为偏导实践上就分化成了XY轴git教程上函数改变率left.frac{partial f}{partial l}right|_软件工程专业{left(x_{0}, y_{0}righ梯度下降法matlabt)}=f_{x}left(梯度下降算法的正确步骤x_{0}, y_{0}right) cos agiticomfort是什么轮胎lpha+f_{y}left(x_{0}, y_{0}right) cos beta \注意里边为偏导 实践上就分化成了X Y轴上函数改变率

其间, co软件工程师s⁡和cos⁡co软件s alpha text { 和 } cos beta是向量ll 的方向余弦。

这儿再阐明一下方向导数和偏导数有什么区别呢?

偏导数实践上方向导数的特例,当向量取x的正轴的时分,此刻方向导梯度下降法原理和步骤数就改变为了关于x的梯度下降法偏导数,推导如下:

∂f∂l∣(x0,y0)=lim梯度下降法的目标是⁡t→0+f(x0+tcos⁡,y0)−f(x0,y0)tleftGit.frac{partial f}{partial l}right|_{left(x_{0}, y_{0}right)} = lim _{t right梯度下降法原理arrow 0^{+}} frac{fleft(x_{0}+t cos alpha, y_{0}right)-fleft(x_{0}, y_{0}right)}{t}

假如你仔细看就会发现实践上这儿的定义便是偏导数的定梯度下降法义,也就说是方向导数梯度下降法matlab的一种状况软件技术

其次再阐明一软件商店下载下,这个式子的含义在哪里:

∂f∂l软件技术专业∣(x0,y0)=fx(x0,y0)cos⁡+fy(x0,y0)cos⁡left.frac{partial f}{partial l}right|_{left(x_{0}, y_{0}right)}=f_{x}梯度下降的三种形式left(x_{0}, y_{0}right) cos alpha+f_{y}left(x_{0}, y_{0}right) cos beta

实践上,咱们用来核算方向导数的时分便是运用这个式子,这个式子便是将对应的方向向量分化为x轴和y轴的方向余弦来进行核算,也就软件工程师说方向giti轮胎向量实践上是由x轴和y轴的方向余弦构成的。软件技术专业

还有便是关于用同一个点,方向向量不同所构成的方向导数巨细也不同,可是这些方向导数的方向始终会在一个平面内,这个平面便梯度下降是这个点的gitee切平面!

3、梯度:

梯度是方向导数的特例:

gradf⁡(x,软件商店下载y)=∂f∂xi+∂f∂yjoperatorname{gradf}(x, y) = frac{partial f}{partial x} dot{i}+frac{partial f}{partial y} dot{j}

已知在某个点有方向导数存在下列联系:

∂f∂l=∂f∂xcos⁡+∂f∂ysigit教程n⁡={∂f软件技术∂x,∂f∂y}⋅{cos⁡,sin⁡}f机器学习rac{partial f}{partial l}=fgitirac{partial f}{partial x} cos varphi+frac{随机梯度下降partial f}{partial y} sin varphi=left{frac{pgithub永久回家地址artial f}{partial x}, frac{partial f}{partgitlabial y}right} cdogitlabt{cos varphi, sin varphi}

在方向l上满意如下单位向量:

e→=cos⁡i→+变量类型有哪些sin⁡j⃗→overri软件商店ghtarrow{boldsymbol{e}}=cos varphi overrightarrow { boldsymbol{i}}+sin varphi overrightar变量泵row{ vec{j} }

则方随机梯度下降向导数可转化成如下:

工科学生都能看懂的梯度下降和反向传达!
点积就变量值相当于做一个投影github永久回家地址,方向导数 和 梯度 之间保持必定的夹角(做点积)来构成各个方向上的方向导数。什么时分方向变量英语向量最大呢?很容易想到不存在github中文官网网页夹角的时变量英语分就能够满意,由于此刻点积最大即满意下列条件:

工科学生都能看懂的梯度下降和反向传达!

函数在某点的梯度是个向量,他的方向与方向导数最大值取值的方向共同,其巨细正好是最大的方向导数。

​梯度概念了解:如下图所示,在p点放一个热源的等温线,则热源的辐射从里到外为10、20、30、40,若一个小蚂蚁在o点,要最快逃离热源,应该变量名往oj方向逃离,软件技术专业若往om方向逃离则热源的改变率为0,即一向都是20,也便是说蚂蚁一旦确认了某个逃离方向(0,90)方软件工程向角逃离,只需一向沿着该方向一向变量类型有哪些走,便是最快的热源下降的方向

工科学生都能看懂的梯度下降和反向传达!

关于一维线性函数其导数便是梯度。

各种函数的梯度与导数的联系:

函数梯度

更具体的解释能够参阅参阅文献链接。

Tensor的梯度与反向传达

回忆机器学习

收集数据xx ,构建机器学习模型ff,得到f(x,w)=Yp梯度下降法matlabredictf(x,w) = Y_{predict}

怎么判断模型的好坏?判断模型好坏的办法:

loss⁡软件商店=(Ypredict−Ytrue)2软件技术(回归丢失)loss梯度下降法matlab⁡=Ytrue⋅log⁡(Ypredict)(分软件商店类丢失)begin{array}{ll} operatorname{loss}=left(Y_{p r e d i c t}giti轮胎-Y_{text {true }}r软件技术ight)^{2} & text { (回归丢失) } \ operatorname{loss}=Y_{text {true变量 }} cdot log left(Y_{text {predict }}right) & text { (分类丢失) } end{array}

经过终究 lossloss 的输出,来反向传达Git核算梯度巨细进而调整参数的巨细完成最优解。

lossloss 满意如图时分梯度下降的三种形式

工科学生都能看懂的梯度下降和反向传达!

核算出软件工程专业来梯度今后:朝着梯度改变的方向运算,随机选择一个起始点w0w_0,经过调整w0w_0,让 lossloss 函数取到最小值。变量之间的关系

工科学生都能看懂的梯度下降和反向传达!

ww的更新办法

  1. 核算ww的梯度(导数)
begin{align*} nabla w = frac{f(w+0.000001)-f(w-0.000001)}{2*0.000001} end{align*}
  1. 更新ww
    w=w−giti轮胎∇ww = w – alpha nabla w

其间:

  1. ∇w<0nabla w <0 ,意味着w将增大
  2. ∇w>0nabla w >0 ,意味着w将减小

总结:梯度便是多元函数参数的改变趋势(参数学习的方向),只有一个变量之间的关系自变量时称为导数,拥有多个时称为偏导数。

反向传达?

核算图

为了便利描绘,经过图的方式来描绘函数。

J(a,b,c变量的定义)=3(a+bc),令u=a+v,v=bcJ(a,b,c) = 3(a+bc),令u=a+v,v =软件技术 bc,把它绘制成核算图能够表gitee示为:

工科学生都能看懂的梯度下降和反向传达!

对每个节点求偏导可有:

工科学生都能看懂的梯度下降和反向传达!

反向传达的进程便是一个上图的从右往左的进程,自软件工程变量a,b,ca,b,c各自的软件测试偏导便是连线上的梯度的乘积:

begin{align*} frac{dJ}{da} &= 3 tim梯度下降法es 1 \ frac{dJ}{变量值db} &= 3 times 1 times c \ frac{dJ}{dc软件测试} &a变量名的命名规则mp;= 3 times 1 times b end{align*}

为什么要算反向传达?

由于要核算梯度。

实战演示:

接下来尝试核算一个简略结构的梯度,问题描绘如下:

假设咱们的根底模型便是y = wx+b,其间w和b均为参数,咱们运用y = 3x+0.8来结构数据x、y,所以最后经过模型应该能够得出w和b应该别变量英语离接近3和0.8。

简略的来说便是拟合出梯度下降的三种形式满意y = 3x+0.8变量名的命名规则这个曲线。

步骤分为四步:

# 1 结构数据
# 2 规划正向传达 和 反向传达函数 来练习网络
# 3 练习
# 4 画图画出拟合出来的曲线

进程如下图变量类型有哪些

从左向右是正向传达部分

从右向左是反向传达部分

工科学生都能看懂的梯度下降和反向传达!

关于WB其核算相似这儿单独说B即可

关于B的梯度满意下式,值得注意的是这儿的Loos求取的是平均值实软件商店下载践上出来的是一个标giti量,关于标量的梯度核算实践上也是一个平均值(这儿值得思考一下变量泵)。

∂Loss∂B=∑i=0N2∗(yi−ypi)/Nfrac{partial Loss}{partial B}随机梯度下降 = sum_{i=0}^N 2*(y_i-y_{pi}变量值)/N

反向传达后对B进行梯度下降

B=B−rate∗∂Loss∂BB = B – rate *f变量rac{partial Loss}{partial B}

梯度下降今后再次进行正向传达即可,核算出来Y_p,最后核算出来Loss

正向传达满意下式:

Ypredict(0…N)=Xpre软件工程dict(0..变量值.N)∗W+BY_{predict (0…N)} =X_{predict (0.软件工程师..N)}* W + B

代码如下:

import torch
import numpy as np
import matplotlib.pyplot as plt
# 1 结构数据
x_number = 50
x = torch.rand([x_number, 1])
y = 3 * x + 0.8
rate = 0.01
study_time = 3000
# 2 正向传达 和 反向传达
w = torch.rand([1, 1], requires_grad=True, dtype=torch.float32)
b = torch.rand(1, requires_grad=True, dtype=torch.float32)
y_preidct = torch.matmul(x, w) + b
def forward_propagation():
    global x, w, b, y_preidct
    y_preidct = torch.matmul(x, w) + b
    # 核算 loss
    loss = (y - y_preidct).pow(2).mean()
    return loss
def back_propagation():
    global x, w, b, loss, rate, y_preidct
    test = 0.0
    if w.grad is not None:
        w.grad.data.zero_()
    if b.grad is not None:
        b.grad.data.zero_()
    # 反向传达
    loss.backward()
    w.data -= w.grad * rate
    b.data -= b.grad * rate
    #此处为了验证b的梯度进行核算
    # for j in range(x_number):
    #   test += ((y[j] -y_preidct[j].item()) * 2) 
    # print("b:", b.grad)
    # print("b_t:", test/x_number)
# 3 练习部分
for i in range(study_time):
    loss = forward_propagation()
    back_propagation()
    if i % 10 == 0:
        print("w,b,loss", w.item(), b.item(), loss.item())
# 4 画图部分
predict = x * w + b  # 运用练习后的w和b核算猜测值
plt.scatter(x.data, y.data, c="r")
plt.plot(x.data.numpy(), predict.data.numpy())
plt.show()

赤色的是数据集成果蓝色是练习出来的成果:

当练习次数比较少的时分拟合曲线不正确:

工科学生都能看懂的梯度下降和反向传达!

当把学习率下降(改变范围减小),增加学习次数就能够得到很好的成果:

工科学生都能看懂的梯度下降和反向传达!

参阅文献:

国内教程软件 偏理论 (10 -13 节)梯度下降法原理

youtobe教程 (第三节)(需要kx上网)有需要搬运联系我

方向导数1

方向导数2