英文

Flan-UL2的模型卡片

目录

  • TL;DR
  • 使用模型
  • 结果
  • UL2简介
  • 训练
  • 贡献
  • 引用
  • TL;DR

    Flan-UL2是基于T5架构的编码器-解码器模型。它使用与去年早些时候发布的 UL2 model 相同的配置。它通过使用"Flan" prompt调整和数据集收集进行了微调。

    根据原始的 blog ,以下是显着的改进:

    • 原始的UL2模型只使用512的感受野进行训练,这对于N-shot prompting时N很大的情况并不理想。
    • Flan-UL2检查点使用具有2048感受野,这使得它更适用于少样本的上下文学习。
    • 原始的UL2模型还使用了模式切换标记,以获得良好的性能。然而,它们在推理或微调过程中有些不方便。在这个更新/更改中,我们在应用Flan指令调整之前继续对UL2 20B进行额外的训练100k步(使用小批量)来忘记“模式标记”。这个Flan-UL2检查点不再需要模式标记。

    使用模型

    从T5x转换到huggingface

    您可以使用 convert_t5x_checkpoint_to_pytorch.py 脚本,并通过传递参数strict = False。原始字典缺少最后的层标准化,这就是为什么我们传递strict = False参数的原因。

    python convert_t5x_checkpoint_to_pytorch.py --t5x_checkpoint_path PATH_TO_T5X_CHECKPOINTS --config_file PATH_TO_CONFIG --pytorch_dump_path PATH_TO_SAVE
    

    我们使用了与 google/ul2 相同的配置文件。

    运行模型

    为了更高效地使用内存,我们建议您使用load_in_8bit标志以8位方式加载模型,如下所示(仅适用于GPU):

    # pip install accelerate transformers bitsandbytes
    from transformers import T5ForConditionalGeneration, AutoTokenizer
    import torch
    model = T5ForConditionalGeneration.from_pretrained("google/flan-ul2", device_map="auto", load_in_8bit=True)                                                                 
    tokenizer = AutoTokenizer.from_pretrained("google/flan-ul2")
    
    input_string = "Answer the following question by reasoning step by step. The cafeteria had 23 apples. If they used 20 for lunch, and bought 6 more, how many apple do they have?"                                               
    
    inputs = tokenizer(input_string, return_tensors="pt").input_ids.to("cuda")
    outputs = model.generate(inputs, max_length=200)
    
    print(tokenizer.decode(outputs[0]))
    # <pad> They have 23 - 20 = 3 apples left. They have 3 + 6 = 9 apples. Therefore, the answer is 9.</s>
    

    否则,您可以使用bfloat16加载和运行模型,如下所示:

    # pip install accelerate transformers
    from transformers import T5ForConditionalGeneration, AutoTokenizer
    import torch
    model = T5ForConditionalGeneration.from_pretrained("google/flan-ul2", torch_dtype=torch.bfloat16, device_map="auto")                                                                 
    tokenizer = AutoTokenizer.from_pretrained("google/flan-ul2")
    
    input_string = "Answer the following question by reasoning step by step. The cafeteria had 23 apples. If they used 20 for lunch, and bought 6 more, how many apple do they have?"                                               
    
    inputs = tokenizer(input_string, return_tensors="pt").input_ids.to("cuda")
    outputs = model.generate(inputs, max_length=200)
    
    print(tokenizer.decode(outputs[0]))
    # <pad> They have 23 - 20 = 3 apples left. They have 3 + 6 = 9 apples. Therefore, the answer is 9.</s>
    

    结果

    性能改进

    报告的结果如下:

    MMLU BBH MMLU-CoT BBH-CoT Avg
    FLAN-PaLM 62B 59.6 47.5 56.9 44.9 49.9
    FLAN-PaLM 540B 73.5 57.9 70.9 66.3 67.2
    FLAN-T5-XXL 11B 55.1 45.3 48.6 41.4 47.6
    FLAN-UL2 20B 55.7(+1.1%) 45.9(+1.3%) 52.2(+7.4%) 42.7(+3.1%) 49.1(+3.2%)

    UL2简介

    这整个部分都是从 google/ul2 模型卡片复制过来的,可能会根据flan-ul2的情况进行更改。

    UL2是一个统一的预训练框架,可在各种数据集和设置中普遍有效。UL2使用混合去噪器(MoD)作为预训练目标,将不同的预训练范例组合在一起。UL2引入了模式切换的概念,其中下游微调与特定的预训练方案相关联。

    摘要

    现有的预训练模型通常针对特定类别的问题。到目前为止,关于正确的架构和预训练设置,似乎还没有达成共识。本文提出了一个统一的框架,用于预训练在各种数据集和设置中普遍有效的模型。我们首先将架构原型与预训练目标解开,这两个概念通常被混淆。接下来,我们提出了自我监督在NLP中的广义和统一视角,并展示了如何将不同的预训练目标归纳为彼此,并且插值不同的目标可以是有效的。然后,我们提出了混合去噪器(MoD)作为一种将多种预训练范例组合在一起的预训练目标。我们还引入了模式切换的概念,在其中下游微调与特定的预训练方案相关联。我们进行了大量实验来比较多种预训练目标,并发现我们的方法通过在多个不同的设置中优于T5和/或类似GPT模型来推动Pareto前沿。最后,通过将我们的模型扩展到20B参数,我们在50个众所周知的受监督NLP任务上实现了SOTA性能,包括语言生成(自动和人工评估)、语言理解、文本分类、问题回答、常识推理、长文本推理、结构化知识基础和信息检索。我们的模型在上下文学习方面也取得了强大的结果,在零样本SuperGLUE上优于175B GPT-3,并使T5-XXL在单次摘要中的性能提高了三倍。

    有关更多信息,请参阅原始论文。

    论文: Unifying Language Learning Paradigms

    作者: Yi Tay, Mostafa Dehghani, Vinh Q. Tran, Xavier Garcia, Dara Bahri, Tal Schuster, Huaixiu Steven Zheng, Neil Houlsby, Donald Metzler

    训练

    Flan UL2

    Flan-UL2模型是使用UL2检查点初始化的,然后使用Flan Prompting进行了额外训练。这意味着原始的训练语料库是C4,

    在“Scaling Instruction-Finetuned language models (Chung et al.)”(也有时被称为Flan2论文)中,关键思想是在一个数据集收集的指令上训练一个大型语言模型。这些数据集被构造为指令,使得模型能够在各种任务之间进行泛化。Flan主要是在学术任务上进行训练的。在Flan2中,我们发布了一系列的T5模型,从200M到11B的参数,并进行了Flan调整。

    Flan数据集也已在“The Flan Collection: Designing Data and Methods for Effective Instruction Tuning”(Longpre et al.)中开源。请参阅Google AI博客文章:“The Flan Collection: Advancing Open Source Methods for Instruction Tuning”。

    UL2预训练

    该模型在C4语料库上进行预训练。预训练时,模型在C4上的1万亿令牌进行训练(200万步),批量大小设为1024。输入和目标的序列长度设置为512/512。预训练期间的dropout为0。预训练需要大约一个月的时间来处理大约1万亿个令牌。该模型有32个编码器层和32个解码器层,dmodel为4096,df为16384。每个头的维度为256,共有16个头。我们的模型使用8个模型并行。使用与T5相同的sentencepiece分词器,词汇大小为32000(点击 here 了解有关T5分词器的更多信息)。

    UL-20B可以理解为与T5非常相似但使用不同目标进行训练并稍微调整了一些参数。UL-20B是使用 Jax T5X 基础架构进行训练的。

    预训练期间的训练目标是一种不同去噪策略的混合,具体说明如下:

    去噪的混合

    引用论文中的描述:

    我们推测,一个强大的通用模型必须在预训练期间暴露于解决多样化的问题。考虑到预训练是使用自我监督进行的,我们认为这种多样性应该注入到模型的目标中,否则模型可能会在某些能力上缺乏,例如生成长时间连贯的文本。受此启发以及当前的目标函数类别,我们定义了三个在预训练期间使用的主要范例:

    • R-Denoiser : 普通的去噪是介绍在 T5 中的标准跨度破坏,它使用2到5个标记作为跨度长度,约占输入标记的15%。这些跨度很短,潜在地有助于获取知识,而不是学习生成流畅的文本。

    • S-Denoiser : 原始的去噪的一个特例,我们观察到在构建输入到目标任务时存在严格的顺序,即前缀语言模型。为此,我们简单地将输入序列划分为两个子序列,作为上下文和目标,使得目标不依赖于未来信息。这与标准跨度破坏不同,标准跨度破坏中可能存在一个目标标记早于上下文标记的情况。注意,类似于前缀语言模型设置,上下文(前缀)保留了双向感受野。我们注意到,具有非常短的记忆或无记忆的S-Denoiser类似于标准因果语言模型。

    • X-Denoiser : 去噪的极端版本,模型必须根据有限的信息从输入中恢复大部分内容,以生成较长的目标。为此,我们选择包括无限制的去噪示例,其中约50%的输入序列被屏蔽。这是通过增加跨度长度和/或破坏率实现的。如果一个预训练任务具有长跨度(例如≥ 12个标记)或具有较大的破坏率(例如≥ 30%),我们认为该任务是极端的。X-Denoising的动机是在普通的跨度破坏和语言模型样式的目标之间进行插值。

    更多详细信息,请参见论文的第3.1.2节。

    微调

    模型在N个预训练步骤之后持续进行微调,其中N通常为50k到100k。换句话说,在每个Nk步的预训练之后,模型会在每个下游任务上进行微调。请参阅论文的第5.2.2节,了解所有用于微调的数据集的概述。

    随着模型的持续微调,一旦某个任务达到了最先进水平,微调就会在该任务上停止,以节省计算资源。总共,该模型进行了265万步的训练。

    贡献

    本模型最初由 Yi Tay 贡献,并由 Younes Belkada Arthur Zucker 添加到Hugging Face生态系统中。

    引用

    如果您想引用这项工作,请考虑引用宣布发布Flan-UL2的 blogpost