《李沐读论文》系列笔记【更新中】
零、如何读论文
读三遍:
1. 第一遍
读完标题和摘要后,直接跳到结论,这几个部分读完就大概知道文章在讲什么东西了,之后还可以看一下正文中的图表,判断一下这篇文章是否适合自己,是否要继续读;
2. 第二遍
按顺序通读一遍全文,了解文章中的图表、方法都在干什么,有什么特点,这期间遇到不懂的细节可以先做标记,之后如果要精读再去研究引用的相关论文。读完之后根据需要选择是否需要精读;
3. 第三遍
精读,读的时候思考如果是我来做我会怎么做,想象自己来实现整篇文章。
一、AlexNet
AlexNet 是深度学习的奠基之作,其精髓在于它首次成功证明了深度卷积神经网络(CNN)在大规模图像识别任务上的卓越性能,并引入或有效推广了几项关键技术和设计理念。
1. 深度网络的可行性
AlexNet 拥有 8 层学习层(5 个卷积层 + 3 个全连接层),这在当时是“非常深”的网络。它在ImageNet上的成功证明了深度网络的可行性;它的架构展示了深度学习的过程就是一个知识的压缩过程,将原始信息的尺寸(size)逐渐压缩,但信息密度(channel)逐渐增大,将人类能看懂的一个个像素压缩成机器能看懂的向量。
AlexNet整体架构
2. ReLu的应用
激活函数使用ReLu而不是当时常用的tanh和sigmoid,发现训练速度要更快。虽然当时认为ReLu更快的原因现在看来都不是很对,但现在仍然流行ReLu,因为它更简单。
3. 多GPU训练
受限于当时 GPU 显存,模型被拆分成两部分,分别在两块 NVIDIA GTX 580 GPU 上并行训练,并在特定层进行通信。这启发了后续更大模型的分布式训练策略。
4. 重叠池化
使用步长 (stride=2) 小于池化窗口大小 (size=3) 的池化操作。相比于传统的非重叠池化 (stride=size),重叠池化能略微提升精度,并有助于减轻过拟合(通过引入轻微的空间平移不变性扰动)。它代表了池化操作的一种优化选择。
5. Dropout的应用
Dropout就是在训练期间,以一定概率(前两个全连接层设为 0.5)随机将神经元的输出置零。在当时人们会采用模型融合(结合多个模型的预测结果)来避免过拟合,但是对于本身就需要数天来训练的深度网络来说成本太昂贵了,所以作者使用了Dropout,认为其效果相当于每次输入就得到一个新模型,等价于模型融合。不过后来的研究发现Dropout更多等价于一个L2正则项。
6. 数据增强
采用图像平移和水平翻转(生成位置和镜像变化)、改变 RGB 通道强度(使用 PCA 对 RGB 像素值进行扰动,模拟光照和颜色变化)等技术来扩充训练数据,利用有限的数据生成更多的训练样本,提高模型的泛化能力,是缓解过拟合的关键且成本低廉的方法。
二、ResNet
ResNet的精髓在于使用了Residual Connection(残差连接)来更好地训练很深的网络,避免了退化问题和梯度消失问题。所谓退化问题指网络较浅时效果好,加深后反而不好,这不合常理,因为如果更深的层次没用,将其设为恒等映射也不至于效果更差。
1. Residual Connection
残差连接就是将浅层的输出跳跃到深层的输出处将两者相加,使网络学习残差映射(F(x) = H(x) - x)而不是目标映射 (H(x))。若最优映射接近恒等变换(H(x) = x),则学习残差 F(x) → 0 比学习完整映射更易优化。
另外残差连接还解决了梯度消失的问题,使得训练更快。梯度消失是指由于反向传播中使用了求梯度的链式法则,如果梯度都是小于1的,连乘之后会接近0导致梯度消失。而残差连接的输出是F(x) + x,其梯度由于加法的存在不会变为0,避免了梯度消失问题。
梯度公式
2. Bottleneck Block
当层数比较深时输入输出的通道数会比较大,这时如果直接计算的话复杂度会比较高,ResNet采用了Bottleneck Block的设计,先使用1*1的卷积对输入进行降维,计算以后再用1*1的卷积对输出进行升维还原回原来的维度,这样可以将复杂度降低到与降维之后的通道数差不多。
Building Block (左) Bottleneck Block (右)