1.gradient_accumulation_steps: 梯度累积步数(显存不够时扩大有效 batch)
①作用:
在资源受限(如显存不足)的情况下,用于模拟更大的批次大小(batch size)
它允许将一个大批次(effective batch size)拆分成多个小批次逐步计算梯度,然后累加这些梯度后再更新模型参数
②工作原理
假设:
- `per_device_train_batch_size = 4`(每个设备上的批次大小)
- `gradient_accumulation_steps = 8`
那么:
- 模型会连续处理8次小批次(每次4个样本),累积每次小批次的梯度。
- 总的**有效批次大小(effective batch size)** = `per_device_train_batch_size × gradient_accumulation_steps = 4 × 8 = 32`。
- 在累积了8次小批次的梯度后,优化器才执行一次参数更新(即一步梯度下降)。
2.max_grad_norm 梯度裁剪阈值(防止梯度爆炸)
①作用
防止梯度爆炸:在深度神经网络(尤其是RNN或Transformer等复杂模型)中,梯度可能会变得非常大,导致参数更新过大,模型训练不稳定甚至发散。`max_grad_norm`通过限制梯度范数来缓解这个问题。
稳定训练:裁剪梯度可以使优化过程更平滑,尤其是在训练大模型或处理不平衡数据时。
控制更新幅度:通过限制梯度的大小,间接控制每次参数更新的步长,避免模型陷入不稳定的优化区域。
②使用场景
大模型训练:如BERT、GPT等大型语言模型,梯度爆炸风险较高,常用梯度裁剪。
长序列处理:在处理长序列数据(如长文本或时间序列)时,梯度容易累积变大,`max_grad_norm` 能有效控制。
不稳定数据集:当数据分布复杂或存在噪声时,梯度裁剪可以减少训练过程中的震荡。
③ 设置建议
常见取值:通常设置为 `0.5`、`1.0` 或 `2.0`。`1.0` 是许多任务的默认值(如Hugging Face Transformers的默认设置)。
调优方法:
- 如果训练过程中观察到损失(loss)剧烈波动或出现 `NaN`/`Inf`,可以尝试减小 `max_grad_norm`。
- 如果模型收敛过慢,可以尝试适当增大 `max_grad_norm`,但需注意不要过大导致不稳定。
④与`gradient_accumulation_steps`的关系
梯度累积的影响:当使用 `gradient_accumulation_steps` 时,梯度会在多次小批次中累积,可能导致较大的梯度范数。此时,`max_grad_norm` 尤为重要,可以防止累积梯度过大。
结合使用:在显存受限时,`gradient_accumulation_steps` 和 `max_grad_norm` 常一起使用,以在模拟大批量训练的同时保持稳定性。
3.lr_scheduler_type 调度器类型
用于选择学习率调度器的类型。学习率调度器会根据训练的进度(如epoch数、步数或性能指标)动态调整学习率,而不是保持固定的学习率。
①作用
动态调整学习率:通过在训练的不同阶段使用不同的学习率,优化模型的收敛速度和性能。
防止过拟合或欠拟合:早期使用较大的学习率加速学习,后期使用较小的学习率精细调整参数。
提高训练稳定性:避免学习率过高导致震荡或过低导致收敛缓慢。
适应复杂任务:对于大型模型(如Transformer)或复杂数据集,动态学习率通常能带来更好的效果。
②.常见类型
在深度学习框架(如Hugging Face Transformers、PyTorch等)中,`lr_scheduler_type` 支持多种调度器类型。以下是一些常见的类型及其特点:
- **`linear`**(线性调度器):
- 学习率从初始值线性下降到0(或某个最小值)。
- 常用于预训练大模型(如BERT),尤其在结合 warm-up(预热)时效果很好。
- 公式:`lr = initial_lr * (1 - current_step / total_steps)`。
- 适合需要逐渐降低学习率的场景。
- **`cosine`**(余弦退火调度器):
- 学习率按照余弦函数曲线下降,可能在训练后期接近最小值后反弹。
- 提供平滑的衰减,常用于需要周期性调整学习率的任务。
- 公式:`lr = min_lr + 0.5 * (initial_lr - min_lr) * (1 + cos(π * current_step / total_steps))`。
- 适合需要温和调整的任务。
- **`reduce_lr_on_plateau`**(基于性能衰减):
- 当验证指标(如验证损失)停止改善时,降低学习率。
- 需要指定监控指标和衰减因子(factor)。
- 适合需要根据模型性能动态调整学习率的任务。
②.设置建议
- 选择依据:
- 对于大型语言模型(如BERT、GPT),`linear` 或 `cosine` 调度器结合 warm-up 是常见选择。
- 对于需要动态调整的任务,`reduce_lr_on_plateau` 适合根据验证性能调整。
- 预热(warm-up):
- 建议设置 `warmup_steps` 或 `warmup_ratio`(通常为总步数的5%-10%),以稳定初始训练。
- 例如,`warmup_steps=500` 或 `warmup_ratio=0.1`。
- 实验调优:
- 尝试不同的调度器类型(如 `linear` vs. `cosine`),并结合初始学习率进行网格搜索。
- 监控训练损失和验证指标,观察调度器效果。
4.warmup_ratio:预热比例(相对总步数)
`warmup_ratio` 指定了预热阶段的训练步数占总训练步数的比例。在预热阶段,学习率从一个很小的值(通常为0或接近0)线性增加到初始学习率(`learning_rate`),以稳定模型的初始训练过程。
① 作用
- **稳定训练初期**:在训练开始时,模型参数是随机初始化的,梯度可能不稳定。使用较小的学习率(通过预热逐渐增加)可以防止参数更新过大,避免训练发散或震荡。
- **适应大模型**:对于大型模型(如Transformer、BERT、GPT等),预热阶段尤为重要,因为这些模型对初始学习率非常敏感。
- **提高收敛性**:预热有助于模型在早期阶段更平滑地探索损失函数的表面,从而提高最终的收敛性能。
② 使用场景
- **大型语言模型**:如BERT、RoBERTa、LLaMA等,预热是标准做法,通常设置 `warmup_ratio` 在 0.05 到 0.2 之间。
- **长序列或复杂任务**:在处理长文本或不稳定数据集时,预热有助于稳定梯 exported。
- **分布式训练**:在多GPU/TPU环境中,预热可以帮助协调不同设备的初始优化。
③设置建议
- **常见取值**:通常设置为 0.05 到 0.2(即总步数的5%-20%)。Hugging Face Transformers 默认值为 0.0(无预热),需手动设置。
- **经验值**:
- 对于小型数据集或简单任务,`warmup_ratio` 可以设为 0.05 或更低。
- 对于大型模型或长时间训练,建议设为 0.1 或 0.15。
- **与学习率的关系**:
- 如果初始学习率(`learning_rate`)较高,建议使用较长的预热阶段(更大的 `warmup_ratio`)。
- 如果初始学习率较低,预热阶段可以适当缩短。
5.label_smoothing_factor(标签平滑)
用于实现标签平滑(label smoothing)技术。标签平滑通过对真实标签分布进行平滑处理,减少模型对硬标签(hard labels)的过分自信,从而提高模型的泛化能力和训练稳定性。
①作用
- **防止过拟合**:通过避免模型对单一类别过于自信,标签平滑可以提高模型的泛化能力,尤其在处理噪声数据或小型数据集时。
- **提高训练稳定性**:减少硬标签(例如 [1, 0, 0])带来的过高置信度,缓解模型在训练过程中的震荡。
- **提升模型性能**:在许多任务(如图像分类、自然语言处理)中,标签平滑已被证明能略微提高模型的准确率或BLEU分数等指标。
- **缓解标签噪声**:在数据集标签可能存在错误的情况下,标签平滑可以降低模型对错误标签的敏感性。
②工作原理
在没有标签平滑的情况下,分类任务的真实标签通常是 one-hot 编码,例如对于 3 个类别的分类问题,真实标签可能是 `[1, 0, 0]`,表示 100% 置信度属于第一个类别。标签平滑将 one-hot 标签转换为一个平滑的分布。
③设置建议
大型语言模型**:如BERT、RoBERTa、T5等,标签平滑常用于提高文本分类或生成任务的泛化能力。
不适合所有任务**:在某些任务中(如数据非常干净或类别分布明确),标签平滑可能效果有限。
常见取值**:通常在 0.0 到 0.2 之间。默认值为 0.0(无平滑)。常见值为 0.1(许多 NLP 任务的标准设置)。
6.save_steps 模型保存间隔(步数 / epoch)
用于控制模型检查点(checkpoint)的保存频率。它指定了在训练过程中,每经过多少个训练步(steps)保存一次模型的参数和状态
作用
- **定期保存模型**:在长时间训练中,定期保存检查点可以防止因意外中断(如硬件故障、电源中断)导致训练进度丢失。
- **支持恢复训练**:如果训练中断,可以从最近的检查点恢复,而无需从头开始。
- **模型选择**:通过保存多个检查点,可以在训练后根据验证集性能选择最佳模型。
- **调试和分析**:定期保存的检查点允许在不同训练阶段评估模型性能或分析训练动态。
7.early_stopping_patience
表示在验证集指标(如验证损失或准确率)停止改善后,训练继续进行的步数或轮数(epochs)上限。如果在指定次数内指标仍未改善,训练将提前终止。
作用
- **防止过拟合**:当模型在训练集上继续优化但验证集性能不再提升时,早停可以避免模型过拟合训练数据。
- **节省计算资源**:通过提前终止训练,减少不必要的计算时间和资源消耗。
- **选择最佳模型**:结合检查点保存(如 `save_steps`),可以选择验证集性能最佳的模型。
8.early_stopping_threshold
指定验证集指标改善的最小幅度。只有当新指标相比历史最佳指标的改善超过此阈值时,才认为模型性能有“显著改善”。它用于避免因微小波动而重置耐心计数器。
作用
- **控制早停敏感性**:通过设置改善阈值,过滤掉验证指标的微小变化,避免因噪声导致的误判。
- **提高早停的鲁棒性**:确保只有显著的性能提升才被视为改善,适合验证集指标波动较大的场景。
- **平衡训练时间和性能**:避免因过于严格的早停条件导致训练过早终止。
2168

被折叠的 条评论
为什么被折叠?



