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

纽约大学深度学习PyTorch课程笔记Week3

  • Week 3
    • 3.1 神经网络参数变换可视化及卷积的基本概念
      • 3.1.1 神经网络的可视化
      • 3.1.2 参数变换
        • 一个简单的参数变换:权重共享
        • 超网络
        • 序列数据中的主题(motif)检测
        • 图像中的图案检测
      • 3.1.3 离散卷积
        • 卷积
        • 互相关(cross-correlation)
        • 高维卷积
        • 在深度卷积神经网络(DCNN)中,卷积操作中可用的一般变化
      • 3.1.4 深度卷积神经网络 (DCNNs)
      • 3.1.5 来自生物学的灵感
        • Hubel 和Weisel的贡献 (1962)
        • Fukushima的贡献(1982)
    • 3.2 卷积网络的演变,架构,实现细节和优势。
      • 3.2.1 原始 CNN 和向现代 CNN 的演变
        • 小数据集上的原始卷积神经网络
        • 贝尔实验室:第一个“真正的”卷积网络
        • 有汇聚层的卷积网络架构
        • 位移等变性
        • 通用架构分解
      • 3.2.2 LeNet5 和数字识别
        • 在 PyTorch 中实现 LeNet5
      • 3.2.3 CNN的优势
        • 示例:MNIST
      • 3.2.4 特征捆绑问题
        • 什么是特征捆绑问题?
        • 如何解决?
        • 示例:动态输入长度
      • 3.2.5 CNN 的优势
    • 3.3 神经信号的性质
      • 3.3.1 神经信号的性质
      • 3.3.2 探索自然信号的特性以建立不变性和同变性
        • 区域性 ⇒ \Rightarrow 离散型
        • 固定性 ⇒ \Rightarrow 参数共享
        • 填充
        • 标准的面向空间数据CNN
        • 汇聚

Week 3

3.1 神经网络参数变换可视化及卷积的基本概念

3.1.1 神经网络的可视化

在这一节,我们将展示神经网络的可视化以及线性变换和ReLU操作的效果

纽约大学深度学习PyTorch课程笔记(自用)Week3_第1张图片

图1是一个神经网络的可视化表示。一般来说,神经网络的输入位于图的底部或者左侧,而输出位于图的顶部或者右侧。在图1中,粉色的神经元是输入,蓝色的神经元是输出。在这个网络中,我们有4个隐藏层,这意味着整个网络总共有6层(4个隐藏层 + 1个输入层+1个输出层)。我们使用 2 × 2 2\times2 2×2矩阵作为权重矩阵 W W W。这是因为我们希望将输入平面变换为另一个平面。而线性变换则包括切变、旋转、反射和缩放。

纽约大学深度学习PyTorch课程笔记(自用)Week3_第2张图片

每层的变换类似于将我们的平面折叠进如图2所示的一些特定区域。在实验中我们发现,如果每个隐藏层仅仅有两个神经元,则优化过程会变长;而如果在隐藏层中有更多神经元,则优化过程会变得容易。那么问题来了:为何较少的神经元数量会让训练变得困难?我们将在可视化 ReLU \texttt{ReLU} ReLU之后回答这个问题。

纽约大学深度学习PyTorch课程笔记(自用)Week3_第3张图片

当我们分离每个隐藏层,我们会发现每一层都执行了线性变换中的某些步骤,然后再执行可将负值转化为零的ReLU操作。在图3(a)(b)中,我们可以观察到ReLU操作的可视化效果。ReLU操作为我们执行了非线性变换。经过一些变换之后,我们最终将得到如图4所示的线性可分的数据。
纽约大学深度学习PyTorch课程笔记(自用)Week3_第4张图片

那么现在我们终于知道了两个神经元的隐藏层难以训练的原因。在我们的6层网络中,每个隐藏层都具有一个bias。因此如果其中一个bias将数据点移出右上象限,那么ReLU操作将使这些点变为零。之后,无论后续的层如何变换,那么该值将一直保持零。为了让神经网络更容易训练,我们可以通过在隐藏层中添加更多的神经元让网络变宽,也可以通过添加更多的隐藏层,亦或者使用两个方法的组合。在剩下的学期中,我们将深入探索网络的最佳架构是什么这个主题,请保持关注。

3.1.2 参数变换

一般的参数变换意味着我们的参数向量 w w w是一个函数的输出。通过这个变换,我们可以将原始参数空间映射到另一个空间。在图5中, w w w是含参数 u u u H H H的输出。 G ( x , w ) G(x,w) G(x,w)是一个网络,而 C ( y , y ˉ ) C(y,\bar y) C(y,yˉ)则是代价函数。反向传播公式也做了如下改变:

u ← u − η ∂ H ∂ u ⊤ ∂ C ∂ w ⊤ u \leftarrow u - \eta\frac{\partial H}{\partial u}^\top\frac{\partial C}{\partial w}^\top uuηuHwC

[ N u × 1 ] = [ N u × 1 ] − η [ N u × N w ] × [ N w × 1 ] , [N_u \times 1] = [N_u \times 1]-\eta[N_u \times N_w]\times[N_w \times 1], [Nu×1]=[Nu×1]η[Nu×Nw]×[Nw×1],

w ← w − η ∂ H ∂ u ∂ H ∂ u ⊤ ∂ C ∂ w ⊤ w \leftarrow w - \eta\frac{\partial H}{\partial u}\frac{\partial H}{\partial u}^\top\frac{\partial C}{\partial w}^\top wwηuHuHwC
这些公式以矩阵形式应用。注意,右边的项的维度需要保持协调。 u , w , ∂ H ∂ u ⊤ u,w,\frac{\partial H}{\partial u}^\top u,w,uH, ∂ C ∂ w ⊤ \frac{\partial C}{\partial w}^\top wC 的维度分别是 [ N u × 1 ] , [ N w × 1 ] , [ N u × N w ] , [ N w × 1 ] [N_u \times 1],[N_w \times 1],[N_u \times N_w],[N_w \times 1] [Nu×1],[Nw×1],[Nu×Nw],[Nw×1]。原本 ∂ H ∂ u \frac{\partial H}{\partial u} uH的维度应该是 [ N w × N u ] ( 即 ∂ w ∂ u ) [N_w \times N_u](即\frac{\partial w}{\partial u}) [Nw×Nu](uw),转置后变成 [ N u × N w ] [N_u \times N_w] [Nu×Nw] ∂ C ∂ w \frac{\partial C}{\partial w} wC也同理。因此反向传播公式的维度是协调一致的。

纽约大学深度学习PyTorch课程笔记(自用)Week3_第5张图片


一个简单的参数变换:权重共享

权重共享变换意味着 H ( u ) H(u) H(u)只是将 u u u的一个分量复制为 w w w中的多个分量。 H ( u ) H(u) H(u)就像一个Y形分支,将 u 1 u_1 u1 复制到 w 1 , w 2 w_1 , w_2 w1,w2 。我们可以将其表达为,

w 1 = w 2 = u 1 , w 3 = w 4 = u 2 w_1 = w_2 = u_1, w_3 = w_4 = u_2 w1=w2=u1,w3=w4=u2

我们强制共享参数保持相等,因此关于共享参数的梯度将在反向传播中被求和。举个例子,代价函数 C ( y , y ˉ ) C(y, \bar y) C(y,yˉ)关于 u 1 u_1 u1的梯度是代价函数 C ( y , y ˉ ) C(y, \bar y) C(y,yˉ))关于 w 1 w_1 w1 的梯度和代价函数 C ( y , y ˉ ) C(y, \bar y) C(y,yˉ)关于 w 2 w_2 w2的梯度之和。
纽约大学深度学习PyTorch课程笔记(自用)Week3_第6张图片


超网络

超网络是指网络的其中一个网络权重是另一个网络的输出。图6显示了一个“超网络”的框架。其中,函数 H H H作为一个网络具有参数向量 u u u和输入 x x x。因此 G ( x , w ) G(x,w) G(x,w)的权重是通过网络 H ( x , u ) H(x,u) H(x,u)动态配置的。这个想法虽然古老,但即使在现在也非常有效。

纽约大学深度学习PyTorch课程笔记(自用)Week3_第7张图片


序列数据中的主题(motif)检测

权重共享变换可被用于主题检测。主题检测表示在序列数据中找出某些主题,比如在语音或者文本数据中找出关键词。如图7所示,一种解决方案是在数据上使用滑动窗口,即通过移动权重共享函数来检测特定的主题(即语言信号中的一组特定声音),然后将输出(即评分)传给最大值函数。

纽约大学深度学习PyTorch课程笔记(自用)Week3_第8张图片

在这个例子中,我们有5个这样的函数。这个方案的结果就是,我们对5个梯度求和并进行反向传播计算。我们不想要这些梯度隐式累加,因此我们需要使用PyTorch中的zero_grad()来初始化梯度


图像中的图案检测

另一个有用的场景是图像中的图案检测。我们经常通过在图片上刷动我们的“检测模板”进行形状检测,而这并不依赖于形状的位置和形变。一个简单的例子如图8所示,即对字母”C”和”D”进行区分。”C”与”D”的区别在于”C”拥有两个端点,而”D”则有两个拐角。因此我们可以基于此设计“端点模板”和“拐角模板”。如果形状与模板相似,则会有阈值输出。然后我们可以通过对这些输出求和以区分字母。在图8中,该网络检测到两个端点和0个拐角,因此答案“C”被激活。

纽约大学深度学习PyTorch课程笔记(自用)Week3_第9张图片

这里同样重要的是,我们的**“模板匹配”应该是平移不变的 - 即当我们对输入进行移位,输出或者说被检测到的字母不应该改变**。这在权重共享变换中被完美解决。如图9所示,当我们改变“D”的位置,我们依然可以检测到拐角图案,即使它们已经被移位。当我们对检出的图案进行求和,“D”的检测将被激活。

纽约大学深度学习PyTorch课程笔记(自用)Week3_第10张图片

使用局域检测器,然后对所有检测进行求和来检测图像中的字母,这是一种我们已经使用了多年的手工规则方法。而这就带来一个问题:我们如何能够自动设计这些“检测模板”呢?我们能够使用神经网络来学习这些“检测模板”吗?接下来我们将会介绍卷积,即我们用“检测模板”来匹配图片的操作。

3.1.3 离散卷积


卷积

1维情况下,输入 x x x w w w之间卷积的精确数学定义是:

y i = ∑ j w j x i − j y_i = \sum_j w_j x_{i-j} yi=jwjxij

也就是说, i i i个输出翻转的 w w w(reversed w) 和 x x x上同样大小的滑窗之间的点积。为了计算完整的输出,我们从起始位置运行滑窗,每次移动该滑窗一个单元的位置,一直重复,直到滑遍 x x x


互相关(cross-correlation)

实际上,在PyTorch这样的深度学习框架中使用的卷积定义会有一点点不一样。在深度学习中,卷积中的过滤器不经过反转。严格来说,这是互相关。我们本质上是执行逐元素乘法和加法。但在深度学习中,直接将其称之为卷积更加方便。这没什么问题,因为过滤器的权重是在训练阶段学习到的

PyTorch中的卷积实现上, w w w并没有进行翻转:

y i = ∑ j w j x i + j y_i = \sum_j w_j x_{i+j} yi=jwjxi+j

数学家称这个公式为“互相关”。这两个形式在这里只是约定不同而已。实际上,如果我们前向或者反向读取内存中的权重的时候,互相关和卷积是可以互换的。

但有的时候,比如当我们在数学文献中想要利用卷积/互相关的某些数学性质的时候,知道这个区别则是非常重要的。

纽约大学深度学习PyTorch课程笔记(自用)Week3_第11张图片


高维卷积

对于像图像这样的二维输入,我们可以使用卷积的二维版本:

y i j = ∑ k l w k l x i + k , j + l y_{ij} = \sum_{kl} w_{kl} x_{i+k, j+l} yij=klwklxi+k,j+l

这个定义可以从二维,类似地扩展到三维、四维。这里, w w w被称为卷积核(convolution kernel)


在深度卷积神经网络(DCNN)中,卷积操作中可用的一般变化

  1. 步幅: 前文提到,在 x x x中的滑窗每次移动都是一个单位,但是其实我们也可以增大步长(比如每次两个、三个单位)。举例来说:假设输入 x x x为1维,大小为100且 w w w的尺寸为5。那么使用1或者2为步幅的输出尺寸如下表所示:

纽约大学深度学习PyTorch课程笔记(自用)Week3_第12张图片

  1. 填充: 在设计深度神经网络架构的时候,我们经常希望卷积的输出与输入保持相同尺寸。而这可以通过对输入填充一些零单元(通常情况下)完成,一般是两边都进行填充。填充一般是为了方便。它有时会影响一些性能,还会产生一些有趣的边界效应,但即便如此,当非线性变换为ReLU时,其实零单元填充是合理的。

3.1.4 深度卷积神经网络 (DCNNs)

正如前文所述,深度神经网络是由线性操作和逐点非线性层重复交替组成的。在卷积神经网络中,线性操作就是上面描述的卷积操作。需要注意的是,这里还有一种第三类层称之为汇聚层(pooling layer)(这是可选的层)。

之所以去堆叠这些层的原因是我们想要构建数据的一个层次化表征。 卷积网络不是只局限于处理图像,它们同样被成功地应用于语音和语言。技术上来看,它们适用于任意数组形式的数据类型。当然,这些数组需要满足一些特定的性质。

那么为什么我们需要获取世界的层次化表征呢?因为我们生活的世界是组合的。这个观点在前文中有提及。这样的层次化的特性可以从很多事实中观察到。比如,局域像素汇集形成如有向边这样的简单样式,而这些边又进一步汇集形成更加抽象的图样。这样的层次组合不断进行,直到我们在现实中看到的部分物体、整个物体最终形成。

纽约大学深度学习PyTorch课程笔记(自用)Week3_第13张图片
这个在自然世界里观察到的组合的层次化特性,不只是因为我们视觉感知到如此,这在物理层面上也是事实。在物理学描述的最低层次,我们拥有基本粒子,这些基本粒子形成原子,原子形成分子,这个过程持续,最终构成各种材料,物体的局部,直到各种物理世界中的物体。

世界的这个组合的特性可能可以回答爱因斯坦关于人类如何理解他们生存的世界之经典感叹。

这个宇宙最不能被理解之处是它居然可以被理解。

幸亏这样的组合性质人们才能够理解世界,这个事实对Yann来说似乎仍然像一个共谋之事。如果世界没有组合性,那么也许理解我们这个世界将会需要更多的魔法。这里,我们引用伟大的数学家Stuart Geman的一句话:

要不这个世界就是组合而成的,要不则存在上帝。

3.1.5 来自生物学的灵感

那么为何深度学习应该根植于我们的世界是可理解的并且有着组合化的性质这样的想法呢?Simon Thorpe所做的研究让我们对此有了更多的理解。他证明我们识别日常物体的方式是非常迅速的。他做了这样的实验,即每100毫秒快速出示一组图像,然后让被试识别这些他们能够识别的图片。这表明人类检测物体通常需要100毫秒。此外,下图描述了在大脑不同的部分中,神经元从一个区域传播到下一个区域所需的时间:

纽约大学深度学习PyTorch课程笔记(自用)Week3_第14张图片
从图中我们可以看到,信号从视网膜传递到LGN(用于对比增强、门控制,等等),然后传往V1初级视皮层,再到V2,V4,然后是下颞叶皮质(PIT),类别在大脑的这个部分被定义。开放性大脑手术中的观察表明, 如果你为人类放映一部影片,PIT中的神经元只有在检测到某些特定的影像 – 比如Jennifer Aniston或者某人的祖母的时候才会被激活 – 其它的时候则不会。神经元活动不受像位置、尺寸、光照、您祖母的朝向、她的穿着等等的影响。 此外,人类能够在极短暂的反应时间内归类物体,这表明即使没有在复杂的循环计算上花费时间,这也是可能做到的。当然,这只是一个单一的前馈过程。 这些洞见启发我们开发出完全前馈的神经网络架构,而这样的架构仍然可以以一种不受输入的不相关变换影响的方式解决识别问题。

关于人类大脑的更进一步的洞见来自于Gallant 和Van Essen,他们关于人类大脑的模型描述了两个不同的通路:

纽约大学深度学习PyTorch课程笔记(自用)Week3_第15张图片
右侧表示腹侧通路,它会告知你的所见;而左边代表背侧通路,它可以识别位置、几何和运动。他们在人类(还有灵长目动物)的视觉皮质(当然还有它们之间的相互作用)中看上去相当不同。

Hubel 和Weisel的贡献 (1962)

纽约大学深度学习PyTorch课程笔记(自用)Week3_第16张图片

Hubel 和 Weisel 在实验中使用电极来测量猫脑部的神经活动针对视觉刺激的响应。他们发现在V1区域的神经元只对视野的某些区域(称为“感受野”)敏感,并且在那片区域可检测有向边。比如,如果你给猫看一个垂直的线条,然后开始转动线条,在转到某一个角度的时候,神经元开始激活。类似地,随着线条离开那个角度,神经元的激活也随之消失。对于这一类选择性激活神经元,由于它们能够检测局域特征,Hubel 和 Weisel 称之为“简单细胞”。 此外,他们还发现如果你将线条远离感受野,那个特定的神经元就不再激活,但另一个神经元将会被激活。对于视野中的所有区域,都有针对性的局域检测单元,因此,人类大脑处理视觉信息的过程可以看做是一系列的“卷积”。 另一类神经元,也就是他们称之为“复杂细胞”, 能够聚合一定区域里的多个简单细胞的输出。我们可以将这些操作看做使用类似求最大值、求和、平方和这样的函数,或者任何不依赖于顺序的函数去计算激活的聚合。不论那些刺激位于区域的哪个部分,这些复杂细胞都可以检测一个区域中的边与方向。换句话说,它们对于输入位置的微小变化是平移不变的。

Fukushima的贡献(1982)

纽约大学深度学习PyTorch课程笔记(自用)Week3_第17张图片

Fukushima第一个利用计算机模型,使用手写数字数据集将多层简单细胞和复杂细胞的想法进行实现。其中的一些特征检测器是手工提取或者学习到的,虽然这里的学习用到的是非监督的聚类算法,而且由于反向传播还未被使用,这里是针对每一层分别训练。 Yann LeCun在几年后(1989,1998)对此进行研究并实现了同样的架构。但是这次,他是利用反向传播在监督学习的框架下进行训练。这通常被认为是现代的卷积神经网络的起源。(MIT的Riesenhuber在1999年也重新发现了这套架构,虽然他并没有使用反向传播。)

3.2 卷积网络的演变,架构,实现细节和优势。

3.2.1 原始 CNN 和向现代 CNN 的演变


小数据集上的原始卷积神经网络

受福岛视觉皮层模型的启发,Yann LeCun 教授于 1988-1989 年在多伦多大学使用简单/复杂的细胞层次结构并结合监督训练和反向传播,开发了第一个CNN。实验使用320个用鼠标写成数字的小型数据集比较了以下架构的性能:

  1. 单FC(全连接)层
  2. 两层FC
  3. 没有共享权重的本地连接层
  4. 带有共享权重和本地连接的受限网络
  5. 带有共享权重和本地连接的受限网络的改版(更多功能图)
    纽约大学深度学习PyTorch课程笔记(自用)Week3_第18张图片

性能最好的架构(具有共享权重的受限网络)具有最强的泛化能力,成为现代 CNN 的基础。 然而单独的 FC 层则有过拟合的倾向。


贝尔实验室:第一个“真正的”卷积网络

转到贝尔实验室后,LeCunn 的研究转向使用美国邮政服务的手写邮政编码来训练更大的 CNN:

  • 256 (16×16) 输入层
  • 12 5 × \times × 5 步幅为 2 的卷积核 (每步前进 2 个像素): 下一层分辨率下降
  • 没有单独的汇聚层
    纽约大学深度学习PyTorch课程笔记(自用)Week3_第19张图片

有汇聚层的卷积网络架构

第二年的改进是引入了单独的汇聚层,暨通过对输入求均值,添加偏差并传递给非线性函数(双曲正切函数)来完成。2 × \times × 2 汇聚的步幅为2,因此分辨率降低一半。

纽约大学深度学习PyTorch课程笔记(自用)Week3_第20张图片

单个卷积层的示例如下:

  1. 输入大小为 32×32
  2. 输入图像以 1 的步幅输入 5×5 卷积层内核,输出 28((32-(5-1))/1=28)×28 的特征图。
  3. 将特征图输入非线性函数:尺寸 28×28
  4. 再以 2 的步幅输入 2×2 汇聚层,尺寸 14×14
  5. 对 4 个内核重复 1-4 步

第一层简单卷积/汇聚层的组合通常会检测简单特征,例如定向边缘检测。 在第一个卷积/汇聚层之后,目标是检测来自先前层的特征组合。为此,第 2-4 步会在上一层特征图上由多个内核重复进行,并求和成为新的特征图。

  1. 将新的 5×5 内核扫描所有之前的特征图,并对其结果求和。(注意:在 LeCun 教授于1989年的实验中,连接未完全出于计算目的。现在的设置通常会强制使用完全连接):尺寸 10×10
  2. 将卷积的输出传递给非线性函数:尺寸 10×10
  3. 对 16 个内核重复前两步。
  4. 将结果传递到 2×2、步幅为 2 的汇聚层:每个特征图的尺寸 5×5

最后是为了输出设置的卷积层 (虽然看起来像全连接层, 但确实是卷积层)。

  1. 最后的卷积层以 5×5 内核扫描所有之前的特征图,并对其结果求和:尺寸 1×1
  2. (将卷积的输出)传递给非线性函数:尺寸 1×1
  3. 为一个类别生成单独输出。
  4. 对所有10个类别(同时)重复先前步骤。

关于卷积如何改变下一层特征图的尺寸,请参见Andrej Karpathy网站上的动画。 全文见这里。

斯坦福CS231n的Convolutional Neural Networks (CNNs / ConvNets)讲的十分详细!!!
纽约大学深度学习PyTorch课程笔记(自用)Week3_第21张图片


位移等变性

纽约大学深度学习PyTorch课程笔记(自用)Week3_第22张图片

图2 位移等变性

如幻灯片上的动画所示(这是另一个示例),对输入图像的变换会对特征图产生相同的变换。 但是,特征图中的更改是通过卷积/汇聚操作缩放的。例如步幅为 2 的 2×2 汇聚将输入层的 1 像素偏移在其特征图上减少到 0.5 像素。然后将空间分辨率交换为更多的特征类型,即使表示形式更加抽象,并且对位移和变形的敏感性降低。


通用架构分解

通用 CNN 架构可分为几种基本的层:

  • 归一化层 :调整白化(可选):

    • 减轻:例如平均去除、高通滤波
    • 分离:局部对比归一化,方差归一化
  • 滤波器层 :增加维度 ;过完备基向量投影 ;边缘检测

  • 非线性层:稀疏

    • 典型的整流线性单位(ReLU): ReLU ( x ) = max ⁡ ( x , 0 ) \text{ReLU}(x) = \max(x, 0) ReLU(x)=max(x,0)
  • 汇聚层 :特征图汇总

    • 最大值汇聚*(maxpooling): MAX = Max i ( X i ) \text{MAX}= \text{Max}_i(X_i) MAX=Maxi(Xi)

    • LP范数汇聚: L p = ( ∑ i = 1 n ∥ X i ∥ p ) 1 p \text{L}p= \left(\sum_{i=1}^n \|X_i\|^p \right)^{\frac{1}{p}} Lp=(i=1nXip)p1

    • 对数概率汇聚: Prob = 1 b ( ∑ i = 1 n e b X i ) \text{Prob}= \frac{1}{b} \left(\sum_{i=1}^n e^{b X_i} \right) Prob=b1(i=1nebXi)

    纽约大学深度学习PyTorch课程笔记(自用)Week3_第23张图片

3.2.2 LeNet5 和数字识别


在 PyTorch 中实现 LeNet5

LeNet5 由以下几层组成(第 1 层是最顶层):

  1. Log-softmax
  2. 全连接层, 尺寸:500×10
  3. ReLu
  4. 全连接层, 尺寸:(4×4×50)×500
  5. 最大值汇聚层,尺寸 2×2, 步幅 2
  6. ReLu
  7. 卷积层,20个输出通道,内核 5×5,步幅 1
  8. 最大值汇聚层,尺寸 2×2, 步幅 2
  9. ReLu
  10. 卷积层,20个输出通道,内核 5×5,步幅 1

输入层是一个 32×32 灰度图像(1 个输入通道)。

纽约大学深度学习PyTorch课程笔记(自用)Week3_第24张图片

LeNet5可以使用以下代码在PyTorch中实现:

class LeNet5(nn.Module):
    def __init__(self):
        super().__init__()
        self.conv1 = nn.Conv2d(1, 20, 5, 1)
        self.conv2 = nn.Conv2d(20, 20, 5, 1)
        self.fc1 = nn.Linear(4*4*50, 500)
        self.fc2 = nn.Linear(500, 10)

    def forward(self, x):
        x = F.relu(self.conv1(x))
        x = F.max_pool2d(x, 2, 2)
        x = F.relu(self.conv2(x))
        x = F.max_pool2d(x, 2, 2)
        x = x.view(-1, 4*4*50)
        x = F.relu(self.fc1)
        x = self.fc2(x)
    return F.logsoftmax(x, dim=1)

尽管 fc1 和 fc2 是全连接层,但可视为卷积层,其内核覆盖整个输入。全连接层用于提高效率

nn.Sequential 可以实现相同的功能,但已经过时。
纽约大学深度学习PyTorch课程笔记(自用)Week3_第25张图片

3.2.3 CNN的优势

在全卷积网络中,无需指定输入的大小。但更改输入的大小也会更改输出的大小

在潦草手写识别系统中,我们不必将输入图像分成多个部分。我们可以将 CNN 应用于整个图像:内核将覆盖整个图像的所有位置,并记录相同的输出无论特征位于何处。 在整个图像上应用 CNN 比在多个位置分别应用 CNN 需要的计算量小得多。无需事先分割减少了工作量,因为分割图像的任务类似于识别图像。


示例:MNIST

LeNet5在大小 32×32 的 MNIST 图像集上进行训练,以对图像中心的各个数字进行分类,并通过平移、缩放,侧面数字来进行数据扩增。它也进行第 11 类的训练,即不代表任何上述类别。 此类的图像通过空白图像或在侧面而非中心放置数字来生成。

下图中的八个数字就是将输出问题放到32 × 32输入窗口的8个不同位置,输入每次偏移4个像素;输出的数字就代表识别到的数字

纽约大学深度学习PyTorch课程笔记(自用)Week3_第26张图片

图 3 滑动窗口卷积网络

上图显示了 32×32 图像训练的 LeNet5 网络可以应用于 32×64 图像,以在多个位置识别数字。

3.2.4 特征捆绑问题


什么是特征捆绑问题?

视觉神经科学家和计算机视觉专家有如何将对象定义为对象的问题。对象是功能的集合,但是如何绑定所有功能以形成该对象呢?


如何解决?

我们可以使用非常简单的 CNN 来解决此特征绑定问题:只要我们有足够的非线性度和数据来训练 CNN,我们只需使用两层带有汇聚层的的卷积层加上另外两层全连接层,而无需任何特定机制。
纽约大学深度学习PyTorch课程笔记(自用)Week3_第27张图片

图 4 卷积网络表现特征捆绑

上面的动画展示了 CNN 通过移动单个笔画来识别不同数字的能力,展示了其解决特征绑定问题的能力,即以层次、合成的方式识别特征的能力。

示例:动态输入长度

我们可以构建一个具有2个卷积层(步幅为1)和2个汇聚层(步幅为2)的 CNN,使总步幅为4。因此,如果要获得新的输出,我们需要将输入窗口移动 4。 我们在下图(绿色单元)可以看到更明确的的表示。 首先,我们有一个尺寸为 10 的输入,并执行尺寸为 3 的卷积以获得 8 个单元。 之后,我们执行大小为 2 的汇聚以得到 4 个单元。 同样,我们重复卷积并再次汇聚,最终得到 1 个输出。

纽约大学深度学习PyTorch课程笔记(自用)Week3_第28张图片

假设我们在输入层添加 4 个单元(上面的粉色单元),这样我们在第一个卷积层之后可以再获得 4 个单元,在第一个汇聚层之后再获得 2 个单元,在第二个卷积层之后又获得 2 个单元以及多 1 个输出。 因此,新生成输出的窗口大小为 4(2步距 ×2)<!-我们从输入到输出的总体子采样为4(2x2)- >。
此外,这证明了以下事实:如果我们增加输入的尺寸,我们将增加每层的尺寸,从而证明 CNN 能够处理动态长度输入。

3.2.5 CNN 的优势

CNN 非常适合以多维数组形式出现的信号。这些信号具有三个主要特征。

  1. 局部性:第一个是各个值之间存在很强的局部相关性。如果我们观察天然图像上两个临近像素,则这些像素很可能具有相同的颜色。随着两个像素之间的距离越来越远,它们之间的相似性将降低。本地相关性可以帮助我们检测局部特征,即CNN 的作用。如果我们向 CNN 提供置换后的像素,则它在识别输入图像时效果不佳,而 FC 不会受到影响。局部相关性证明了局部连接的合理性。
  2. 平稳性:第二个是特征作为基础可以出现在图像上任何地方,证明了权值共享和汇聚的合理性。此外,统计信号是均匀分布的,这意味着我们需要对输入图像上的每个位置重复进行特征检测。
  3. 结构性:第三个是自然图像有结构,暨特征以层级方式构成图像。这证明了使用多层神经元的合理性,这也与 Hubel 和 Weisel 对简单和复杂细胞的研究紧密相关。

此外,人们在视频、图像、文本和语音识别中大量使用了 CNN。
纽约大学深度学习PyTorch课程笔记(自用)Week3_第29张图片

3.3 神经信号的性质

3.3.1 神经信号的性质

所有的信号都可以被看作向量。例如音频信号是一个一维信号 x = [ x 1 , x 2 , … , x T ] \boldsymbol{x} = [x_1, x_2,…,x_T] x=[x1,x2,,xT] 其中每个数值 x t x_t xt代表了在时间点 t t t上波形的振幅。为了理解某人在说什么,你的耳蜗首先会将空气压力的变化转化为信号,然后你的大脑使用一个语言模型将这个信号转化成一种语言也就是说大脑需要从信号中挑选最有可能的表达。对于音乐而言这种信号是环绕立体的,也就是拥有两个或更多的通道以此让你产生声音从不同方向传输而来的感觉。即使它拥有两个通道,它还是一个一维信号,因为信号仅随着时间变化。

一张图片是一个二维信号因为信息是空间性地被描绘的。需要注意的是,每个点自身都是一个向量。这意味着如果我们在图片中有 d d d个通道,图片中的每一个点都是一个 d d d维向量。对一张RGB形式的彩色图片,这意味着 d = 3 d = 3 d=3。对任何一个点 x i , j x_{i,j} xi,j,向量的数值依次对应了红,绿和蓝的强度。

我们可以用上面的方法来表达语言。每一个词都对应一个one-hot向量,对应该单词在词典中的位置为1其余位置均为0。这意味着每个词都是一个词典大小的向量。

纽约大学深度学习PyTorch课程笔记(自用)Week3_第30张图片
神经信号拥有以下一些性质:

  1. 固定性(stationarity): 某些序列会在信号中重复出现。在音频信号中,我们观察到同样种类的模式在当前区域中反复出现。在图像中,这意味着我们可以预见相似的图案在不同维度上重复。
  2. 区域性(locality):相互靠近的点相比远离的点更加相关。对一维信号,这意味着如果我们观察到了一个波峰在点 t i t_i ti ,我们可以预期在该点周围的一个极小窗口中的点会拥有类似的值,而对于一个远离的点 t j t_j tj两者的值关系不大。更正式的表述是,如果一个信号与其翻转版本完美重合,那么他们的卷积会存在一个波峰。两个一维信号的卷积(交叉相关)无外乎是二者的点乘,即描述二者如何相似或相近。所以信息是被保存在信号中特定的部分中。对于图像,这意味着两个点之间的相关性随着其距离的远离而降低。如果像素 x 0 , 0 x_{0,0} x0,0是蓝色的,那么下一个像素 ( x 1 , 0 , x 0 , 1 ) (x_{1,0},x_{0,1}) (x1,0,x0,1)为蓝色的概率会比较高,而如果你看向图片的另一端 ( x − 1 , − 1 ) (x_{-1,-1}) (x1,1),这个像素的值就与 x 0 , 0 x_{0,0} x0,0​的值无关。
  3. 组合性(compositional): 小的部件组成大的部件,这个过程往复循环就形成了自然界中的万物。例如,字符可以形成字符串,而字符串形成了单词,单词的组合形成了句子。众多的句子形成了文章。这种组合性让世界是可解释的。

如果我们的数据展现了如上三种特性,我们就可以用稀疏的,参数共享的并由堆积层形成的网络来探索它。

注意stationarity意味着一遍又一遍地观察相同的模式,而locality意味着一个模式是区域性的,即事情只在附近有关

3.3.2 探索自然信号的特性以建立不变性和同变性


区域性 ⇒ \Rightarrow 离散型

图1展现了一个5层全连接网络。每一个箭头代表了一个被输入乘上的权重。如我们所见,这个网络非常消耗算力。
纽约大学深度学习PyTorch课程笔记(自用)Week3_第31张图片

图1:全连接网络

如果我们的数据展现了区域性,每一个神经元只需要与附近的一些上一层的神经元相连。所以,如图二所示某一些连接是可以被去除的。图二a代表了一个全连接网络。利用数据的区域性,我们在图二b中丢弃一些较远的神经元之间的连接。尽管图二中的隐藏层中的绿色神经元没有覆盖整个输入,但是整个架构有能力解释所有的输入神经元。感受野(receptive field,RF)的大小由前一层的神经元数目决定,也就是说每个特定层中的神经元都被考虑在内了。所以输出层对于隐藏层的感受野为3,隐藏层对于输入层的感受野是3,但是输出层对于输入层的感受野是5.

纽约大学深度学习PyTorch课程笔记(自用)Week3_第32张图片


固定性 ⇒ \Rightarrow 参数共享

如果我们的数据展现了固定性,我们可以在网络结构中多次使用参数中的一个小子集。例如在我们的稀疏网络图三a,我们能使用黄、橙、红三个共享参数的集合,那样参数的数目就会从9降到3!新的网络甚至可能会表现得更好,因为我们有更多数据来训练参数。具有区域性和固定性的权重参数就被称为卷积核(convolution kernel/filter)

纽约大学深度学习PyTorch课程笔记(自用)Week3_第33张图片
使用稀疏性和参数共享有如下优势:

  • 参数共享
    • 更快得收敛
    • 更好的泛化性
    • 不被输入大小限制
    • 卷积核独立 ⇒ \Rightarrow 高并行度
  • 连接稀疏
    • 减少计算量

图四显示了一个在一维数据上的核的例子。其中核的尺寸为: 2(核的个数) * 7(前一层的厚度) * 3(唯一的连接/权重的数目)。在这里一维数据使用了三维的kernel

对于核尺寸的选择是经验性的。3 * 3大小的卷积似乎是应用在空间数据上的最小尺寸。大小为1的卷积可以被用来得到一个能被应用到更大的输入图像上的最后一层。尺寸为偶数的核可能会降低数据质量,所以我们通常会选择奇数作为核的尺寸,通常为3或者5

纽约大学深度学习PyTorch课程笔记(自用)Week3_第34张图片


填充

填充通常会影响最终的结果,但是很方便进行编程。我们一般使用0值填充(zero-padding)即: padding size = (kernel size - 1)/2。

为什么使用padding?除了前面提到的在CONV之后保持空间尺寸不变的好处之外,这样做实际上还可以提高性能。如果CONV层不对输入进行零填充,只进行有效的卷积,那么在每次CONV之后,体积的大小会减少一小部分,而边界的信息会很快被 “洗掉”。


标准的面向空间数据CNN

一个标准的面向空间数据的CNN有如下性质:

  • 多种层
    • 卷积层
    • 非线性层 (ReLU and Leaky)
    • 汇聚
    • 批量归一化
  • 残差跨层的连接(residual bypass connection)

批量归一化和残差跨层连接对网络训练是很有帮助的。 如果太多层堆叠,信号的一部分信息会在这个过程中丢失。所以通过残差绕过在层之间的额外连接能够保证从底部到顶部的路径,也就形成一个梯度从顶到底的传播路径。

在图五中,尽管输入图像主要包含横跨两个维度的空间信息(除了典型的信息,即每个像素包含的颜色信息),输出层却是比较厚的。在网络中存在空间信息和典型信息直接的权衡使得表征变得稠密。所以当我们沿着层级结构向上的时候,我们会得到更加稠密的表征同时会市区空间信息。
纽约大学深度学习PyTorch课程笔记(自用)Week3_第35张图片


汇聚

纽约大学深度学习PyTorch课程笔记(自用)Week3_第36张图片

如图六所示,一个特定的算子, L p L_p Lp -norm,被应用在不同的区域上。这个算子对每个区域只给出一个值(在我们的例子中,每四个像素产生一个值)。我们依次在每个区域数据上按照步进移动循环这个操作。如果我们有一个 m ∗ n m * n mn大小 c c c个通道的数据,我们最后会获得 m 2 ∗ n 2 \frac{m}{2} * \frac{n}{2} 2m2n 大小 c c c个通道的数据(见图七)。汇聚不是一个参数化的操作;尽管如此,我们能选择不同的汇合的种类,例如最大值汇合,均值汇合等等。汇合的主要目的是减少数据量这样我们就可以在合理的时间中完成计算。

纽约大学深度学习PyTorch课程笔记(自用)Week3_第37张图片

你可能感兴趣的:(深度学习,pytorch,机器学习,神经网络,cnn)