CS231N Lecture10&11 训练技巧

Rongying Liu 课程

1.One time setup

1.Activation Function激活函数及其特征

sigmoid函数

类似于“神经放电”,将数字压缩至[0,1]

三个问题:①平滑的地方梯度消失,让学习过程更困难 (最严重的问题)

​ ②其输出一直为正,并不是以零中心对称的。存在非常不稳定的因素。(会导致梯度一直为正/负)–使用小批量梯度,对这些梯度求平均得到最后的梯度,可以解决这个问题

​ ③exp()函数计算成本较高

image

Tanh函数

是sigmoid的变形。

image

ReLU函数

  • 计算效率高
  • 比sigmoid/tanh收缩更快
  • 问题:dead ReLU:当输入为负数,梯度将恒为零;所有输入为负,将无法激活

image

Leaky ReLU函数

这样梯度不会“死去”

image

GELU函数(高斯错误线性单元)

  • 在0左右取值表现好
  • 其流畅度有利于训练
  • 不是单调的 –可能破坏信息

image

总结

image

2.Data Processing 数据预处理与传递

常见操作

  1. zero-centered 零中心
  2. normalization 正则化
  3. decorrelation 去相关:使用协方差矩阵旋转数据云,使数据不相关
  4. whitened data 白化:同时使用去相关和正则化

image

image

总结

常见的操作:

  • 计算图像的mean值, 可以在样本中减去该平均图像
  • 求平均通道,并在每个像素中减去
  • 求通道的平均和三个颜色标准差,减去均值除以标准差。

image

3.Weight Initialization 权重初始化

  1. 小的随机数 —只对小网络有效(最简单的)

image

Activation Statistics 统计数据激活

Xavier Initialization

(思想:让输入与输出的方差相等)

具体实现如下:

(使用tanh函数、如果使用ReLU又会坍缩)

image

推导

如下

image

Kaiming/MSRA Initialization

方差为2/Din

对残差网络没什么用

image

残差网络的初始:(存疑,2024的ppt没有提及

第一层用MSRA初始化,最后一层为零。

image

3.Regularization 正则化策略

L2 regularization

image

Dropout

image

在层内随机使神经元变为0,随机的概率为超参数。

原理:强制网络存在冗余表示;防止共同适应的特征出现;

或者:认为Dropout是对一个共享权重的子集训练,所有子集权重相同

测试时:不drop(使用所有神经元),然后乘以概率,(即得到训练时对应的期望),没有随机性。如下图。

image

A common pattern:Batch Normalization

image

4.Data Augmentation 数据增强

可以扩大训练集,对训练增加随机性。

  • Random Crops and Scales 对图片随机裁剪
  • Horizontal Flips 视角翻转
  • Color Jitter 随机化对比度和亮度,减少对特定颜色通道的依赖
  • Cutout 随机遮挡图像的部分区域,避免过度依赖局部特征,减少过拟合

image

总结

image

2.Training dynamics

5.Learning Rate Schedules 学习率(超参)

①step schedule

从高学习率开始,在选定的点降低学习率。

image

②cosine schedule

只有两个超参数:学习率\alpha和周期T;超参数比step schedule少得多。

半波余弦函数。

image

③Linear schedule

image

④Inverse Sqrt schedule

学习率下降很快,更多时间在低学习率上。

image

⑤constant schedule

使用常数可以让你的模型开始工作。调整学习率是长期工作(提高效率)。

一般在每5or10 个epoch,形成模型检查点,如果梯度爆炸(正确率降低、停止训练)

6.超参数的选择

步骤:

step 1:检查初始损失。(关闭权重衰减)根据损失函数的结构,分析计算随机初始得到的损失。—-(如果与预期不符,则存在bug)

step 2:过拟合小样本。在小样本(5-10个mini batch)上达到100% accuracy。在过程中调整参数如架构(architecture)、学习率、初始权重。(关闭正则化)—-(目的:确保优化过程无误)

step3 :找到让loss迅速下降的学习率。使用上一步的架构、全部的数据、小的权重衰减,在一百次左右迭代中显著下降。

好的尝试选择:1e-1,1e-2,1e-3,1e-4

step4 :建立粗略的超参数网格。通过粗略网格搜索和短期训练(1-5个epoch),快速缩小一个合适的学习率范围,为后续的精细调优(refining grid)做好准备。这一步的目的是确定一个大致的学习率区域

step5 :Refeine grid。在之前粗略选出的学习率范围内,选择更多的学习率值并进行更精细的搜索。延长训练时间到10-20个epoch或更多。

step6 :观察loss曲线以及accuracy曲线。分析如下。

step7 :goto step5.

(分析loss曲线)

  1. 先平滑再下降:–可能需要重新初始化。
  2. 先下降再平滑: –可能是学习率太高,尝试LR decay
  3. 下降时step decay,然后平滑: –LR decay过早

image

image

image

(分析Accuracy曲线)

  • train&val准确率仍上升: 需要更长时间训练
  • train上升,val下降,间隙大且越来越大,发生过拟合: 增强正则化/使用更多训练数据/(少数情况,减少模型大小或容量)
  • train与val间隙很小,没有正确拟合训练数据:扩大模型/减少正则化

image

image

image

其他小技巧

1.查看权重更新幅度与权重幅度的比值。如果太大,说明有错误。

image

3.After training

7.Model Ensembles 模型集合

使用不同模型的集合,以他们结果的平均作为最终结果。通常最终会得到1-2%的改善。

Tips & Tricks:1. 可以保存一个模型多个检查点,而不是训练多个模型。

            1. 使学习率呈周期性变化,在学习率周期性最低点时,保存作为检查点。
            2. Polyak averaging:(在生成模型中常用)使用运行时的模型权重的指数运行平均值,并在测试时使用该值。(方便消除一些迭代产生的噪声)

8.Transfer Learning 迁移学习

方法1: 在特定数据集训练后,去掉最后一层全连接层(FC layer),相当于得到一个特征向量。再根据特征向量建立新关系。

细调(有时能带来较大提升):

  • 先完成预训练,提取特征向量再进行细调。(反向传播,更新权重)
  • 降低学习率,一般调整至原训练的1/10
  • 有时可以将低层次保持不变,减少计算量

image

总结(根据数据集类型,选择更合适的架构):

如果数据集很小,Pretraining+Finetune 更有用。收集更多数据比pretraining更高效

image

9.Distributed Training 分布式训练

“数据并行”

在批处理维度上划分为n个图像,分给不同gpu独立运行,在末尾对梯度求和时合并数据。

10.Large-Batch Training 大批量训练

多块GPU同时训练时:按比例缩放批量、学习率。

image

”学习率热身“(学习率如果一开始过高,容易梯度爆炸)

在初始的0-5000次迭代,学习率从0开始线性增加

image

  • Title: CS231N Lecture10&11 训练技巧
  • Author: Rongying Liu
  • Created at : 2025-01-23 23:15:02
  • Updated at : 2025-01-23 23:44:00
  • Link: https://github.com/Roinnnn11/Roinnnn11.github.io/2025/01/23/CS231N/CS231N-10&11/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments