CNN发展总结
正在学习李沐老师的d2l课程,梳理一下提到的几个标志性的CNN的逻辑以及发展的逻辑。
¶1 LeNet
LeNet是最早的卷积神经网络,引入了卷积层、池化层等等。其架构如下:
那时的汇聚层、激活函数还是AvergePool和Sigmoid/Tanh,并非后来实践表明表现更好的ReLU和MaxPooling。
¶2 AlexNet
与LeNet思路类似,在imageNet比赛中取得了不错的成绩,证明了更深更大的模型可以有非常好的效果
- 更深的模型层数
- 卷积通道数目巨大,卷积窗口更大
- 激活函数从Sigmoid/Tanh改成ReLU
- 通过Dropout全连接层控制模型复杂度
- 使用大量增强数据:翻转、裁切、变色
其架构如下:
¶3 使用块的网络(VGG)
在AlexNet的实现中,我们可以意识到两件事:
- 更深更大的神经网络确实可以有更好的效果
- 有很多层的组合(例如卷积层+池化层)反复出现
因此为了方便构建模块化地构建更大的网络,我们可以将一系列“层”定义一个“块”,以“块”为基本单位之一构建网络。
¶4 网络中的网络(NiN)
VGG把神经网络的规模做得非常巨大,但是此时又暴露出了内存/显存占用巨大的问题——尤其是卷积层之后的第一个全连接层,因输入输出的维度都巨大,参数的数量也巨大。
为了改善存储占用的问题,NiN网络中使用了使用NiN块与GAP层。
- NiN块中使用了1$\times$1的卷积层,相当于通道维度的全连接层,不仅可以减少参数量,而且可以减少过拟合
- Global Average Pooling (GAP)层被用来代替全连接层,减少了存储的参数的数量
¶4 含并⾏连结的⽹络(GoogLeNet)
有了NiN之后,我们有了控制网络总参数量的工具。由此,我们可以构建更深、更复杂的网络。
GoogLeNet的想法很自然:
- 在我们构建了足够强大的线形网络之后,我们也可以构建一些并行的有分支的网络
- 在纠结要用哪一种卷积参数的时候,我们可以选择全都要
GoogLeNet也借鉴了NiN网络:
- 使用了1$\times$1的卷积网络降维通道
- 使用GAP层,代替全连接层
- 在深度的维度上拼接,实现了并行输出的整合
首先定义了一个Inception块
其中白底的仅仅是用于调整深度,深紫底的才是实际提取特征的层。
由此可以构建出GoogLeNet
#
¶5 残差网络(ResNet)
- 超深神经网络存在两大挑战:
- 参数量庞大,计算和存储开销大。
- 深度增加导致梯度消失/梯度爆炸,训练困难。
前者在前面的模型中已经解决,后者ResNet可以解决。
ResNet的核心思想如下:
- 更复杂的网络应包含原有的更简单网络,保证性能至少不劣于浅层网络。
- 引入残差函数 $F(x) = f(x) - x$,将学习目标改写为:$f(x) = F(x) + x$
残差函数的作用主要想概括为以下两点:
-
保证“性能不劣于浅层网络”
- 当 $F(x) = 0$ 时,网络输出即退化为恒等映射 $y = x$
- 网络可以在恒等映射附近开始学习,使训练更容易
- 如果$F(x)$对于结果不好,那$F(x)$拿不到梯度,还是在0附近
-
梯度传递优势
- 前向传播时,恒等映射提供了直接捷径
- 反向传播时,梯度可以沿 $+x$ 这条捷径无衰减地传回,缓解梯度消失问题
ResNet最大的挑战是:相加的时候捷径的形状不同。
-
通道数量不同
通过增加$1\times1$卷积层来控制通道数
-
维度不同
通过卷积核为1,有stride的卷积层来控制维度
ResNet基本结构的图示如下:
¶6 稠密连接网络(DenseNet)
DenseNet 继承了ResNet的思想,将其进一步发展。
如果说ResNet是泰勒展开的一阶近似,那DenseNet就是高阶近似。DenseNet讲更多的过往的层传到现在的结果。
DenseNet主要由两种块构成:
-
稠密块
大量旁路,为了将这么多结果整合在一起,DenseNet像GoogLeNet一样,在通道维度把结果拼接起来。
-
过渡块
经过稠密块后通道数巨大,因此使用$1\times1$卷积层减小通道数,使用平均汇聚层减小维数。