模型简介
模型特点
模型能力
使用案例
🚀 Flan-UL2模型卡
Flan-UL2 是基于 T5
架构的编解码器模型,它使用了与去年早些时候发布的 UL2 模型
相同的配置,并通过 “Flan” 提示调优和数据集收集进行了微调。该模型在多方面展现出优势,如扩大了接收域、无需模式令牌等,能在多种自然语言处理任务中发挥出色性能。
🚀 快速开始
从 T5x 转换到 Hugging Face
你可以使用 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
相同的配置文件。
运行模型
为了更高效地使用内存,建议你在 GPU 环境下使用 load_in_8bit
标志以 8bit
模式加载模型:
# 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>
✨ 主要特性
接收域扩大
原始的 UL2 模型仅在 512 的接收域上进行训练,这对于 N 值较大的 N-shot 提示来说并不理想。而 Flan-UL2 检查点使用了 2048 的接收域,使其更适用于少样本上下文学习。
无需模式令牌
原始的 UL2 模型需要模式切换令牌才能获得良好的性能,但这些令牌在推理或微调时需要进行一些更改,使用起来比较麻烦。在本次更新中,我们在应用 Flan 指令调优之前,对 UL2 20B 进行了额外 100k 步(小批量)的训练,使其“忘记”了“模式令牌”。因此,Flan-UL2 检查点不再需要模式令牌。
📦 安装指南
文档中未提及具体安装步骤,可参考上述“快速开始”部分进行模型的转换和运行。
💻 使用示例
基础用法
# 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>
高级用法
# 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 | 平均 | |
---|---|---|---|---|---|
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 使用了混合去噪器(Mixture-of-Denoisers,MoD),这是一种将多种预训练范式结合在一起的预训练目标。UL2 引入了模式切换的概念,即下游微调与特定的预训练方案相关联。
摘要
现有的预训练模型通常针对特定类型的问题。到目前为止,对于正确的架构和预训练设置似乎仍未达成共识。本文提出了一个预训练模型的统一框架,该框架在不同数据集和设置下都能普遍有效。我们首先将架构原型与预训练目标这两个通常被混淆的概念分开。接下来,我们提出了自然语言处理中自监督的广义和统一视角,并展示了不同的预训练目标如何相互转换,以及在不同目标之间进行插值如何有效。然后,我们提出了混合去噪器(MoD),这是一种将多种预训练范式结合在一起的预训练目标。此外,我们引入了模式切换的概念,即下游微调与特定的预训练方案相关联。我们进行了广泛的消融实验,比较了多种预训练目标,发现我们的方法在多个不同设置下优于 T5 和/或类似 GPT 的模型,推动了帕累托前沿。最后,通过将我们的模型扩展到 200 亿参数,我们在 50 个成熟的有监督自然语言处理任务中取得了最优性能,包括语言生成(自动和人工评估)、语言理解、文本分类、问答、常识推理、长文本推理、结构化知识接地和信息检索。我们的模型在上下文学习方面也取得了很好的结果,在零样本 SuperGLUE 上优于 1750 亿参数的 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 提示进行额外训练。这意味着原始的训练语料库是 C4
。
在 “Scaling Instruction-Finetuned language models (Chung et al.)”(有时也称为 Flan2 论文)中,关键思想是在一组数据集上训练大型语言模型。这些数据集以指令的形式表述,能够在不同任务中实现泛化。Flan 主要在学术任务上进行训练。在 Flan2 中,我们发布了一系列参数从 2 亿到 110 亿的 T5 模型,这些模型都使用 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。预训练期间,丢弃率设置为 0。对于大约 1 万亿个令牌的预训练,耗时略超过一个月。该模型有 32 个编码器层和 32 个解码器层,dmodel
为 4096,df
为 16384。每个头的维度为 256,总共有 16 个头。我们的模型使用了 8 的模型并行度。使用了与 T5 相同的词汇表大小为 32000 的 SentencePiece 分词器(点击 此处 了解更多关于 T5 分词器的信息)。
UL-20B 可以被解释为一个与 T5 非常相似的模型,但使用了不同的目标和略有不同的缩放旋钮进行训练。UL-20B 使用 Jax 和 T5X 基础设施进行训练。
预训练期间的训练目标是多种去噪策略的混合,具体解释如下:
混合去噪器
引用论文中的内容:
我们推测,一个强大的通用模型在预训练期间必须接触到解决各种问题。鉴于预训练是使用自监督进行的,我们认为这种多样性应该注入到模型的目标中,否则模型可能会缺乏某种能力,如长连贯文本生成。 基于此,以及当前的目标函数类别,我们定义了预训练期间使用的三种主要范式:
-
R-去噪器:常规去噪是 T5 中引入的标准跨度损坏,使用 2 到 5 个令牌的范围作为跨度长度,大约掩盖输入令牌的 15%。这些跨度较短,可能有助于获取知识,而不是学习生成流畅的文本。
-
S-去噪器:一种特定的去噪情况,在构建输入到目标任务时遵循严格的顺序,即前缀语言建模。为此,我们只需将输入序列划分为两个子序列,分别作为上下文和目标,使得目标不依赖于未来信息。这与标准跨度损坏不同,在标准跨度损坏中,可能存在目标令牌的位置早于上下文令牌的情况。请注意,与前缀语言模型设置类似,上下文(前缀)保留了双向接收域。我们注意到,具有非常短记忆或无记忆的 S-去噪在精神上与标准因果语言建模类似。
-
X-去噪器:一种极端的去噪版本,模型需要根据输入的一小部分到中等部分恢复大部分输入。这模拟了模型需要从信息相对有限的记忆中生成长目标的情况。为此,我们选择包含具有激进去噪的示例,其中大约 50% 的输入序列被掩盖。这可以通过增加跨度长度和/或损坏率来实现。我们认为,如果预训练任务具有长跨度(例如,≥ 12 个令牌)或高损坏率(例如,≥ 30%),则该任务是极端的。X-去噪的动机是在常规跨度损坏和类似语言模型的目标之间进行插值。
请参阅以下图表以获得更直观的解释:
重要提示:如需更多详细信息,请参阅 论文 的 3.1.2 节。
微调
模型在 N 个预训练步骤后继续进行微调,N 通常在 5 万到 10 万之间。换句话说,在每 N 万步的预训练之后,模型会在每个下游任务上进行微调。请参阅 论文 的 5.2.2 节,了解用于微调的所有数据集的概述。
由于模型是持续微调的,一旦某个任务达到最优性能,就会停止在该任务上的微调,以节省计算资源。模型总共训练了 265 万步。
重要提示:如需更多详细信息,请参阅 论文 的 5.2.1 和 5.2.2 节。
🔧 技术细节
模型架构
Flan-UL2 基于 T5
架构,具有 32 个编码器层和 32 个解码器层,dmodel
为 4096,df
为 16384,每个头的维度为 256,总共有 16 个头。
训练设置
- 预训练语料库:C4
- 预训练步骤:200 万步
- 批量大小:1024
- 序列长度:输入和目标均为 512/512
- 丢弃率:0
- 模型并行度:8
- 分词器:与 T5 相同的 SentencePiece 分词器,词汇表大小为 32000
微调设置
- 微调步骤:在每 5 万到 10 万步预训练后进行
- 总训练步骤:265 万步
📄 许可证
本模型使用 apache-2.0
许可证。
贡献者
本模型最初由 Yi Tay 贡献,并由 Younes Belkada 和 Arthur Zucker 添加到 Hugging Face 生态系统中。
引用
如果你想引用这项工作,请考虑引用宣布 Flan-UL2
发布的 博客文章。



