共计 2436 个字符,预计需要花费 7 分钟才能阅读完成。
背景:深度学习革命的起点
2012 年,多伦多大学的 Alex Krizhevsky 等人提出的 AlexNet 以压倒性优势赢得 ImageNet 竞赛(Top- 5 错误率 15.3%,比第二名低 10.8%)。这个 8 层神经网络首次证明:

- 深度卷积神经网络在复杂视觉任务上的可行性
- GPU 加速训练使深层网络成为可能
- ReLU 等新技术显著提升模型性能
网络架构详解
分层结构(输入为 224×224 RGB 图像)
- 卷积层 1 :96 个 11×11 滤波器,步长 4,输出 55×55×96 → MaxPooling(3×3, stride=2)
- 卷积层 2 :256 个 5×5 滤波器,padding=2 → MaxPooling
- 卷积层 3 -5:384/384/256 个 3×3 滤波器,均使用 padding=1
- 全连接层 :4096 → 4096 → 1000(ImageNet 类别数)
关键创新技术
1. ReLU 激活函数
传统神经网络使用 Sigmoid/Tanh,存在梯度消失问题。ReLU($f(x)=max(0,x)$)的实验优势:
| 指标 | ReLU | Sigmoid |
|---|---|---|
| 训练速度 | 6×更快 | 基准 |
| Top- 1 错误率 | 25.8% | 31.5% |
| 收敛迭代次数 | 35 epoch | 50 epoch |
2. 局部响应归一化(LRN)
早期尝试的归一化方法(现多被 BN 替代):
$$ b_{x,y}^i = a_{x,y}^i / (k + α \sum_{j=max(0,i-n/2)}^{min(N-1,i+n/2)} (a_{x,y}^j)^2 )^β $$
- $k=2$, $n=5$, $α=10^{-4}$, $β=0.75$ 为论文参数
- 在相邻通道间做抑制,增强泛化能力
3. Dropout 技术
- 训练时随机丢弃 50% 神经元
- 预测时使用全部神经元但权重减半
- 相当于模型集成,减少过拟合
PyTorch 实现
import torch
import torch.nn as nn
class AlexNet(nn.Module):
def __init__(self, num_classes=1000):
super(AlexNet, self).__init__()
self.features = nn.Sequential(# Conv1 (224->55)
nn.Conv2d(3, 96, kernel_size=11, stride=4, padding=0),
nn.ReLU(inplace=True),
nn.LocalResponseNorm(size=5, alpha=1e-4, beta=0.75, k=2),
nn.MaxPool2d(kernel_size=3, stride=2),
# Conv2 (27->27)
nn.Conv2d(96, 256, kernel_size=5, padding=2),
nn.ReLU(inplace=True),
nn.LocalResponseNorm(size=5, alpha=1e-4, beta=0.75, k=2),
nn.MaxPool2d(kernel_size=3, stride=2),
# Conv3-5 (13->13)
nn.Conv2d(256, 384, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.Conv2d(384, 384, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.Conv2d(384, 256, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=3, stride=2),
)
self.classifier = nn.Sequential(nn.Dropout(p=0.5),
nn.Linear(256*6*6, 4096),
nn.ReLU(inplace=True),
nn.Dropout(p=0.5),
nn.Linear(4096, 4096),
nn.ReLU(inplace=True),
nn.Linear(4096, num_classes),
)
def forward(self, x):
x = self.features(x)
x = torch.flatten(x, 1)
x = self.classifier(x)
return x
数据预处理示例:
from torchvision import transforms
transform = transforms.Compose([transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225])
])
性能分析
CIFAR-10 测试结果(输入 32×32 调整到 224×224)
| 指标 | AlexNet | ResNet-18 |
|---|---|---|
| 准确率 | 78.2% | 94.5% |
| 参数量 | 61M | 11M |
| 训练时间 /epoch | 45s | 28s |
| GPU 显存占用 | 1.8GB | 1.2GB |
显存占用分析
- 主要消耗在第一个全连接层(256×6×6 → 4096)
- 现代网络通常用全局平均池化替代 FC 层
避坑指南
- 全连接层参数爆炸 :
- 原版 FC 层占模型总参数量的 95%
-
解决方案:添加 AdaptiveAvgPool2d(6×6→1×1)
-
LRN 的现代替代 :
- BatchNorm 效果更好且计算量更低
-
示例替换:
nn.LocalResponseNorm → nn.BatchNorm2d -
学习率设置 :
- 初始建议 3e-4(Adam)或 0.01(SGD+momentum)
- 每 30epoch 乘以 0.1
延伸思考
- 历久弥新的设计 :
- ReLU 激活函数的广泛使用
- 卷积 + 池化的基础结构
-
Dropout 在 FC 层的应用
-
小样本改造方向 :
- 减少 FC 层维度(4096→512)
- 添加注意力机制
- 使用预训练权重进行迁移学习
AlexNet 虽已不是 SOTA,但其设计思想仍深刻影响着现代 CNN 架构。理解这些基础原理,能帮助我们在新场景中做出更合理的架构决策。
正文完
