趋近智
启动训练过程涉及将模型架构、标记 (token)化的数据集和定义的超参数 (parameter) (hyperparameter)绑定到前向传播、损失计算和权重 (weight)更新的自动化序列中。Hugging Face 的 Trainer 类负责管理这一过程,它抽象掉了大部分 PyTorch 样板代码,同时保留了对执行状态的精细控制。
在投入可能耗时数小时或数天的完整训练运行之前,通常的做法是在一小部分数据上测试流水线。这可以验证内存限制是否得到满足,并确保损失按预期下降,而不会在计算过程中遇到内存溢出错误。
# 选择一小部分样本进行练习运行
small_train_dataset = tokenized_dataset["train"].select(range(500))
small_eval_dataset = tokenized_dataset["test"].select(range(100))
运行受限的数据集可以让你快速验证数据整理器(data collator),并确保输入已正确填充到每个批次的最大长度。
要执行循环,需实例化 Trainer 类。你需要传入带有 LoRA 适配器的基础模型、前一节定义的训练参数 (parameter)、拆分后的数据集以及数据整理器。数据整理器通过将原始标记 (token)序列组织成统一的张量来为模型准备数据。
from transformers import Trainer, DataCollatorForLanguageModeling
# 创建一个忽略指令填充的数据整理器
data_collator = DataCollatorForLanguageModeling(
tokenizer=tokenizer,
mlm=False
)
trainer = Trainer(
model=peft_model,
args=training_args,
train_dataset=small_train_dataset,
eval_dataset=small_eval_dataset,
data_collator=data_collator,
)
通过设置 mlm=False,你指示整理器为因果语言建模处理数据,这是生成任务的标准方法,模型在其中预测序列中的下一个标记。
通过调用实例化对象上的 train 方法来启动过程。
# 开始训练循环
training_results = trainer.train()
当你执行此命令时,自动化循环就开始了。引擎获取数据批次,将其传递给模型,并使用交叉熵损失计算生成的标记 (token)与实际目标标记之间的差异。
在单个训练迭代中执行的操作序列。
由于你使用的是参数 (parameter)高效微调 (fine-tuning)(PEFT),反向传播 (backpropagation)仅计算注入的 LoRA 矩阵的梯度。冻结的基础模型权重 (weight)保持不变,从而节省了大量的计算资源。
长度为 的单个序列的交叉熵损失计算如下:
这里, 是在给定所有先前上下文 (context)标记的情况下,模型分配给正确下一个标记的概率。随着训练循环的运行,优化器会调整适配器权重以最大化该概率,从而导致总损失值下降。
随着循环的迭代,你将在终端中按照训练参数 (parameter)中指定的间隔看到输出日志。你应该监控两个主要指标:训练损失和评估损失。
300 步内训练损失与评估损失的对比。末端的偏差表明出现了过拟合 (overfitting)的早期迹象。
成功的运行表现为训练损失和评估损失均稳步下降。如果训练损失继续下降但评估损失开始攀升,说明你的模型已开始背诵训练子集。这意味着它正在失去推广到新数据的能力。如果你观察到这种现象,可以提前停止训练循环或调整学习率和权重 (weight)衰减参数。
一旦循环成功处理了预定义的轮数(epochs),你必须将新训练的适配器权重 (weight)保存到磁盘。
# 保存训练好的 LoRA 适配器
trainer.save_model("./custom-slm-lora-adapters")
请记住,由于你使用了 LoRA,你并不是在保存整个数 GB 大小的语言模型。你只需保存新训练的低秩矩阵,这些矩阵通常仅占用几 MB 的存储空间。在接下来的部署阶段,这些轻量级适配器文件将加载到原始基础模型之上,以改变其文本生成行为。
这部分内容有帮助吗?
© 2026 ApX Machine LearningAI伦理与透明度•