使用Hugging Face Transformers和Keras进行模型微调实战指南

使用Hugging Face Transformers和Keras进行模型微调实战指南

notebooks Notebooks using the Hugging Face libraries 🤗 notebooks 项目地址: https://gitcode.com/gh_mirrors/note/notebooks

前言

在现代自然语言处理(NLP)领域,预训练模型的微调已成为解决各类文本任务的标准方法。本文将详细介绍如何利用Hugging Face生态系统中的Transformers库,结合Keras框架,对BERT模型进行微调,以完成句子对分类任务。

环境准备

在开始之前,我们需要安装必要的Python库:

pip install datasets evaluate transformers[sentencepiece]

这些库分别提供以下功能:

  • datasets: 用于加载和处理数据集
  • evaluate: 用于模型评估
  • transformers: 提供预训练模型和训练工具
  • sentencepiece: 分词器支持

数据集加载与预处理

我们使用GLUE基准测试中的MRPC(Microsoft Research Paraphrase Corpus)数据集,该任务需要判断两个句子是否语义等价。

from datasets import load_dataset
raw_datasets = load_dataset("glue", "mrpc")

MRPC数据集包含训练集、验证集和测试集,每个样本包含两个句子和一个标签(0表示不相似,1表示相似)。

分词处理

使用BERT的分词器对文本进行处理:

from transformers import AutoTokenizer
checkpoint = "bert-base-uncased"
tokenizer = AutoTokenizer.from_pretrained(checkpoint)

def tokenize_function(example):
    return tokenizer(example["sentence1"], example["sentence2"], truncation=True)

tokenized_datasets = raw_datasets.map(tokenize_function, batched=True)

这里的分词器会自动添加BERT所需的特殊token([CLS], [SEP]等),并处理句子对格式。

数据准备

为了适配Keras训练流程,我们需要将数据集转换为TensorFlow格式:

from transformers import DataCollatorWithPadding
data_collator = DataCollatorWithPadding(tokenizer=tokenizer, return_tensors="tf")

tf_train_dataset = tokenized_datasets["train"].to_tf_dataset(
    columns=["attention_mask", "input_ids", "token_type_ids"],
    label_cols=["labels"],
    shuffle=True,
    collate_fn=data_collator,
    batch_size=8,
)

DataCollatorWithPadding确保每个batch中的样本长度一致,通过padding处理。

模型加载

加载预训练的BERT模型,并添加适合MRPC任务的分类头:

from transformers import TFAutoModelForSequenceClassification
model = TFAutoModelForSequenceClassification.from_pretrained(checkpoint, num_labels=2)

num_labels=2表示这是一个二分类任务。

模型训练

基础训练配置

from tensorflow.keras.losses import SparseCategoricalCrossentropy

model.compile(
    optimizer="adam",
    loss=SparseCategoricalCrossentropy(from_logits=True),
    metrics=["accuracy"],
)
model.fit(
    tf_train_dataset,
    validation_data=tf_validation_dataset,
)

高级训练配置

为了获得更好的训练效果,我们可以实现学习率调度:

from tensorflow.keras.optimizers.schedules import PolynomialDecay
from tensorflow.keras.optimizers import Adam

batch_size = 8
num_epochs = 3
num_train_steps = len(tf_train_dataset) * num_epochs
lr_scheduler = PolynomialDecay(
    initial_learning_rate=5e-5, end_learning_rate=0.0, decay_steps=num_train_steps
)
opt = Adam(learning_rate=lr_scheduler)

model.compile(optimizer=opt, loss=loss, metrics=["accuracy"])
model.fit(tf_train_dataset, validation_data=tf_validation_dataset, epochs=3)

这种配置下,学习率会从5e-5开始,随着训练过程逐渐衰减到0。

模型评估

训练完成后,我们可以在验证集上进行预测和评估:

preds = model.predict(tf_validation_dataset)["logits"]
class_preds = np.argmax(preds, axis=1)

使用GLUE官方评估指标:

import evaluate
metric = evaluate.load("glue", "mrpc")
results = metric.compute(predictions=class_preds, references=raw_datasets["validation"]["label"])

典型的评估结果可能包含准确率(accuracy)和F1分数,例如:

{'accuracy': 0.857, 'f1': 0.899}

关键点解析

  1. 数据预处理:正确处理句子对格式是BERT模型成功的关键,需要确保两个句子之间有[SEP]标记分隔。

  2. 批次处理:动态padding技术可以显著减少计算资源的浪费,只对每个batch内的样本进行padding。

  3. 学习率调度:对于微调任务,较小的初始学习率和衰减策略通常能带来更好的效果。

  4. 评估指标:对于类别不平衡的数据集,F1分数往往比准确率更能反映模型性能。

常见问题与解决方案

  1. 内存不足:可以尝试减小batch size或使用梯度累积技术。

  2. 过拟合:增加dropout率或使用早停策略。

  3. 训练不稳定:尝试使用更小的学习率或添加学习率warmup。

总结

本文详细介绍了使用Hugging Face Transformers和Keras进行BERT模型微调的完整流程。通过合理的数据处理、模型配置和训练策略,我们可以在MRPC等句子对分类任务上取得优秀的表现。这种方法可以轻松扩展到其他类似的NLP任务中。

notebooks Notebooks using the Hugging Face libraries 🤗 notebooks 项目地址: https://gitcode.com/gh_mirrors/note/notebooks

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

洪牧朴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值