Pytorch Document学习笔记

  • Pytorch Document学习笔记
    • 1. 网络层
      • 1.1 torch.nn.Conv2d
      • 1.2 torch.nn.MaxPool2d / torch.nn.MaxUnpool2d
      • 1.3 torch.nn.ReLU
      • 1.4 torch.nn.BatchNorm2d
    • 2. 优化器
      • 2.1 torch.optim.SGD
      • 2.2 torch.optim.Adagrad
      • 2.3 torch.optim.RMSprop
      • 2.4 torch.optim.Adam
    • 3. 损失函数
      • 3.1 torch.nn.L1Loss
      • 3.2 torch.nn.MSELoss
      • 3.3 torch.nn.CrossEntropyLoss
    • 4. 初始化
      • 4.1 torch.nn.init.uniform
      • 4.2 torch.nn.init.normal
      • 4.3 torch.nn.init.constant
      • 4.4 torch.nn.init.xavier_uniform / torch.nn.init.xavier_normal
      • 4.5 torch.nn.init.kaiming_uniform / torch.nn.init.kaiming_normal

Pytorch Document学习笔记

最近花了些时间补充了Pytorch相关的知识,正好借着Pytorch的官方文档补充下深度学习的基础知识,主要是看看Pytorch中封装有哪些库函数,搞清楚这些库函数后面具体使用的算法,由于面比较广,可能深度不是很够

1. 网络层

1.1 torch.nn.Conv2d

卷积层的目的主要是提取特征,in_channels和out_channels分别控制着输入通道和输出通道的数量,kerner_size, stride和padding组合控制这卷积后输出特征层的大小,另外:
dilation为空洞卷积的间隔,在图像分割领域,在dilation提出来之前,主要通过pooling和up sampling来提高单个像素的感受野,dilation的主要作用就是在不用pooling的情况下也能够增大像素的感受野,以达到更好的分割效果,如下图所示:

groups为分组卷积,所谓分组卷积就是将32通道的卷积任务分为两个16通道卷积进行,主要作用是减少参数量,因为减少了参数量,对于网络来说相当于进行了正则化。
bias为卷积偏置,偏置的存在主要是为两个更好地拟合数据

1.2 torch.nn.MaxPool2d / torch.nn.MaxUnpool2d

池化层的作用主要是去掉特征中的冗余信息,相当于下采样操作,当return_indices设置为True时,函数会输出最大值的序号,而最大反池化则等同于上采样,输入为最大池化操作的输出以及序号,将非最大值部分设置为0
pytorch中出来最大池化操作,池化操作还包括AvgPool2d, FractionalMaxPool2d, LPPool2d, AdaptiveMaxPool2d, AdaptiveAvgPool2d

1.3 torch.nn.ReLU

非线性激活层存在的目的是为了让网络对非线性的数学模型具有拟合效果,与其类似的激活函数还包括ELU, PReLU, LeakyReLU, Threshold, Sigmoid, Tanh等等等等

1.4 torch.nn.BatchNorm2d

批归一化层相对来说会复杂一些,起主要目的是改变小批量数据的分布(均值和方差),批归一化的位置如果放在激活层之前则是对节点的输出进行归一化,如果放在激活后则是对下一个节点的输入进行归一化,都是可以的,批归一化层的公式如下y=x−mean⁡[x]Var⁡[x]+ϵ∗gamma +beta y=\frac{x-\operatorname{mean}[x]}{\sqrt{\operatorname{Var}[x]}+\epsilon} * \text { gamma }+\text { beta } y=Var[x]

+ϵxmean[x]gamma+beta其中meanmeanmeanvarvarvar分别为批数据的均值和方差,gammagammagammabetabetabeta为可以学习的参数,在训练过程中通过反向传播更新该参数,而在预测过程中则将该参数固定,Batch Normalization(BN)超详细解析对批归一化层进行了详细的解释,参考其总结一下加入批归一层带来的好处:

  1. 可以使用更大的学习率,学习过程更加稳定
  2. 可以将卷积层中的偏置设置为0,因为批归一化过程中会移除数据流中的直流分量
  3. 对初始化权重不再敏感
  4. 抑制了梯度消失同时具备正则化的效果

2. 优化器

2.1 torch.optim.SGD

随机梯度下降法的定义是随机选取批量数据中单个样本梯度进行梯度下降,其优势是算法收敛速度快,但是精度会有所损失,在实际应用为了权衡速度和精度,通常我们是批量样本中随机选取小批量样本进行梯度计算,例如我们随机随机了mmm个样本{x(1),…,x(m)}\left\{x^{(1)}, \ldots, x^{(m)}\right\}{x(1),,x(m)},对应的目标为y(i)y^{(i)}y(i),进行梯度估计有g←1m∇w∑iL(f(x(i);w),y(i))g \leftarrow \frac{1}{m} \nabla_{w} \sum_{i} L\left(f\left(x^{(i)} ;w \right), y^{(i)}\right)gm1wiL(f(x(i);w),y(i))进行权重更新有w←w+gw \leftarrow w+gww+g随机梯度下降法中有如下几个参数:
动量因子momentum,在上面例子的基础上,多了一步速度更新v←αv−ϵgv \leftarrow \alpha v-\epsilon gvαvϵg然后在进行权重更新w←w+vw \leftarrow w+vww+v这样改进之后,当前时刻的梯度与历史时刻梯度相似时,这种趋势在当前时刻会加强,如果不同,则当前时刻的梯度方向减弱,由此动量因子可以让那些因为学习率太大而来回摆动的参数梯度前后抵消,从而阻止发散。
权重衰减系数weight_decay,该系数和L2正则化有关,所谓L2正则化就是在代价函数后面再加上一个正则化项C=C0+λ2n∑ww2C=C_{0}+\frac{\lambda}{2 n} \sum_{w} w^{2} C=C0+2nλww2L2正则化的作用主要是的权重www变小,防止过拟合。我们对加入L2正则化后的代价函数进行推导有:∂C∂w=∂C0∂w+λnw\frac{\partial C}{\partial w}=\frac{\partial C_{0}}{\partial w}+\frac{\lambda}{n} w wC=wC0+nλw∂C∂b=∂C0∂b\frac{\partial C}{\partial b}=\frac{\partial C_{0}}{\partial b}bC=bC0我们发现,L2正则化后对偏置bbb没有影响,但是对于权重www的更新有影响:KaTeX parse error: Undefined control sequence: \alphaC at position 56: …frac{\partial \̲a̲l̲p̲h̲a̲C̲_{0}}{\partial …在不适用L2正则化时,求导结果中的www之前的系数是1,而1−ηλn1-\frac{\eta \lambda}{n}1nηλ小于1,其效果是减小www,这就是权重衰减系数的由来,在he实际应用中,学习率衰减通常有线性衰减(间隔固定epoch学习率减半)和指数衰减(间隔固定epoch学习率乘以0.9998)两种。
Nesterov加速梯度是在动量因子的基础上可以进一步加快收敛速度,使得收敛曲线更加稳定,经典动量的公式如下:vt=αvt−1−ϵg(wt−1)v_{t}=\alpha v_{t-1}-\epsilon g\left(w_{t-1}\right) vt=αvt1ϵg(wt1)wt=wt−1+vtw_{t}=w_{t-1}+v_{t} wt=wt1+vt

而Nesterov加速梯度后的公式如下:wt−1ahead=wt−1+μvt−1w_{t-1}^{a h e a d}=w_{t-1}+\mu v_{t-1} wt1ahead=wt1+μvt1vt=αvt−1−ϵg(wt−1ahead)v_{t}=\alpha v_{t-1}-\epsilon g\left(w_{t-1}^{a h e a d}\right) vt=αvt1ϵg(wt1ahead)wt=wt−1+vtw_{t}=w_{t-1}+v_{t} wt=wt1+vt即Nesterov加速梯度中计算的梯度是在当前权重加上累计速度后的梯度

2.2 torch.optim.Adagrad

Adagrad算法相对SGD算法能够更加有效地收敛,能够在数据分布系数的场景,更好利用系数梯度的信息,我们计算梯度有:g←1m∇w∑iL(f(x(i);w),y(i))g \leftarrow \frac{1}{m} \nabla_{\boldsymbol{w}} \sum_{i} L\left(f\left(\boldsymbol{x}^{(i)} ; \boldsymbol{w}\right), \boldsymbol{y}^{(i)}\right) gm1wiL(f(x(i);w),y(i))累积平方梯度:r←r+g⊙gr \leftarrow r+g \odot g rr+gg计算更新Δθ←−ϵδ+r⊙g\Delta \boldsymbol{\theta} \leftarrow-\frac{\epsilon}{\delta+\sqrt{r}} \odot g Δθδ+r

ϵg应用更新θ←θ+Δθ\theta \leftarrow \theta+\Delta \theta θθ+Δθ通常Adagrad算法一开始是激励收敛的,后面慢慢就变成惩罚收敛,这也就导致了会出现学习绿收缩到太小而无法进行有效收敛的情况

2.3 torch.optim.RMSprop

RMSprop算法与Adagrad算法唯一的不同就在于累积平方梯度的方法不同,其累积平方梯度的方式为:r←ρr+(1−ρ)g⊙gr \leftarrow \rho r+(1-\rho) g \odot g rρr+(1ρ)gg其实就是添加了一个衰减系数来控制历史信息获取多少,在该函数中同样可以配置动量因子momentum以及权重衰减系数weight_decay

2.4 torch.optim.Adam

Adam算法全称为adaptive moment estimation,Adam算法其实就是momentum和RMSporp的结合,其通过计算梯度的一阶矩估计和二阶矩估计而为不同的参数设计独立的自适应学习率,具体算法如下,同样先估计梯度:g←1m∇w∑iL(f(x(i);w),y(i))\boldsymbol{g} \leftarrow \frac{1}{m} \nabla_{\boldsymbol{w}} \sum_{i} L\left(f\left(\boldsymbol{x}^{(i)} ; \boldsymbol{w}\right), \boldsymbol{y}^{(i)}\right) gm1wiL(f(x(i);w),y(i))然后是更新一阶矩估计,也就是momenturm项:s←ρ1s+(1−ρ1)gs \leftarrow \rho_{1} s+\left(1-\rho_{1}\right) g sρ1s+(1ρ1)g更新二阶矩估计,相当于二阶矩估计:r←ρ2r+(1−ρ2)g⊙gr \leftarrow \rho_{2} r+\left(1-\rho_{2}\right) g \odot g rρ2r+(1ρ2)gg然后分别修正一阶矩偏差和二阶矩偏差s^←s1−ρ1t\hat{\boldsymbol{s}} \leftarrow \frac{\boldsymbol{s}}{1-\rho_{1}^{t}} s^1ρ1tsr^←r1−ρ2t\hat{\boldsymbol{r}} \leftarrow \frac{\boldsymbol{r}}{1-\rho_{2}^{t}} r^1ρ2tr然后逐元素计算更新Δθ=−ϵs^r^+δ\Delta \theta=-\epsilon \frac{\hat{\boldsymbol{s}}}{\sqrt{\hat{\boldsymbol{r}}}+\delta} Δθ=ϵr^

+δs^最后应用更新:θ←θ+Δθ\theta \leftarrow \theta+\Delta \theta θθ+ΔθAdam算法的优势是适合解决大规模数据的参数优化问题,同时适用于非稳态目标

pytorch中还有的优化方法有Adadelta,Adamax,ASGD,LBFGS以及RProp

3. 损失函数

3.1 torch.nn.L1Loss

计算输入xxx和目标yyy之间的绝对值的平均值loss⁡(x,y)=1/n∑∣xi−yi∣\operatorname{loss}(x, y)=1 / n \sum \mid x_{i}-y_{i}| loss(x,y)=1/nxiyi

3.2 torch.nn.MSELoss

计算输入xxx和目标yyy之间的均方误差loss⁡(x,y)=1/n∑(xi−yi)2\operatorname{loss}(x, y)=1 / n \sum\left(x_{i}-y_{i}\right)^{2} loss(x,y)=1/n(xiyi)2

3.3 torch.nn.CrossEntropyLoss

用于多分类器的交叉熵损失loss⁡(x,class )=−log⁡exp⁡(x[class ])∑jexp⁡(x[j]))=−x[class ]+log⁡(∑jexp⁡(x[j]))\operatorname{loss}(x, \text { class })=-\log \frac{\exp (x[\text { class }])}{\left.\sum_{j} \exp (x[j])\right)} \quad=-x[\text { class }]+\log \left(\sum_{j} \exp (x[j])\right) loss(x,class)=logjexp(x[j]))exp(x[class])=x[class]+log(jexp(x[j]))

pytorch中还有的损失函数有NLLLoss,KLDivLoss,BCELoss,MarginRankingLoss,HingeEmbeddingLoss,MultiLabelMarginLoss,SmoothL1Loss,SoftMarginLoss,MultiLabelSoftMarginLOss,CosineEmbeddingLoss,MultiMarginLoss

4. 初始化

4.1 torch.nn.init.uniform

从给定的上下界的均匀分布中生成值,然后填充入张量或者变量进行初始化

4.2 torch.nn.init.normal

从给定的均值和方差的正态分布中生成值,然后填充入张量或者变量进行初始化

4.3 torch.nn.init.constant

将给定的常量填充入张量或者变量进行初始化

4.4 torch.nn.init.xavier_uniform / torch.nn.init.xavier_normal

为了使得网络中信息更好的流动,每一层输出的方差应该尽量相同,这就是xavier算法的核心思想,对于一层卷积有
y=w1x1+⋯+wnixni+by=w_{1} x_{1}+\cdots+w_{n_{i}} x_{n_{i}}+b y=w1x1++wnixni+b其中nin_ini表示输入个数,根据概率统计知识我们有如下方差公式:Var⁡(wixi)=E[wi]2Var⁡(xi)+E[xi]2Var⁡(wi)+Var⁡(wi)Var⁡(xi)\operatorname{Var}\left(w_{i} x_{i}\right)=E\left[w_{i}\right]^{2} \operatorname{Var}\left(x_{i}\right)+E\left[x_{i}\right]^{2} \operatorname{Var}\left(w_{i}\right)+\operatorname{Var}\left(w_{i}\right) \operatorname{Var}\left(x_{i}\right) Var(wixi)=E[wi]2Var(xi)+E[xi]2Var(wi)+Var(wi)Var(xi)特别地,当我们假设输入和权重都是0均值时有Var⁡(wixi)=Var⁡(wi)Var⁡(xi)\operatorname{Var}\left(w_{i} x_{i}\right)=\operatorname{Var}\left(w_{i}\right) \operatorname{Var}\left(x_{i}\right) Var(wixi)=Var(wi)Var(xi)进一步假设输入的xxxwww都是独立同分布,则有:Var⁡(y)=niVar⁡(wi)Var⁡(xi)\operatorname{Var}(y)=n_{i} \operatorname{Var}\left(w_{i}\right) \operatorname{Var}\left(x_{i}\right) Var(y)=niVar(wi)Var(xi)于是,为了保证输入与输出方差一致,则应该有:Var⁡(wi)=1ni\operatorname{Var}\left(w_{i}\right)=\frac{1}{n_{i}} Var(wi)=ni1对于一个多层网络,某一层的方差可以用累计的形式表达:Var⁡[zi]=Var⁡[x]∏i′=0i−1ni′Var⁡[Wi′]\operatorname{Var}\left[z^{i}\right]=\operatorname{Var}[x] \prod_{i^{\prime}=0}^{i-1} n_{i^{\prime}} \operatorname{Var}\left[W^{i^{\prime}}\right] Var[zi]=Var[x]i=0i1niVar[Wi]反向传播时具有类似的形式:Var⁡[∂Cost ∂si]=Var⁡[∂Cost ∂sd]∏i′=idni′+1Var⁡[Wi′]\operatorname{Var}\left[\frac{\partial \text { Cost }}{\partial s^{i}}\right]=\operatorname{Var}\left[\frac{\partial \text { Cost }}{\partial s^{d}}\right] \prod_{i^{\prime}=i}^{d} n_{i^{\prime}+1} \operatorname{Var}\left[W^{i^{\prime}}\right] Var[siCost]=Var[sdCost]i=idni+1Var[Wi]则为了保证前向传播和反向传播时每一层的方差一致,则应该满足∀i,niVar⁡[Wi]=1\forall i, \quad n_{i} \operatorname{Var}\left[W^{i}\right]=1 i,niVar[Wi]=1∀i,ni+1Var⁡[Wi]=1\forall i, \quad n_{i+1} \operatorname{Var}\left[W^{i}\right]=1 i,ni+1Var[Wi]=1但是实际中输入和输出的个数通常不相等,因此最终我们的权重方差应该满足:∀i,Var⁡[Wi]=2ni+ni+1\forall i, \quad \operatorname{Var}\left[W^{i}\right]=\frac{2}{n_{i}+n_{i+1}} i,Var[Wi]=ni+ni+12对于[a, b]区间中的均匀分布的方差为:Var⁡=(b−a)212\operatorname{Var}=\frac{(b-a)^{2}}{12} Var=12(ba)2那么,满足xavier算法的均匀分布是W∼U[−6nj+nj+1,6nj+nj+1]W \sim U\left[-\frac{\sqrt{6}}{\sqrt{n_{j}+n_{j+1}}}, \frac{\sqrt{6}}{\sqrt{n_{j}+n_{j+1}}}\right] WU[nj+nj+1

6

,nj+nj+1

6

]同理我们可知满足xavier算法的高斯分布是W∼N[0,2nj+nj+1]W\sim N\left[0, \frac{\sqrt{2}}{\sqrt{n_{j}+n_{j+1}}}\right]WN[0,nj+nj+1

2

]

4.5 torch.nn.init.kaiming_uniform / torch.nn.init.kaiming_normal

上述xavier初始化的问题主要在只适用于线性激活函数,但实际上,对于深层神经网络来说,线性激活函数没有价值。kaiming算法就是针对是非线性的Relu激活函数设计的一种初始化方法。对于均值为0的输出来说,Relu激活函数会将小于零的部分都置为0,这样上述xavier初始化中均值为0的假设就不成立了,具体的推到可以参考论文Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification

pytorch中还有的初始化方式有eye,dirac,sparse

Pytorch Document学习笔记相关推荐

  1. Ceres Solver Document学习笔记

    Ceres Solver Document学习笔记 Ceres Solver Document学习笔记 1. 基本概念 2. 基本方法 2.1 CostFunction 2.2 AutoDiffCos ...

  2. pyTorch——基础学习笔记

    pytorch基础学习笔记博文,在整理的时候借鉴的大量的网上资料,存在和一部分图片定义的直接复制黏贴,在本博文的最后将会表明所有的参考链接.由于参考的内容众多,所以博文的更新是一个长久的过程,如果大佬 ...

  3. PyTorch深度学习笔记之四(深度学习的基本原理)

    本文探讨深度学习的基本原理.取材于<PyTorch深度学习实战>一书的第5章.也融入了一些自己的内容. 1. 深度学习基本原理初探 1.1 关于深度学习的过程的概述 给定输入数据和期望的输 ...

  4. 卷起来了,写了一套Tensorflow和Pytorch的学习笔记(20G/代码/PPT/视频)

    作为一名AI工程师,掌握一门深度学习框架是必备的生存技能之一. 谷歌的 Tensorflow 与 Facebook 的 PyTorch 一直是颇受社区欢迎的两种深度学习框架. 我们通过调研发现,80% ...

  5. Pytorch深度学习笔记(七)逻辑斯蒂回归

    目录 1. logistic(逻辑斯蒂)函数 2.二分类任务(binary classification)损失函数 3.二分类任务(binary classification)最小批量损失函数 4.逻 ...

  6. pytorch深度学习笔记(一)

    深度卷积神经网络(AlexNet) 在2012年前,图像特征都是机械地计算出来的.事实上,设计一套新的特征函数.改进结果,并撰写论文是盛极一时的潮流.SIFT [Lowe, 2004].SURF [B ...

  7. PyTorch深度学习笔记

    神经元 本博客所说的神经元指的是输入输出矩阵的数,每一个数就算一个神经元,而不是权重参数(也可以理解为kernel). 卷积操作 一次扫描:生成一张新特征图 先生成与原特征图数量相等的kernel,k ...

  8. 《Dive into DL Pytorch》学习笔记

    原文链接:https://github.com/ShusenTang/Dive-into-DL-PyTorch,将<动手学深度学习> 原书中MXNet代码实现改为PyTorch实现. 第二 ...

  9. 关于document学习笔记及涉及的前端笔试题

    Document 文档子节点 document.documentElement 始终指向HTML页面中的<html>元素 document.body 始终指向<body>元素 ...

最新文章

  1. 如何用css实现等高布局。
  2. mongodb数据库淘汰_MongoDB 等 NoSQL 与关系型数据库相比,有什么优缺点及适用场景?...
  3. 如何在Linux下安装PyCharm
  4. matlab graphic,Matlab图形系统,Matlab Graphic System,音标,读音,翻译,英文例句,英语词典...
  5. calling c++ from golang with swig--windows dll(一)
  6. 转载:[Matlab]结构体(Struct)
  7. 快餐店选址指南--转
  8. 求助wpe封包遇到动态验证怎么办
  9. 微信发红包功能的测试用例
  10. IJCAI 2021丨时间序列相关研究论文汇总
  11. jmeter与lr区别
  12. selenium破解滑块验证码自动查询+获取后续表单数据
  13. PXE的原理与配置方式
  14. 常用sql语句(备忘)
  15. oracle 10g alter system reset,《深入浅出Oracle》勘误表
  16. 自己对mysql中的Join的理解
  17. 车载gps位置服务器,车载GPS监控系统工作原理简介
  18. 苹果手机图片黑白互换_苹果与3周显卡互换
  19. 【信息】宁波银行金融科技部:常见问题解答
  20. Echarts3 关系图-力导向布局图

热门文章

  1. 【Mybatis 之应用篇】 5_Mybatis总结(附20道练习题以及答案)
  2. 为什么魂斗罗只有 128 KB却可以实现那么长的剧情?
  3. 蓝桥杯练习系统习题-算法提高2
  4. hibernate教程--快速入门(增删改查)
  5. UI组件之AdapterView及其子类(二)GridView网格视图的使用
  6. struts2的bean标签和set标签
  7. (Oracle学习笔记) PL/SQL编程语言
  8. Python中的异常处理详解
  9. 利用Spring的Aop实现项目的日志监控
  10. Java 里的泛型简介.