Candlest 的博客

Back

AlexNet-flowerBlur image

前言#

创新实践课程着实是一门大水课,但是沈力老师着实是一位很有激情的老师。

虽然这是一门水课,但是我记起来一句话,记得是大一在华工转专业群的一位学长口中听到的:

水课的意义就是让你知道有这么一个东西。

那好,我现在正缺少深度学习的密集实践。借助这门课的机会,尝试在实践中让枯燥漂浮的理论变得生动接地气起来。

AlexNet 如何让 NN 再次伟大#

人工特征统治了世界太久,却没有人发掘 GPU 里面日益增长的算力的价值。AlexNet 用扎实的工程功底针对「让一个超大网络能被训练」这个问题做了很多创新的模型设计,并运用了很多训练技巧。

AlexNet 证明了“深度 + 数据 + 计算”,后续工作只是不断逼近这个范式的极限。

模型总览#

在最初的 AlexNet 论文1里面,网络结构是基于 LeNet 并妥协了当时尚未成熟的 DNN 软硬件件环境(比如卡均显存很小,只有原始的 CUDA C++ 加速库)而设计的。AlexNet 的网络结构如下图所示2

alex2012

由于历史时代限制,AlexNet 的网络结构设计中包含了很多妥协/在今天看来多余、不必要的设计,比如:

  • 11×1111 \times 11 大卷积 + stride=4stride=4
  • LRN(局部响应归一化)
  • 分组卷积(因为单卡放不下)
  • 强依赖 FC(4096×24096 \times 2
  • 手写 CUDA 实现

在不需要为软硬件做出大量妥协的今天,AlexNet 被深度学习界的前辈们还原成了一个「干净的 CNN baseline」:

LeNet(左)到AlexNet(右)¶

也就是经典的:(Conv+Pool)×2+Conv×3+FC×3(Conv + Pool) ×2 + Conv ×3 + FC ×3 两层 Conv → ReLU → Pool 构成了特征提取器,三层 FC → ReLU 构成了分类器。

Input
→ Conv1 → ReLU → MaxPool
→ Conv2 → ReLU → MaxPool
→ Conv3 → ReLU
→ Conv4 → ReLU
→ Conv5 → ReLU → MaxPool
→ Flatten
→ FC → ReLU → Dropout
→ FC → ReLU → Dropout
→ FC → Softmax
plaintext

Modernized AlexNet¶

特征提取器#

在输入进入 pipeline 的前期,经过了两层 Conv → ReLU → Pool 结构,其中:

  • Conv 的作用是提取局部特征,保留位置信息。
  • ReLU 的作用是引入非线性,具有非线性激活函数的网络可以逼近任意连续函数3
  • Pool 的作用是降低特征图的分辨率(下采样),模糊位置信息,减少计算量,也就是信息压缩。

分类器#

丰富的多频道特征在 pipeline 的中期(flatten)被压缩成了一个一维的特征向量,进入了后续的三层 FC → ReLU 结构,开始逐步降维。

MLP 理论上有能够学习任何函数的能力,在这里三层恰好是一个平衡表现能力和计算效率(收敛难度)的选择。

这里在 FC 层后面还加了 Dropout 正则化,来防止过拟合。(后面会介绍 Dropout 的原理和作用)

pipeline 可视化#

为进一步观察最优模型的中间表征与判别区域,选取验证集中的一张 daisy 样本,对最优权重 augment_weight_decay 进行特征图与 Grad-CAM 可视化。该样例最终预测类别为 daisy,预测置信度为 1.0000。

最优模型对 daisy 样本的中间层特征图可视化

上图展示了输入图像以及 5 个卷积层中激活最强的部分通道。该可视化反映了 AlexNet 从浅层局部纹理到深层高阶语义表征的逐级抽象过程,也说明最优模型在该样本上能够形成较稳定的层级特征响应。

Grad-CAM

Grad-CAM 作用于最后一层卷积层 features.10,用于展示分类决策对应的空间响应区域。结合该样例被正确分类为 daisy 的结果,可以看出该可视化为模型判别依据提供了直观解释,有助于从单样本层面补充对模型可解释性的观察。

ReLU:让模型更快收敛#

当时业界普遍使用的激活函数是 sigmoidsigmoidtanhtanh4,AlexNet 首次在深度卷积网络中使用了 ReLU 激活函数5,并且证明了它能够让模型更快地收敛

relu

从「传统饱和神经元」到 ReLU,有以下几个好处:

  1. ReLU 的计算量更小。
  2. 有效地应对了梯度消失问题(因为 ReLU 在大于零时梯度恒为 1),模型训练时鲁棒性更强。

正则化#

AlexNet 是一个有 60M 参数的大模型,训练数据只有 1.2M 张图片,过拟合是一个非常严重的问题。为了限制过拟合,AlexNet 在模型设计中引入了很多正则化方法。

机器学习里,「正则化」不是某个具体操作,而是一类方法,核心目标是限制模型的过拟合,提高泛化能力。典型做法包括:

  • L2(weight decay):通过训练超参数,限制参数大小
  • L1:鼓励稀疏
  • 数据增强:增加训练分布(稍后介绍 AlexNet 的做法)
  • 早停:限制训练时间
  • Dropout:随机丢弃神经元

Dropout#

在每一次迭代中,对某全连接层,Dropout通过修改神经网络的结构实现按一定概率将神经元置为0,该神经元不参与前向和反向传播,等同于被删除,此时网络结构不变。

Dropout

Dropout 的作用:

  1. 打破 co-adaptation,耦合的、脆弱的表示。
  2. 等价于模型集成(集成学习),每次 dropout 相当于在训练一个「子网络」。

数据增强#

这句话第二次重复「AlexNet 是一个有 60M 参数的大模型,训练数据只有 1.2M 张图片,过拟合是一个非常严重的问题。」

Dropout 是从模型的参数入手增加鲁棒性,数据增强则是从训练数据入手增加鲁棒性。AlexNet 论文中使用了两种数据增强方法:空间变换和颜色扰动。

空间变换:裁剪、翻转#

训练时,从每张图片中随机裁剪出 224×224224 \times 224 的子图(原图是 256×256256 \times 256),并且随机水平翻转。

(256224)2=322=1024(256 - 224)^2 = 32^2 = 1024 种位置,再乘以水平翻转可以得到 2048 倍数据扩增。

data1

测试时,从原图里裁出 5 个 224×224 的 patch,每一张都做一个水平翻转,得到 10 个 patch,分别输入模型进行预测,最后取平均。

data1.5

可以看作一种提高「平移不变性」的增强方法。

颜色扰动:PCA 光照扰动#

AlexNet 在 RGB 空间做 PCA 分解,沿主成分方向加入随机扰动。

不过它贡献有限(比不上 ReLU / Dropout / GPU),后来也基本没人用,现在被更简单的方法完全替代(color jitter)。

实验实践#

数据增强#

在 AlexNet 为花卉分类的实验中,数据增强的作用非常明显。

train_curve_compare

仅加入数据增强后,验证精度由 0.7637 提升至 0.8159 (+0.0522)。随机裁剪与水平翻转有效扩展了训练样本分布,缓解了模型对训练集细节的过拟合。同时,最佳 epoch 由第 16 轮推迟至第 23 轮,说明模型需要更多轮次适应多样化输入,但最终获得了更好的泛化效果。数据增强是本实验中收益最显著的单一改进措施。

早停#

在实验过程中,发现大部分模型在第 16-23 轮左右就已经达到了最佳验证精度,继续训练反而会过拟合,验证精度开始下降。因此,早停是一个非常有效的正则化方法,同时它还能减少计算资源的浪费。

train

权重衰减#

单独加入 weight_decay=1e-4 后,验证精度从 0.7637 提升至 0.7830,表明权重衰减能在一定程度上抑制参数过大、改善泛化,但收益不及数据增强,说明仅靠参数正则化无法替代样本层面的分布扩展。

进一步在”增强 + 权重衰减”组合下对比不同衰减系数:5e-5 对应 0.8132,1e-4 对应0.8269,2e-4 对应 0.8049。

1e-4 在当前实验范围内效果最优——正则化过弱则抑制过拟合不足,过强则限制模型拟合能力。

学习率调度#

加入余弦退火调度后,验证精度反而从 0.7637 降至 0.7473。这说明学习率调度并非在所有场景下都能带来收益。本实验中固定学习率 2e-4 对 Adam 已较为合适,叠加 cosine 调度后后期学习率下降过快,可能导致模型在尚未充分收敛时便进入过小步长阶段。

Adam v.s. SGD#

将 Adam 替换为 SGD 并保持 lr=2e-4 时,最佳验证精度仅为 0.4615。该学习率对 SGD 而言过 小,导致参数更新缓慢、难以充分收敛。补充实验中将学习率提高后:

  • lr=5e3lr=5e-3:验证精度 0.7610
  • lr=1e2lr=1e-2:验证精度 0.7335

val_acc

结果表明,SGD 低性能的主因是学习率不匹配,而非优化器本身的缺陷。但即便调至更合适的 学习率, SGD 在本实验中仍未超过 Adam 系列方案,因此在当前任务规模与训练预算下, Adam 仍为 更稳妥的选择。

这里需要填坑,后续会学习 Adam v.s. SGD 这些优化器的原理和区别,来分析为什么 Adam 在这个实验中表现更好。


Footnotes#

  1. ImageNet Classification with Deep Convolutional Neural Networks, Alex Krizhevsky, Ilya Sutskever, Geoffrey E. Hinton

  2. 来自原始论文中中的 Figure 2: An illustration of the architecture of our CNN, explicitly showing the delineation of responsibilities between the two GPUs. One GPU runs the layer-parts at the top of the figure while the other runs the layer-parts at the bottom. The GPUs communicate only at certain layers. The network’s input is 150,528-dimensional, and the number of neurons in the network’s remaining layers is given by 253,440–186,624–64,896–64,896–43,264– 4096–4096–1000.

  3. Universal approximation theorem

  4. 定义 sigmoid(x)=11+exsigmoid(x) = \frac{1}{1 + e^{-x}}tanh(x)=exexex+extanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}},它们的输出分别是 (0,1)(0, 1)(1,1)(-1, 1),它们被作者称为「传统饱和神经元」。

  5. Rectified linear units improve restricted boltzmann machines, Vinod Nair, Geoffrey E. Hinton

记使用 AlexNet 进行图像分类的一次实验
https://blog.candlest.cc/blog/ai/alexnet
Author Candlest
Published at 2026年4月7日