ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Transformers 预训练模型微调实战:Trainer 与原生 PyTorch 双路径详解

Transformers 预训练模型微调实战:Trainer 与原生 PyTorch 双路径详解 Transformers 预训练模型微调实战Trainer 与原生 PyTorch 双路径详解【免费下载链接】transformers Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.项目地址: https://gitcode.com/GitHub_Trending/tra/transformers导读在 Transformers 生态中微调fine-tuning是让预训练模型适配具体任务的最有效手段它继承模型在海量语料上习得的通用知识只需在面向任务的较小数据集上继续训练即可显著降低计算成本与碳排放同时无需从零训练即可获得接近当前最优state-of-the-art的效果。本文以 Yelp Reviews 情感分类任务为例完整讲解两条微调路线一条是使用 Transformers 内置的Trainer训练器一条命令完成训练与评估另一条是手写原生 PyTorch 训练循环DataLoaderAdamW 学习率调度器 梯度反传。读完本文你将掌握数据集预处理、训练超参数配置、评估指标接入以及从训练到推理的完整微调流程并能基于当前仓库源码理解每一步背后的实现原理。准备数据集加载与预处理微调的第一步是获取数据并将其处理为模型可接受的输入格式。下面以 Datasets 中的 Yelp Reviews 数据集为例该数据集包含 5 个情感类别标签非常适合文本分类微调 from datasets import load_dataset dataset load_dataset(yelp_review_full) dataset[train][100] {label: 0, text: My expectations for McDonalds are t rarely high. But for one to still fail so spectacularly...that takes something special!\nThe cashier took my friends\s order, then promptly ignored me. ...}每条样本包含两个字段label04 的类别编号和text评论文本。模型无法直接消费原始文本必须借助tokenizer将其转换为input_ids、attention_mask等张量输入。由于样本长度不一还需要通过padding补齐到统一长度、通过truncation截断超长序列。使用AutoTokenizer加载与预训练模型配套的分词器并编写预处理函数然后通过 Datasets 的map方法一次性应用到整个数据集batchedTrue表示按批次批量处理速度更快 from transformers import AutoTokenizer tokenizer AutoTokenizer.from_pretrained(google-bert/bert-base-cased) def tokenize_function(examples): ... return tokenizer(examples[text], paddingmax_length, truncationTrue) tokenized_datasets dataset.map(tokenize_function, batchedTrue)如果希望缩短实验周期可以先用shuffleselect各取 1000 条样本构成训练集与评估集的子集验证流程跑通后再扩展到全量数据 small_train_dataset tokenized_datasets[train].shuffle(seed42).select(range(1000)) small_eval_dataset tokenized_datasets[test].shuffle(seed42).select(range(1000))提示shuffle(seed42)固定随机种子保证子集采样可复现这也是后续实验对比的前提。路径一使用 Trainer 微调Trainer是 Transformers 为训练而优化的开箱即用训练器它封装了训练循环的全部细节同时保留 logging、梯度累积、混合精度等丰富的可配置能力让你不必手写任何循环代码就能启动训练。加载带分类头的模型通过AutoModelForSequenceClassification加载预训练模型并用num_labels5指定分类头的输出维度Yelp Reviews 共有 5 个类别 from transformers import AutoModelForSequenceClassification model AutoModelForSequenceClassification.from_pretrained(google-bert/bert-base-cased, num_labels5)关于加载时的 warning此时你可能看到类似部分预训练权重未被使用、部分权重被随机初始化的提示——这完全正常。BERT 预训练时的任务头head会被丢弃替换为随机初始化的分类头。微调的本质就是在这个新分类头上训练同时把预训练学到的知识迁移到当前分类任务上。配置训练超参数TrainingArgumentsTrainingArguments集中管理所有可调超参数与训练选项。最基础的是指定 checkpoint 的输出目录 from transformers import TrainingArguments training_args TrainingArguments(output_dirtest_trainer)在默认参数基础上你还可以按需调整以下高频选项均可在当前仓库的 training_args.py 中查到定义训练时长num_train_epochs训练轮数、per_device_train_batch_size单设备批大小、learning_rate初始学习率训练优化bf16True/fp16True混合精度取决于硬件、gradient_accumulation_steps梯度累积等效放大批大小、gradient_checkpointing以重计算换显存评估与保存eval_strategy与save_strategy何时评估/保存、load_best_model_at_end训练结束后加载最优 checkpoint需配合eval_strategy使用日志logging_steps每隔多少步输出一次 loss。定义评估指标Trainer默认不会自动评估模型性能需要你传入一个计算指标的函数。使用 Datasets 提供的accuracy指标并注意把所有模型的输出 logits 先经argmax转换为预测类别再交给compute计算准确率 import numpy as np from datasets import load_metric metric load_metric(accuracy) def compute_metrics(eval_pred): ... logits, labels eval_pred ... predictions np.argmax(logits, axis-1) ... return metric.compute(predictionspredictions, referenceslabels)说明在新版本的 Datasets 中load_metric已逐步迁移至独立的evaluate库evaluate.load(accuracy)接口与用法保持一致。无论采用哪种加载方式compute_metrics函数的签名与返回格式不变。如果你希望在训练过程中持续观察评估指标可以在TrainingArguments中设置eval_strategyepoch让 Trainer 在每个 epoch 结束时自动评估一次 from transformers import TrainingArguments, Trainer training_args TrainingArguments(output_dirtest_trainer, eval_strategyepoch)从源码看eval_strategy支持三个取值no不评估默认、steps按步数评估配合eval_steps指定间隔、epoch每轮评估。组装 Trainer 并启动训练将模型、训练参数、训练集、评估集与指标函数一并交给Trainer trainer Trainer( ... modelmodel, ... argstraining_args, ... train_datasetsmall_train_dataset, ... eval_datasetsmall_eval_dataset, ... compute_metricscompute_metrics, ... )随后调用train即可一键开始微调 trainer.train()从实现层面看Trainer.train()是主训练入口它内部会依次处理模型初始化、梯度检查点激活、checkpoint 恢复resume_from_checkpoint支持从上次中断处继续训练、批大小自动探测auto_find_batch_size等逻辑再进入真正的_inner_training_loop训练循环——这正是一行代码完成微调背后的支撑。路径二原生 PyTorch 微调如果你希望完全掌控训练过程也可以绕过Trainer用纯 PyTorch 手写训练循环。首先释放此前Trainer占用的显存如在笔记本环境中del model del pytorch_model del trainer torch.cuda.empty_cache()后处理数据集手写循环前需要对tokenized_datasets做三步后处理使其符合模型的输入约定删除text列——模型不接受原始文本输入 tokenized_datasets tokenized_datasets.remove_columns([text])将label重命名为labels——模型期望标签参数名为labels tokenized_datasets tokenized_datasets.rename_column(label, labels)设置数据集输出格式——让数据集在迭代时直接返回 PyTorch 张量 tokenized_datasets.set_format(torch)同样切出 1000 条子集加速实验 small_train_dataset tokenized_datasets[train].shuffle(seed42).select(range(1000)) small_eval_dataset tokenized_datasets[test].shuffle(seed42).select(range(1000))构建 DataLoader用DataLoader封装训练集与评估集以便按批次迭代数据。训练集开启shuffleTrue打乱顺序并指定batch_size8 from torch.utils.data import DataLoader train_dataloader DataLoader(small_train_dataset, shuffleTrue, batch_size8) eval_dataloader DataLoader(small_eval_dataset, batch_size8)重新加载带 5 个标签的分类模型 from transformers import AutoModelForSequenceClassification model AutoModelForSequenceClassification.from_pretrained(google-bert/bert-base-cased, num_labels5)优化器与学习率调度器使用 PyTorch 的AdamW优化器学习率设为5e-5微调任务常用量级 from torch.optim import AdamW optimizer AdamW(model.parameters(), lr5e-5)学习率调度器则复用Trainer默认使用的类型——线性衰减linear。通过 Transformers 提供的get_scheduler统一创建需要先根据 epoch 数与 DataLoader 长度计算总训练步数 from transformers import get_scheduler num_epochs 3 num_training_steps num_epochs * len(train_dataloader) lr_scheduler get_scheduler( ... namelinear, optimizeroptimizer, num_warmup_steps0, num_training_stepsnum_training_steps ... )从 optimization.py 的调度器注册表TYPE_TO_SCHEDULER_FUNCTION可以看到get_scheduler是统一的调度器工厂除linear外还支持调度器名称对应实现特点linearget_linear_schedule_with_warmup带 warmup 的线性衰减Trainer 默认cosineget_cosine_schedule_with_warmup余弦退火cosine_with_restartsget_cosine_with_hard_restarts_schedule_with_warmup余弦退火 硬重启polynomialget_polynomial_decay_schedule_with_warmup多项式衰减constant/constant_with_warmupget_constant_schedule(_with_warmup)恒定学习率inverse_sqrtget_inverse_sqrt_schedule逆平方根衰减reduce_on_plateauget_reduce_on_plateau_schedule指标停滞时自动降 LRcosine_with_min_lrget_cosine_with_min_lr_schedule_with_warmup带下限的余弦退火warmup_stable_decayget_wsd_schedulewarmup–稳定–衰减WSD不同调度器对参数的要求不同如constant不需要num_training_steps而linear两者都需要get_scheduler内部会据此做参数校验缺失必填参数时直接抛出ValueError。指定计算设备最后把模型移动到 GPU如果可用否则在 CPU 上训练可能从几分钟延长到数小时 import torch device torch.device(cuda) if torch.cuda.is_available() else torch.device(cpu) model.to(device)手写训练循环使用tqdm显示训练进度条核心循环包含四个固定动作前向计算 → 反向传播 → 优化器更新 → 调度器步进 梯度清零。注意每个 batch 都要先搬运到device from tqdm.auto import tqdm progress_bar tqdm(range(num_training_steps)) model.train() for epoch in range(num_epochs): ... for batch in train_dataloader: ... batch {k: v.to(device) for k, v in batch.items()} ... outputs model(**batch) ... loss outputs.loss ... loss.backward() ... optimizer.step() ... lr_scheduler.step() ... optimizer.zero_grad() ... progress_bar.update(1)optimizer.step()根据梯度更新权重lr_scheduler.step()推进学习率调度optimizer.zero_grad()在下一轮前清空累积梯度——三者顺序不可颠倒。手写评估循环与Trainer的compute_metrics思路一致原生循环同样需要自己评估。区别在于评估阶段先用metric.add_batch逐批累积预测与标签训练全部结束后再统一调用metric.compute()得出最终准确率。评估时须切换到model.eval()模式并包裹在torch.no_grad()中以关闭 dropout 与梯度计算、节省显存 metric load_metric(accuracy) model.eval() for batch in eval_dataloader: ... batch {k: v.to(device) for k, v in batch.items()} ... with torch.no_grad(): ... outputs model(**batch) ... logits outputs.logits ... predictions torch.argmax(logits, dim-1) ... metric.add_batch(predictionspredictions, referencesbatch[labels]) metric.compute()两种路径如何选择首选Trainer它天然与 Transformers 模型深度集成——默认使用AdamW优化器与线性 warmup 调度器见 trainer.py 的文档说明自动处理设备放置、梯度累积、混合精度、checkpoint 保存与恢复、分布式训练等工程细节是绝大多数微调场景的最优起点。选择原生 PyTorch当你需要自定义损失函数、精细控制每个 batch 的梯度流或想彻底理解训练循环的每个环节时手写循环提供了完全的自由度代价是需要自行管理优化器、调度器、设备与指标计算。更多微调资源仓库的 examples/pytorch 目录提供了文本分类、token 分类、问答、翻译、摘要、语言建模等常见 NLP 任务的完整 PyTorch 训练脚本可以直接作为模板改写仓库的 notebooks 目录收录了针对不同任务与框架的微调示例适合交互式学习与调试微调完成后可参考仓库中的 Trainer 相关测试 与 training_args 相关测试了解各训练选项在真实代码路径中的行为进一步校验自己的训练配置。【免费下载链接】transformers Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.项目地址: https://gitcode.com/GitHub_Trending/tra/transformers创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表