0%

训练Tricks

训练小技巧

解决训练稳定性

问题 核心问题 主要技巧
学习率为什么不能始终不变 每一步应该走多远? Scheduler、Warmup
Batch 如何影响梯度 当前梯度到底有多可信? Batch Size、梯度噪声
显存不足时如何模拟大 Batch 放不下更多样本怎么办? Gradient Accumulation
如何防止单次更新失控 极端梯度会不会破坏模型? Gradient Clipping
网络在第一次更新前为何已经可能失败 参数起点为什么重要? Initialization、激活函数、残差连接
深层网络中的特征尺度为何会漂移 中间表示如何保持稳定? BatchNorm、LayerNorm、RMSNorm

前面的就不讲了,也许从梯度下降到优化器会联想到。我详细讲讲最后的三个归一化

归一化

归一化解决以下问题

  • 激活值趋于0或1
  • 不同层的有效学习率失去平衡

一般来说,归一化是,ε的作用是防止除0。但如果我们强制归一化后均值为0,方差为1,模型的表达能力会收到限制,因此需要加入可学习参数

其中γ用于重新调整尺度,β用于重新调整偏移。也就是说我们先把特征拉回容易优化的标准坐标系,再允许模型学习适合任务的尺度和偏移。

不同归一化的区别,就在于如何选取公式中的那组

方法 统计量从哪里计算? 是否依赖 Batch? 是否减去均值? 常见场景
BatchNorm 同一通道在多个样本中的值 CNN
LayerNorm 单个样本内部的一组特征 Transformer、MLP、RNN
RMSNorm 单个样本内部的一组特征 现代 Transformer、LLM

BatchNorm

假设一个Batch中有四个样本,每个样本有三个特征(B=3,D=4):

BN会固定某一个特征维度,跨样本统计均值和方差。如对第一个特征维度:

完整公式为:

一般我们CNN用BN,BN用于归一化通道特征值。因为卷积通道通常可以理解成一种局部特征探测器。某个特征可能倾向于响应边缘、纹理、高频等等。BN将同一个探测器的响应调整到相对稳定的尺度,方便后续网格判断响应是否显著、不同通道之间如何组合、哪些特征值的放大或一致。

LayerNorm

对于自回归模型而言,推理可能逐Token进行,从而Batch size也会变化。同时一个Token往往不依赖于其他样本。这推动了LN的使用

LN不再跨样本统计,而是在每一个样本内部,对一整组特征计算均值和方差。这样就避免了对Batchsize的依赖,同时使训练样本之间不再因为归一化而发生耦合。

假设一个样本具有特征向量

LN会计算这个样本自身的均值和方差

然后归一化

LN通常在Transformer中使用。因为对于Trans,单个Token的隐藏向量可以写成,不同维度并不一定对应像CNN通道那样稳定、局部、可直接跨图片比较的滤波器响应。并且序列模型常常不同句子长度不同,Batchsize动态变化,单个样本需要独立处理。LN可以消除Token不必要的整体偏移和尺度差异,使网络更关注维度之间的相对结果。比如说[100,102,98]和[1.00,1.02, 0.98]。

RMSNorm

相比LN,RMSN只除以均方根。

对很多 Transformer 模型而言,控制向量长度已经足以改善优化;将均值严格搬回零点未必是必要条件。

EMA

EMA观察模型在训练过程中的参数轨迹,并额外维护一份更加平滑的权重。

假设当前正常训练的模型参数为$\theta_t$,EMA模型参数为,EMA衰减系数为β(0到1)。每次完成参数更新后,EMA权重执行

一般设置默认衰减值为0.999。这个β控制的是EMA模型的记忆长度,设置为0.999相当于能够记忆1000步。注意和Adam中的EMA区分,Adam会维护一/二阶矩估计的EMA,属于优化器内部的梯度统计,而Model EMA数据模型权重统计

我记得计网里面,TCP那一块有个参数的计算的思想就和这个很像。是哪个等我想起来了再写

解决泛化性

避免特征共适应

Dropout

假设某一层输出

训练时随机生成一个掩码

使用逐元素相乘,那么部分特征会被置0

但需要注意的是,Dropout需要除以保留概率,这样

激活值的期望保持不变

Droppath

直接丢弃整条残差分支,整个block输出为零,通过恒等分支x传播。

Mixed-based Data Augmentation

这类数据增强特点是,不仅改变输入图片,还会同步改变标签。它会主动构造训练集中不存在的新样本,并未它生成新的监督信号。这种限制模型在训练样本之间的行为,使决策边界更加平滑

Mixup

随机选取两个样本,再从beta分布中采样一个混合系数$\lambda$,随后构造新样本

新的标签为

Mixup不要求生成看起来真实的图片,而是约束模型

也就是说输入发生平滑变化的时候,输出也不应突然跳变。它鼓励模型在训练样本至今啊形成简单的线性行为,有利于泛化能力提升。

但由于这回破坏自然图像原本的局部结构,所以对于普通分类可能有效,但对于强调局部特征的任务,未必是最合理的增强方式

CutMix

CutMix解决了上述破坏自然图像原本的局部结构的问题,只交换局部区域。它从一张图像中裁剪一个矩形区域,粘贴到另一张图片上;标签则按照区域面积比例进行混合。

这个方法会迫使模型不要过度依赖某一个最显著区域,必须要有更多局部证据和更完整的目标结构

但问题在于这个标签的比例计算。一个类别的判别信息不等同于图片面积,而在于语义比例。

snapmix

这个方法主要面向细粒度识别任务,使用Class Activation Map来减轻按像素面积分配标签造成的噪声。

相对于Cutmix,Snap按语义贡献分配标签

其借助CAM,得到模型主要依赖图片中的哪些区域进行判断。Snapmix将CAM归一化,使全部空间位置的值之和为1。这个归一化后的图称为SPM。然后通过区域内的SPM值求和估计区域的语义比例。

需要注意的是,此时两个图的标签权重加起来不一定是1了。然后还有一个 有点就是粘贴到目标图不一定是固定原图大小。

解决实验不可靠