ARTICLE DETAIL

资讯详情

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

Transformers 预训练模型微调实战:基于 Trainer、Keras 与原生 PyTorch 的完整指南

Transformers 预训练模型微调实战:基于 Trainer、Keras 与原生 PyTorch 的完整指南 Transformers 预训练模型微调实战基于 Trainer、Keras 与原生 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本文围绕仓库 docs/source/es/training.md 中微调预训练模型Fine-tuning a un modelo pre-entrenado教程展开以 Yelp Reviews 情感分类任务为例系统讲解在 Transformers 中微调预训练模型的三大技术路线基于Trainer的高层封装、基于 TensorFlow/Keras 的训练以及手写原生 PyTorch 训练循环。读完本文你将掌握数据集预处理、训练超参配置、指标计算与完整微调流程并能将相同思路迁移到其他 NLP 任务。使用预训练模型pre-trained model进行微调fine-tuning具有显著优势大幅降低计算成本与碳排放让你无需从零训练即可直接站在最新一代模型的肩膀上。在 Transformers 中微调预训练模型主要有三种方式使用 Transformers 的 [Trainer] 高层 API 进行微调使用 TensorFlow Keras 进行微调使用原生 PyTorch 手写训练循环进行微调。本文将以 Yelp Reviews 情感分类5 分类为贯穿案例逐一演示这三条路线。准备数据集Data Processing在对预训练模型应用微调之前需要先下载数据集并完成预处理。第一步加载 Yelp Reviews 数据集 from datasets import load_dataset dataset load_dataset(yelp_review_full) dataset[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. I had to force myself in front of a cashier who opened his register to wait on the person BEHIND me. I waited over five minutes for a gigantic order that included precisely one kid\s meal. After watching two people who ordered after me be handed their food, I asked where mine was. The manager started yelling at the cashiers for serving off their orders when they didn\t have their food. But neither cashier was anywhere near those controls, and the manager was the one serving food to customers and clearing the boards.\nThe manager was rude when giving me my order. She didn\t make sure that I had everything ON MY RECEIPT, and never even had the decency to apologize that I felt I was getting poor service.\nI\ve eaten at various McDonalds restaurants for over 30 years. I\ve worked at more than one location. I expect bad days, bad moods, and the occasional mistake. But I have yet to have a decent experience at this store. It will remain a place I avoid unless someone in my party needs to avoid illness from low blood sugar. Perhaps I should go back to the racially biased service of Steak n Shake instead!}每个样本包含一条评论文本text和对应的情感标签label。由于模型只接受 token 化后的输入必须使用分词器tokenizer处理文本并为变长序列指定 padding填充与 truncation截断策略。利用 Datasets 的map方法可以一步完成对整个数据集的批量预处理 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)这里paddingmax_length会将所有样本填充到模型的最大长度truncationTrue则截断超长文本保证批次内张量形状一致、可直接喂给模型。如果希望加快微调速度可以只取完整数据集的一个小子集进行实验 small_train_dataset tokenized_datasets[train].shuffle(seed42).select(range(1000)) small_eval_dataset tokenized_datasets[test].shuffle(seed42).select(range(1000))使用固定随机种子shuffle(seed42)并截取前 1000 条既能保证实验可复现又能显著缩短训练时间适合快速验证流程。使用Trainer进行微调 Transformers 提供了针对自身模型优化的 [Trainer] 类其定义位于 src/transformers/trainer.py封装了完整的训练循环无需手写forward/backward即可启动训练。Trainer的 API 支持大量训练选项与特性包括日志记录logging、梯度累积gradient accumulation与混合精度mixed precision等。首先加载模型并指定预期的标签数量。根据 Yelp Review 数据集的字段说明该任务共有 5 个标签 from transformers import AutoModelForSequenceClassification model AutoModelForSequenceClassification.from_pretrained(google-bert/bert-base-cased, num_labels5)提示加载时你会看到一条警告提示部分预训练权重未被使用、部分权重被随机初始化。这是完全正常的现象BERT 预训练时的分类头head会被丢弃替换为一个随机初始化的序列分类头。通过迁移学习你可以针对自己的序列分类任务微调这个新的模型头而其余预训练参数则作为特征提取的底座被保留。训练超参数Hyperparameters接下来创建 [TrainingArguments]它集中承载所有可调超参数以及各类训练选项开关定义于 src/transformers/training_args.py。本教程可以先使用默认超参数再根据实验结果自由调优。必须指定训练 checkpoint 的保存目录 from transformers import TrainingArguments training_args TrainingArguments(output_dirtest_trainer)除output_dir外TrainingArguments中常用的关键超参数均可在 training_args.py 中查看其默认值与说明还包括参数默认值作用per_device_train_batch_size8每个设备GPU/CPU上的训练 batch 大小实际 batch 大小为per_device_train_batch_size × 设备数gradient_accumulation_steps1梯度累积步数累积若干步后再更新参数等效于放大 batch 大小累积时每gradient_accumulation_steps × xxx_step条样本才记录一次日志、评估与保存learning_rate5e-5初始学习率num_train_epochs3训练轮数logging_steps500每隔多少训练步记录一次日志eval_strategyno评估策略取值no不评估、steps按步评估或epoch每轮结束评估其枚举定义见 src/transformers/trainer_utils.py评估指标MetricsTrainer默认不会自动评估模型性能需要传入一个计算并上报指标的函数。 Datasets 库提供了简单的accuracy准确率指标可用load_metric加载 import numpy as np from datasets import load_metric metric load_metric(accuracy)定义compute函数计算预测准确率。注意所有 Transformers 模型返回的都是 logits因此需要先将 logits 转换为预测类别 def compute_metrics(eval_pred): ... logits, labels eval_pred ... predictions np.argmax(logits, axis-1) ... return metric.compute(predictionspredictions, referenceslabels)若希望在微调过程中跟踪评估指标可在训练参数中指定eval_strategy让模型在每个 epoch 结束时计算一次评估指标 from transformers import TrainingArguments training_args TrainingArguments(output_dirtest_trainer, eval_strategyepoch)构造 Trainer 并训练将模型、训练参数、训练集、验证集与评估函数一并传入Trainer trainer Trainer( ... modelmodel, ... argstraining_args, ... train_datasetsmall_train_dataset, ... eval_datasetsmall_eval_dataset, ... compute_metricscompute_metrics, ... )调用 [~transformers.Trainer.train]对应 src/transformers/trainer.py 中的train方法即可启动微调 trainer.train()Trainer内部会替你完成 batch 组装默认使用DataCollatorWithPadding动态填充、前向/反向传播、优化器与学习率调度、梯度累积、混合精度、日志与 checkpoint 保存等一系列工作是日常微调最推荐的高层入口。使用 Keras 进行微调 Transformers 模型同样支持通过 TensorFlow 的 Keras API 进行训练只需在微调前做少量调整。将数据集转换为 TensorFlow 格式[DefaultDataCollator]实现见 src/transformers/data/data_collator.py负责将样本张量拼接collate成 batch 供模型训练。记得指定return_tensorstf以返回 TensorFlow 张量 from transformers import DefaultDataCollator data_collator DefaultDataCollator(return_tensorstf)提示Trainer默认使用DataCollatorWithPadding因此使用高层 API 时无需显式指定 data collator而在 Keras 流程中需要自行创建。随后用 Datasets 的to_tf_dataset方法将 token 化后的数据集转换为 TensorFlow 数据集在columns中指定模型输入字段在label_cols中指定标签字段 tf_train_dataset small_train_dataset.to_tf_dataset( ... columns[attention_mask, input_ids, token_type_ids], ... label_colslabels, ... shuffleTrue, ... collate_fndata_collator, ... batch_size8, ... ) tf_validation_dataset small_eval_dataset.to_tf_dataset( ... columns[attention_mask, input_ids, token_type_ids], ... label_colslabels, ... shuffleFalse, ... collate_fndata_collator, ... batch_size8, ... )编译并训练Compile Fit加载一个带预期标签数量的 TensorFlow 模型 import tensorflow as tf from transformers import TFAutoModelForSequenceClassification model TFAutoModelForSequenceClassification.from_pretrained(google-bert/bert-base-cased, num_labels5)然后像训练任何普通 Keras 模型一样先compile再fit model.compile( ... optimizertf.keras.optimizers.Adam(learning_rate5e-5), ... losstf.keras.losses.SparseCategoricalCrossentropy(from_logitsTrue), ... metricstf.metrics.SparseCategoricalAccuracy(), ... ) model.fit(tf_train_dataset, validation_datatf_validation_dataset, epochs3)其中SparseCategoricalCrossentropy(from_logitsTrue)直接以模型输出的 logits 计算稀疏类别交叉熵SparseCategoricalAccuracy作为训练过程的监控指标。原生 PyTorch 微调[Trainer] 负责了训练循环的绝大部分工作让微调可以一行代码完成但如果你更偏好手写训练循环、对过程有完全掌控也可以在原生 PyTorch 中微调 Transformers 模型。如果你之前已经在 notebook 中运行过Trainer示例建议重启内核或执行以下代码释放显存del model del pytorch_model del trainer torch.cuda.empty_cache()接下来手动对tokenized_dataset做后处理使其满足训练要求删除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)与之前一样截取小子集加速微调 small_train_dataset tokenized_datasets[train].shuffle(seed42).select(range(1000)) small_eval_dataset tokenized_datasets[test].shuffle(seed42).select(range(1000))构造 DataLoader为训练集和验证集分别创建DataLoader以便按 batch 迭代数据 from torch.utils.data import DataLoader train_dataloader DataLoader(small_train_dataset, shuffleTrue, batch_size8) eval_dataloader DataLoader(small_eval_dataset, batch_size8)加载带预期标签数量的模型 from transformers import AutoModelForSequenceClassification model AutoModelForSequenceClassification.from_pretrained(google-bert/bert-base-cased, num_labels5)优化器与学习率调度创建优化器与学习率调度器。这里使用 PyTorch 的AdamW优化器 from torch.optim import AdamW optimizer AdamW(model.parameters(), lr5e-5)再利用 Transformers 的get_scheduler创建与Trainer同款的学习率调度器统一 API 定义于 src/transformers/optimization.py 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 ... )get_scheduler根据name参数从注册表SchedulerType枚举见 src/transformers/trainer_utils.py查找对应调度函数支持linear、cosine、cosine_with_restarts、polynomial、constant、constant_with_warmup、inverse_sqrt、reduce_lr_on_plateau等多种策略。本例使用无 warmup 的线性衰减namelinear, num_warmup_steps0总训练步数由num_epochs × len(train_dataloader)决定。最后指定运行设备——有 GPU 则用 GPU否则退回 CPU。注意在 CPU 上训练可能需要数小时而 GPU 上仅需几分钟 import torch device torch.device(cuda) if torch.cuda.is_available() else torch.device(cpu) model.to(device)提示如果本地没有 GPU可以通过云端的免费 notebook如 Colaboratory、SageMaker StudioLab获得免费 GPU 资源。训练循环使用tqdm为训练步骤添加进度条然后编写标准的 PyTorch 训练循环 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)循环内每次迭代依次完成将 batch 移动到设备 → 前向计算得到 loss → 反向传播 → 优化器更新参数 → 学习率调度器步进 → 梯度清零 → 更新进度条。评估指标与Trainer需要传入评估函数类似手写训练循环时也需要自行计算指标。区别在于这里不再每轮结束计算一次而是用add_batch累积所有验证 batch 的预测结果训练结束后统一计算 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()注意评估阶段使用model.eval()关闭 dropout 等训练专用层并在torch.no_grad()上下文内禁止梯度计算以节省显存、加快推理。更多微调资源 Transformers Examples 目录如 examples/pytorch/text-classification提供了在 PyTorch 与 TensorFlow 上训练常见 NLP 任务的脚本。以 run_glue.py 为例通过命令行即可在 GLUE 基准cola、sst2、mrpc、stsb、qqp、mnli、qnli、rte、wnli 等任务上微调任意模型python run_glue.py \ --model_name_or_path google-bert/bert-base-cased \ --task_name mrpc \ --do_train \ --do_eval \ --max_seq_length 128 \ --per_device_train_batch_size 32 \ --learning_rate 2e-5 \ --num_train_epochs 3 \ --output_dir /tmp/mrpc/该脚本覆盖了数据加载、token 化、Trainer训练与评估的完整链路是学习与复现微调流程的最佳范本目录下还提供 run_glue_no_trainer.py手写 PyTorch 循环版与 run_xnli.py跨语言任务版等变体。 Transformers Notebooks 目录包含多个针对特定任务进行微调的 notebook覆盖 PyTorch 与 TensorFlow 两种框架。小结本文完整演示了在 Transformers 中微调预训练模型的三种方式核心要点如下数据预处理是共同起点使用AutoTokenizermap完成 token 化务必设置 padding 与 truncation 策略并通过shuffle(seed...).select(range(...))构造可复现的小型实验集Trainer路线最省力TrainingArguments集中管理超参数配合eval_strategy、compute_metrics即可获得带评估的训练循环底层实现可追溯至 src/transformers/trainer.pyKeras 路线适合 TensorFlow 用户DefaultDataCollator(return_tensorstf)to_tf_dataset完成数据转换之后就是标准的compile/fit原生 PyTorch 路线提供最大灵活性手动完成列删除/重命名、DataLoader、AdamW优化器、get_scheduler学习率调度与完整训练/评估循环适合需要深度定制训练过程的场景。无论选择哪条路线预训练 微调的范式都能让你以极低的成本获得接近最前沿水平的任务表现这也是 Transformers 生态被广泛采用的核心理由。【免费下载链接】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),仅供参考
返回列表