动手学深度学习6.1 从全连接层到卷积-笔记&练习(PyTorch)

以下内容为结合李沐老师的课程和教材补充的学习笔记,以及对课后练习的一些思考,自留回顾,也供同学之人交流参考。

本节课程地址:从全连接到卷积_哔哩哔哩_bilibili

本节教材地址:6.1. 从全连接层到卷积 — 动手学深度学习 2.0.0 documentation (d2l.ai)

本节开源代码:...>d2l-zh>pytorch>chapter_multilayer-perceptrons>why-conv.ipynb


从全连接层到卷积

我们之前讨论的多层感知机十分适合处理表格数据,其中行对应样本,列对应特征。 对于表格数据,我们寻找的模式可能涉及特征之间的交互,但是我们不能预先假设任何与特征交互相关的先验结构。 此时,多层感知机可能是最好的选择,然而对于高维感知数据,这种缺少结构的网络可能会变得不实用。

例如,在之前猫狗分类的例子中:假设我们有一个足够充分的照片数据集,数据集中是拥有标注的照片,每张照片具有百万级像素,这意味着网络的每次输入都有一百万个维度。 即使将隐藏层维度降低到1000,这个全连接层也将有 106×103=109 个参数。 想要训练这个模型将不可实现,因为需要有大量的GPU、分布式优化训练的经验和超乎常人的耐心。

有些读者可能会反对这个观点,认为要求百万像素的分辨率可能不是必要的。 然而,即使分辨率减小为十万像素,使用1000个隐藏单元的隐藏层也可能不足以学习到良好的图像特征,在真实的系统中我们仍然需要数十亿个参数。 此外,拟合如此多的参数还需要收集大量的数据。 然而,如今人类和机器都能很好地区分猫和狗:这是因为图像中本就拥有丰富的结构,而这些结构可以被人类和机器学习模型使用。 卷积神经网络(convolutional neural networks,CNN)是机器学习利用自然图像中一些已知结构的创造性方法。

不变性

想象一下,假设我们想从一张图片中找到某个物体。 合理的假设是:无论哪种方法找到这个物体,都应该和物体的位置无关。 理想情况下,我们的系统应该能够利用常识:猪通常不在天上飞,飞机通常不在水里游泳。 但是,如果一只猪出现在图片顶部,我们还是应该认出它。 我们可以从儿童游戏”沃尔多在哪里”( 下图)中得到灵感: 在这个游戏中包含了许多充斥着活动的混乱场景,而沃尔多通常潜伏在一些不太可能的位置,读者的目标就是找出他。 尽管沃尔多的装扮很有特点,但是在眼花缭乱的场景中找到他也如大海捞针。 然而沃尔多的样子并不取决于他潜藏的地方,因此我们可以使用一个“沃尔多检测器”扫描图像。 该检测器将图像分割成多个区域,并为每个区域包含沃尔多的可能性打分。 卷积神经网络正是将空间不变性(spatial invariance)的这一概念系统化,从而基于这个模型使用较少的参数来学习有用的表示。

现在,我们将上述想法总结一下,从而帮助我们设计适合于计算机视觉的神经网络架构。

  1. 平移不变性(translation invariance):不管检测对象出现在图像中的哪个位置,神经网络的前面几层应该对相同的图像区域具有相似的反应,即为“平移不变性”。
  2. 局部性(locality):神经网络的前面几层应该只探索输入图像中的局部区域,而不过度在意图像中相隔较远区域的关系,这就是“局部性”原则。最终,可以聚合这些局部特征,以在整个图像级别进行预测。

让我们看看这些原则是如何转化为数学表示的。

多层感知机的限制

首先,多层感知机的输入是二维图像 \mathbf{X} ,其隐藏表示 \mathbf{H} 在数学上是一个矩阵,在代码中表示为二维张量。 其中 \mathbf{X} 和 \mathbf{H} 具有相同的形状。 为了方便理解,我们可以认为,无论是输入还是隐藏表示都拥有空间结构。

使用 [\mathbf{X}]_{i, j}  [\mathbf{H}]_{i, j} 分别表示输入图像和隐藏表示中位置 (i, j) 处的像素。 为了使每个隐藏神经元都能接收到每个输入像素的信息,我们将参数从权重矩阵(如同我们先前在多层感知机中所做的那样)替换为四阶权重张量 \mathsf{W} 。假设 \mathbf{U} 包含偏置参数,我们可以将全连接层形式化地表示为

\begin{aligned} \left[\mathbf{H}\right]_{i, j} &= [\mathbf{U}]_{i, j} + \sum_k \sum_l[\mathsf{W}]_{i, j, k, l} [\mathbf{X}]_{k, l}\\ &= [\mathbf{U}]_{i, j} + \sum_a \sum_b [\mathsf{V}]_{i, j, a, b} [\mathbf{X}]_{i+a, j+b}.\end{aligned}

其中,从 \mathsf{W} 到 \mathsf{V} 的转换只是形式上的转换,因为在这两个四阶张量的元素之间存在一一对应的关系。 我们只需重新索引下标 (k, l) ,使 k = i+a 、 l = j+b ,由此可得 [\mathsf{V}]_{i, j, a, b} = [\mathsf{W}]_{i, j, i+a, j+b} 。 索引 a 和 b 通过在正偏移和负偏移之间移动覆盖了整个图像。 对于隐藏表示中任意给定位置 (i, j) 处的像素值 [\mathbf{H}]_{i, j} ,可以通过在 x 中以 (i, j) 为中心对像素进行加权求和得到,加权使用的权重为 [\mathsf{V}]_{i, j, a, b} 。

平移不变性

现在引用上述的第一个原则:平移不变性。 这意味着检测对象在输入 𝑋 中的平移,应该仅导致隐藏表示 𝐻 中的平移。也就是说, \mathsf{V} 和 \mathbf{U} 实际上不依赖于 (i, j) 的值,即 [\mathsf{V}]_{i, j, a, b} = [\mathbf{V}]_{a, b} 。并且 \mathbf{U} 是一个常数,比如 u 。因此,我们可以简化 \mathbf{H} 定义为:

[\mathbf{H}]_{i, j} = u + \sum_a\sum_b [\mathbf{V}]_{a, b} [\mathbf{X}]_{i+a, j+b}.

这就是卷积(convolution)。我们是在使用系数 [\mathbf{V}]_{a, b} 对位置  (i, j) 附近的像素 (i+a, j+b) 进行加权得到 [\mathbf{H}]_{i, j} 。 注意, [\mathbf{V}]_{a, b} 的系数比 [\mathsf{V}]_{i, j, a, b} 少很多,因为前者不再依赖于图像中的位置。这就是显著的进步!

局部性

现在引用上述的第二个原则:局部性。如上所述,为了收集用来训练参数 [\mathbf{H}]_{i, j} 的相关信息,我们不应偏离到距 (i, j) 很远的地方。这意味着在 |a|> \Delta  |b| > \Delta 的范围之外,我们可以设置 [\mathbf{V}]{a, b} = 0 。因此,我们可以将 [\mathbf{H}]_{i, j} 重写为

[\mathbf{H}]_{i, j} = u + \sum_{a = -\Delta}^{\Delta} \sum_{b = -\Delta}^{\Delta} [\mathbf{V}]_{a, b} [\mathbf{X}]_{i+a, j+b}. (6.1.3)

简而言之, (6.1.3) 是一个卷积层(convolutional layer),而卷积神经网络是包含卷积层的一类特殊的神经网络。 在深度学习研究社区中, \mathbf{V} 被称为卷积核(convolution kernel)或者滤波器(filter),亦或简单地称之为该卷积层的权重,通常该权重是可学习的参数。 当图像处理的局部区域很小时,卷积神经网络与多层感知机的训练差异可能是巨大的:以前,多层感知机可能需要数十亿个参数来表示网络中的一层,而现在卷积神经网络通常只需要几百个参数,而且不需要改变输入或隐藏表示的维数。 参数大幅减少的代价是,我们的特征现在是平移不变的,并且当确定每个隐藏活性值时,每一层只包含局部的信息。 以上所有的权重学习都将依赖于归纳偏置。当这种偏置与现实相符时,我们就能得到样本有效的模型,并且这些模型能很好地泛化到未知数据中。 但如果这偏置与现实不符时,比如当图像不满足平移不变时,我们的模型可能难以拟合我们的训练数据。

卷积

在进一步讨论之前,我们先简要回顾一下为什么上面的操作被称为卷积。在数学中,两个函数(比如 f, g: \mathbb{R}^d \to \mathbb{R} )之间的“卷积”被定义为

(f * g)(\mathbf{x}) = \int f(\mathbf{z}) g(\mathbf{x}-\mathbf{z}) d\mathbf{z}. (6.1.4)

也就是说,卷积是当把一个函数“翻转”并移位 \mathbf{x} 时,测量 f 和 g 之间的重叠。 当为离散对象时,积分就变成求和。例如,对于由索引为 \mathbb{Z} 的、平方可和的、无限维向量集合中抽取的向量,我们得到以下定义:

(f * g)(i) = \sum_a f(a) g(i-a). (6.1.5)

对于二维张量,则为 f 的索引 (a, b) 和 g 的索引 (i-a, j-b) 上的对应加和:

(f * g)(i, j) = \sum_a\sum_b f(a, b) g(i-a, j-b). (6.1.6)

这看起来类似于 (6.1.3),但有一个主要区别:这里不是使用 (i+a, j+b) ,而是使用差值。然而,这种区别是表面的,因为我们总是可以匹配 (6.1.3)和 (6.1.6)之间的符号。我们在 (6.1.3)中的原始定义更正确地描述了交叉相关(cross-correlation),这个问题将在下一节中讨论。

“沃尔多在哪里”回顾

回到上面的“沃尔多在哪里”游戏,让我们看看它到底是什么样子。卷积层根据滤波器 𝑉 选取给定大小的窗口,并加权处理图片,如 下图 中所示。我们的目标是学习一个模型,以便探测出在“沃尔多”最可能出现的地方。

通道

然而这种方法有一个问题:我们忽略了图像一般包含三个通道/三种原色(红色、绿色和蓝色)。 实际上,图像不是二维张量,而是一个由高度、宽度和颜色组成的三维张量,比如包含 1024×1024×3 个像素。 前两个轴与像素的空间位置有关,而第三个轴可以看作每个像素的多维表示。 因此,我们将 \mathbf{X} 索引为 [\mathbf{X}]_{i, j, k} 。由此卷积相应地调整为 [\mathbf{V}]_{a,b,c} ,而不是 [\mathbf{V}]_{a,b} 。

此外,由于输入图像是三维的,我们的隐藏表示 𝐻 也最好采用三维张量。 换句话说,对于每一个空间位置,我们想要采用一组而不是一个隐藏表示。这样一组隐藏表示可以想象成一些互相堆叠的二维网格。 因此,我们可以把隐藏表示想象为一系列具有二维张量的通道(channel)。 这些通道有时也被称为特征映射(feature maps),因为每个通道都向后续层提供一组空间化的学习特征。 直观上可以想象在靠近输入的底层,一些通道专门识别边缘,而一些通道专门识别纹理。

为了支持输入 \mathbf{X} 和隐藏表示 \mathbf{H} 中的多个通道,我们可以在 \mathbf{V} 中添加第四个坐标,即 [\mathbf{V}]_{a, b, c, d} 。综上所述,

[\mathbf{H}]_{i,j,d} = \sum_{a = -\Delta}^{\Delta} \sum_{b = -\Delta}^{\Delta} \sum_c [\mathbf{V}]_{a, b, c, d} [\mathbf{X}]_{i+a, j+b, c},(6.1.7)

其中隐藏表示 \mathbf{H} 中的索引 d 表示输出通道,而随后的输出将继续以三维张量 \mathbf{H} 作为输入进入下一个卷积层。 所以, (6.1.7) 可以定义具有多个通道的卷积层,而其中 \mathbf{V} 是该卷积层的权重。

然而,仍有许多问题亟待解决。 例如,图像中是否到处都有存在沃尔多的可能?如何有效地计算输出层?如何选择适当的激活函数?为了训练有效的网络,如何做出合理的网络设计选择?我们将在本章的其它部分讨论这些问题。

小结

  • 图像的平移不变性使我们以相同的方式处理局部图像,而不在乎它的位置。
  • 局部性意味着计算相应的隐藏表示只需一小部分局部图像像素。
  • 在图像处理中,卷积层通常比全连接层需要更少的参数,但依旧获得高效用的模型。
  • 卷积神经网络(CNN)是一类特殊的神经网络,它可以包含多个卷积层。
  • 多个输入和输出通道使模型在每个空间位置可以获取图像的多方面特征。

练习

1. 假设卷积层 (6.1.3) 覆盖的局部区域 \Delta = 0 。在这种情况下,证明卷积内核为每组通道独立地实现一个全连接层。
解:
\Delta = 0时,卷积核为1×1,如下

[\mathbf{H}]_{i, j} = u + [\mathbf{V}]_{0, 0} [\mathbf{X}]_{i, j}

此时,对于每个通道,卷积核只与输入特征图的一个元素相乘,而不考虑其他元素。并且此时输出尺寸和输入尺寸一致,且每个输出元素都是输入特征图对应元素的加权和(一对一),因此,对于每个通道而言,可以认为卷积内核为每组通道独立地实现了一个全连接层。
但要注意的是,二者的工作原理不同,卷积核是局部加权求和(一对一/一对局部),而全连接层是全局加权求和(一对全部);此外,二者的输出尺寸不同,即使卷积核为1×1,输出尺寸也是随输入尺寸可变的,而全连接层的输出尺寸是固定的,因此,二者当且仅当输入尺寸为1×1时等效,也即上述,对于每个通道,可以看作卷积内核为每组通道独立地实现了一个全连接层。

2. 为什么平移不变性可能也不是好主意呢?
解:
平移不变性意味着无论图像中的对象在什么位置,网络都能够识别出相同的特征,是提高了网络对于待识别对象的泛化能力,这对于图像识别任务非常有利,但是对于其他的任务而言可能不是好主意,比如:
在精准定位、图像分割任务中,此时网络不仅需要识别对象,还需要知道对象的确切位置,但平移不变性的存在意味着对对象的位置和边界并不敏感,可能会影响此类任务的精度。

3. 当从图像边界像素获取隐藏表示时,我们需要思考哪些问题?
解:
图像边界像素可能没有足够的局部像素与卷积核一一对应,如需保留边界像素信息,则需要在输入图像的边缘进行0填充,增加图像尺寸,使得边界像素可以与卷积核匹配,确保边界像素的信息不会丢失。

4. 描述一个类似的音频卷积层的架构。
解:
- 输入X:一维数组形式,每个元素代表一个时间点的信号强度。
- 卷积核V:一维卷积核(宽度K),在时间维度按步长滑动提取特征。
- 输出H:H = X*V+u,尺寸与输入X一致。

5. 卷积层也适合于文本数据吗?为什么?

解:
适合,因为卷积层能够很好地处理一维序列数据,包括文本数据。通过使用适当大小的卷积核和步长,卷积层可以捕捉到不同长度的词组或句子模式。并且,卷积层的平移不变性使得一个词组在句子中的位置改变不会影响卷积层学习到的特征表示,有助于文本中的特征提取。

6. 证明在 (6.1.6)中, f * g = g * f 。

解:
即证明卷积操作符合交换律,如下:
(g * f)(i, j) = \sum_a\sum_b g(c, d) f(i-c, j-d)
a = i - c , b = i - d , 则有 c = i - a , d = i - b ,

故: (g * f)(i, j) = \sum_a\sum_b g(i - a, i - b) f(a, b)
对 g(i - a, i - b) f(a, b) 运用乘法交换律,可得:
(g * f)(i, j) = \sum_a\sum_b f(a, b) g(i - a, i - b) = (f * g)(i, j)
即证。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

scdifsn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值