模型:
google/flan-ul2
任务:
文生文数据集:
svakulenk0/qrecc taskmaster2 djaym7/wiki_dialog deepmind/code_contests lambada gsm8k aqua_rat esnli quasc qed c4 3Ac4 3Aqed 3Aquasc 3Aaqua_rat 3Aesnli 3Alambada 3Agsm8k 3Adeepmind/code_contests 3Ataskmaster2 3Adjaym7/wiki_dialog 3Asvakulenk0/qrecc语言:
en预印本库:
arxiv:2205.05131许可:
apache-2.0Flan-UL2是基于T5架构的编码器-解码器模型。它使用与去年早些时候发布的 UL2 model 相同的配置。它通过使用"Flan" prompt调整和数据集收集进行了微调。
根据原始的 blog ,以下是显着的改进:
您可以使用 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%) |
这整个部分都是从 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模型是使用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”。
该模型在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 。