一、引言
pipeline(管道)是huggingface transformers库中一种极简方式使用大模型推理的抽象,将所有大模型分为音频(Audio)、计算机视觉(Computer vision)、自然语言处理(NLP)、多模态(Multimodal)等4大类,28小类任务(tasks)。共计覆盖32万个模型
今天介绍NLP自然语言处理的第一篇:填充蒙版(fill-mask),在huggingface库内有1.2万个填充蒙版(fill-mask)模型,最典型且必须掌握的模型当属google的bert。
二、填充蒙版(fill-mask)
2.1 概述
掩码mask语言建模的任务是掩码句子中的一些单词,并预测哪些单词应该替换这些掩码mask。当我们从统计上建模所训练的语言时,这些模型非常有用。。
2.2 技术原理
最典型的模型是google发布的BERT,BERT模型是一种基于Transformer的深度学习模型,主要用于自然语言处理任务,通过预训练和微调过程,在多种NLP任务中取得了显著的成绩
2.2.1 BERT模型的基本概念
BERT(Bidirectional Encoder Representations from Transformers)是一种预训练语言模型,由Google于2018年发布。它通过联合左侧和右侧的上下文信息,从未标记文本中预训练出一个深度双向表示模型。BERT模型的核心在于其使用Transformer的编码器部分,能够捕捉文本的双向上下文信息,这在之前的语言模型中是不曾实现的。
2.2.2 BERT模型的工作原理
- 预训练阶段:BERT通过两个主要任务进行预训练:遮蔽语言模型(MLM)和下一句预测(NSP)。在MLM任务中,模型被训练来预测输入句子中被遮蔽的词;而在NSP任务中,模型需要判断两个句子是否是连续的文本序列。
- 微调阶段:预训练完成后,BERT模型可以通过添加任务特定的输出层来进行微调,以适应不同的NLP任务,如情感分析、问答、命名实体识别等。微调过程利用了预训练阶段学到的语言表征,使得模型能够快速适应新的任务并取得优异的性能。
2.2.3 BERT模型的结构
BERT模型由多层Transformer编码器堆叠而成,每一层都包含自注意力机制和前馈神经网络。这种深层结构使得BERT能够捕捉从浅层语法特征到深层语义特征的不同级别的语言信息。
2.2.4 BERT模型的应用
BERT在多种NLP任务上取得了当时的最先进结果,包括但不限于情感分析、问答、命名实体识别等。由于其出色的性能和广泛的适用性,BERT成为了NLP领域的一个重大突破,为后续的语言模型研究和发展奠定了基础。
2.2.5 BERT模型与Transformer的区别和联系
Transformer是一种基于注意力的神经网络架构,而BERT是Transformer的一个具体应用实例,专注于自然语言处理任务。BERT利用了Transformer的编码器部分,通过预训练和微调过程,在多种自然语言处理任务中表现优异。
2.3 应用场景
- 语言理解评估:通过评估模型在遮蔽的单词预测上的准确性,可以衡量模型对语言的理解能力。
- 词汇学习:帮助模型学习词汇关系,例如同义词、上下文适用的词汇等。
- 文本生成:在内容创作、文本自动生成等领域,根据上下文填充适当的词汇,生成连贯、合理的文本段落。
- 文本完成与修正:自动完成文本或纠正拼写错误、语法错误,特别是在自动文本编辑器或写作辅助工具中。
- 个性化推荐系统:在内容推荐中,理解用户查询或上下文后,填充特定的关键词来优化推荐内容。
- 翻译与多语言处理:在机器翻译中,通过上下文预测单词,有助于提高翻译的准确性和自然性。
- 情感分析和语义理解:通过预测特定情境下的词汇来更精确地理解文本的情感或意图。
- 教育工具:用于语言学习软件中,帮助学生学习新词汇,通过填空练习来加强记忆。
2.4 pipeline参数
2.4.1 pipeline对象实例化参数
- model(PreTrainedModel或TFPreTrainedModel)— 管道将使用其进行预测的模型。 对于 PyTorch,这需要从PreTrainedModel继承;对于 TensorFlow,这需要从TFPreTrainedModel继承。
- tokenizer ( PreTrainedTokenizer ) — 管道将使用 tokenizer 来为模型编码数据。此对象继承自 PreTrainedTokenizer。
- modelcard(
str
或ModelCard
,可选)— 属于此管道模型的模型卡。 - framework(
str
,可选)— 要使用的框架,"pt"
适用于 PyTorch 或"tf"
TensorFlow。必须安装指定的框架。 - task(
str
,默认为""
)— 管道的任务标识符。 - num_workers(
int
,可选,默认为 8)— 当管道将使用DataLoader(传递数据集时,在 Pytorch 模型的 GPU 上)时,要使用的工作者数量。 - batch_size(
int
,可选,默认为 1)— 当管道将使用DataLoader(传递数据集时,在 Pytorch 模型的 GPU 上)时,要使用的批次的大小,对于推理来说,这并不总是有益的,请阅读使用管道进行批处理。 - args_parser(ArgumentHandler,可选) - 引用负责解析提供的管道参数的对象。
- device(
int
,可选,默认为 -1)— CPU/GPU 支持的设备序号。将其设置为 -1 将利用 CPU,设置为正数将在关联的 CUDA 设备 ID 上运行模型。 - torch_dtype(
str
或torch.dtype
,可选) - 直接发送model_kwargs
(只是一种更简单的快捷方式)以使用此模型的可用精度(torch.float16
,,torch.bfloat16
...或"auto"
) - binary_output(
bool
,可选,默认为False
)——标志指示管道的输出是否应以序列化格式(即 pickle)或原始输出数据(例如文本)进行。 - top_k(
int
,可选,默认为 5)— 要返回的预测数量。 - targets(
str
或List[str]
,可选)— 传递后,模型会将分数限制在传递的目标上,而不是在整个词汇表中查找。如果提供的目标不在模型词汇表中,则它们将被标记化,并使用第一个生成的标记(带有警告,并且可能会更慢)。 - tokenizer_kwargs(
dict
,可选)——传递给标记器 (tokenizer) 的关键字参数的附加词典。
2.4.2 pipeline对象使用参数
- args(
str
或List[str]
)— 一个或多个带有掩码标记的文本(或一个提示列表)。 - targets(
str
或List[str]
,可选)— 传递后,模型会将分数限制在传递的目标上,而不是在整个词汇表中查找。如果提供的目标不在模型词汇表中,则它们将被标记化,并使用第一个生成的标记(带有警告,并且可能会更慢)。 - top_k(
int
,可选)——传递时,覆盖要返回的预测数量。
2.4.3 pipeline返回参数
- sequence(
str
)——与掩码标记预测相对应的输入。 - score(
float
)——相应的概率。 - token (
int
) — 预测的 token id(用于替换被屏蔽的 token id)。 - token_str (
str
) — 预测的标记(用于替换被屏蔽的标记)。
2.5 pipeline实战
采用pipeline,使用google的bert中文版模型bert-base-chinese对文本进行补全。
代码语言:javascript复制import os
os.environ["HF_ENDPOINT"] = "https://hf-mirror.com"
os.environ["CUDA_VISIBLE_DEVICES"] = "2"
from transformers import pipeline
fill_masker = pipeline(model="google-bert/bert-base-chinese", task="fill-mask")
output=fill_masker("我是一个[MASK].")
print(output)
执行后,自动下载模型文件并进行识别:
2.6 模型排名
在huggingface上,我们将填充蒙版(fill-mask)模型按下载量从高到低排序,总计1.2万个模型,排名第一的当属google-bert/bert-base-uncased。
三、总结
本文对transformers之pipeline的填充蒙版(fill-mask)从概述、技术原理、pipeline参数、pipeline实战、模型排名等方面进行介绍,读者可以基于pipeline使用文中的2行代码极简的使用NLP中的填充蒙版(fill-mask)模型。