Transformers 库:一个强大的 NLP 模型工具库

释放双眼,带上耳机,听听看~!
Transformers 库提供创建和加载 transformer 模型的功能,支持多种 NLP 任务,包括文本分类、文本生成、命名实体识别等。
  • Transformers 库提供创建 transformer 模型和加载使用共享模型的功能;另外,模型中心(hub)包含数千个可以任意下载和使用的预训练模型,也支持用户上传模型到 Hub。

    API 概述

    Transformers 库的 API 主要包括以下三种:

    1. MAIN CLASSES:主要包括配置(configuration)、模型(model)、分词器(tokenizer)和流水线(pipeline)这几个最重要的类。
    2. MODELS:库中和每个模型实现有关的类和函数。
    3. INTERNAL HELPERS:内部使用的工具类和函数。

    三,快速上手

    3.1,transformer 模型类别

    Transformer 模型架构主要由两个部件组成:

    • Encoder (左侧): 编码器接收输入并构建其表示(其特征)。这意味着对模型进行了优化,以从输入中获得理解。
    • Decoder (右侧): 解码器使用编码器的表示(特征)以及其他输入来生成目标序列。这意味着该模型已针对生成输出进行了优化。

    Transformers 库:一个强大的 NLP 模型工具库

    上述两个部件中的每一个都可以作为模型架构独立使用,具体取决于任务:

    • Encoder-only models: 也叫自动编码 Transformer 模型,如 BERT-like 系列模型,适用于需要理解输入的任务。如句子分类和命名实体识别。
    • Decoder-only models: 也叫自回归 Transformer 模型,如 GPT-like 系列模型。适用于生成任务,如文本生成
    • Encoder-decoder models 或者 sequence-to-sequence models: 也被称作序列到序列的 Transformer 模型,如 BART/T5-like 系列模型。适用于需要根据输入进行生成的任务,如翻译或摘要。

    下表总结了目前的 transformers 架构模型类别、示例以及适用任务:

    模型 示例 任务
    编码器 ALBERT, BERT, DistilBERT, ELECTRA, RoBERTa 句子分类、命名实体识别、从文本中提取答案
    解码器 CTRL, GPT, GPT-2, Transformer XL 文本生成
    编码器-解码器 BART, T5, Marian, mBART 文本摘要、翻译、生成问题的回答

    3.2,Pipeline

    Transformers 库支持通过 pipeline() 函数设置 task 任务类型参数,来跑通不同模型的推理,可实现一行代码跑通跨不同模态的多种任务,其支持的任务列表如下:

    任务 描述 模态 Pipeline
    文本分类 为给定的文本序列分配一个标签 NLP pipeline(task=”sentiment-analysis”)
    文本生成 根据给定的提示生成文本 NLP pipeline(task=”text-generation”)
    命名实体识别 为序列里的每个token分配一个标签(人, 组织, 地址等等) NLP pipeline(task=”ner”)
    问答系统 通过给定的上下文和问题, 在文本中提取答案 NLP pipeline(task=”question-answering”)
    掩盖填充 预测出正确的在序列中被掩盖的token NLP pipeline(task=”fill-mask”)
    文本摘要 为文本序列或文档生成总结 NLP pipeline(task=”summarization”)
    文本翻译 将文本从一种语言翻译为另一种语言 NLP pipeline(task=”translation”)
    图像分类 为图像分配一个标签 Computer vision pipeline(task=”image-classification”)
    图像分割 为图像中每个独立的像素分配标签(支持语义、全景和实例分割) Computer vision pipeline(task=”image-segmentation”)
    目标检测 预测图像中目标对象的边界框和类别 Computer vision pipeline(task=”object-detection”)
    音频分类 给音频文件分配一个标签 Audio pipeline(task=”audio-classification”)
    自动语音识别 将音频文件中的语音提取为文本 Audio pipeline(task=”automatic-speech-recognition”)
    视觉问答 给定一个图像和一个问题,正确地回答有关图像的问题 Multimodal pipeline(task=”vqa”)

    Transformers 库:一个强大的 NLP 模型工具库

    以下代码是通过 pipeline 函数实现对文本的情绪分类。

    from transformers import pipeline
    
    classifier = pipeline("sentiment-analysis")
    print(classifier("I've been waiting for a HuggingFace course my whole life."))
    # [{'label': 'POSITIVE', 'score': 0.9598049521446228}]
    

    NLP 问题中,除了使用 pipeline() 任务中默认的模型,也可以通过指定 modeltokenizer 参数来自动查找相关模型。

    3.3,AutoClass

    Pipeline() 函数背后实际是通过 “AutoClass” 类,实现通过预训练模型的名称或路径自动查找其架构的快捷方式。通过为任务选择合适的 AutoClass 和它关联的预处理类,来重现使用 pipeline() 的结果。

    3.3.1,AutoTokenizer

    分词器(tokenizer)的作用是负责预处理文本,将输入文本(input prompt)转换为数字数组(array of numbers)来作为模型的输入。tokenization 过程主要的规则包括:如何拆分单词和什么样级别的单词应该被拆分。值得注意的是,实例化 tokenizer 和 model 必须是同一个模型名称或者 checkpoints 路径。

    对于 LLM ,通常还是使用 AutoModelAutoTokenizer 来加载预训练模型和它关联的分词器。

    from transformers import AutoModel, AutoTokenizer
    tokenizer = LlamaTokenizer.from_pretrained(model_name_or_path)
    model = AutoModel.from_pretrained(model_name_or_path, torch_dtype=torch.float16)
    

    一般使用 AutoTokenizer 加载分词器(tokenizer):

    from transformers import AutoTokenizer
    
    model_name = "nlptown/bert-base-multilingual-uncased-sentiment"
    tokenizer = AutoTokenizer.from_pretrained(model_name)
    
    encoding = tokenizer("We are very happy to show you the 🤗 Transformers library.")
    print(encoding)
    
    """
    {'input_ids': [101, 11312, 10320, 12495, 19308, 10114, 11391, 10855, 10103, 100, 58263, 13299, 119, 102], 
    'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
    'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]}
    """
    

    tokenizer 的返回是包含了如下“键”的字典:

    tokenizer() 函数还支持列表作为输入,并可填充和截断文本, 返回具有统一长度的批次

    pt_batch = tokenizer(
        ["We are very happy to show you the 🤗 Transformers library.", "We hope you don't hate it."],
        padding=True,
        truncation=True,
        max_length=512,
        return_tensors="pt",
    )
    

    3.3.2,AutoModel

    Transformers 提供了一种简单统一的方式来加载预训练的模型实例,即可以像加载 AutoTokenizer 一样加载 AutoModel,我们所需要提供的必须参数只有模型名称或者 checkpoints 路径,即只需输入初始化的 checkpoint(检查点)或者模型名称就可以返回正确的模型体系结构。示例代码如下所示:

    from transformers import AutoTokenizer, AutoModelForSequenceClassification
    from torch import nn
    
    model_name = "nlptown/bert-base-multilingual-uncased-sentiment"
    tokenizer = AutoTokenizer.from_pretrained(model_name) # 会下载 vocab.txt 词表
    
    # ["We are very happy to show you the 🤗 Transformers library.", "We hope you don't hate it."],
    pt_batch = tokenizer(
        "We are very happy to show you the 🤗 Transformers library.", "We hope you don't hate it.",
        padding=True,
        truncation=True,
        max_length=512,
        return_tensors="pt",
    )
    
    pt_model = AutoModelForSequenceClassification.from_pretrained(model_name) # 会下载 pytorch_model.bin 模型权重
    
    pt_outputs = pt_model(**pt_batch) # ** 可解包 pt_batch 字典
    pt_predictions = nn.functional.softmax(pt_outputs.logits, dim=-1) # 在 logits上应用softmax函数来查询概率
    
    print(pt_predictions)
    print(pt_model.config.id2label) # {0: '1 star', 1: '2 stars', 2: '3 stars', 3: '4 stars', 4: '5 stars'}
    

    注意,Transformers 模型默认情况下需要多个句子,虽然这里输入是一个句子,但 tokenizer 不仅会将输入ID列表转换为张量,还在其顶部添加了一个维度。

    程序运行结果输出如下所示。

    tensor([[0.0021, 0.0018, 0.0115, 0.2121, 0.7725],
    [0.2084, 0.1826, 0.1969, 0.1755, 0.2365]], grad_fn=)

    参考链接

    1. HuggingFace Transformers 官方文档
    2. NLP Course
    3. NLP领域中的token和tokenization到底指的是什么
本网站的内容主要来自互联网上的各种资源,仅供参考和信息分享之用,不代表本网站拥有相关版权或知识产权。如您认为内容侵犯您的权益,请联系我们,我们将尽快采取行动,包括删除或更正。
AI教程

AI绘画技术:探索创造性和有趣的新兴领域

2023-12-18 21:50:14

AI教程

Word2Vec模型参数更新方程详解

2023-12-18 22:00:14

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索