#pic_center
R 1 R_1 R1
R 2 R^2 R2
目录
- 知识框架
- No.1 深度卷积神经网络 AlexNet
- 一、AlexNet
- 1、AlexNet
- 2、机器学习
- 3、几何学
- 4、特征工程
- 5、HardWare
- 6、数据集
- 7、AlexNet的改进的地方
- 8、AlexNet架构-卷积+池化
- 9、AlexNet架构-卷积+池化
- 10、AlexNet架构-全连接层
- 11、更多改变细节
- 12、复杂度分析
- 13、总结
- 二、D2L代码注意点
- 三、QA
- No.2 使用块的网络 VGG
- 一、VGG
- 1、VGG
- 2、VGG更深更大?
- 3、VGG块
- 4、VGG架构
- 5、发展进程
- 6、发展以及效率
- 7、总结
- 二、D2L代码注意点
- 三、QA
- No.3 网络中的网络 NiN
- 一、NIN
- 1、NiN
- 2、全连接层的问题
- 3、NiN块
- 4、NiN架构
- 5、NiN Networks
- 6、总结
- 二、D2L代码注意点
- 三、QA
- No.4 含并行连结的网络 GoogLeNet / Inception V3
- 一、GoogLeNet
- 1、简单介绍GooLeNet
- 2、最好的卷积层超参数?
- 3、Inception块:小学生才做选择题,我全要了
- 4、第一个Inception块
- 5、Inception块比较
- 6、GooLeNet架构
- 7、段1 & 2
- 8、段3
- 9、段4 & 段5
- 10、Inception有各种后续变种
- 11、V3各个阶段块改进
- 12、图示比较
- 13、总结
- 二、D2L代码注意点
- 三、QA
- No.5 批量归一化
- 一、批量归一化
- 1、批量归一化
- 2、批量归一化的提出
- 3、批量归一化方法
- 4、批量归一化层
- 5、批量归一化在做什么?
- 6、总结
- 二、D2L代码注意点
- 三、QA
- No.6 残差网络 ResNet
- 一、ResNet
- 1、ResNet
- 2、加更多的层总是改进精度吗?
- 3、残差块
- 4、ResNet块细节
- 5、不同的残差块
- 6、ResNet架构
- 7、对比
- 8、总结
- 二、D2L代码注意点
- 三、QA
- No.7 ResNet为什么能训练出1000层的模型
- 一、ResNet的梯度计算
- 二、QA
- No.8 图片分类竞赛
知识框架
No.1 深度卷积神经网络 AlexNet
一、AlexNet
1、AlexNet
- 讲AlexNet;真的是引起了整个这一次深度学习热潮的第一个网络;这个是2012年的左右的时候的一个网络;真的是从它开始到今天;一直是深度学习不断的一个火热的一个状态;
2、机器学习
- 首先,让我们来看一下深度学习出现之前的机器学习网络是什么样的。在2000年左右,支配着机器学习领域的主要算法是核方法。这种方法的核心思想是首先学习特征,我们之前已经介绍过特征提取的方法。然后,关键是使用核函数来计算高维空间中两个点之间的相关性,即如何判断在高维空间中两个点的相关性。在线性模型中,通常是通过内积来完成的。但是核方法更进一步,通过变换这个空间,将它映射成所需的样子,然后通过核函数的计算,将问题变成一个凸优化问题。这就是核方法的关键思想。
- 核方法的最大特点之一就是它有一套完整的泛函分析理论体系,可以用来计算模型的复杂度,以及在什么条件下会发生什么样的事情。这一点让核方法变得非常美丽。因为它是一个凸优化问题,所以它有非常好的数学定理,能够精确地计算模型的复杂度和性能。在2000年左右,核方法之所以能够替代神经网络并成为机器学习的主流,主要是因为它具备了这套完整的泛函分析理论体系。
- 当然,后来,随着深度学习的兴起,机器学习领域的热点逐渐转向了深度学习,这是发生在2010年左右的事情。深度学习的兴起使优化问题变得更为重要,因此优化问题成为机器学习领域的热门方向。然而,深度学习的崛起是在2006年之后,特别是在2010年左右才真正开始兴起的。在那之前,核方法一直是机器学习的主流算法。
- 当然,现在支持向量机(SVM)仍然广泛使用,因为它不需要大规模挑战,而且对挑战并不敏感。因此,通常情况下,SVM仍然是一种可靠的选择。
3、几何学
- 这里我们要讨论的是卷积神经网络,通常简称为卷积网络或卷网络。这些网络主要用于处理2D图像数据。在2000年左右,计算机视觉领域的主要关注点是从几何学角度解决问题。一本经典的参考书是《Multiview Geometry in Computer Vision》,它介绍了如何将计算机视觉问题描述为几何问题。
- 这本书的核心思想是首先进行特征提取,然后将整个几何问题转化为计算机视觉问题。例如,考虑在三个相机的不同位置拍摄的图像,可以通过相机的位置信息还原3D场景。在这种情况下,可以建立一个优化的目标函数,通常是凸优化问题,以还原这个场景。
- 一个关键的优点是它具有优美的数学定理,特别是在凸优化情况下,以及一些特殊的非凸情况下。它的最佳情况是,如果假设符合物理模型,那么效果会非常好。这个模型假设了关于世界的一些简单的物理模型,如果这些假设成立,效果会很好。
- 然而,最近的研究表明,深度学习可以在许多领域取得比传统物理模型更好的效果,包括地球科学、气象预测、药物研究、材料科学等。深度学习在这些领域的应用正在逐渐扩展,不仅能够超越物理模型,还能够在基于物理知识的模型上取得更好的效果。
4、特征工程
- 在过去的10年甚至15年里,在计算机视觉领域,特征工程曾经是至关重要的。特征工程指的是如何从一张图像中提取有意义的特征。在以前,通常会直接将图像的原始像素数据输入到模型中,但实际上,如果使用传统的机器学习模型,如SVM,直接使用原始像素数据效果会很差。
- 因此,多年来,计算机视觉研究者提出了许多图像特征提取算法。其中最著名的是SIFT(尺度不变特征变换)模型。SIFT模型会检查图像中的各个方向和局部区域,然后提取一些小但具有描述性的特征量,以描述图像。如果特征工程得当,那么后续的多分类模型,如SVM,就能很好地工作。
- 在深度学习兴起之前,计算机视觉领域更关注如何提取图像的特征,而不太关心使用什么样的机器学习模型。不管是SVM还是其他模型,都可以使用,关键是如何进行有效的特征提取,以便让机器学习算法更好地学习和理解图像数据。所以整个计算机视觉领域,针对不同的问题,都会采用不同的特征提取方法。
5、HardWare
- 在过去的几十年中,特别是在过去的60年里,计算机领域的发展趋势以及深度学习的崛起是非常值得关注的。下面是一个时间线,从1970年开始,覆盖到了2020年。我们可以看到有三个关键指标:样本数量、内存大小以及CPU(或计算单元)的能力。
- 在70年代,样本数量大约是100个左右,内存大小为1KB,而CPU的性能相对较弱。当时的计算机情况可能难以理解,因为与现代计算机相比,它们相对较弱。
- 然后,进入90年代,特别是在90年代末,我们看到了一些变化。样本数量增加到了约1万个,内存大小达到了10兆字节。虽然这个内存大小在当时已经算不小了,但仍然不足以容纳某些大型数据集。此时的CPU性能也相对较好,每秒可以执行1000万次计算,尽管与现代计算机相比依然有差距。
- 随着时间的推移,数据规模持续增长。现在,我们可以处理数十亿级别的数据,内存容量达到了100GB以上。而计算能力方面,我们不再仅依赖CPU,而是采用GPU,如Volta的GPU,它们的性能远超过了过去的CPU。因此,数据量和计算能力都取得了巨大的增长。
- 这种变化导致了不同阶段的模型选择偏好的不同。在90年代,由于数据和计算都有限,神经网络并不流行,因为其较小的模型规模和较低的内存需求使得核方法等方法更为合适。但随着计算能力的增加,我们可以构建更深的神经网络,用更多的计算能力来提高精度。
- 总结来说,数据、硬件和算法之间的不同发展速度影响了模型的选择。当前,神经网络是主流,但未来可能会有新的模型或方法出现,使得CPU再次成为一种有效的计算工具。历史一直在不断演变,因为不同主义的不同发展阶段导致了对流行方法的选择差异。所以,未来的发展方向仍然难以预测。
6、数据集
- 关于数据,需要强调其在深度学习中的关键作用。一个具体例子是ImageNet数据集,这是一个由李飞飞老师和Princeton合作创建的数据集,用于自然物体的彩色图像分类任务。与之前的手写数字识别(如MNIST)不同,ImageNet包含了大量的高分辨率彩色图像。
- ImageNet的图像通常更大,平均宽度约为469像素,高度约为387像素。该数据集包含了大约120万个样本,其中包含了1000个不同的类别,每个类别至少有5000张照片,因此总共有1200多万张图像。相比之下,ImageNet竞赛通常使用其中的1000个类别,每个类别平均约有5000张照片。
- 这个数据集的主要特点是类别数增加了100倍,样本数量增加了1000倍,同时图像的尺寸更大。由于有如此大规模的数据集,研究人员可以构建更深层次的卷积神经网络,以提取更复杂的信息。
- 在ImageNet竞赛的2012年,AlexNet模型获得了冠军,这标志着深度卷积神经网络的崛起。这是深度学习历史上的一个重要时刻。
7、AlexNet的改进的地方
-
关于AlexNet,它本质上是一个更深、更大的LeNet。在架构上,与LeNet相比,AlexNet没有太多本质的区别。接下来,我们将看一下AlexNet的具体实现以及它的主要改进:
-
首先,AlexNet引入了丢弃法(Dropout)。如果您还不熟悉丢弃法,可以查看相关视频,这是一种常用的正则化技巧。此技巧有助于控制模型,特别是在处理更大的模型时,如AlexNet。丢弃法通过随机关闭一部分神经元,在训练过程中有助于防止过拟合。
-
其次,AlexNet将激活函数从之前神经网络的Sigmoid改为ReLU(Rectified Linear Unit)。这个改变对模型性能产生了积极影响。我们在昨天的Q&A环节中也提到过,ReLU在训练深度网络时表现更出色。它的梯度更大,特别是在零点附近,有助于支持更深的网络。
-
第三,AlexNet使用了Max Pooling,而不是之前神经网络中常用的平均池化。Max Pooling选择每个区域内的最大值,从而使输出值相对较大,有助于训练。
-
总的来说,AlexNet的改进不仅仅在于增加模型的深度和规模,还包括引入了丢弃法、使用ReLU激活函数以及Max Pooling。这些改进使得深度学习神经网络的性能得到提升,并对计算机视觉领域产生了深远的影响,改变了人们的观念。深度学习的一个重要观点是不再依赖手工特征提取,而是通过深度学习神经网络端到端地学习从原始数据到最终分类或预测的过程。这是深度学习的一个核心优势。
-
以前,在深度学习和卷积神经网络(CNN)兴起之前,计算机视觉领域的方法有所不同。在早期,处理图像数据通常涉及到人工特征提取,这是计算机视觉研究者的关键任务。在许多任务中,特征提取的质量对问题的理解和最终的机器学习算法的性能至关重要。
-
举例来说,考虑图像分类问题。首先,研究者需要决定如何从图像中提取相关特征。这意味着将图像转换成机器可以理解的数值数据。在早期的图像分类竞赛中,如ImageNet,这个步骤变得非常重要。研究者们需要确保他们从图像中提取了能够用于机器学习的有效特征。
-
接下来,他们将使用标准的机器学习模型,如支持向量机(SVM)或随机森林,将这些特征用于分类任务。整个问题的理解和信息提取都集中在人工特征提取的过程中。
-
然而,随着深度学习和卷积神经网络的崛起,这个情况发生了变化。现在,卷积神经网络的最后一层通常是一个Softmax分类器。在整个网络中的前几层,通过CNN学习图像特征。CNN在不同的通道中学习不同的模式,从图像中抽取信息,并使Softmax分类器能够有效进行分类。
-
这个改变有两个关键点:
- 第一,卷积神经网络的构建变得相对简单,不需要深入了解计算机视觉领域的专业知识。这使得它更容易应用于不同的任务。
- 第二,由于模型的所有部分一起训练,CNN学到的特征很可能适用于Softmax分类,这是通过深层神经网络对原始数据进行转化,使得Softmax分类器可以有效运行。
-
总之,深度学习对传统机器学习的改变在于不再需要关注如何手动提取特征,而是通过端到端的学习过程,从原始数据(如像素、字符串或其他信号)直接到最终的分类或预测结果,这是深度学习的主要卖点。这一变化对计算机视觉领域产生了深远的影响。
8、AlexNet架构-卷积+池化
- 接下来,我们来详细探讨一下AlexNet的架构。首先,需要明确它实际上是一个更深更大的LeNet,我们将它们进行比较。
- 首先,让我们看看AlexNet和LeNet的输入图像大小。在AlexNet中,输入图像的大小为224x224,稍大一些,而LeNet的输入图像为32x32,通道数为1(即灰度图像)。这是因为AlexNet处理的是RGB彩色图像,因此具有3个通道。
- 接下来,我们来看第一个卷积层。在LeNet中,第一个卷积层采用了5x5的卷积窗口,输出通道数为6。在AlexNet中,第一个卷积层采用了更大的11x11的卷积窗口,因为输入图像更大,需要更大的窗口来捕获更多的信息。此外,AlexNet的输出通道数增加到了96。此处的步幅(Stride)等于4,这是因为在2012年时,GPU性能还不如现在好,内存也较小,因此需要较大的步幅以减少计算负担。
- 接下来是卷积层之后的池化层。在AlexNet中,池化窗口的大小为3x3,而在LeNet中为2x2,步幅相同。值得注意的是,AlexNet采用了Max池化,而LeNet使用的是Average池化。
- 这些是AlexNet和LeNet在第一层卷积和池化层的主要区别。AlexNet采用了更大的输入图像,更大的卷积窗口和更多的输出通道,以及Max池化,这些变化都旨在处理更复杂的图像数据,尤其是彩色图像。这些设计选择使得AlexNet在计算机视觉任务中表现出色。
9、AlexNet架构-卷积+池化
- 接下来,让我们继续探讨LeNet和AlexNet的架构。
- LeNet的架构包括一个5x5的卷积层,输出通道数为16,然后是一个均值池化层。接下来,Lenet再次使用了一个相同配置的卷积层和均值池化层。
- 现在,让我们看一下AlexNet的架构。AlexNet的第三层卷积层也使用了一个5x5的卷积窗口,其中Pad(填充)参数设置为2,以保持输入和输出尺寸相同。这一层有256个输出通道,相对于之前的96通道,这是一个显著的增加。这个设计改变的主要目的是为了更好地识别图像中的各种模式,因此需要更多的输出通道。接下来是一个均值池化层,窗口大小为3x3,步幅(Stride)为2,以减半输入图像的高度和宽度。
- 此后,AlexNet新增了3个卷积层,相对于LeNet多出3个卷积层。这些卷积层都采用了3x3的卷积窗口,Pad参数设置为1,以保持输入和输出尺寸一致。这些卷积层的输出通道数逐渐增加,分别为384、384和256。这三个卷积层紧接在一起,最后是一个均值池化层,大小为3x3,步幅为2。
- 总结来看,AlexNet相对于LeNet增加了更多的卷积层和更多的输出通道,以处理更复杂的图像特征。这些设计选择旨在提高图像识别性能,特别是在大规模图像数据集上。
10、AlexNet架构-全连接层
- Lenet在两个卷积层之后,使用了两个隐藏层,并最后使用Softmax回归进行输出。对于LeNet,第一个隐藏层的大小为120,接下来是84,最后是10,用于输出。相比之下,AlexNet也使用了两个隐藏层,但隐藏层的规模大幅增加,从一开始就变成了4096,这是一个非常大的数字。这样之所以要如此大,是因为AlexNet需要处理1,000个类别的问题,因此隐藏层的规模必须比1,000要大一些。因此,AlexNet采用了两个大小为4096的隐藏层。
- 总结一下,AlexNet的架构相对于LeNet,前两个卷积层使用了更大的窗口和更多的通道,增加了3个额外的卷积层,并在最后的全连接层中使用了更大规模的隐藏层。因此,AlexNet可以被描述为更深更宽的网络结构。
11、更多改变细节
- 更多的细节在这方面。先前已经提到,没有使用激活层,而是将激活函数从LeNet的Sigmoid变为ReLU。之前已经解释过,ReLU能够有效减缓梯度消失问题,因为它的梯度通常较大,特别是在大于零的值上。此外,ReLU函数的一阶导数在零点处等于一,因此更容易实现数值稳定性。
- 另一个重要的变化是在全连接层之后引入了Dropout层,用于模型正则化。另外,数据增强也是一个非常重要的步骤。AlexNet认为120万张图片不足以支撑深度学习模型的训练,因此采用了数据增强的方法。数据增强包括对原始图片进行多种随机变换,如随机截取、缩放、改变亮度、改变色调等。这样做的目的是增加训练数据的多样性,使模型更加稳健。
- AlexNet的思想是通过引入这些变化,让模型更加对未知数据具有鲁棒性,降低了过拟合的风险。这个数据增强的话题将在后续的课程中详细讨论,因为它在计算机视觉中非常重要。
12、复杂度分析
- 对比这两个模型的复杂度,首先来看参数的个数。LeNet相对较简单,例如,第一个卷积层有150个可学习参数,第二个大约有2,400个参数,后续的全连接层稍微多一些。而AlexNet在参数数量上更为庞大,主要是因为它的第一个卷积层使用了7x7的卷积核,通道数也增加了,而且输入通道数从1变成了3,使得第一个卷积层的参数数量从150直接增加到了约35,000,第三和第五卷积层也是类似的。最后的全连接层更大,大约有26 million到16 million个参数,使得整个模型的大小约为46 million个参数。与之相比,LeNet只有约60,000个参数,因此AlexNet在可学习的参数数量上多了大约10倍。
- 考虑到ImageNet数据集有大约120万张图片,因此需要大约100 GB的磁盘存储。相比之下,LeNet的数据存储要小得多,大约只需要10 MB左右。这是因为卷积层相对来说比较节省参数。不过,要注意的是参数数量并不是衡量模型复杂度的唯一标准,还有其他因素需要考虑。
- 另一个重要的因素是计算复杂度,即FLOPs(每秒浮点运算次数)。AlexNet相较于LeNet有更大的计算复杂度,需要进行更多的浮点计算。具体数字不再详细介绍,但可以理解为AlexNet在前向传播时需要进行更多的计算。在ImageNet数据集上,AlexNet进行一次前向传播需要的计算次数约为LeNet的250倍。这意味着AlexNet要进行更多的计算工作。
- 综上所述,尽管AlexNet的参数数量相对更多,但由于卷积层相对较节省参数,因此实际上它的计算复杂度比LeNet更高。这两个模型处于不同的复杂度水平,AlexNet在计算复杂度上更昂贵,这是它们之间重要的区别。
13、总结
- 总结一下,AlexNet相对于LeNet来说更大更深,多了三个卷积层,但在整体架构上与LeNet没有太大区别。它包括卷积层和全连接层,参数数量比LeNet多了10倍,计算复杂度要高出260倍。
- 此外,AlexNet引入了一些技巧,如丢弃法、ReLU激活函数、最大池化层以及数据增强,这些技巧使得训练更加容易。
- 在2012年的ImageNet竞赛中,AlexNet的胜利标志着深度学习的崭露头角,引领了深度学习的热潮。这一胜利激发了许多研究者的兴趣,随后几年的ImageNet竞赛中,深度神经网络成为赢得冠军的主要工具。基本上,前几名的参赛队伍都采用了深度神经网络。这标志着深度学习的发展取得了显著的成就。
二、D2L代码注意点
三、QA
No.2 使用块的网络 VGG
一、VGG
1、VGG
- VGG对于AlexNet的改进之一就是解决了AlexNet结构不规则的问题。AlexNet虽然增大了规模,但在结构上显得相对随意,缺乏明确的设计思路,导致了许多疑问,如为何要这样设计,如何变得更深或更宽等问题。为了实现更深更大的网络,VGG采用了更清晰、更规则的设计思路。
2、VGG更深更大?
- 当VGG团队在2013年思考如何构建更深更大的网络时,他们面临了多个选项。其中之一是增加更多的全连接层,但全连接层通常占用大量内存,并且计算量也很大。另一个选项是增加更多的卷积层,但对于像AlexNet这样的模型,添加更多的卷积层并不容易,因为需要复制很多3x3的卷积层,这很繁琐。
- 因此,VGG的思路是将整个网络划分为一些小块,即卷积块,然后将这些卷积块堆叠在一起。这种方法就像搭乐高积木一样,首先组装小块,然后将它们重复多次。这种方法更加模块化和可扩展,使得网络的构建更加灵活,这就是VGG的主要思想。
3、VGG块
- VGG的主要思想是拓展了AlexNet的架构。例如,我们已经介绍过,连续的三个3x3卷积层,紧接着一个最大池化层,被称为卷积块。VGG将这个思路进一步扩展,允许使用多个这样的卷积块,其中的n和m是超参数。n表示卷积块的数量,m表示每个卷积块中的通道数。这个架构的关键特点是使用大量的3x3卷积层,然后将它们堆叠在一起,最后形成VGG网络。
- 此外,VGG还采用了与AlexNet相同的2x2最大池化窗口和步幅为2,以减小网络的空间维度。通过使用3x3的卷积核,而不是5x5,VGG能够在相同的计算成本下构建更深的网络,因为3x3卷积核提供了更广泛的感受野和更好的效果。
- 总之,VGG网络的核心思想是使用大量的3x3卷积层,将它们堆叠在一起,形成VGG块,这样可以构建更深更大的网络,而不会增加过多的计算成本。
4、VGG架构
- 接下来,VGG架构实际上是将LeNet的卷积层部分替换掉,将其整个卷机层的架构进行了更新。LeNet是一个较大的模块,所以VGG将其替换为n个VGG块,并将它们串联在一起。你可以自由组合不同大小的块,比如VGG16有13个卷积层,VGG19有16个卷积层,等等。此外,它仍然保留了最后的两个全连接层,其中4096个神经元,最后输出。
- 因此,VGG最大的改进之一是将AlexNet中不规则的部分提取出来,形成了一个叫做VGG块的模块,同时去掉了前面的两个不规则部分,从而使整个网络更加规整和清晰。所以你现在可以将多个这样的块串在一起来构建不同规模的VGG网络。
5、发展进程
- 回顾一下这个演进过程,从20世纪90年代的LeNet,其中包含两个卷积+池化层和两个全连接层,到AlexNet,AlexNet更大更深,然后到VGG。你可以将VGG视为一个更大更深的AlexNet,因为它保留了中间的新添加的部分,将其复制了多次,去掉了前面的那部分,而其余部分保持不变。这使得整个网络更大更深。
6、发展以及效率
- 关于模型性能和精度的讨论,让我们来看一下现在的进度。这是一个古龙CV模型Zoo中的图表,用来比较不同模型的性能。横轴表示不同的模型,纵轴表示它们在ImageNet上的准确性,准确性越高越好。首先,我们看到AlexNet,它是一个速度很快的网络,每秒可以处理大约5,000次的推断。然而,它的准确性不高,Top-1准确性约为0.56。
- 接下来是VGG,对AlexNet进行了显著的性能提升,但代价是速度较慢,大约慢了5到6倍,因为它更深了。此外,VGG在内存使用方面较为占用,不同模型占用不同的内存大小,您可以根据需求选择不同的模型,速度和精度之间会有权衡。
- 值得注意的是,这些是早期的网络,更多新的网络模型在性能和精度上都表现更出色,但VGG是一个经典的网络,它在2013年赢得了ImageNet冠军,因此在深度学习的发展历史中具有重要地位。
7、总结
- 总结一下,VGG的核心思想是利用可重复使用的卷积块来构建深度卷积神经网络。它将AlexNet的那一部分提取出来,形成一个VGG块,然后您可以通过配置不同数量的VGG块和通道数来获得不同的网络变种。这一思想后来得到广泛应用,即使用可重复的块来构建深度网络。
- 另一个关键思想是网络的配置灵活性,就像购车时可以选择高配版或低配版一样。VGG也提供了不同的配置选项,其中低配版速度更快但精度较低,而高配版速度较慢但用于提高精度。这两个思想对后续深度网络的设计产生了重要影响。
二、D2L代码注意点
三、QA
No.3 网络中的网络 NiN
一、NIN
1、NiN
- 今天我们要介绍的是NiN,也就是"Network in Network",中文可译为"网络中的网络"。尽管NIN目前用得不多,几乎很少被应用,但它提出了一些非常重要的概念,这些概念后来被广泛采用在其他网络中。因此,我们今天首先来详细介绍这个网络。
2、全连接层的问题
-
首先,我们来看一下,在之前的AlexNet和VGG网络中,它们都在最后一层使用了相当大的全连接层。在VGG和AlexNet中,这些全连接层包括两个具有4096个神经元的全连接层,以及一个全连接层用作输出层。我们之前已经提到,这些全连接层其实占用了相当多的参数空间。基本上,网络中的所有参数都集中在这些全连接层中。值得注意的是,这些全连接层会导致过拟合的问题。
-
让我们仔细看一下这个问题。如果我们使用卷积层,计算参数数量的方式是输入通道数乘以输出通道数,再乘以卷积核的高度和宽度,如果我们用k表示卷积核的大小,那么参数数量就是k的平方。但如果我们使用全连接层,那么参数数量将是输入像素总数乘以输入通道数,再乘以输出通道数,这意味着参数数量是输入图像的总像素数。比如,在卷积层的情况下,第一个全连接层的参数数量是16x5x5x120,即为48,000,但在AlexNet中,第一个全连接层的参数数量是256x5x5x4096,即为26,214,400。而在VGG网络中,情况更加明显,因为它的通道数增加到512,同时将高宽压缩到7x7,第一个全连接层的参数数量为512x7x7x4096,即为100,112,896。这个参数数量巨大,而且会导致内存占用量巨大。
-
当我们观察卷积神经网络的结构时,常常会注意到在卷积层之后的最后一层,通常将输出特征图的维度压缩为1x1,有时甚至是7x7,同时输出通道数也会发生变化。这会导致参数数量相对较多的情况。举例来说,如果我们考虑卷积层后的第一个全连接层,如果通道数为N,那么参数数量将是16x5x5xN,再乘以120,这是输出隐藏层的大小。这里的16是最后一个卷积层的输出通道数,5x5表示将输入高宽压缩到5x5。因此,参数数量约为48K。然而,当我们查看AlexNet时,其最后一个卷积层的输出通道数为256,乘以5x5,再乘以4096,参数数量约为26兆。而对于VGG来说,问题更加明显,因为它的通道数增加到512,同时将高宽压缩到7x7,再乘以4096,这导致参数数量高达约100兆。因此,VGG网络占用了相当大的参数空间。
-
此外,内存的占用也相当大,特别是在卷积层之后的第一个全连接层。这会带来多个问题,首先是需要大量的内存,其次是计算资源的占用,这将在后面的解释中详细讨论。在硬件层面,一个大型矩阵乘法操作实际上主要是由内存访问而不是计算本身所主导。
-
另一个问题是,拥有大量参数的全连接层容易导致模型过拟合,因此需要大量的正则化来防止全连接层过于"学习"数据。为了解决这些问题,NIN的思想是完全放弃全连接层。最近的研究工作,如MLP-Mixer,也提出了类似的思想,试图替代传统的卷积神经网络(CNN),摒弃全连接层,而是使用卷积层来替代。因此,问题不在于全连接层是否可行,而在于如何设计卷积网络,设计得当的话,全连接层仍然是有效的。
3、NiN块
- NIN(Network in Network)引入了一个非常重要的概念,即"NIN块",这个概念在后续的网络设计中被广泛采用。每个网络通常会有其独特的局部卷积神经网络架构,构成整个网络的模块。
- NIN块的结构如下:首先是一个卷积层,随后是两个1x1的全连接层。这两个1x1的卷积层实际上相当于全连接层,因为它们具有1x1的窗口大小,无填充,输入和输出的形状保持不变,通道数也不发生变化。这两个1x1的卷积层的主要作用是混合通道特征。你可以将NIN块视为由一个卷积层和两个1x1的全连接层构成,它是一个相对简单的卷积神经网络模块。
- 这个块中的全连接层是针对每个像素点进行的,因此它们的权重对于每个像素点都是相同的,而不会受到输入高度和宽度的影响。因此,这个全连接层可以被视为按像素点进行的全连接层,权重是一样的。
- NIN块的核心思想在于使用1x1的卷积层来替代全连接层,这一思想在后续的网络设计中得到广泛应用。
4、NiN架构
- 整体架构不再包括全连接层,而是采用了NIN块和1x2的最大池化层交替使用,最大池化层的作用是将高度和宽度减半。最后,通过全局平均池化层得到输出。全局平均池化层的高度和宽度与输入相同,因此对于每个通道,它会选择最大值。
- 如果要获得例如1,000个类别的预测,可以将最后的全局池化层的输出通道数设置为1,000,然后对于每个通道,取出一个值,将该值视为该类别的预测分数,然后应用Softmax函数,以获得各类别的概率分布。这种设计非常极端,因为不再需要使用传统的全连接层。
5、NiN Networks
- 这个网络结构看起来是这样的。首先,它包括一系列的3x3卷积层,再加上一个最大池化层。在NIN中,我们使用的是一个卷积层,后面跟着两个1x1卷积层,这两个1x1卷积层的作用相当于全连接层。然后,在VGG中,我们通常有4个VGG块,每个块后面跟着两个大型全连接层(MLP),最终输出1,000个类别的分类结果,其中每个类别对应一个输出通道。而在NIN中,网络更加简单,只包含一个NIN块,接着是一个1x2的最大池化层,这个过程会一直重复,直到最后。如果设置通道数等于所需的分类数,那么最后就不再需要额外的全连接层,而是直接应用全局平均池化,以获得每个类别的预测。这就是RN架构的主要内容。
6、总结
- 总结一下:NIN的核心思想是NIN块,即在每个卷积层之后添加两个1x1的卷积层,
- 用于引入非线性,对每个通道的像素进行混合。接着是一个非线性激活函数,因为它包含两个层。最后,使用一个全局平均池化层来替代VGG和AlexNet中的全连接层。全局平均池化层的优势在于不需要额外的大型全连接层,从而减少参数数量。
- 总的来说,NIN的架构相对简单,由多个NIN块和最大池化层构成,一直到最后的全局平均池化层。它的参数数量很小,因为没有全连接层,不管类别数量有多大,都不会对网络结构产生太多影响。这就是NIN网络的要点。
二、D2L代码注意点
三、QA
No.4 含并行连结的网络 GoogLeNet / Inception V3
一、GoogLeNet
1、简单介绍GooLeNet
- 接下来我们讲述今天的第二个网络,它被称为GoogleNet。尽管NiN几乎没有再被使用,但GoogleNet仍然大量被采用,特别是在Google内部以及其他地方也经常使用。当GoogleNet首次发布时,它引起了广泛的注意。看一下这个横向的结构,实际上应该是竖直的,这是因为它首次引入了一个可以达到接近100层的卷积层。虽然它并不是直接拥有100多层的深度,但它的卷积层数量确实超过了100。此外,它的名称中的"L"是大写的,这是为了向NiN致敬,尽管实际上两者没有直接关系,而只是为了取一个名字
- GoogleNet由一群人共同设计和开发,并在ImageNet比赛中取得了卓越的成绩,甚至获得了冠军。此外,他们也想把自己公司的名字放在那里,所以取了这个名字,并以一种幽默的方式向NiN表示敬意。所以,通过了解NIN之后,更容易理解GoogleNet的设计,因为NIN严重影响了后者的设计,这也是为什么我们在介绍NIN之后继续介绍GoogleNet的主要目的。
2、最好的卷积层超参数?
- 让我们来看一下它的动机是什么。之前有很多人问过,为什么要选择这种卷积方式,为什么要使用5x5,3x3,7x7等尺寸的卷积核,以及如何选择通道数。在这里,我们可以认为Net是怎么样的。AlexNet通过增加更多的通道宽度,使用了一些VGG的思路,几乎都采用了3x3的卷积核。然而,实际上还是采用了AlexNet的那套思路,但加入了1x1的卷积层。
- 所以,人们开始思考,到底哪种组合更好。例如,使用1x1的卷积核,3x3的卷积核,5x5的卷积核或7x7的卷积核,或者是使用最大池化还是平均池化,还是在什么情况下使用最大池化,或者是否需要额外的卷积层。这里有很多不同的选择,所以我们需要考虑哪种方式更好。
3、Inception块:小学生才做选择题,我全要了
- 现在来看一下,Inception块的概念。块的意思是不再选择一种卷积核,而是同时使用多种卷积核,有不同的通道;然后不同的通道选择不同的设计;而是同时使用多种卷积核,每种卷积核提取不同的特征。这是Inception块的核心思想,它的名字取自电影"Inception",在梦中嵌套梦的情节。大家似乎都喜欢给一些新概念取一些花哨的名字,对吧?所以,
- 让我们看一下Inception块在做什么。首先,输入位于这里,这是输入。然后,输出将出现在这里,输出将在稍后进行。现在,让我们仔细看一下。输入位于这里,你可以看到它被复制了四块。之前,输入只有一条路径,对吧?但在这里不同,它有四条路径。
- 第一条路径是将输入连接到一个1x1的卷积层,1x1的卷积层将输出到这里。
- 然后,第二条路径,首先通过一个1x1的卷积层对通道数进行转换,然后输入到一个3x3的卷积层中,填充(Pad)等于1,以保持输入和输出的高宽相同。这是第二条路径。
- 第三条路径,同样,将输入通过一个1x1的卷积层对通道数进行转换,而不改变高宽,但通过一个5x5的卷积层来提取一些空间信息,填充(Pad)等于2,以保持输入和输出的高宽相同。
- 还有第四条路径,它使用了一个3x3的最大池化层,填充(Pad)等于1,然后在后面加上一个1x1的卷积层。
- 所有这四条路径的输出将被合并在一起,而合并是在输出的通道数上进行的,不是在图像上。所以,这个就是Inception的核心定义。你可以基本上看到,高宽不会改变,改变的是通道数。当你再次看,你会看到有1x1的卷积核,3x3的卷积核,5x5的卷积核,3x3的最大池化层,还有一堆1x1的卷积核。所以基本上,1,3,5,和Max Pooling都被包含在内,所以不需要特别担心要选择哪种。
4、第一个Inception块
- 现在让我们来看看通道数的变化。假设输入有192个通道和28x28的高宽。高宽不会改变,对吧?现在让我们看看通道数如何变化。
- 首先,第一条路径将通过1x1的卷积层将通道数降至64。
- 接下来,通道数从192降到96。为什么要降到96呢?因为后面要使用3x3的卷积核,降低通道数可以减少模型的复杂度。模型的复杂度基本上可以看作是可以学习的参数数量,而卷积层的可学习参数数量等于输入通道数乘以输出通道数再乘以卷积核的大小。卷积层的可学习参数数量等于输入通道数乘以输出通道数再乘以卷积核的大小,所以将通道数从192降至96。然后通道数再增加到128,
- 因为它使用了5x5的卷积核,更昂贵。所以它将通道数从192降至16。然后再用5x5的卷积核,通道数增加到32。
- Max pooling不会改变通道数,但1x1的卷积核会将通道数降至32。
- 白色的1x1卷积核可以认为是用来改变通道数的,要么改变输入,要么改变输出。蓝色的卷积核用来提取信息,不会改变通道数,而红色的卷积核可以认为是用来抽取空间信息的。所以,这就是通道数变化的关键。当你看到这个地方的数字时,可能会觉得有点奇怪,因为作者从来没有明确解释这个数字是怎么来的。
- 但大致上,你可以认为,最后的通道数是64加上128加上32再加上32,等于256。所以,假设你想从192变成256,那么你可以暂时不管细节,只想着如何将通道数从192增加到256。接下来,你要考虑如何分配这256个通道。每个通道负责识别一些模式,所以你想要将重要的通道分配给重要的模式。这就是为什么一半的通道数留给了3x3卷积核,因为3x3卷积核比较有用,不仅计算开销较小,而且能够提取很好的空间信息。剩下的128个通道分配给了1x1卷积核,1x1卷积核不考虑空间信息,只关注通道信息。然后,64个通道平均分给了5x5卷积核和1x1卷积核,32个通道分配给了3x3卷积核和1x1卷积核。所以通道数基本上就是向下递减,要么减半,要么是原来的3/4。基本上,设计思路大致如此,但具体的数值是通过调试得出的。
5、Inception块比较
- 因此,我们可以进行比较,为什么要使用Inception模块。假设我们不使用Inception模块,而是希望从输入通道数24达到输出通道数128。如果我们不使用Inception模块,而是使用单独的3x3卷积核,参数数量将会增加到0.4兆。如果选择5x5的卷积核,参数数量将更多,因为窗口大小更大,达到1.22兆。
- 通过Inception模块,特别是其中包含大量的1x1卷积层,参数数量仅为0.16兆。这意味着Inception模块使参数数量减小了,而不是直接使用3x3卷积核,参数数量减小了将近1/3,减小了大约两倍。此外,计算量也减少了,因为参数数量减少,计算量也减少,这几乎呈线性关系。因此,5x5卷积核的计算量最大,为900兆次浮点运算,3x3卷积核为350兆次,而Inception模块的计算量为128兆次。总之,Inception模块的核心思想是不仅增加了卷积核的多样性,还减少了参数数量,降低了计算量,这是它的优点。
6、GooLeNet架构
- 不管怎样,Inception架构包括了大量的Inception模块,它与VGG的区别并不本质。Inception架构也分成了5个阶段,与之前的VGG相似。在第一个阶段,输入数据首先通过一个卷积层,然后进入一个3x3的最大池化层,与之前的处理方式相同。接着,第二个阶段也没有使用Inception模块,而是使用了一个1x1的卷积层,以及一条被认为最重要的通道,然后再使用了3x3的卷积层,最后进行了3x3的最大池化操作。这是第一个阶段的处理。
- 它使用了两个Inception块,不改变高度和宽度,只改变通道数,然后通过3x3的最大池化层进行高宽的降维。接下来是第三阶段,Stage 3,同样使用了两个Inception块,不改变高宽,只改变通道数,然后使用了3x3的最大池化层进行高宽的降维。接下来是第四阶段,Stage 4,这一阶段使用了五个Inception块,最后通过一个最大池化层进行高宽的降维。最后一层,Stage 5,使用了两个Inception块,并使用全局的平均池化层,最终得到一个全连接层。
- 为什么我们要提到Network in Network(NIN)在讨论GoogleNet之前呢?因为可以看到GoogleNet大量使用了1x1的卷积层,它通常在全连接层之前使用,以减少通道数。此外,GoogleNet还使用了全局平均池化层。不同的是,GoogleNet没有强制规定最后一个Inception块的输出通道数必须等于类别数,这使得GoogleNet的设计更加灵活。这是GoogleNet的概述,接下来我们将详细了解每个块是如何设计的。
7、段1 & 2
- 首先看下段1 和段2 ,我们来比较一下GoogleNet和AlexNet的区别。首要的区别在于窗口大小。GoogleNet使用的是7x7的窗口,而AlexNet则使用的是11x11的窗口,并且采用stride等于2。这是为了避免一下子将高宽减小得太快,保持一定的特征信息。此外,通道数也有所不同,GoogleNet中使用的通道数相对较少,为64,。然后通过一个3x3的最大池化层,stride等于2,这使得高宽在这个阶段降低了4倍。接下来是一个1x1的卷积层,通道数没有改变,它用来做通道数的融合,然后再接一个3x3的卷积层,通道数增加到了192。在这个阶段,高宽几乎减小了8倍,从224x224减小到了28x28。
- 前面的两个阶段虽然卷积层数量不多,但是它们都迅速将输入数据的尺寸缩小,以便后续的计算可以更加高效。如果输入的高宽太大,后续计算将会变得更加复杂。相比之下,在保留更多高宽信息的同时使用了更小的卷积窗口,使得后续网络可以更深。这就是GoogleNet和AlexNet之间的主要区别。
8、段3
- 接下来,我们来看第三个阶段。第三个阶段使用了两个Inception块。输出通道数从192变成了256,然后再变成了480。随后通过一个stride等于2的最大池化层,将28x28的尺寸减小到了14x14,但通道数增加到了480。
- 尽管有两个Inception块,但实际上,它们的通道数分配是不同的。有一半的通道数分配在第一条通道中,剩下的一半分在第二条通道中。然后,第一条通道中的通道数增加到128,第二条通道变成128,第三条通道变成192,最后一条通道扩大了三倍,从32增加到96。这个阶段的通道数分配似乎没有明显的规律,很难总结出通道分配的模式。
- 这个不同通道数之间的关系似乎相当复杂,难以总结出明确的规律。或许是因为研究人员进行了大量的超参数搜索,试验了各种不同的通道数分配,然后选择效果最好的版本。这也可能是因为他们有足够的计算资源,可以尝试不同的通道数组合。因此,最终的设计可能会看起来有些奇怪,但却在实际应用中表现出色。
9、段4 & 段5
- 段四和段五也是一样的。在这些阶段中,很难理解每个通道数是如何计算的,这导致了“GoogleNet”这篇论文的难以复现。由于存在众多的超参数和不清晰的说明,很难准确地复现论文中的模型。不过,总体原则还是可以理解的。
- 在第四阶段,包括了5个Inception块,其中通道数从480逐渐增加到512,然后再到了832。而在第五阶段,通道数保持在832,图像尺寸减小到14x14。最后,使用全局平均池化将特征图减小为一个大小为1x1的输出。
- 综上所述,GoogleNet的结构基本如上所述。与VGG相似,它有5个阶段,但不再使用VGG块,而是采用Inception块。每个Inception块的设计看起来复杂,通道数逐渐增加,最终达到了1024。这与VGG的512通道相比,GoogleNet使用了更多的通道,提高了网络的表示能力。
10、Inception有各种后续变种
- 后续的版本有很多变种。最初的版本是V1,但现在大多数使用的是V3或V4。V2它基于第一个版本并加入了Batch Normalization。
- 关于V3,它在V2的基础上进行了一些修改,尝试了各种不同的想法,如将5x5卷积层替换为两个3x3卷积层,或将5x5替换为1x7和7x1卷积层。它更深入地关注了空间信息,使得输入从224变成了299,这使得实现该论文变得更加复杂。
- V4是在V3的基础上引入了残差连接,也被称为Residual Connection,这将在ResNet部分进行讲解。总结来说,V2添加了Batch Normalization,V4添加了Residual Network,而在V3中,对Inception块进行了重新审视,尝试调整各种参数和设计。
- 需要注意的是,在这些版本之间进行了大量的尝试和修改。因此,实际实现这些论文时可能会面临挑战,特别是在输入尺寸从224变成299的情况下,这与其他网络不同。不过,这些变种的不断改进使得它们在不同领域的任务中都取得了令人印象深刻的成就。
11、V3各个阶段块改进
- 在V3中,进行了一些关键的修改。首先,原本的5x5卷积核被替换成两个3x3卷积核。然后,将3x3卷积核替换成了1x7和7x1的两个卷积核,而原本的5x5卷积核则被替换成了1x7、7x1和1x7、7x1的两个卷积核。这些修改发生在V3的第四段中。在第三段中,同样的替换策略也被应用。
- 至于第五段,变化更加特殊,它将3x3卷积核替换成了两个串联的卷积核,一个是3x1,另一个是1x3。而原来的5x5卷积核则经历了多次替换,包括3x3、1x3、3x1等组合。这些变化是V3中的重要改动,它们的目的是通过更多的小卷积核来代替大卷积核,以提高模型的效率和表现。
12、图示比较
- V3,即Inception V3,虽然在某些方面显得不同寻常,但其实效果相当出色。让我们来看看这个版本。Inception V3在图中用黄色标识,这个点代表了它的性能。横轴表示处理速度,速度越快越好。这是一个速度分布图,可以看到在处理速度方面,它相当出色,每秒能够处理约7,000个样本。相比之下,V3在速度上略显较慢,每秒处理大约800个样本。这些性能数据是关于预测速度的,训练速度通常会慢一倍。
- V3的性能在ImageNet数据集上也表现出色,接近0.8的准确度。与之前提到的VGG相比,它取得了更好的性能。尽管V3需要更多的内存和计算资源,但它的精度要高得多。然而,与其他后来的网络相比,V3在速度和性能之间的权衡方面并没有太多优势。
- 总之,Inception V3是一个内存消耗较大、计算速度较慢但精度非常出色的网络。尽管在当前的深度学习领域,它可能不再是首选,但它仍然是一个被广泛使用的网络版本。
13、总结
- Inception架构的特点在于使用了4种不同超参数的卷积层,每一层都用于提取信息,这意味着每个层级都使用了不同的组合来提取不同的空间信息。其主要优点包括模型参数较少、计算复杂度低。
- 在GoogleNet中使用了9个Inception块,每个Inception块包含多个卷积核,总计约为1236个卷积核。所以,整个GoogleNet网络中包含了近7000个卷积核。在之后的改进版本中,出现了更深的网络,尽管不是纯粹的深度达到100层,但通过增加通道数来实现达到上百层的网络。网络的发展需要不断的改进和引入新的技术,否则就会被淘汰,GoogleNet一直在持续改进中,从V1到V4,目前仍然在广泛使用。然而,GoogleNet的一个问题是其结构复杂,特别是通道的设计,人们难以理解其中的构造,这也是为什么它没有得到广泛欢迎的原因之一。因为它的结构相当复杂,难以由人工设计。
二、D2L代码注意点
三、QA
No.5 批量归一化
一、批量归一化
1、批量归一化
- 先讨论一下批量归一化。现在,几乎所有主流的卷积神经网络都在不同程度上采用了批量归一化这一技术。虽然早在上世纪80年代就有池化层(pooling)和卷积层(convolution)等概念出现,但批量归一化这一特定的层出现相对较晚,大约是在2016年左右。这一技术的提出是相对新的。然而,一旦引入批量归一化,人们发现其效果非常显著,特别是在构建非常深的卷积神经网络时,这一层成为不可或缺的组成部分。因此,批量归一化在深度学习中扮演了重要的角色。
2、批量归一化的提出
- 首先,让我们讨论一个问题。当神经网络变得非常深时,数据在下方,损失函数在上方。在自动微分求导中,正向传播(forward)是从下往上的过程,而反向传播(backward)则是从上往下传播的过程。这里存在一个问题,当梯度在上方时会比较大,但在传播到下方时,由于梯度是一系列小值相乘,它逐渐减小。虽然梯度爆炸是一个问题,但通常情况下,梯度会变得相对较小,特别是靠近数据的那些层,梯度会逐渐减小。这就导致了一个问题,即上方的层的权重会得到更快的更新,因为梯度较大。
- 然而,下方的层由于梯度较小,其权重更新较慢。这种不均匀的权重更新会导致一个问题,即顶部层很快就可能会收敛,而底部层的变化较慢。每次底部层变化时,顶部层就需要重新训练,因为底层特征已经改变,而顶部层的权重还在学习以前的内容。因此,在训练期间,上部层的收敛速度较快,而底部层的收敛速度较慢,导致训练的收敛速度较慢。因此,是否可以在底部训练时就改变底部特征,以避免顶部层不断重训,这是批量归一化需要解决的问题。
3、批量归一化方法
- 这个段落描述了批量归一化(Batch Normalization)的核心思想。其目的是通过固定分布的方式来提高神经网络的稳定性,减少内部协变量漂移的影响。
- 这个核心思想非常简单。它的出发点是,当我们在讨论损失和数值稳定性时,我们提到数据分布的均值和方差在不同层之间发生变化可能会引起问题。为了解决这个问题,一种简单的方法是将数据的分布固定在某一特定分布上,使每一层的输出和梯度都符合这个分布。当然,具体的分布参数可以进行微调,但整体来看,数据分布保持不变,这有助于减小变化的幅度。在训练过程中,微小的变化会更容易应对。
- 批量归一化实际上是一种相当简单的思想。它尝试将一个小批量的数据的均值和方差固定下来。以最简单的情况为例,对于一个小批量数据,我们对其中的样本进行求和以计算均值,然后计算方差(方差等于样本值减去均值的平方和,再加上一个小的常数以防止方差为零)。
- 然后,批量归一化的操作就是将批量内的每个样本减去均值,除以方差,然后乘以一个可学习的参数伽马,并加上另一个可学习的参数贝塔。这里的均值和方差是根据当前批量数据计算的。
- 批量归一化的目标是将数据分布调整为均值为0,方差为1的分布,这个分布可能并不适用于所有情况。因此,可以通过学习新的均值和方差来更好地适应数据,但是伽马和贝塔的变化受到限制,以避免过大的变化。
- 这只是批量归一化的基本思想。具体实现的细节将在后续讨论,但在掌握细节之前,我们可以先了解一下批量归一化带来的好处。
4、批量归一化层
- 在这个段落中,我们将探讨批量归一化(Batch Normalization)中伽马和贝塔的角色,以及它们如何与不同类型的神经网络层交互。
- 首先,让我们来讨论伽马和贝塔,它们具体是什么。实际上,可以将它们视为用于每个特征或每一列的参数。在全连接层或卷积层的输出上应用批量归一化时,它们将在激活函数之前起作用。这意味着在卷积层或全连接层的输出后立即接入批量规范化层,其作用是将输出的均值和方差进行归一化。具体而言,对于每个特征或通道,我们计算其均值和方差,并将输出进行均值减法和方差划分。接下来,我们使用可学习参数伽马和贝塔进行线性变换,然后再应用激活函数。
- 为什么要在激活函数之前应用批量归一化呢?如果将其应用在ReLU(修正线性单元)激活函数之后,由于ReLU将所有负数值变为零,这将导致伽马和贝塔的线性变换无效。因此,批量归一化通常应用在激活函数之前,以确保它是线性变换,而激活函数引入了非线性。这样,批量归一化成为一种线性变换,用于使均值和方差更稳定,避免剧烈变化。
- 批量归一化还可以应用于全连接层和卷积层的输入。对于全连接层,它会计算每个特征的均值和方差,将特征归一化为均值为0,方差为1。这类似于常见的数据预处理方法。不同的是,批量归一化将此操作应用于每个全连接层的输入,而不仅仅是数据。
- 另一方面,批量归一化也可以应用于卷积层的输入,尤其是在1x1卷积中。这里的思想是将每个像素视为一个样本,对每个通道进行均值和方差的计算。这使得1x1卷积等效于全连接层。
5、批量归一化在做什么?
- 具体来说,这是一个关于批量归一化(Batch Normalization)的讨论。批量归一化是一个经典的计算机科学案例,之前已经被广泛讨论。
- 当这项技术首次被提出时,作者声称它的目的是减少内部协变量转移(Internal Covariate Shift)。在机器学习领域,内部协变量转移是一个常被讨论的问题,因为当前数据的分布可能随时间变化,比如今天和明天,或者在不同的环境下,如疫情前后,可能会有很大差异。尝试使用疫情前的数据来处理疫情后的数据可能会导致问题。
- 批量归一化被认为有助于减少内部协变量转移,但后来的研究发现,它可能并没有真正实现这一目标。这一观点引发了许多研究人员的兴趣,他们开始深入研究这个问题,试图弄清楚批量归一化的工作原理。
- 最终,有人发现,批量归一化本质上是在每个小批量数据中引入了噪音,以控制模型的复杂度。这种噪音由mu(均值)和gamma(缩放)构成。这些值是在每个随机的小批量上计算的,因此它们具有一定的随机性。此外,它们可以根据学习率进行调整,以使其变化不那么剧烈。
- 总的来说,批量归一化的目的是引入一些噪音,以控制模型的复杂度。这种方法在某些情况下被证明是有效的,但并不是适用于所有情况。因此,理解这个技术的工作原理非常重要,以确定何时使用它以及如何使用它。尽管目前还存在一些理论上的不确定性,但随着时间的推移,新的理论框架可能会逐渐出现,用以更好地解释批量归一化的工作原理。因此,我们不必着急,只要这项技术一直有效,就会有人继续研究并提出新的理论来解释它的原理。
6、总结
- 总结一下,批量归一化,即将一个小批量数据的均值和方差固定,然后学习适当的偏移和缩放参数。偏移和缩放参数指的是它们的作用是调整均值和方差。
- 当涉及到全连接层时,它们的作用是对每个特征进行操作,每一列都有对应的特征。
- 对于卷积层,它是在将数据拉成一个矩阵后,在输出维度上进行操作。通常情况下,它可以加速模型的收敛。通过使用批量归一化,我们可以调整较大的学习率,这意味着更快的训练速度。它允许我们使用更大的随机批量和学习率进行训练,这也更容易理解。每一层的均值和方差都被合并在一起,这有助于避免之前提到的学习率过大或过小的问题。通过将每一层的输入数据都归一化到一个相似的分布中,可以使用较大的学习率。这是一种直观的理解方式。
- 但反过来看,很多时候,批量归一化只是用来加速训练过程,而不会改变模型的精度。如果不使用批量归一化,训练可能会慢一些,但不会使模型的精度变好。这是批量归一化的一个特点,因为它不会改变模型的均值或精度,但会加速训练过程。因此,通常情况下,它会被广泛采用。这就是批量归一化的概要。
二、D2L代码注意点
三、QA
No.6 残差网络 ResNet
一、ResNet
1、ResNet
- 假设你在卷积神经网络里面;只要了解一个神经网络的话;你就了解Resnet就行了;Resnet是一个很简单的;也是很好用的一个网络;这也是大家会经常在实际中;使用的一个网络;
2、加更多的层总是改进精度吗?
- 这个残差网络思想源自于一种观点,即不断加深神经网络是否总是有益的?事实并非一定如此。
- 举例来说,假设这里是你的最优值,表示最佳结果的位置。而F1代表一个函数,其大小反映了函数的复杂程度。如果模型足够简单,可能能够在这个区域内找到最佳值,因为模型足够简单,可以覆盖这一区域。这就是所谓的模型偏差,即模型在这一类问题上表现得非常好。
- 但是,如果你让模型变得更复杂,例如从F1到F6更复杂的模型,这个区域也变得更大。然而,更复杂的模型一定会表现得更好吗?并非如此。以一个例子来说明,最佳值在F2处红点然后离最佳数值f,但当你到F6时,你会发现与最佳值的距离实际上更远。尽管F6模型更复杂,但它可能学习得偏离最佳值。这在统计学中被称为模型偏差。
- 那么,应该如何处理呢?如果每次增加模型的复杂度(从F1到F2,再到F3,F6等)都包含了前面较小模型,这些模型作为子模型存在于更复杂的模型中。因此,更复杂的模型可以更好地学习,因为它至少不会变差,通常情况下会变得更好。这就是ResNet(残差网络)的核心思想。
- ResNet的方法是允许增加更多的层,而不会使模型性能下降,通常会改进模型性能。这个思想可以帮助我们理解深度神经网络中的层次结构。
3、残差块
- 然后,具体的实现方法也非常简单。通常,我们在构建神经网络时,需要一层接着一层地串联起来。但如果我们想要通过增加一些层来增加模型的复杂度,而不希望对已有的部分造成影响,该怎么做呢?答案很简单:使用加法。
- 假设我们有一个新的函数FX,它等于输入x加上另一个函数GX。即,FX = x + GX。如果GX不执行任何操作,也就是什么都不学习,至少还是能得到x。这意味着,即使GX不做任何事情,输出仍然会包含x。
- 但是,如果GX能够学到一些有用的东西,它会使输出变得更加丰富。从图形上看,如果需要两层,例如一个卷积层和一个激活函数,然后再连接一个卷积层和激活函数,这是一个串联结构。如果我们想要创建一个通道,使新添加的层可以选择性地不执行任何操作,我们该怎么做呢?答案是将一条捷径添加到这个位置。我们将FX的输出加上x,这表示,如果没有这一层,它不会对前面的部分产生影响,但仍然能够通过前面的层。
- 这是一个关键的概念,也是ResNet(残差网络)的核心思想。ResNet可以包含一个没有实际影响的小模型,使得即使没有这个小模型,网络仍然可以工作。从函数的角度来看,这解释了为什么这个想法是有用的。然而,ResNet本身并没有这么明确地阐述,它主要关注通过传递残差来加速训练,实际上,它允许你嵌入之前较小的网络,以便先训练较小的网络。
4、ResNet块细节
- 然后,关于具体的设计,他是借鉴了VGG的思路。他的设计包括以下步骤:首先进行3x3卷积,接着添加批量归一化(Batch Normalization),再经过ReLU激活函数。接下来再进行3x3卷积,再次添加批量归一化,通常情况下,接着使用ReLU激活函数将输出传递到下一层。然而,现在的不同之处在于,输入x还会被加到批量归一化的输出上,然后作为ReLU的输入。这是第一步实现。
- 在第二步实现中,他会在这一步再添加一个1x1的卷积层,用于通道数的转换。假如要进行通道数的变换,由于直接将x相加不是可行的,因此添加了一个1x1的卷积层,以确保通道数与之前的层合适,可以将它们按元素相加。这就是他的设计中的一个关键细节。
- 当然,你可以根据需要使用不同的技巧和参数进行调整。
5、不同的残差块
- 然后,关于夹在哪个位置的问题,实际上有多种可行的选择。你可以选择将输入x添加到不同的位置,取决于你的需求。你可以选择将输入x夹在3x3卷积层之前,或者将其夹在批量归一化(Batch Normalization)之前或之后。无论你将输入x添加到哪个位置,你都需要确保它能够在后续的层中正常传递。
- 此外,你还可以尝试将批量归一化(Batch Normalization)放置在不同的位置,例如在3x3卷积层之前或之后。你可以随意尝试不同的组合,因为你的网络结构通常包括三个关键层:卷积层、批量归一化层和激活函数层。不管你如何组合它们,最终效果可能差不多,但原始的配置通常表现得更好。你可以进行实验来找到最适合你的配置。
6、ResNet架构
- ResNet(Residual Network)的架构非常特殊。它的核心创新在于引入了残差连接(residual connections)。在ResNet中,核心思想是将一个跳跃连接(skip connection)添加到网络的不同层之间,使信息能够跳过一层或多层而不受影响。这种连接方式被称为残差连接,因此它的名字也来源于这一特性。
- ResNet的基本构建单元是ResNet块。有两种常见类型的ResNet块,一种是高宽减半的ResNet块,另一种是高宽不减半的ResNet块。高宽减半的ResNet块通常包括一个步幅为2的卷积层,这会将输入的高度和宽度减半,并将通道数翻倍。这是通过一个1x1卷积来完成的,以增加通道数。接着,这两个分支的结果会被相加在一起,形成ResNet块的输出。
- 对于高宽不减半的ResNet块,步幅通常为1,不会减小高度和宽度。这种块通常用于网络的第一个阶段,而不会减小输入的空间分辨率。
- ResNet的整体架构类似于VGG和GoogleNet,它被分为五个阶段(stage)。每个阶段包含一系列ResNet块。在每个阶段的末尾,会应用批量归一化和3x3的池化层。最后,全局平均池化(global average pooling)用于产生最终的输出。
- 需要注意的是,ResNet的架构可以根据需要进行微调,可以根据不同的网络深度和输出通道数来设计不同的ResNet架构。它的灵活性使其成为计算机视觉任务中的一种强大工具。
7、对比
- 然后,让我们来详细了解一下ResNet 512。ResNet 512是ResNet的一个经过两次三次改进的版本。最初的版本是ResNet 512,它在计算机视觉领域引起了巨大的变革。多年来,ResNet 512一直在不断演进,包括对网络结构的调整、训练算法的优化以及更好的数据增强和学习率策略的应用。
- 原始的ResNet 512构架于多年前,随着计算机硬件和深度学习理论的发展,对其进行了多次改进。现在,我们看到ResNet 512在各个领域都有广泛的应用,其表现一直在不断提高。其中的一些改进包括不同的层数和块的配置。在ResNet中,层数越多,网络性能通常越好。例如,ResNet 512是一个强大的模型,但还有更深的版本,如ResNet 101和ResNet 152。这些模型拥有更多的卷积层,通常在计算机视觉任务中表现出色。
- 然而,需要指出的是,ResNet 512通常用于刷新深度学习竞赛的高分榜单。在实际应用中,它的计算成本较高,因此很少被广泛采用。通常,ResNet 34或ResNet 50是更常见的选择,它们在性能和计算复杂度之间取得了平衡。
- 总之,ResNet 512的影响深远,它的残差连接思想已经成为深度学习领域的标配。不仅仅在ResNet中,几乎所有最新的深度学习网络都采用了这一思想。这表明ResNet的核心创新对深度学习的发展产生了深远的影响。 ResNet是一个不可或缺的工具,它为解决计算机视觉问题提供了强大的基础。
8、总结
- 让我们总结一下残差网络的关键思想。残差连接,简而言之,是通过引入跨层的快捷连接来简化训练非常深的神经网络。这是因为即使网络非常深,残差连接的存在允许网络包含较小的子网络。无论多么深,网络总是首先训练下面的较小部分,然后逐渐扩展到更深层次。
- 由于这一思想的应用,ResNet可以训练超过1,000层的深度网络,只要硬件资源足够。这一创新对深度神经网络产生了深远的影响,特别是引入了残差连接,这种跨层连接几乎已成为现代神经网络的标配,使得构建深度网络变得更加容易。
二、D2L代码注意点
三、QA
No.7 ResNet为什么能训练出1000层的模型
一、ResNet的梯度计算
- 所以今天在开始之前,让我们回顾一下Resnet是如何处理梯度消失的,以便能够训练多达1,000层的深度网络。在之前讨论梯度消失时,我们提到一种解决方法是将乘法操作转化为加法操作,而Resnet正是采用了这个方法,特别是通过引入残差连接。解释一下Resnet是如何处理梯度消失的。
- 首先,假设我有一个网络,它有一些输入x和预测输出y,其中y是通过函数F计算得到的,F包括了一系列卷积层和其他操作,它们有一些权重需要更新。为了更新权重,我们需要计算损失函数关于这些权重的梯度,而这里的关键问题是确保这些梯度不会变得特别小。如果梯度太小,无论我们如何调整学习率都会面临问题,因为数值稳定性可能会受到威胁。因此,我们希望梯度不会变得太小。
- 接下来,让我们考虑在网络中添加更多的层会发生什么。如果我们在网络上方再叠加一些层,梯度的传播可能会变得更加复杂。特别是,靠近底部的层可能会受到更严重的梯度消失问题。当我们计算损失函数关于底层权重的梯度时,新添加的层的梯度会乘以旧层梯度。如果新添加的层的梯度非常小,那么这种相乘操作会导致底层梯度变得微不足道。这可能会使训练过程受阻。
- Resnet的解决方法是引入了残差连接。残差连接允许信息绕过一些层直接传递到更深的层。这意味着即使新添加的层梯度很小,底层仍然可以获得足够大的梯度,因为信息可以通过跳跃连接传播,而不必等待所有层完成。这有助于解决靠近数据端的层的梯度消失问题,无论网络有多深。
- 希望这个解释有助于理解Resnet是如何应对梯度消失问题的。如果您有任何进一步的问题,请随时提出。