第37章:Trainer、Callback 与训练循环源码

发布时间:2026/6/11 10:28:12

第37章:Trainer、Callback 与训练循环源码 1 项目背景业务场景算法团队在客服工单分类任务的训练过程中遇到了一个奇怪的问题:训练 loss 一直在正常下降,但验证集 F1 在第 2 个 epoch 后突然从 0.89 跌到 0.62,之后一直震荡不恢复。更奇怪的是,Trainer 的EarlyStoppingCallback没有触发——因为它是基于eval_loss判断的,而eval_loss仍在缓慢下降。小陈需要在训练过程中同时监控 F1——当 F1 连续 3 个 epoch 没有提升时提前停止训练。此外,还需要在指标异常时发送钉钉告警。这要求他深入理解 Trainer 的 Callback 机制。另一个需求是自定义 loss:由于投诉类工单的标签极度稀疏(仅占 5%),标准的 CrossEntropyLoss 会让模型忽略投诉类。小陈需要在训练时给类别加权。痛点Trainer 虽然封装良好,但一旦需要自定义行为,就必须理解其内部机制:Trainer.train() ├── _inner_training_loop() │ ├── for epoch in epochs: │ │ ├── for step, batch in dataloader: │ │ │ ├── training_step(batch) ← 可重写 │ │ │ │ ├── model(**batch) ← forward │

相关新闻