大模型高效调参策略(下)
调参这件事,说是深度学习的“手艺活”一点也不为过。前面聊了一些基础,接下来我们把剩下的核心技巧逐一拆解。从损失函数到数据验证,每一步都有门道,值得细细品味。
trick 4:关于调参
调参,做笔记是基本功。而且切记:每次只动一个参数,否则出了效果你都不知道功臣是谁,出了问题也找不到元凶。
那么,有哪些参数值得重点调?
4.1 关于 Loss function 调参策略
损失函数,是模型和数据以外第三重要的参数。选MSE、Cross entropy、Focal还是自定义?没有标准答案,得具体问题具体分析。分类任务和回归任务天然不一样,样本不平衡时Focal往往有奇效。
4.2 关于 Learning rate 和 batch size 调参策略
- 学习率和批次大小是两大核心参数,而且它们相互影响——反向传播时直接左右梯度。经验之谈:先定batch size,再调learning rate。
- batch size不能太大,也不能太小,一般设为16的倍数比较稳妥。太小浪费计算资源,太大又吃内存。但有一个例外:表示学习和对比学习领域,batch size越大越好,显存不够就上累计梯度,否则模型可能不收敛。其他领域看情况。
- 微调场景下的learning rate:NLP的BERT类模型通常在1e-5级别附近,配合warmup和衰减;CV类模型在1e-3级别附近,也是衰减。具体数值需要多试几次。
- learning rate的trick不少:cosine学习率、warmup、阶梯衰减……都是实战中常用的手段。
4.3 关于 Epoch number 和 early stopping 调参策略
- Epoch数和Early stopping是孪生兄弟。得盯着loss曲线,看看到底哪个epoch效果最好,及时停住。
- Epoch太大浪费计算,太小又没学到极致。另外一定要搞懂Epoch、Iteration、batch size三者之间的关系——这是基本功。
注:
不要过早early stopping,有时候收敛平台在后半段才出现。
对于数据量巨大的推荐系统模型,一个epoch足矣,再多就过拟合了。
4.4 关于 Optimizer 调参策略
- Adam和SGDM是应用最广的两个优化器。Adam收敛快,SGDM收敛慢但最终精度往往更高。现在很多人先上Adam快速跑,后期切换到SGDM精调。
- 如果非要二选一,那Adam无疑是更稳妥的选择。
注:NLP、抽象层次高或目标函数不平滑的任务,优先用Adam;其他任务可以试试SGD(一般需要的迭代次数多于Adam)。
4.5 关于 Activation function 调参策略
- ReLU、Sigmoid、Softmax、Tanh是最常用的四个激活函数。
- 输出层常用Sigmoid和Softmax,中间层首选ReLU,RNN类则多用Tanh。
4.6 关于 Weights initialization 调参策略
- 预训练参数是最好的初始化方式,没有之一。其次是Xa vier初始化。
4.7 关于 Regularization 调参策略
- Dropout思想简单,但效果出奇好。现在大部分任务都用预训练模型,模型内部的dropout ratio是个重要参数。首选0.5,但默认值不一定最优——有时候把dropout重置为0,反而有奇效。
4.8 关于 Validation 调参策略
- 在验证集上筛选模型参数时,除了观察loss,还可以设置某种规则,引导模型朝特定方向更新参数。
trick 5:模型训练过拟合和欠拟合问题?
过拟合和欠拟合是训练中绕不开的两个坎,直接影响模型的泛化能力——也就是在未见数据上的表现。
5.1 欠拟合(Underfitting)
- 判断:欠拟合时,模型连训练数据的底层模式都抓不住,训练和测试表现都不行。
- 原因:模型太简单,表达不了数据中的复杂关系。典型迹象是训练误差和验证误差都高,而且两者很接近。
- 解决手段:
- :加层、加节点,或者换更复杂的结构。
增加模型复杂度
- :引入更多相关特征,帮助模型理解数据。
增加特征
- :优化学习率、批次大小等超参数。
调整模型参数
- :如果正则化太强导致欠拟合,就适当降低。
减少正则化强度
5.2 过拟合(Overfitting)
- 危害:训练误差极低,验证误差却很高——模型把噪声和偶然特性都学进去了。
- 原因:模型在训练数据上表现过于优秀,却无法泛化到新数据。
- 解决手段:
- :更多样本能帮助模型学到真实分布。
增加训练数据
- :L1/L2正则化,限制参数大小。
正则化
- :验证集性能不再提升时及时停止。
早停法(Early Stopping)
- :K折交叉验证,更准确地评估模型。
交叉验证
- :随机丢弃神经元,减少对特定样本的依赖。
Dropout
- :通过变换生成更多样本来提升泛化能力。
数据增强
- :减少层数或节点数,避免不必要的复杂度。
简化模型
从实践经验来看:过拟合首先上dropout,然后加batch norm。过拟合越严重,dropout和BN就加得越多。有时候直接在embedding层加dropout,会有预料之外的效果。
trick 6:模型参数初始化方法
Linear/CNN常用Kaiming uniform或normalize,Embedding常用截断normalize。相关论文很多,可以深入看看。
trick 7:Normalization 选择问题
GN、BN和LN都是神经网络中常用的归一化方法。BN指Batch Normalization,LN指Layer Normalization。
- BatchNorm:在batch维度做归一化,计算N*H*W的均值。
- LayerNorm:在channel维度做归一化,计算C*H*W的均值。
- InstanceNorm:在单个channel内做归一化,计算H*W的均值。
- GroupNorm:先将channel分组,然后在每组内做归一化,计算(C//G)*H*W的均值。
GN与LN、IN有密切关系,这两者在循环网络(RNN/LSTM)和生成网络(GAN)中尤其成功。
- 选择策略:序列输入用LN,非序列输入用BN。
trick 7:模型输出层选择问题
基于backbone构建层次化的neck,通常比直接使用最后一层输出效果好。reduce function方面,attention通常优于简单pooling。多任务场景需要构建不同的QKV。
trick 8:随机数种子设定问题
随机数种子一定要设定好,否则很多对比实验的结论可能并不准确。
trick 9:cross validation问题
交叉验证方式要结合具体任务和数据标签设计。时序数据务必避免未来信息泄漏。
trick 10:新模型开发前期问题
开发新模型时,最开始不要加激活函数、不加batch norm、不加dropout——纯模型先跑通。然后再一步一步加组件,验证每个改动的作用。不要迷信经典结构(除非是预训练模型),比如觉得加了dropout一定有效、加了BN一定有提升就一股脑全加上。首先要判断模型处于欠拟合还是过拟合阶段,再对症下药。
trick 11:badcase 分析问题
对于图像和NLP任务,如果效果一直提不上去,可以尝试自己标注一些模型经常分错的bad case,加入训练集后往往会有意想不到的收获。
-
- 关于宇宙的好的网名有哪些
- 角色扮演 | 1
- 网名