本文重要面向对自然语言处理感兴趣的开辟者和研究人员,无论你是刚刚踏入 NLP 范畴的新手,还是已经有肯定基础但想要深入探索的中级开辟者,都能从本文中获益。我们将聚焦于 Hugging Face 这个强大的开源平台,它为 NLP 开辟提供了丰富的工具和资源,极大地简化了开辟过程
Hugging Face 简介
Hugging Face 是一个集成了大量预训练模子、数据集和其他资源的开源社区,专注于自然语言处理(NLP)。它为开辟者和研究人员提供了方便的工具,可以快速使用并微调大规模预训练的 NLP 模子。通过与 transformers 库的紧麋集成,Hugging Face 极大地简化了 NLP 项目标开辟过程,降低了门槛。
Hugging Face Hub
Hugging Face Hub 是一个包罗多种预训练模子、数据集及其他资源的平台。开辟者可以通过几行代码轻松加载如 BERT、GPT 等模子,无需深入相识模子的底层实现。许多业界权势巨子的研究者和公司也在 Hugging Face 上发布和分享本身的最新模子,使得广大的开辟者和研究人员可以大概在这些资源的基础上举行创新。通过 Hugging Face,我们可以“站在巨人的肩膀上”,节省大量的盘算资源和数据准备工作。
使用模子
1. 使用官方代码快速加载模子
- from transformers import BertModel, BertTokenizer
- # 加载BERT模型和分词器
- model = BertModel.from_pretrained('bert-base-uncased')
复制代码 这种方式是通过 Hugging Face 提供的 transformers 库直接加载预训练模子。BertTokenizer 会自动处理文本的分词工作,BertModel 则负责加载模子并初始化其权重。此方法快速且高效,实用于大多数开辟者。
2. 手动下载并导入模子
如果你需要在没有良好网络环境的情况下使用模子,大概希望将模子当地化,可以选择手动下载并加载模子文件。起首在 Hugging Face 官网找到你需要的 BERT 模子,下载以下文件:
- config.json(模子配置)
- pytorch_model.bin(模子权重)
- tokenizer_config.json(分词器配置)
- tokenizer.json(分词器的词表)
- vocab.txt(BERT的词汇表)
然后,创建 model 文件夹,将这些文件放入该目次,并通过以下代码加载模子:
- import transformers
- # 设置本地模型路径
- MODEL_PATH = r"D:\model\bert-base-uncased"
- # 加载本地存储的分词器
- tokenizer = transformers.BertTokenizer.from_pretrained(r"D:\model\bert-base-uncased\vocab.txt")
- # 加载模型配置和模型
- model_config = transformers.BertConfig.from_pretrained(MODEL_PATH)
- model = transformers.BertModel.from_pretrained(MODEL_PATH, config=model_config)
复制代码 手动下载和导入模子实用于当地存储需求较高或网络条件较差的情况。
问答使命
1. 模子构建
- from transformers import BertTokenizer, BertForQuestionAnswering
- import torch
- # 加载中文BERT模型和分词器
- model = BertForQuestionAnswering.from_pretrained("bert-base-chinese")
- tokenizer = BertTokenizer.from_pretrained("bert-base-chinese")
复制代码 在这里,我们通过 BertForQuestionAnswering 类初始化模子,专门用于问答使命。该模子会输出两个重要分数:start_position(答案的起始位置)和 end_position(答案的结束位置)。
2. 模子输入与输出
- 输入:问题和上下文
- 输出:猜测的开始位置和结束位置的 logits(得分)
比方,给定问题“李明是谁?”和文章“李明是个学生”,模子的输出应该是“学生”。
- # 输入问题和上下文
- question = "李明是谁?"
- context = "李明是个学生"
- # 对问题和上下文进行编码
- inputs = tokenizer(question, context, return_tensors="pt")
- # 进行推理,获取模型输出
- outputs = model(**inputs)
- # 提取start_logits和end_logits
- start_logits = outputs.start_logits
- end_logits = outputs.end_logits
- # 找到最可能的答案起始和结束位置
- start_position = torch.argmax(start_logits)
- end_position = torch.argmax(end_logits)
复制代码 3. 解码答案
- # 将token ID转换为词
- all_tokens = tokenizer.convert_ids_to_tokens(inputs["input_ids"].squeeze())
- # 获取答案的token
- answer_tokens = all_tokens[start_position : end_position + 1]
- # 将tokens合并为最终的答案字符串
- answer = tokenizer.convert_tokens_to_string(answer_tokens)
- print("Answer:", answer) # 输出:学生
复制代码 在这段代码中,我们通过 start_position 和 end_position 提取对应的 token,从而得到答案。
使用框架举行微调模子
Hugging Face 提供了很多工具资助用户举行模子的微调,数据加载,训练和评估等。
1.加载预训练模子和分词器
- from transformers import AutoTokenizer, AutoModelForSequenceClassification
- # 假设以下变量已经定义
- base_model = "bert-base-uncased"
- label2id = {"positive": 0, "negative": 1}
- id2label = {0: "positive", 1: "negative"}
- training_output_dir = "training_output"
- # 导入 AutoTokenizer 并根据预训练的基础模型加载相应的分词器
- tokenizer = AutoTokenizer.from_pretrained(base_model)
- # 导入 AutoModelForSequenceClassification 并根据预训练的基础模型加载相应的序列分类模型
- # 这里的 num_labels 表示分类任务的类别数量,根据 label2id 字典的长度确定
- # label2id 是将标签映射为数字 ID 的字典,方便模型处理
- # id2label 是将数字 ID 映射回标签的字典,用于结果解释
- model = AutoModelForSequenceClassification.from_pretrained(
- base_model,
- num_labels=len(label2id),
- label2id=label2id,
- id2label=id2label
- )
复制代码 :
- AutoTokenizer.from_pretrained(base_model):根据预定义的 base_model 名称加载相应的分词器,分词器用于将文本数据转换为模子可以处理的格式。
- AutoModelForSequenceClassification.from_pretrained(...):根据 base_model 加载相应的序列分类模子,同时通过 num_labels、label2id 和 id2label 参数将标签和其对应的 ID 举行映射,以便模子处理分类使命。
2. 加载并处理数据集
datasets 库可以资助我们轻松加载各种尺度数据集,并通过 tokenizer 对数据举行预处理。
- from datasets import load_dataset
- # 加载IMDB电影评论数据集
- train_test_dataset = load_dataset("imdb")
- # 定义tokenization函数
- def tokenize_function(examples):
- return tokenizer(examples["text"], padding=False, truncation=True)
- # 对数据集进行tokenize
- train_test_tokenized = train_test_dataset.map(tokenize_function, batched=True)
复制代码 在这段代码中,起首使用 load_dataset 函数从 Hugging Face 的数据集仓库中加载名为 imdb 的数据集,这个数据集包罗了大量的影评数据,常用于文天职类、情感分析等使命。然后,定义了一个 tokenize_function 函数,它会使用 tokenizer 对数据集中的 text 字段举行分词处理,根据 padding=False 和 truncation=True 的设置,不会对文本举行填充操作,但会对过长的文本举行截断处理。末了,使用 map 函数将 tokenize_function 应用到整个数据集上,并以批处理的方式举行处理,得到处理后的数据集 train_test_tokenized。
3. 设置评估指标
使用 evaluate 库配置评估指标,并盘算模子性能。
- import numpy as np
- import evaluate
- # 加载准确度评估指标
- metric = evaluate.load("accuracy")
- # 计算准确度的函数
- def compute_metrics(eval_pred):
- logits, labels = eval_pred
- predictions = np.argmax(logits, axis=-1)
- return metric.compute(predictions=predictions, references=labels)
复制代码 这里,我们起首导入 numpy 和 evaluate 库。通过 evaluate.load("accuracy") 加载正确率评估指标。compute_metrics 函数用于盘算评估指标,它接收 eval_pred 作为输入,其中包罗了模子的猜测效果 logits 和真实标签 labels。使用 np.argmax(logits, axis=-1) 找到猜测效果中概率最大的类别作为最终的猜测类别,末了使用 metric.compute(predictions=predictions, references=labels) 盘算正确率。
4. 配置训练参数
TrainingArguments 类用于设置训练过程中的各项参数。
- from transformers import TrainingArguments
- # 配置训练参数
- training_args = TrainingArguments(
- output_dir=training_output_dir, # 设置输出目录
- evaluation_strategy="epoch" # 每个epoch结束后进行一次评估
- )
复制代码 TrainingArguments 类用于设置训练过程中的各种参数。在这里,我们设置了 output_dir 作为训练输出的目次,将训练效果存储在该目次下,需要将 training_output_dir 替换为实际的存储路径。evaluation_strategy="epoch" 表现在每个训练周期(epoch)结束时举行评估,以便我们可以大概实时相识模子的训练进展和性能。
5. 创建 Trainer 实例并举行训练
Trainer 是 Hugging Face 提供的一个类,用于简化训练流程。
- from transformers import Trainer
- from transformers import DataCollatorWithPadding
- # 使用批处理器
- # 对输入数据进行填充处理,确保输入数据长度一致,以便于模型处理
- # tokenizer 是之前已定义好的分词器,将其传递给 DataCollatorWithPadding 实例化数据处理器
- data_collator = DataCollatorWithPadding(tokenizer)
- # 创建 Trainer 实例
- trainer = Trainer(
- model=model,
- args=training_args,
- train_dataset=train_test_dataset["train"],
- eval_dataset=train_test_dataset["test"],
- compute_metrics=compute_metrics,
- data_collator=data_collator
- )
- # 开始训练
- trainer.train()
复制代码 在这部门代码中,我们使用 Trainer 类创建一个训练器实例。其中,model 参数指定了要训练的模子,args 参数传递了之前设置的训练参数,train_dataset 和 eval_dataset 分别指定了训练集和测试集,compute_metrics 提供了评估指标的盘算函数,data_collator 用于对数据举行整理和批处理。末了调用 trainer.train() 开始训练模子,Trainer 会自动完成模子的前向流传、反向流传、参数更新等一系列训练过程。
6. 模子评估
- # 评估模型性能
- eval_results = trainer.evaluate()
- # 打印评估结果
- print("Evaluation Results:")
- for key, value in eval_results.items():
- print(f"{key}: {value}")
复制代码 在模子训练完成后,使用 trainer.evaluate() 对模子举行评估,得到评估效果 eval_results。这个效果是一个包罗多个评估指标的字典,我们使用 for 循环遍历并打印出每个评估指标的名称和对应的值,以便检察模子的性能。
总结
Hugging Face 提供的工具和资源极大简化了 NLP 模子的使用和微调过程。通过 Hugging Face Hub,我们可以轻松下载并使用多种预训练模子。通过 transformers 库中的工具,我们可以快速举行微调并实行常见的 NLP 使命,如文天职类、问答、命名实体识别等。
本文重点先容了如何利用 BERT 举行问答使命的微调,同时提供了如何使用 Trainer 类、AutoTokenizer 和 datasets 等工具举行训练和评估的示例。希望这些信息可以大概资助你更高效地使用 Hugging Face 平台,提升 NLP 项目标开辟服从。
感谢您的阅读!希望这篇文章对你有所资助。如果你有任何问题或建议,欢迎在评论区留言,我们可以一起讨论和学习。祝你在 NLP 项目标开辟中一切顺利!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |