资讯详情

纽约大学深度学习PyTorch课程笔记(自用)Week1&2

深入学习纽约大学PyTorch课程笔记Week1&2

  • 0. 课程纲要
  • 1. Week1
    • 1.1 深度学习的动机及其历史和灵感
      • 1.1.1 深度学习的灵感和历史
        • 监督学习
      • 1.1.2 模型识别的历史和梯度下降简介
        • 梯度通过反向传输计算
      • 1.1.3 层次结构的视觉皮层
    • 1.2 卷积神经网络(CNN)为什么深度学习会进化及其用途?
      • 1.2.1 卷积神经网络(CNN)的演化
      • 1.2.2 深度学习和特征提取
      • 1.2.3 学习表征
    • 1.3 问题动机、线性代数和视觉化
      • 1.3.1 与变动机
      • 1.3.2 资料视觉化 - 不同颜色的点通过神经网络分离
        • 网络结构
      • 1.3.3 随机投影 - Jupyter Notebook
  • 2. Week2
    • 2.1 梯度下降和反向传播算法导论
      • 2.1.1 梯度下降优化算法
        • 参数化模型
        • 梯度下降
      • 2.1.2 随机梯度下降和反向传播算法在传统神经网络中的优势
        • 随机梯度下降的优点
        • 传统神经网络
        • 反向传播通过非线性函数进行
        • 通过加权和反向传播
      • 2.1.3 神经网络和反向传播PyTorch实现
        • 传统神经网络的方块图表示
        • PyTorch实现
        • 反向传播模块
        • 多层结构的反向传播
    • 2.2 计算神经网络模块的梯度和反向传播的实用技能
      • 2.2.1 反向传播的具体例子也介绍了神经网络模块的基础
        • 范例
        • 基本的神经网络模块
      • 2.2.2 LogSoftMax vs SoftMax
      • 2.2.3 反向传播的实用技巧
        • 用 ReLU 作为非线性函数
        • 以交叉熵为分类问题的损失函数
        • 小批量训练(minibatch)随机梯度下降
        • 打乱样本顺序进行训练
        • 将输入归一化,使其具有零平均值和单位方差
        • 学习率按进度降低
        • 使用 L1 和(或)L2 权重衰减正则化
        • 权重初始化
        • 使用 dropout
    • 2.3 人工神经网络(ANNs)
      • 2.3.1 监督学习分类
      • 2.3.2 训练数据
      • 2.3.3全连接层(fully connected (FC) layer)
      • 2.3.4 神经网络(推断 (inference))
      • 2.3.5 神经网络(训练 I)
      • 2.3.6 神经网络 (训练 II)

0. 课程纲要

  • 监督学习,神经网络,深度学习基础
  • 反向传播算法和架构组成
  • 卷积神经网络及应用
  • 更深入的学习结构
  • 正则化技巧/优化技巧/理解深度学习如何工作
  • 基于能量的模型 (Energy-based models)
  • 多监督学习 在这里插入图片描述

1. Week1

1.1 深度学习的动机及其历史和灵感

1.1.1 深度学习的灵感和历史

深度学习的概念受到大脑的启发,但并不是每脑的每一个细节都很重要。类比之下,飞机的概念受到鸟类的启发。它们的飞行原理相同,但细节完全不同。

深度学习的历史可以追溯到今天,我们称之为控制论(cybernetics)的学科。20世纪40年代,McCulloch和Pitts有一个想法:神经元是一个可以开关的阈值单元,它可以将神经元连接成布尔电路,并用它进行逻辑推理。因为神经元是二元,大脑其实是逻辑推理机。神经元计算输入的加权和,并与阈值进行比较。如果结果超过阈值,则打开并关闭。这是对神经网络工作模式的简单描述。几十年来,相关领域一直采用这个模型。

1947年,Donald Hebb通过修改彼此之间的连接(突触)强度来思考大脑中的神经元。Hebb学习:当两个神经元一起刺激时,它们之间的连接变得更强;当它们不一起刺激时,它们之间的连接就会减弱。

此后在1948年,Norbert Wiener通过传感器提出控制论(sensor)和执行器(actuator),可构建反馈电路和自调系统。例如,汽车(转向控制)中反馈机制的相关规则和稳定性来自控制理论。

1957年,Frank Rosenblatt提出了传感器。该算法可以修改简单神经网络的权重。

总之,通过模拟大量神经元制造智能机器的想法诞生于20世纪40年代,在20世纪50年代很流行,但在20世纪60年代没有。它衰落的根源在于:

研究人员使用的神经元是二元的。然而,只有连续的激活函数才能使反向传播算法发挥作用。研究人员没想到会使用连续的神经元。他们没想到会用梯度训练,因为二元神经元不能微分。

即使有连续的神经元,它的输入也需要乘以权重来获得权重和贡献。1980年前,乘法两个数字的过程非常缓慢,尤其是浮点数。这也使得研究人员不愿意使用连续的神经元。

1985年的深度学习算法的出现再次流行起来。1995年,该方向再次下降,机器学习社区也放弃了神经网络的想法。2010年初,人们在语音识别方面取得了巨大的进展,并大量商业化。2013年,计算机视觉转向使用神经网络。2016年,自然语言处理也是如此。很快,我们将在机器人、控制和其他学科看到类似的革命。

监督学习

90%的深度学习应用使用监督学习。在监督学习中,您需要收集一组相应的输入和输出数据,然后将输入交给机器以学习正确的输出。。这里的微妙之处在于了解参数应该调整到哪个方向和多少。这需要梯度计算和反向传输算法。

监督学习可以追溯到感知机和自适应线单元(Adaline, Adaptive Linear Element)。Adaline基于与感知机相同的架构,对输入进行加权求和。当加权之和高于阈值时开,低于阈值时关闭。感知机是一种两层神经网络,第二层可以训练,第一层固定。在大多数情况下,第一层的权重是随机决定的,称为联想层(associative layer)。

1.1.2 模型识别的历史和梯度下降简介

以前的模式识别构成了深度学习基础。模式识别的基本模型包括特征提取器和可训练分类器。特征提取器从输入数据经中获得有用的特征,比如人脸识别中的任务中检测出眼睛。然后,可训练分类器计算出代表特征的向量的加权和,并与阈值比较。可训练分类器可以是感知机或者一个神经网络。问题是,特征提取器必须由人工设计。因此,模式识别/机器视觉的侧重点变成了为具体问题设计特征提取器,而非可训练分类器。

随着深度学习的出现与发展,这个二阶过程转变为一系列模块。。我们之所以使用非线性单元而不是线性,是因为两层线型单元的组成仍为线性,因此相当于一层线型单元。

最简单的含可调参数与非线性单元的多层结构是:用向量表现的输入,比如图像或语音。该输入和权重矩阵相乘,矩阵的系数是可调参数。接着,相乘结果的每个部分都通过一个非线性单元,比如ReLU。重复这个过程便得到一个基本的神经网络。它之所以被称为神经网络,是因为这个结构将输入的每个组成部分与矩阵对应的行相乘,获得一个加权和。

回到监督学习的概念上,我们将输出结果与目标输出比较,并优化一个目标函数。这个目标函数,或者说损失,计算结果与目标间的距离/惩罚/差异,并取它在训练集上的平均数。这就是我们要减少的目标。换言之,我们想找到能减少这个平均数的参数值。

我们通过计算梯度的方式来寻找它。举个例子,一个大雾弥漫的夜晚,我们在一座光滑的山上迷路了。我们想下到山谷的村庄里。这时我们可以转身寻找最陡的方向并迈一小步。这个方向就是梯度的反方向。只要假设山谷是凸的,那我们这样重复下去必定能达到山底。

随机梯度下降(stochastic gradient descent)是一种更高效的方法。既然我们想减少整个训练集的平均损失,那每次取一个样本或一小组样本,计算它们的误差并使用梯度下降。接下来取一个新样本并得到一个新的误差,然后算出一个新的梯度。使用随机梯度下降的两个原因:一是经验上当数据集非常大时SGD收敛得更快,二是能取得更好的泛化能力,在其它的数据集上预测时能得到相近的性能。

通过反向传播计算梯度

通过反向传播计算梯度是链式法则的实际应用。

状态梯度的反向传播(计算)如下:

∂ C ∂ x i − 1 = ∂ C ∂ x i ∂ x i ∂ x i − 1 ∂ C ∂ x i − 1 = ∂ C ∂ x i ∂ f i ( x i − 1 , w i ) ∂ x i − 1 \begin{aligned} \frac{\partial C}{\partial \boldsymbol{x}_{i - 1}} &= \frac{\partial C}{\partial \boldsymbol{x}_i}\frac{\partial \boldsymbol{x}_i}{\partial \boldsymbol{x}_{i - 1}} \\ \frac{\partial C}{\partial \boldsymbol{x}_{i - 1}} &= \frac{\partial C}{\partial \boldsymbol{x}_i}\frac{\partial f_i(\boldsymbol{x}_{i - 1}, \boldsymbol{w}_i)}{\partial \boldsymbol{x}_{i - 1}} \end{aligned} ∂xi−1​∂C​∂xi−1​∂C​​=∂xi​∂C​∂xi−1​∂xi​​=∂xi​∂C​∂xi−1​∂fi​(xi−1​,wi​)​​

权重梯度的反向传播(计算)如下:

∂ C ∂ w i = ∂ C ∂ x i ∂ x i ∂ w i ∂ C ∂ w i = ∂ C ∂ x i ∂ f i ( x i − 1 , w i ) ∂ w i \begin{aligned} \frac{\partial C}{\partial \boldsymbol{w}_{i}} &= \frac{\partial C}{\partial \boldsymbol{x}_i}\frac{\partial \boldsymbol{x}_i}{\partial \boldsymbol{w}_{i}} \\ \frac{\partial C}{\partial \boldsymbol{w}_{i}} &= \frac{\partial C}{\partial \boldsymbol{x}_i}\frac{\partial f_i(\boldsymbol{x}_{i - 1}, \boldsymbol{w}_i)}{\partial \boldsymbol{w}_{i}} \end{aligned} ∂wi​∂C​∂wi​∂C​​=∂xi​∂C​∂wi​∂xi​​=∂xi​∂C​∂wi​∂fi​(xi−1​,wi​)​​

需要注意的是,输入时需要向量而非标量,而且通常是多维向量。反向传播使得我们可以计算真实值与实际输出(目标函数)之差对于网络中任何值的导数。最后,反向传播之所以如此重要是因为它会被应用于多层之上。

考虑如何处理输入十分重要。比如 256 × 256 256\times256 256×256大小的图像需要有 200,000 个值的矩阵。 这些巨型矩阵之后会交给神经网络层来处理,而利用这样的矩阵是不切实际的。因此,对矩阵的结构进行假设十分重要。

1.1.3 视觉皮层的层次结构

福岛邦彦的实验使我们对大脑如何处理视觉有所了解。总的来说,我们发现视网膜前面的神经元压缩了输入(又称对比度归一化),之后视觉信号从我们的眼睛传播到我们的大脑。此后视觉信号被分阶段处理,特定类别的特定神经元被激活。因此,视觉皮层以分层方式进行模式识别。

研究人员在视觉皮层的特定区域(特别是V1区域)的电极实验使他们意识到,某些神经元会对出现在视野中的小区域的图案产生反应,并且临近的神经元对相邻区域也有类似的表现。另外,对同一视野做出反应的神经元会以有组织的方式对不同类型的边缘(垂直或水平边缘)做出反应。 还有一种值得关注的观点是是视觉过程本质上是前馈过程,因此可以在无反复连接的情况下完成快速识别。

1.2 卷积神经网络(CNN)的演化及其用途,为何出现深度学习?

1.2.1 卷积神经网络(CNN)的演化

在动物的大脑中,神经元对特定方向的边缘信息有所反应。对同一方向起反应的神经元群将复制遍整个视野。

Fukushima (1982)基于两个概念构建了一个与大脑工作方式相同的神经网络(NN)。第一,神经元将跨越视野进行复制。 第二,复杂细胞可以将来自简单细胞(方向选择性单元)的信息进行汇合。 这造成的结果就是,图片的移动将改变单个细胞的激活,但是并不影响复杂细胞的集成激活(卷积汇合操作)。

LeCun (1990)使用反向传播算法训练CNN,进行手写数字的识别。在1992年的一个演示中,展示了该算法可以识别任意样式的数字。在那时,使用通过端到端训练的模型进行字符/模式识别非常新颖。在这之前,大家的方案通常是利用 特征提取器再加上一个监督模型。

这些新颖的CNN系统能够同时在图片上识别多个字符。为了实现识别,人们在CNN中使用一个小型的输入窗,并将其滑过整个图像。如果它被激活,那就意味着存在某个特定的字符。

之后,这个想法被应用于面部/人物检测和语义分割(逐像素分类)。包括像Hadsell (2009)和Farabet (2012)这样 的例子。最终,CNN在工业界变得非常普遍,在如车道跟踪这样的自动驾驶应用中也被使用。

在20世纪80年代,用来训练CNN的特殊硬件是一个非常热门的主题。接着,人们对此的兴趣衰退。而如今这个主题则再次变得炙手可热。

深度学习(虽然在那时大家还没有使用这个词)的革命始于2010-2013年。研究人员致力于创造那些可以帮助大型CNN训练变得更加快速的算法。 Krizhevsky (2012)在2012年提出AlexNet。这是一个比以往大得多的卷积神经网络,使用GPU在 ImageNet(130多万张图片)上进行训练。在经过几周的训练之后,AlexNet大幅度超越当时的最佳性能 – 将top-5错误率从25.8%降到16.4%。

在看到AlexNet的成功之后,计算机视觉社区开始确信CNN的有效。虽然2011-2012涉及CNN的论文都被拒稿, 但是自2016以来,大多数被接收的CV论文都使用了CNN。

多年以来,CNN中的层的数量在不断增加:LeNet – 7层,AlexNet – 12层,VGG – 19层,ResNet – 50层。尽管如此,在计算输出的所需操作数、模型的大小和它的准确率之间始终存在着一种权衡。因此当前一个非常热门的主题就是如何压缩网络,使得计算更加快速。

1.2.2 深度学习和特征提取

多层网络之所以成功,是因为它发掘了天然数据的复合结构。在复合的层级结构中,层级中某一层的目标的组合形成 下一层中的目标。如果我们将这个层级结构看做一个多层结构的网络,并且让网络学习特征的合适的组合,那么 我们就得到了所谓的深度学习架构。因此,深度学习网络本质上就是层次化的。

深度学习架构使计算机视觉任务取得了难以置信的发展。从识别并生成围绕目标的准确遮罩(mask)到识别 目标的空间性质。Mask-RCNN和RetinaNet架构对这类改善作出了主要贡献。

Mask RCNN在分割独立目标中被广泛使用。即为图像中的每一个目标建立遮罩。在这个任务中,输入和输出都是图像。该架构还可以被用来执行实例分割任务,即,在一张图像中识别同一类型的不同目标。由Facebook AI 研究院 (FAIR)开发的软件系统:Detectron,实现了所有这些SOTA(state-of-the-art)的目标检测算法并且将其开源。

一些CNN的实际应用还包括赋能自动驾驶和分析医学影像。

虽然人们对深度学习背后的科学和数学已经有了不错的理解,但是仍有一些有趣的问题需要更深入的研究。 这些问题包括:已知我们可以使用两层结构近似任意函数,为什么多层架构会表现的更好?为何CNN在语音、图像、文本这样的天然数据上效果很好?我们如何对非凸函数较好地优化?为什么过度参数化的结构也会有效?

特征提取由扩展表征维度组成,比如扩展的特征更有可能线性可分;由于可能的分离平面数量的增加,使得高维空间 的数据点更有可能线性可分。

早前的机器学习从业者依靠高质量、手工提取、针对特定任务的特征来构建人工智能模型,但是随着深度学习的出现, 模型能够自动提取通用特征。在特征提取算法中的一些常见方法如下:

  • 空间贴片
  • 随机投影
  • 多项式分类器(特征向量积)
  • 径向基函数
  • 核机

由于数据的复合性质,学到的特征随着抽象层次的增加具有层级化的表征。比如:

  • 图像 - 在最细的粒度级别,图像可以被认为是像素。像素的组合构成边缘,边缘的组合构成纹理基元(多边缘形状),纹理基元构成图案,图案构成部分图像。将这些部分图像组合,构成最终的图像。

  • 文本 - 类似地,在文本数据中也存在固有的层级。字符形成词,而词形成词组,然后是子句,再然后,将子句合并,我们得到句子。而最终句子会告诉我们故事表达了什么。

  • 语音 - 在语音里,样本组成波段,波段组成声音,声音组成元音,继而组成音素,接着是整个词,然后是句子, 这里也同样展现出了清晰的层级化表征。

1.2.3 学习表征

有一种驳斥深度学习的说法:如果我们能够使用2层结构近似任意函数,为何还要更多层?

举个例子:支持向量机(SVM)“从数据中”找到一个分类超平面,这意味着预测是基于训练数据的比较。SVM本质上是一个极简的2层神经网络,其中第一层定义了一个“模板”,第二层则是一个线性分类器。而2层说法的谬误在于,复杂度和中间层的大小是N的指数级(为了完成一个困难的任务,我们需要大量的模板)。但是如果你扩展层的数量到log(N), 那么层的复杂度将成为N的线性级别。这里就存在时间和空间的权衡。

这里再举一个类比:设计一个电路,使用不多于两层的逻辑门来计算一个布尔函数 - 用这种方法,我们其实可以计算任意布尔函数!但是,对于复杂函数而言,第一层(逻辑门的数量)的复杂度和资源将会很快变得无法实现。

什么是“深度”?

  • SVM不是深度的,因为它仅仅有两层
  • 分类树也不是深度的,因为它的每一层分析了同样的(原始)特征
  • 深度网络具有很多层,并且被用来构建一个复杂性递增的特征的层级结构

模型如何学习表征(好的特征)?

流形假设(Manifold Hypothesis):天然的数据存在于一个低维流形上。可能的图像的集合本质上是无限的,而“天然”的图像的集合是其中 一个小子集。比如:对于一个人物的图像,可能的图像的集合规模大约在能移动的面部肌肉的数量(自由度)这个量级 ~(about) 50。一个理想的(同时不切实际的)特征提取器需要表达所有这些变化的因素(每个肌肉、光照、等等等等)。

Manifold

讲稿最后的Q&A:

对于人脸的那个例子,能不能用一些其他的维度约化技术(比如主成分分析(PCA))来抽取这些特征? 回答:只有当流形表面为超平面时可行,但显然这里不是

1.3 问题动机、线性代数与视觉化

1.3.1 变换与其动机

让我们看看一个图像分类的例子。比方我们用一个一百万像素的相机拍一张照片,这张图片铅直、水平各有约 1000 个像素,而每个像素会有红绿蓝三个色彩的维度。每个图像因此就可以当作三百万维空间中的一点。在这样大的维度中,许多我们想分类的有趣图像——像是狗对上猫——必然会在空间中的相同区域中。

为了有效分离这谢图像,我们考虑对资料进行一些变换以移动这些资料点。请回想一下,在二维空间中,一个线性变换等同于矩阵乘法。例如下列这些线性变换:

  • 旋转(当矩阵为正交矩阵)
  • 缩放(当矩阵为对角矩阵)
  • 反射(当行列式为负值)
  • 错切

值得注意的是,。再回到我们的图像例子,我们可以先平移使各点移动到 0 的周遭,再用对角矩阵缩放来放大那个区域,最后,我们就能寻找能分割空间将各点分到各自的类别的直线。亦即,藉由线性与非线性的转换,将资料点映射到一个使他们线性可分的空间。下个部份我们会更具体的说明这个想法。

1.3.2 资料视觉化 - 通过神经网路将不同颜色的点分离

我们的视觉化展现的是由五个股组成的螺旋,每个股对应不同颜色。这些点在一个二维平面中,可以用元组来代表;这些颜色代表第三个维度,或者当作是各点的类别。接着我们可以用一个网路来分开不同颜色的点。

(a) 输入各点,通过网路前 (b) 输出各点,通过网路后

这个网路会拉伸空间以使各点能被分离. 当收敛时,网路会把每种颜色分开至最终流形中的不同子空间。也就是说,新的空间中的每个颜色,对于一对全的回归都是线性可分的。图中的这些向量可以用一个 5 x 2 的矩阵表示;这个矩阵乘上每个点产出属于五种不同颜色的分数,于是每个点可以再以它们的分数分为不同颜色。。总之,这个网路对空间进行变换,而这种变换可参数化为数个矩阵与非线性变换。

网络结构

图 2: 网路结构

第一个矩阵将 2 维的输入映射到 100 维的隐藏层。接着加上一个非线性层:ReLU,即 Rectified Linear Unit,就是一个输出输入大于零部分的函数 ( ⋅ ) + (\cdot)^+ (⋅)+ 。接下来,为了用图片的方式显示图像,我们用一个嵌入层来将 100 维的隐藏层映射到 2 维的输出。最后,嵌入层被投影到 5 维的最后一层,每个维度代表各个颜色的分数。

1.3.3 随机投影 - Jupyter Notebook

演示代码

2. Week2

2.1 梯度下降和反向传播算法导论

2.1.1 梯度下降优化算法

参数化模型


参数化模型 y ˉ = G ( x , w ) \bar{y} = G(x,w) yˉ​=G(x,w)

简单来讲,参数化模型就是依赖于输入和可训练参数的函数。 其中,可训练参数在不同训练样本中是共享的,而输入则因每个样本不同而不同。 在大多数深度学习框架中,参数是隐性的:当函数被调用时,参数不被传递。 如果把模型比作面向对象编程,这些参数相当于被“储存在函数中”。

参数化模型(上文提到的函数)包含一个参数向量,这个模型可以将一个输入转化成输出。 在监督学习中,我们把模型的输出 ( y ˉ ) (\bar{y}) (yˉ​)送入代价函数 ( C ( y , y ˉ ) ) (C(y,\bar{y} )) (C(y,yˉ​)),并将它与正确答案 ( y ) ({y}) (y) 对比。 图1是这个过程的示意图。

下列是几个参数化模型的例子。

  • 线性模型 - 输入向量的加权和:

y ˉ = ∑ i w i x i , C ( y , y ˉ ) = ∥ y − y ˉ ∥ 2 \bar{y} = \sum_i w_i x_i, C(y,\bar{y}) = \Vert y - \bar{y}\Vert^2 yˉ​=i∑​wi​xi​,C(y,yˉ​

标签: zg2传感器如何维护dx1台中仪表变送器dx1通化仪表变送器7悬臂式系列传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台