CS231N Lecture10&11 训练技巧
1.One time setup
1.Activation Function激活函数及其特征
sigmoid函数
类似于“神经放电”,将数字压缩至[0,1]
三个问题:①平滑的地方梯度消失,让学习过程更困难 (最严重的问题)
②其输出一直为正,并不是以零中心对称的。存在非常不稳定的因素。(会导致梯度一直为正/负)–使用小批量梯度,对这些梯度求平均得到最后的梯度,可以解决这个问题
③exp()函数计算成本较高

Tanh函数
是sigmoid的变形。

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

Leaky ReLU函数
这样梯度不会“死去”

GELU函数(高斯错误线性单元)
- 在0左右取值表现好
- 其流畅度有利于训练
- 不是单调的 –可能破坏信息

总结

2.Data Processing 数据预处理与传递
常见操作
- zero-centered 零中心
- normalization 正则化
- decorrelation 去相关:使用协方差矩阵旋转数据云,使数据不相关
- whitened data 白化:同时使用去相关和正则化


总结
常见的操作:
- 计算图像的mean值, 可以在样本中减去该平均图像
- 求平均通道,并在每个像素中减去
- 求通道的平均和三个颜色标准差,减去均值除以标准差。

3.Weight Initialization 权重初始化
- 小的随机数 —只对小网络有效(最简单的)

Activation Statistics 统计数据激活
Xavier Initialization
(思想:让输入与输出的方差相等)
具体实现如下:
(使用tanh函数、如果使用ReLU又会坍缩)

推导
如下

Kaiming/MSRA Initialization
方差为2/Din
对残差网络没什么用

残差网络的初始:(存疑,2024的ppt没有提及)
第一层用MSRA初始化,最后一层为零。

3.Regularization 正则化策略
L2 regularization
Dropout

在层内随机使神经元变为0,随机的概率为超参数。
原理:强制网络存在冗余表示;防止共同适应的特征出现;
或者:认为Dropout是对一个共享权重的子集训练,所有子集权重相同。
在测试时:不drop(使用所有神经元),然后乘以概率,(即得到训练时对应的期望),没有随机性。如下图。

A common pattern:Batch Normalization

4.Data Augmentation 数据增强
可以扩大训练集,对训练增加随机性。
- Random Crops and Scales 对图片随机裁剪
- Horizontal Flips 视角翻转
- Color Jitter 随机化对比度和亮度,减少对特定颜色通道的依赖
- Cutout 随机遮挡图像的部分区域,避免过度依赖局部特征,减少过拟合

总结

2.Training dynamics
5.Learning Rate Schedules 学习率(超参)
①step schedule
从高学习率开始,在选定的点降低学习率。

②cosine schedule
只有两个超参数:学习率\alpha和周期T;超参数比step schedule少得多。
半波余弦函数。

③Linear schedule

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

⑤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曲线)
- 先平滑再下降:–可能需要重新初始化。
- 先下降再平滑: –可能是学习率太高,尝试LR decay
- 下降时step decay,然后平滑: –LR decay过早



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



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

3.After training
7.Model Ensembles 模型集合
使用不同模型的集合,以他们结果的平均作为最终结果。通常最终会得到1-2%的改善。
Tips & Tricks:1. 可以保存一个模型多个检查点,而不是训练多个模型。
- 使学习率呈周期性变化,在学习率周期性最低点时,保存作为检查点。
- Polyak averaging:(在生成模型中常用)使用运行时的模型权重的指数运行平均值,并在测试时使用该值。(方便消除一些迭代产生的噪声)
8.Transfer Learning 迁移学习
方法1: 在特定数据集训练后,去掉最后一层全连接层(FC layer),相当于得到一个特征向量。再根据特征向量建立新关系。
细调(有时能带来较大提升):
- 先完成预训练,提取特征向量再进行细调。(反向传播,更新权重)
- 降低学习率,一般调整至原训练的1/10
- 有时可以将低层次保持不变,减少计算量

总结(根据数据集类型,选择更合适的架构):
如果数据集很小,Pretraining+Finetune 更有用。收集更多数据比pretraining更高效。

9.Distributed Training 分布式训练
“数据并行”
在批处理维度上划分为n个图像,分给不同gpu独立运行,在末尾对梯度求和时合并数据。
10.Large-Batch Training 大批量训练
多块GPU同时训练时:按比例缩放批量、学习率。

”学习率热身“(学习率如果一开始过高,容易梯度爆炸)
在初始的0-5000次迭代,学习率从0开始线性增加。

- 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.