LLM 课程文档
理解学习曲线
并获得增强的文档体验
开始使用
理解学习曲线
现在您已经学会了如何使用 Trainer
API 和自定义训练循环来实现微调,理解如何解释结果至关重要。学习曲线是宝贵的工具,可以帮助您在训练期间评估模型性能,并在潜在问题导致性能下降之前识别它们。
在本节中,我们将探讨如何阅读和解释准确度曲线和损失曲线,理解不同曲线形状告诉我们模型行为的含义,并学习如何解决常见的训练问题。
什么是学习曲线?
学习曲线是模型在训练过程中性能指标随时间变化的视觉表示。需要监控的两个最重要曲线是:
- 损失曲线:显示模型误差(损失)如何随训练步骤或时期变化
- 准确度曲线:显示在训练步骤或时期中正确预测的百分比
这些曲线帮助我们了解模型是否有效学习,并指导我们进行调整以提高性能。在 Transformers 中,这些指标是为每个批次单独计算的,然后记录到磁盘。然后,我们可以使用 Weights & Biases 等库来可视化这些曲线并跟踪模型的性能。
损失曲线
损失曲线显示模型误差如何随时间下降。在一次典型的成功训练运行中,您会看到一条类似于下图的曲线:
- 初始损失高:模型开始时未优化,因此预测最初较差
- 损失递减:随着训练的进行,损失通常会下降
- 收敛:最终,损失稳定在低值,表明模型已学习到数据中的模式
与前几章一样,我们可以使用 Trainer
API 来跟踪这些指标并在仪表板中可视化它们。下面是如何使用 Weights & Biases 执行此操作的示例。
# Example of tracking loss during training with the Trainer
from transformers import Trainer, TrainingArguments
import wandb
# Initialize Weights & Biases for experiment tracking
wandb.init(project="transformer-fine-tuning", name="bert-mrpc-analysis")
training_args = TrainingArguments(
output_dir="./results",
eval_strategy="steps",
eval_steps=50,
save_steps=100,
logging_steps=10, # Log metrics every 10 steps
num_train_epochs=3,
per_device_train_batch_size=16,
per_device_eval_batch_size=16,
report_to="wandb", # Send logs to Weights & Biases
)
trainer = Trainer(
model=model,
args=training_args,
train_dataset=tokenized_datasets["train"],
eval_dataset=tokenized_datasets["validation"],
data_collator=data_collator,
processing_class=tokenizer,
compute_metrics=compute_metrics,
)
# Train and automatically log metrics
trainer.train()
准确度曲线
准确度曲线显示正确预测的百分比随时间变化。与损失曲线不同,准确度曲线通常会随着模型学习而增加,并且通常可以包含比损失曲线更多的步骤。
- 初始值低:初始准确度应较低,因为模型尚未学习数据中的模式
- 随训练增加:如果模型能够学习数据中的模式,准确度通常会随着模型学习而提高
- 可能出现平台期:准确度通常以离散跳跃而非平滑的方式增加,因为模型会做出接近真实标签的预测
💡 为什么准确度曲线是“阶梯状”的:与连续的损失不同,准确度是通过将离散预测与真实标签进行比较来计算的。模型信心的微小改进可能不会改变最终预测,导致准确度保持平坦,直到超过某个阈值。
收敛
当模型性能稳定,损失和准确度曲线趋于平稳时,就发生了收敛。这表明模型已经学习了数据中的模式并已准备好使用。简单来说,我们的目标是让模型在每次训练时都能收敛到稳定的性能。
一旦模型收敛,我们就可以使用它们对新数据进行预测,并参考评估指标来了解模型的表现。
解释学习曲线模式
不同的曲线形状揭示了模型训练的不同方面。让我们检查最常见的模式及其含义。
健康的学习曲线
一个良好的训练运行通常会显示类似于下图的曲线形状
让我们看看上面的插图。它显示了损失曲线(左侧)和相应的准确度曲线(右侧)。这些曲线具有独特的特征。
损失曲线显示模型损失随时间变化的值。最初,损失很高,然后逐渐降低,表明模型正在改进。损失值的降低表明模型正在做出更好的预测,因为损失代表预测输出和真实输出之间的误差。
现在让我们将注意力转向准确度曲线。它代表模型随时间变化的准确度。准确度曲线从低值开始,并随着训练的进行而增加。准确度衡量正确分类实例的比例。因此,随着准确度曲线的上升,它表明模型正在做出更多正确的预测。
曲线之间一个显著的区别是准确度曲线的平滑度和“平台期”的存在。虽然损失平滑下降,但准确度曲线上的平台期表示准确度的离散跳跃而不是连续增加。这种行为归因于准确度的测量方式。即使最终预测仍然不正确,如果模型的输出更接近目标,损失也会改善。然而,准确度只有当预测跨越阈值变为正确时才会提高。
例如,在区分猫(0)和狗(1)的二元分类器中,如果模型对狗的图像(真实值1)预测为0.3,则四舍五入为0,这是不正确的分类。如果在下一步中预测为0.4,它仍然不正确。损失会减少,因为0.4比0.3更接近1,但准确度保持不变,从而形成平台期。只有当模型预测的值大于0.5并四舍五入为1时,准确度才会跳升。
健康曲线的特征
- 损失平稳下降:训练损失和验证损失都稳步下降
- 训练/验证性能接近:训练和验证指标之间差距小
- 收敛:曲线趋于平稳,表明模型已学习到模式
实际案例
让我们通过一些学习曲线的实际例子。首先,我们将强调一些在训练期间监控学习曲线的方法。下面,我们将分解学习曲线中可以观察到的不同模式。
训练期间
在训练过程中(执行 trainer.train()
后),您可以监控这些关键指标
- 损失收敛:损失是否仍在下降,或者是否已趋于平稳?
- 过拟合迹象:验证损失是否开始增加,而训练损失下降?
- 学习率:曲线是否过于不稳定(学习率过高)或过于平坦(学习率过低)?
- 稳定性:是否存在表明问题的突然峰值或下降?
训练后
训练过程完成后,您可以分析完整的曲线以了解模型的性能。
- 最终性能:模型是否达到了可接受的性能水平?
- 效率:是否可以通过更少的时期达到相同的性能?
- 泛化能力:训练和验证性能有多接近?
- 趋势:额外的训练是否可能提高性能?
🔍 W&B 仪表板功能:Weights & Biases 会自动创建美观、交互式的学习曲线图。您可以
- 并排比较多个运行
- 添加自定义指标和可视化
- 设置异常行为警报
- 与您的团队分享结果
在 Weights & Biases 文档中了解更多信息。
过拟合
过拟合发生在模型从训练数据中学习过多,导致无法泛化到不同数据(由验证集表示)的情况。
症状
- 训练损失持续下降,而验证损失增加或趋于平稳
- 训练准确度和验证准确度之间存在较大差距
- 训练准确度远高于验证准确度
过拟合的解决方案
- 正则化:添加 Dropout、权重衰减或其他正则化技术
- 早停:当验证性能停止改进时停止训练
- 数据增强:增加训练数据多样性
- 降低模型复杂度:使用较小的模型或较少的参数
在下面的示例中,我们使用早停来防止过拟合。我们将 early_stopping_patience
设置为 3,这意味着如果验证损失连续 3 个时期没有改善,训练将停止。
# Example of detecting overfitting with early stopping
from transformers import EarlyStoppingCallback
training_args = TrainingArguments(
output_dir="./results",
eval_strategy="steps",
eval_steps=100,
save_strategy="steps",
save_steps=100,
load_best_model_at_end=True,
metric_for_best_model="eval_loss",
greater_is_better=False,
num_train_epochs=10, # Set high, but we'll stop early
)
# Add early stopping to prevent overfitting
trainer = Trainer(
model=model,
args=training_args,
train_dataset=tokenized_datasets["train"],
eval_dataset=tokenized_datasets["validation"],
data_collator=data_collator,
processing_class=tokenizer,
compute_metrics=compute_metrics,
callbacks=[EarlyStoppingCallback(early_stopping_patience=3)],
)
2. 欠拟合
当模型过于简单而无法捕捉数据中的潜在模式时,就会发生欠拟合。这可能由以下几个原因造成:
- 模型过小或缺乏学习模式的能力
- 学习率过低,导致学习缓慢
- 数据集过小或不具代表性
- 模型未正确正则化
症状
- 训练和验证损失均保持较高水平
- 模型性能在训练早期就趋于平稳
- 训练准确度低于预期
欠拟合的解决方案
- 增加模型容量:使用更大的模型或更多参数
- 延长训练时间:增加时期数
- 调整学习率:尝试不同的学习率
- 检查数据质量:确保数据已正确预处理
在下面的示例中,我们增加了训练时期数,以查看模型是否可以学习数据中的模式。
from transformers import TrainingArguments
training_args = TrainingArguments(
output_dir="./results",
-num_train_epochs=5,
+num_train_epochs=10,
)
3. 不稳定的学习曲线
当模型学习效率不高时,就会出现不稳定的学习曲线。这可能由以下几个原因造成:
- 学习率过高,导致模型错过最佳参数
- 批处理大小过小,导致模型学习缓慢
- 模型未正确正则化,导致过拟合训练数据
- 数据集未正确预处理,导致模型从噪声中学习
症状
- 损失或准确度频繁波动
- 曲线显示出高方差或不稳定性
- 性能波动,没有明确的趋势
训练和验证曲线都显示出不稳定行为。
不稳定曲线的解决方案
- 降低学习率:减小步长以实现更稳定的训练
- 增加批量大小:更大的批量提供更稳定的梯度
- 梯度裁剪:防止梯度爆炸
- 更好的数据预处理:确保一致的数据质量
在下面的示例中,我们降低了学习率并增加了批处理大小。
from transformers import TrainingArguments
training_args = TrainingArguments(
output_dir="./results",
-learning_rate=1e-5,
+learning_rate=1e-4,
-per_device_train_batch_size=16,
+per_device_train_batch_size=32,
)
关键要点
理解学习曲线对于成为一名有效的机器学习实践者至关重要。这些可视化工具提供了关于模型训练进度的即时反馈,并帮助您就是否停止训练、调整超参数或尝试不同方法做出明智的决定。通过练习,您将对健康的学习曲线是什么样子以及如何在出现问题时解决问题有一个直观的理解。
💡 关键要点:
- 学习曲线是理解模型训练进度的重要工具
- 监控损失曲线和准确度曲线,但请记住它们具有不同的特征
- 过拟合表现为训练/验证性能分歧
- 欠拟合表现为训练和验证数据性能均不佳
- Weights & Biases 等工具可以轻松跟踪和分析学习曲线
- 早停和适当的正则化可以解决大多数常见的训练问题
🔬 后续步骤:在您自己的微调实验中练习分析学习曲线。尝试不同的超参数并观察它们如何影响曲线形状。这种动手实践是培养阅读训练进度直觉的最佳方式。
章节测验
测试您对学习曲线和训练分析的理解