过拟合与正则化
Last updated
现象
训练集效果很好,但是验证集很差,这种现象称为过拟合,表现为高方差。
训练数据不足
数据增强
NLP-EDA
CV-切割、裁剪、旋转
Mixup
对抗训练
训练数据中存在噪声:
交叉验证
集成学习(Bagging)
模型复杂度较高:
正则化项
Dropout
Early Stoping
降低模型复杂度
减少模型参数
使用简单模型
现象
训练集和验证集的效果都很差,这种现象称为欠拟合,表现为高偏差;
特征工程
FM、FFM
集成学习(Boosting)
提高模型复杂度
增加模型参数
使用复杂模型
简单数据增强
NLP(EDA:增删改、替换)
图像(切割、裁剪、旋转等)
数据融合
Mixup
常见的正则化项有 L1、L2 正则项;
参考
L1、L2 正则化的特点与区别:NLP-Interview-Notes/正则化.md at main · km1994/NLP-Interview-Notes
当模型在验证集上的性能开始下降时,提前结束训练;
一般会配合交叉验证来使用;
参考
作用
提升泛化能力,减少过拟合;
原理
Dropout 提供了一种廉价的 Bagging 集成近似(模型平均);
思想
遗传算法,通过随机变异(随机删除神经元),来促使整个种群的进化;
Dropout 在训练和测试时有什么区别?为什么?
训练时,经过 Dropout 的输出值会乘以 $\frac{1}{1-p}$;测试时不会。
经过 Dropout 后,输入 x
的期望输出将变为 p*0 + (1-p)*x = (1-p)x
(p
的可能变为 0,1-p
的可能保持不变);
为了还原未经过 Dropout 的期望值,故需要乘以 $\frac{1}{1-p}$
为什么 Dropout 能防止过拟合?
直观上,Dropout 会使部分神经元失活,减小了模型容量,从而降低了模型的拟合能力;
宏观上,Dropout 提供了一种廉价的 Bagging 集成方法(共享权重);
隐藏单元经过 Dropout 后,必须学习与不同采样的神经元合作,使得神经元具有更强的健壮性(减少神经元之间复杂的共适应关系);
【训练阶段】前向传播时,对每个神经元以概率 p
失活(即乘以 0.
),而其他未失活的单元则乘以 1/(1-p)
(放大)
【测试阶段】使 dropout 失效,即正常使用所有神经元;
[2106.14448] R-Drop: Regularized Dropout for Neural Networks
动机 & 作法
尝试解决 Dropout 在训练与预测时使用不一致的问题;
Dropout 本身不是已经尝试解决了这个不一致问题吗?它的解决方案有什么问题?
Dropout 通过缩放神经元的输出值来缓解训练与预测时不一致的影响。Dropout 的本意是为了得到一个“模型平均”的结果,而这种通过缩放来还原实际上是一种“权重平均”(见 Dropout 的推导),这两者未必等价;
具体来说,Dropout 的正确使用方式应该是预测时打开 Dropout,然后计算多次预测的平均值作为结果;但实际并不是这样使用的。
R-Drop 是怎么解决这个问题的?
通过对同一样本 Dropout 两次,然后加入 KL 散度来保持不同 Dropout 下预测结果的一致性;
KL 散度损失是怎么保证预测一致性的?
交叉熵损失只关注目标类的得分,非目标类的得分不影响最终 loss;相当于训练目标是 “不同 Dropout 下目标类的得分都大于非目标类的得分”。
举例来说 [0.5, 0.2, 0.3]
、[0.5, 0.3, 0.2]
与 [1, 0, 0]
的交叉熵损失是一样的,都是 -log(0.5)
,非目标类的 0.2
和 0.3
都没有起作用;
KL 散度则会关注每一个类别的得分,相当于训练目标是“不同 Dropout 下每个类别的得分一致”
就上例来说,计算 [0.5, 0.2, 0.3]
、[0.5, 0.3, 0.2]
与 [1, 0, 0]
的 KL 散度都会产生非零损失;
参考
per channel per batch
使用场景:CV
前向过程
PyTorch实现
参考
per sample per layer
使用场景:NLP
前向过程
per sample per channel
作用
使用场景:CV 风格迁移
per sample per group
BN 与 LN 的区别
BN 在 batch 维度为归一;
LN 在 feature 维度做归一;
为什么 BN 一般不用于 NLP ?