CS231n Lecture 6 Note

1891 字
9 分钟
CS231n Lecture 6 Note

See: Convolutional Networks

CNN Architectures#

归一化层 (Normalization Layers)#

  • 核心思想:计算输入数据的均值(Mean)和标准差(Std),将数据归一化为标准正态分布,然后再乘以可学习的缩放参数(Scale,γγ)和加上平移参数(Shift,ββ)。
  • 区别:所有的归一化层都在做上述操作,唯一的区别在于它们是基于哪些数据来计算均值和标准差的
    • LayerNorm (层归一化):对单个样本的所有通道、高、宽计算均值和标准差。在 Transformer 中最常用。
    • BatchNorm (批归一化):对整个 Mini-batch 内的单个通道计算均值和标准差。在 CNN 中最常用。
    • Nomalization
      Nomalization

Dropout (正则化技巧) 11<23>#

  • 训练阶段:在每次前向传播时,随机将一部分神经元的输出置为 0(通常概率p=0.5p=0.5),同时,这部分归零的神经元的梯度就不用再算了。
    • 为什么有效? 它迫使网络学习冗余的特征表示,防止模型过度依赖某几个特定的特征(比如,不能只靠“有耳朵”和“有毛”就判断是猫),从而提升泛化能力,防止过拟合。
      image.png
      image.png
    • 另一种解释:Dropout 正在训练一个(共享参数的)大型模型集合。
      image.png
      image.png
  • 测试/推理阶段:不丢弃任何神经元,所有输出都保留。但是,为了保持数值期望与训练时一致,必须将所有输出乘以保留概率pp
    image.png
    image.png

Summary#

""" Vanilla Dropout: Not recommended implementation (see notes below) """
p = 0.5 # probability of keeping a unit active. higher = less dropout
def train_step(X):
""" X contains the data """
# forward pass for example 3-layer neural network
H1 = np.maximum(0, np.dot(W1, X) + b1)
U1 = np.random.rand(*H1.shape) < p # first dropout mask
H1 *= U1 # drop!
H2 = np.maximum(0, np.dot(W2, H1) + b2)
U2 = np.random.rand(*H2.shape) < p # second dropout mask
H2 *= U2 # drop!
out = np.dot(W3, H2) + b3
# backward pass: compute gradients... (not shown)
# perform parameter update... (not shown)
def predict(X):
# ensembled forward pass
H1 = np.maximum(0, np.dot (W1, X) + b1) * p # NOTE: scale the activations
H2 = np.maximum(0, np.dot(W2, H1) + b2) * p # NOTE: scale the activations
out = np.dot (W3, H2) + b3

激活函数 (Activation Functions) 17<00>#

  • Sigmoid:由于在非常大或非常小的值处,梯度几乎为0,会导致梯度消失 (Vanishing Gradients) 问题,现代 CNN 中已很少在隐藏层使用。
    image.png
    image.png
  • ReLU:解决了正数区域的梯度消失问题,计算速度快。但负数区域梯度为 0(死 ReLU 问题)。
    image.png
    image.png
  • 现代激活函数 (GELU, SELU):在 0 附近更加平滑,负数区域有微小的梯度。GELU(高斯误差线性单元)是目前 Transformer 模型的标配。
    image.png
    image.png

Where to activate#

  • Generally placed after linear operators (feedforward/linear layer, convolutional layer, etc.)

经典的 CNN 架构 (CNN Architectures) 22<31>#

image.png
image.png

AlexNet#

  • 历史地位:引爆了现代深度学习。首次证明了“更深的网络 + 卷积 + GPU”能在计算机视觉中取得统治级表现。
  • 特点:相比早期网络结构更大、更深,并首次大量叠加卷积层(而不是每个卷积层后必跟池化层)。

VGGNet#

  • image.png
    image.png
  • 大量使用 3x3 卷积核,步长为1,填充为1。
    • 为什么不用一个大的 7x7,而用三个 3x3 堆叠?
    • 原因:三个 3x3 卷积层的感受野(Receptive Field) 等于一个 7x7,但 3x3 的堆叠不仅参数量更少,而且包含了 3 次 ReLU 激活,非线性表达能力更强 (见cs231n_lec_5)。

GoogLeNet#

  • 核心创新 1:Inception Module。通过并行的不同大小的卷积核(如 1x1, 3x3, 5x5),让网络自己学习当前层应该用多大的感受野。
  • 核心创新 2:抛弃了全连接层 (FC Layers)。引入了全局平均池化 (Global Average Pooling) 直接代替了网络末端的巨大 FC 层。这使得它的参数量极小(仅有 400万参数,而同期的 AlexNet 有 6000万,VGG 有 1.4亿!),大大减少了过拟合风险。

ResNet (残差网络)#

  • 里程碑式的架构。
    image.png
    image.png
    • 痛点:研究发现,无脑加深网络(如 56 层)会导致训练误差和测试误差都变高。这不是过拟合(因为训练误差也高),而是优化难题(梯度难以传导,深层网络连浅层网络的性能都达不到)。
      image.png
      image.png
    • 解决方案:引入残差连接 (Residual Connection, F(x)+xF(x)+x)。也就是把前面的输入xx直接“短路”跳跃连接到后面。
      image.png
      image.png
    • 直觉:网络只需要学习残差F(x)F(x),如果某一层不需要学东西,它的权重很容易变成 0,输出直接等于xx(恒等映射)。这彻底解决了深层网络难以优化的痛点,使得训练 100+ 层网络成为可能。

权重初始化 (Weight Initialization) 42<21>#

  • 如果权重初始化太小(如乘以 0.01),每一层的激活值会趋近于 0。
    image.png
    image.png
  • 如果权重初始化太大(如乘以 0.05),激活值会呈指数级爆炸。
    image.png
    image.png
  • Kaiming 初始化 (Kaiming Initialization):由何恺明(ResNet 作者)提出。公式为2/输入维度\sqrt{2/输入维度}。这能保证在使用 ReLU 时,每一层激活值的方差保持稳定。是目前 CNN 的默认初始化方法。
    image.png
    image.png

数据预处理与数据增强 (Data Prep & Augmentation) 49<28>#

  • 预处理:对 RGB 图像,减去均值,除以标准差。通常直接使用 ImageNet 数据集统计出的均值和标准差(即使你不用ImageNet训练)。
norm_pixel[i,j,c] = (pixel[i,j,c] - np.mean(pixel[:,:,c])) / np.std(pixel[:,:,c])
  • 数据增强 (Data Augmentation):通过在训练时随机改变图像,扩大数据集,防止过拟合。
    • 水平翻转 (Horizontal Flip):适用于日常物体(猫、狗),不适用于文字识别。
      image.png
      image.png
    • 随机裁剪与缩放 (Random Resized Crop)最常用。随机缩放短边,然后截取 224x224 的图像。
    • 测试时增强 (Test Time Augmentation, TTA):在测试时,把同一张图片裁剪出多个版本(中心、四角、翻转),分别预测后取平均,可以提升 1%~2% 的准确率。
      image.png
      image.png
    • 颜色抖动 (Color Jitter):随机改变亮度、对比度。
      image.png
      image.png
  • Cutout
    • Training: Set random image regions to zero
    • Testing: Use full image
      image.png
      image.png

迁移学习 (Transfer Learning) 58<23>#

在现实中,我们很少有像 ImageNet 那样上百万的数据,也很少从零(From Scratch)开始训练模型。

  • 如何做? 下载一个在巨型数据集上预训练好的模型(如 ResNet)。
  • 场景 1(数据量极少):冻结(Freeze)网络前 99% 的层(把它们当做特征提取器),只把最后一层换成你需要的类别数,仅训练最后一层的线性分类器
  • 场景 2(数据量较多)微调 (Fine-tuning)。用较小的学习率,重新训练整个网络的所有层。这是目前业界最主流的做法。
    image.png
    image.png
  • Strategy:
very similar datasetvery different dataset
very little dataUse Linear Classifier on final layerTry another model or collect more data :(
quite a lot of dataFinetune all model layersEither finetune all model layers or tarin from scratch!

超参数调优与 Debug 技巧 (Hyperparameter Tuning) 1:07<21>#

  • 黄金 Debug 技巧:在开始写大循环前,先拿一个极小的数据集(比如 1 张或 10 张图片)去训练,看看模型能不能“过拟合”到 Loss 为 0。如果做不到,说明你的代码有 bug,或者学习率错得离谱。
    image.png
    image.png
  • 调参策略:不要用网格搜索(Grid Search,遍历所有组合),应该用随机搜索(Random Search)。因为不同的超参数重要性不同,随机搜索能在重要的超参数维度上探索更多的可能性。
    image.png
    image.png
  • 看懂曲线:如果 Training Loss 一直下降,但 Validation Loss 停滞或上升,说明过拟合了(需要加正则化或数据);如果两者都很高且接近,说明模型没学好,可以继续训练或加大模型。
    image.png
    image.png

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

CS231n Lecture 6 Note
https://molju.com/posts/cs231nlec6/
作者
molju
发布于
2026-07-31
许可协议
CC BY-NC-SA 4.0

评论区

分类
标签
最新动态