AlexNet
李沐-AlexNet和卷积基础
ImageNet Classification With Deep Convolutional Neural Networks
俄罗斯人Alex Krizhevsky、Ilya Sutskever和Geoffrey Hinton
2012
在谷歌实习时候见到过这个人,汇报了这个工作。首个真正意义上的深度卷积神经网络
摘要
ImageNet是一个很大的数据集超过1500万张在超过22,000个类别,取其中一部分1000个类
在Imageet上top-1错误率37.5%,top-5错误率17.0% (取出概率最大的前五个类别,如果真实类别在这五个类别中,则预测正确),比第二名好很多
六千万参数和六十五万神经元
五个卷经层,三个全链接层,一个softmax层
创新点
- 使用了大的深的卷积神经网络进行图像分类;去除任何一个卷积层(每个卷积层不超过模型参数的1%)都会导致性能下降,这里发现深度很重要
- 采用了两块GPU进行分布式训练;当时只是一个工程性质的东西,但是现在大模型都开始用。
- 采用了Relu进行训练加速;文章中称为非饱和神经元
- 采用LRN(局部归一化)提高模型泛化能力;
- 重叠池化,充分利用信息,提高精度;
- dropout减少神经元之间的依赖性,提高模型泛化能力;采用了一种最近开发的正则化方法,称为“dropout”,证明非常有效
- 训练策略?
- 使用SGD(随机梯度下降)来训练,每个batch128,动量为0.9,权重衰减为0.0005(防止过 拟合,在损失函数中添加一个惩罚项,对网络的权重进行约束,使其趋向于较小的值);
- 使用方差为0.1 均值为0的分布来初始化权重,用常数1来初始化第二、四、五层卷积和全连 接隐藏层的偏置;
- 学习率初始化为0.1,当验证集的精度不再提高时,将学习率除以10;
创新点讲解
-
那个时候都想做无监督学习,在训练之前进行无标号数据集预热,他做了监督的。
-
提出了非饱和非线性函数:Relu**(Rectified Linear Units,ReLUs)**,f(x) = max(0, x)发现这样训练特别快。之前用的是饱和非线性函数f(x) = tanh(x)或者sigmodf(x) = (1 + e^(-x))^(-1),训练起来速度慢
-
LRN(Local Response Normalization,局部响应归一化):Relu不需要归一化来防止饱和,但依然发现了一种归一化方法来提高模型的泛华能力。LRN对**同一空间位置的不同卷积核(通道)的输出进行归一化,其核心思想是模仿生物神经元中的侧向抑制(Lateral Inhibition)**机制,即激活较强的神经元会抑制周围神经元的响应。就是说卷积并且ReLU之后的图上一个点的所有通道,比如这个点有8个通道的值,这8个值做归一化
-
LRN的作用
-
增强泛化能力
- 通过对局部响应的归一化,抑制较大的激活值,避免某些特征通道主导网络训练。
- 类似Dropout,引入了一定的正则化效果,减少过拟合。在AlexNet时代有效提升了模型性能。
-
促进特征多样性
- 防止所有神经元对相同的特征产生高响应,鼓励网络学习多样化的特征。
-
替代Batch Normalization(BN)的前身
-
在BN被广泛使用之前,LRN是一种常见的归一化方法。但BN的效果更好,因此后续模型(如VGG、ResNet)逐渐弃用LRN。
-
效果不如后续的**Batch Normalization(BN)**稳定。
超参数(n,k,α,βn,k,α,β)需要调优,且对不同的数据集可能敏感。
-
在深层网络中效果有限,现代CNN通常使用BN或Layer Normalization替代。
-
-
1
2
3
4
5
6nn.LocalResponseNorm(
size=5, # 局部邻域大小n
alpha=1e-4,
beta=0.75,
k=2.0
) -
网络结构
1、卷积+池化层(前五层)
AlexNet共有五个卷积层,每个卷积层都包含卷积核、偏置项、ReLU激活函数和局部响应归一化(LRN)模块。
卷积层C1:使用96个核对224 × 224 × 3的输入图像进行滤波,卷积核大小为11 × 11 × 3,步长为4。将一对55×55×48的特征图分别放入ReLU激活函数,生成激活图。激活后的图像进行最大池化,size为3×3,stride为2,池化后的特征图size为27×27×48(一对)。池化后进行LRN处理。这一层卷积结束之后,还需要ReLU和LRN(Local Response Normalization 局部响应归一化)和Max_Pooling(最大池化)
卷积层C2:使用卷积层C1的输出(响应归一化和池化)作为输入,并使用256个卷积核进行滤波,核大小为5 × 5 × 48。第一个、第二个卷积层使用了LRN(局部归一化)。第一个、第二个、第五个卷积层使用了最大池化。
卷积层C3:有384个核,核大小为3 × 3 × 256,与卷积层C2的输出(归一化的,池化的)相连。
卷积层C4:有384个核,核大小为3 × 3 × 192。
卷积层C5:有256个核,核大小为3 × 3 × 192。卷积层C5与C3、C4层相比多了个池化,池化核size同样为3×3,stride为2。
其中,卷积层C3、C4、C5互相连接,中间没有接入池化层或归一化层。
2、全连接层(后三层)
全连接层F6:因为是全连接层,卷积核size为6×6×256,4096个卷积核生成4096个特征图,尺寸为1×1。然后放入ReLU函数、Dropout处理。值得注意的是AlexNet使用了Dropout层,以减少过拟合现象的发生。
全连接层F7:同F6层。
全连接层F8:最后一层全连接层的输出是1000维softmax的输入,softmax会产生1000个类别预测的值。
softmax层
如何对抗过拟合
数据增强
减轻图像数据过拟合的最简单和最常见方法是使用保持标签的转换人为地扩大数据集。我们使用两种不同形式的数据增强:
第一种数据增强形式包括生成图像的平移和水平翻转。我们通过**从256×256图像中提取随机的224×224裁剪(及其水平翻转)**来实现这一点,并在这些提取的裁剪上训练我们的网络。这将我们的训练集的大小增加了2048倍。如果没有这个方案,我们的网络将遭受严重的过拟合,这将迫使我们使用规模小得多的网络。
第二种数据增强形式包括改变训练图像中RGB通道的强度。具体来说,我们对整个ImageNet训练集中的RGB像素值执行PCA。对于每个训练图像,我们添加发现的主成分的倍数,其大小与相应的特征值成比例,乘以从均值为零、标准差为0.1的高斯分布中抽取的随机变量。对图片进行PCA,高维数据转换为低维数据,保留数据中的主要变化方向。在这里,PCA应用于RGB像素值,以找到它们之间的主要方向。
Dropout
以0.5的概率将每个隐藏神经元的输出设置为零。
以这种方式“丢弃”的神经元不会贡献于前向传播,并且不参与反向传播。因此,每次呈现输入时,神经网络会对不同的架构进行采样,但所有这些架构共享权重。这种技术减少了神经元的复杂相互适应,因为一个神经元不能依赖于特定其他神经元的存在。因此,它被迫学习更加健壮的特征,这些特征与其他神经元的许多不同的随机子集一起使用时是有用的。在测试时,我们使用所有神经元,但将它们的输出乘以0.5,这是对由指数多的dropout网络产生的预测分布取几何平均的合理近似。
前两个全连接层中使用了dropout。没有dropout,我们的网络表现出明显的过拟合。dropout大致使收敛所需的迭代次数加倍。
计算层和图大小通道的关系
1. 输入张量的表示
假设输入张量的形状为 (N, C, H, W)(PyTorch格式):
N:Batch Size(样本数量)C:Channels(通道数)H:Height(高度)W:Width(宽度)
2. 卷积层(Convolutional Layer)
卷积层通过滑动窗口(卷积核)对输入进行特征提取,其输出尺寸由以下参数决定:
K:卷积核数量(输出通道数C')F:卷积核大小(F × F)S:步长(Stride)P:填充(Padding)- 每个卷积核会对输入的所有通道进行逐通道卷积,再将结果相加,最终输出一个单通道的特征图。所以3通道图经过64个卷积核之后还是64个,不是64*3个
输出尺寸计算公式
示例
-
输入:
(N, 3, 32, 32)(RGB图像) -
卷积层参数:
K=64, F=3, S=1, P=1 -
输出:
-
输出张量:
(N, 64, 32, 32)
3. ReLU(激活函数)
ReLU(Rectified Linear Unit)不改变张量的尺寸,仅对每个元素进行非线性变换:
ReLU(x)=max(0,x)ReLU(x)=max(0,x)
示例
- 输入:
(N, 64, 32, 32) - 输出:
(N, 64, 32, 32)(尺寸不变)
4. 最大池化(Max Pooling)
池化层用于降采样,减少计算量并增强特征不变性。常用参数:
F:池化窗口大小(F × F)S:步长(Stride)P:填充(Padding,通常为0)
输出尺寸计算公式
示例
-
输入:
(N, 64, 32, 32) -
池化参数:
F=2, S=2, P=0 -
输出:
-
输出张量:
(N, 64, 16, 16)
5. 全连接层(Fully Connected Layer, FC)
全连接层将输入展平(Flatten)后与权重矩阵相乘,其输出尺寸由神经元数量决定:
M:输出神经元数量
计算步骤
- 展平输入:将
(N, C, H, W)转换为(N, C × H × W) - 矩阵乘法:
(N, C × H × W) @ (C × H × W, M) → (N, M)
示例
- 输入:
(N, 64, 16, 16) - 展平后:
(N, 64 × 16 × 16) = (N, 16384) - 全连接层参数:
M=1024 - 输出张量:
(N, 1024)










