zoukankan      html  css  js  c++  java
  • Transformers 简介(上)

    作者|huggingface 编译|VK 来源|Github

    Transformers是TensorFlow 2.0和PyTorch的最新自然语言处理库

    Transformers(以前称为pytorch-transformers和pytorch-pretrained-bert)提供用于自然语言理解(NLU)和自然语言生成(NLG)的最先进的模型(BERT,GPT-2,RoBERTa,XLM,DistilBert,XLNet,CTRL ...) ,拥有超过32种预训练模型,支持100多种语言,并且在TensorFlow 2.0和PyTorch之间具有深厚的互操作性。

    特性

    • 与pytorch-transformers一样易于使用
    • 像Keras一样强大而简洁
    • 在NLU和NLG任务上具有高性能
    • 教育者和从业者进入的门槛低

    面向所有人的最新NLP架构

    • 深度学习研究人员
    • 练习实践学习人员
    • AI/ML/NLP教师和教育者

    降低计算成本

    • 研究人员可以共享训练好的模型,而不必总是再训练
    • 从业人员可以减少计算时间和生产成本
    • 具有30多种预训练模型的10种架构,其中一些采用100多种语言

    为模型生命周期的每个部分选择合适的框架

    • 3行代码训练最先进的模型
    • TensorFlow 2.0和PyTorch模型之间的深层互操作性
    • 在TF2.0/PyTorch框架之间随意迁移模型
    • 无缝选择合适的框架进行训练,评估和生产
    章节 描述
    安装 如何安装套件
    模型架构 体系结构(带预训练权重)
    在线演示 试用文本生成功能
    用法 分词和模型使用:Bert和GPT-2
    TF2.0和PyTorch 用10行代码训练TF2.0模型,并将其加载到PyTorch中
    管道 使用管道:使用管道进行分词和微调
    微调与使用脚本 使用提供的脚本:GLUE,SQuAD和文本生成
    分享你的模型 上传和与社区共享你的微调模型
    从pytorch-transformers到 transformers 将代码从pytorch-transformers迁移到transformers
    从pytorch-pretrained-bert迁移到pytorch-transformers 将代码从pytorch-pretrained-bert迁移到transformers

    安装

    此仓库已在Python 3.5 +,PyTorch 1.0.0+和TensorFlow 2.0.0-rc1上进行了测试

    你应该安装虚拟环境中的transformers。如果你不熟悉Python虚拟环境,请查看用户指南。

    使用你要使用的Python版本创建一个虚拟环境并激活它。

    现在,如果你想使用transformers,你可以使用pip进行安装。如果你想使用这些示例,则必须从源代码安装它。

    pip安装

    首先,你需要安装TensorFlow 2.0或PyTorch。有关适用于你平台的特定安装命令,请参阅TensorFlow安装页面和/或PyTorch安装页面。

    安装TensorFlow 2.0或PyTorch后,可以使用pip如下安装transformers:

    pip install transformers

    获取源码

    同样在这里,你首先需要安装TensorFlow 2.0或PyTorch中。有关适用于你平台的特定安装命令,请参阅TensorFlow安装页面和/或PyTorch安装页面。

    在安装TensorFlow 2.0或PyTorch之后,你可以通过克隆存储库并运行以下命令从源代码进行安装:

    git clone https://github.com/huggingface/transformers
    cd transformers
    pip install .

    更新存储库时,应按以下方式升级transformers及其依赖项:

    git pull 
    pip install --upgrade .

    运行示例

    示例包含在存储库中,但未随库一起提供。

    因此,为了运行示例的最新版本,你需要如上所述从源代码安装。

    查看自述文件,了解如何运行示例。

    测试

    该库和一些示例脚本包括一系列测试。可以在tests文件夹中找到库测试,而在examples文件夹中可以找到示例测试。

    根据安装的框架(TensorFlow 2.0或PyTorch),不相关的测试将被跳过。如果要执行所有测试,请确保两个框架都已安装。

    这是为库运行测试的最简单方法:

    pip install -e ".[testing]"
    make test

    对于示例:

    pip install -e ".[testing]"
    pip install -r examples/requirements.txt
    make test-examples

    有关详细信息,请参阅提供指南。

    你要在移动设备上运行Transformer模型吗?

    你应该查看我们的swift-coreml-transformers仓库。

    https://github.com/huggingface/swift-coreml-transformers

    它包含了一套工具来转换PyTorch或TensorFlow 2.0训练的transformers模型(目前包含GPT-2,DistilGPT-2,BERT和DistilBERT)以CoreML模型运行在iOS设备上。

    在将来的某个时候,你将能够从预训练或微调模型无缝过渡到在CoreML中进行生产,或者在CoreML中对模型或应用进行原型设计,然后从TensorFlow 2.0和研究其超参数或体系结构!

    模型架构

    transformers目前提供以下NLU / NLG体系结构:

    1. BERT
    2. GPT
    3. GPT-2
    4. Transformer-XL
    5. XLNet
    6. XLM
    7. RoBERTa
    8. DistilBERT
    9. CTRL
    10. CamemBERT
    11. ALBERT
    12. T5
    13. XLM-RoBERTa
    14. MMBT
    15. FlauBERT
    16. 其他社区的模型
    17. 想要贡献一个新的模型吗?我们已经添加了详细的教程和模板来指导你添加新模型的过程。你可以在存储库的templates文件夹中找到它们。

    在线演示

    由Transformer.huggingface.co的Hugging Face团队构建的 Write With Transformer是此仓库的文本生成功能的正式演示。你可以用它完成GPT2Model,TransfoXLModel和XLNetModel一些实验。

    快速浏览

    让我们做一个快速浏览。每个模型架构的详细示例(Bert、GPT、GPT-2、Transformer-XL、XLNet和XLM)可以在完整文档中找到

    (https://huggingface.co/transformers/)。

    import torch
    from transformers import *
    
    # transformer有一个统一的API
    # 有10个Transformer结构和30个预训练权重模型。
    #模型|分词|预训练权重
    MODELS = [(BertModel,       BertTokenizer,       'bert-base-uncased'),
              (OpenAIGPTModel,  OpenAIGPTTokenizer,  'openai-gpt'),
              (GPT2Model,       GPT2Tokenizer,       'gpt2'),
              (CTRLModel,       CTRLTokenizer,       'ctrl'),
              (TransfoXLModel,  TransfoXLTokenizer,  'transfo-xl-wt103'),
              (XLNetModel,      XLNetTokenizer,      'xlnet-base-cased'),
              (XLMModel,        XLMTokenizer,        'xlm-mlm-enfr-1024'),
              (DistilBertModel, DistilBertTokenizer, 'distilbert-base-cased'),
              (RobertaModel,    RobertaTokenizer,    'roberta-base'),
              (XLMRobertaModel, XLMRobertaTokenizer, 'xlm-roberta-base'),
             ]
    
    # 要使用TensorFlow 2.0版本的模型,只需在类名前面加上“TF”,例如。“TFRobertaModel”是TF2.0版本的PyTorch模型“RobertaModel”
    
    # 让我们用每个模型将一些文本编码成隐藏状态序列:
    for model_class, tokenizer_class, pretrained_weights in MODELS:
        # 加载pretrained模型/分词器
        tokenizer = tokenizer_class.from_pretrained(pretrained_weights)
        model = model_class.from_pretrained(pretrained_weights)
    
        # 编码文本
        input_ids = torch.tensor([tokenizer.encode("Here is some text to encode", add_special_tokens=True)])  # 添加特殊标记
        with torch.no_grad():
            last_hidden_states = model(input_ids)[0]  # 模型输出是元组
    
    # 每个架构都提供了几个类,用于对下游任务进行调优,例如。
    BERT_MODEL_CLASSES = [BertModel, BertForPreTraining, BertForMaskedLM, BertForNextSentencePrediction,
                          BertForSequenceClassification, BertForTokenClassification, BertForQuestionAnswering]
    
    # 体系结构的所有类都可以从该体系结构的预训练权重开始
    #注意,为微调添加的额外权重只在需要接受下游任务的训练时初始化
    
    pretrained_weights = 'bert-base-uncased'
    tokenizer = BertTokenizer.from_pretrained(pretrained_weights)
    for model_class in BERT_MODEL_CLASSES:
        # 载入模型/分词器
        model = model_class.from_pretrained(pretrained_weights)
    
        # 模型可以在每一层返回隐藏状态和带有注意力机制的权值
        model = model_class.from_pretrained(pretrained_weights,
                                            output_hidden_states=True,
                                            output_attentions=True)
        input_ids = torch.tensor([tokenizer.encode("Let's see all hidden-states and attentions on this text")])
        all_hidden_states, all_attentions = model(input_ids)[-2:]
    
        #模型与Torchscript兼容
        model = model_class.from_pretrained(pretrained_weights, torchscript=True)
        traced_model = torch.jit.trace(model, (input_ids,))
    
        # 模型和分词的简单序列化
        model.save_pretrained('./directory/to/save/')  # 保存
        model = model_class.from_pretrained('./directory/to/save/')  # 重载
        tokenizer.save_pretrained('./directory/to/save/')  # 保存
        tokenizer = BertTokenizer.from_pretrained('./directory/to/save/')  # 重载
    

    快速游览TF2.0的训练和与PyTorch的互操作性

    让我们做一个快速的例子如何用12行代码训练TensorFlow 2.0模型,然后加载在PyTorch快速检验/测试。

    import tensorflow as tf
    import tensorflow_datasets
    from transformers import *
    
    # 从预训练模型/词汇表中加载数据集、分词器、模型
    tokenizer = BertTokenizer.from_pretrained('bert-base-cased')
    model = TFBertForSequenceClassification.from_pretrained('bert-base-cased')
    data = tensorflow_datasets.load('glue/mrpc')
    
    # 准备数据集作为tf.data.Dataset的实例
    train_dataset = glue_convert_examples_to_features(data['train'], tokenizer, max_length=128, task='mrpc')
    valid_dataset = glue_convert_examples_to_features(data['validation'], tokenizer, max_length=128, task='mrpc')
    train_dataset = train_dataset.shuffle(100).batch(32).repeat(2)
    valid_dataset = valid_dataset.batch(64)
    
    # 准备训练:编写tf.keras模型与优化,损失和学习率调度
    optimizer = tf.keras.optimizers.Adam(learning_rate=3e-5, epsilon=1e-08, clipnorm=1.0)
    loss = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
    metric = tf.keras.metrics.SparseCategoricalAccuracy('accuracy')
    model.compile(optimizer=optimizer, loss=loss, metrics=[metric])
    
    # 用tf.keras.Model.fit进行测试和评估
    history = model.fit(train_dataset, epochs=2, steps_per_epoch=115,
                        validation_data=valid_dataset, validation_steps=7)
    
    # 在PyTorch中加载TensorFlow模型进行检查
    model.save_pretrained('./save/')
    pytorch_model = BertForSequenceClassification.from_pretrained('./save/', from_tf=True)
    
    #让我们看看我们的模型是否学会了这个任务
    sentence_0 = "This research was consistent with his findings."
    sentence_1 = "His findings were compatible with this research."
    sentence_2 = "His findings were not compatible with this research."
    inputs_1 = tokenizer.encode_plus(sentence_0, sentence_1, add_special_tokens=True, return_tensors='pt')
    inputs_2 = tokenizer.encode_plus(sentence_0, sentence_2, add_special_tokens=True, return_tensors='pt')
    
    pred_1 = pytorch_model(inputs_1['input_ids'], token_type_ids=inputs_1['token_type_ids'])[0].argmax().item()
    pred_2 = pytorch_model(inputs_2['input_ids'], token_type_ids=inputs_2['token_type_ids'])[0].argmax().item()
    
    print("sentence_1 is", "a paraphrase" if pred_1 else "not a paraphrase", "of sentence_0")
    print("sentence_2 is", "a paraphrase" if pred_2 else "not a paraphrase", "of sentence_0")

    欢迎关注磐创博客资源汇总站: http://docs.panchuang.net/

    欢迎关注PyTorch官方中文教程站: http://pytorch.panchuang.net/

    OpenCV中文官方文档: http://woshicver.com/

  • 相关阅读:
    2016年11-29 mysql数据库
    2016年11月25日网页项目知识
    11月22日 网页项目遇到知识
    2016年11月15
    document操作
    2016年11月8日 函数
    2016年11月7日 数组练习
    2016年11月6日数组
    2016年11月4日运算符与语句
    2016年11月3日JS脚本简介数据类型: 1.整型:int 2.小数类型: float(单精度) double(双精度) decimal () 3.字符类型: chr 4.字符串类型:sting 5.日期时间:datetime 6.布尔型数据:bool 7.对象类型:object 8.二进制:binary 语言类型: 1.强类型语言:c++ c c# java 2.弱类型语
  • 原文地址:https://www.cnblogs.com/panchuangai/p/12567853.html
Copyright © 2011-2022 走看看