T5模型及其后续优化

t5作为将全部NLP任务看作Text-To-Text的开山鼻祖,为后续,包括目前许多模型都产生了借鉴和基础。

一、背景

迁移学习是自然语言处理(NLP)中一种强大的技术,它首先在数据丰富的任务上对模型进行预训练,然后在下游任务上进行微调。迁移学习的有效性导致了方法、方法和实践的多样性。在本文中,我们通过引入一个统一的框架来探索NLP的迁移学习技术的前景,该框架将每个语言问题转换为文本到文本的格式。我们的系统研究比较了几十项语言理解任务的预训练目标、体系结构、未标记数据集、迁移方法和其他因素。通过将我们的探索见解与规模和我们新的“Colossal Clean Crawled Corpus”相结合,我们在许多基准测试上取得了最先进的成果,包括摘要、问答、文本分类等。为了促进NLP迁移学习的未来工作,我们发布了数据集、预先训练的模型和代码。

二、T5

T5是编码器-解码器模型,并将所有NLP问题转换为文本到文本格式。它是通过教师的强迫来训练的。这意味着,对于训练,我们总是需要一个输入序列和相应的目标序列。使用input_ids将输入序列馈送到模型。目标序列向右移动,即,由开始序列标记进行预处理,并使用decoder_input_ids将其馈送到解码器。在教师强制风格中,目标序列随后被EOS令牌附加,并与标签相对应。PAD令牌在此被用作开始序列令牌。T5可以以有监督和无监督的方式进行训练/微调。

在这里插入图片描述

2.1 训练
  • 无监督

    span mask任务

    from transformers import T5Tokenizer, T5ForConditionalGeneration
    
    tokenizer = T5Tokenizer.from_pretrained("t5-small")
    model = T5ForConditionalGeneration.from_pretrained("t5-small")
    
    input_ids = tokenizer("The <extra_id_0> walks in <extra_id_1> park", return_tensors="pt").input_ids
    labels = tokenizer("<extra_id_0> cute dog <extra_id_1> the <extra_id_2>", return_tensors="pt").input_ids
    
    # the forward function automatically creates the correct decoder_input_ids
    loss = model(input_ids=input_ids, labels=labels).loss
    loss.item()
    
  • 有监督

    from transformers import T5Tokenizer, T5ForConditionalGeneration
    
    tokenizer = T5Tokenizer.from_pretrained("t5-small")
    model = T5ForConditionalGeneration.from_pretrained("t5-small")
    
    input_ids = tokenizer("translate English to German: The house is wonderful.", return_tensors="pt").input_ids
    labels = tokenizer("Das Haus ist wunderbar.", return_tensors="pt").input_ids
    
    # the forward function automatically creates the correct decoder_input_ids
    loss = model(input_ids=input_ids, labels=labels).loss
    loss.item()
    
2.2 预测
  • 无监督任务

    from transformers import T5Tokenizer, T5ForConditionalGeneration
    
    tokenizer = T5Tokenizer.from_pretrained("t5-small")
    model = T5ForConditionalGeneration.from_pretrained("t5-small")
    
    input_ids = tokenizer("The <extra_id_0> walks in <extra_id_1> park", return_tensors="pt").input_ids
    
    sequence_ids = model.generate(input_ids)
    sequences = tokenizer.batch_decode(sequence_ids)
    sequences
    

三、t5优化版本

3.1 t5v1.1

无监督预训练的t5,为了更好适应下游特点微调任务,不至于原有t5监督预训练任务造成很大的diff。

  1. feed-forward 使用geglu代替relu
  2. 预训练时 关闭dropout
  3. 仅使用C4数据集进行预训练
  4. 嵌入层和分类器层之间没有参数共享。
  5. 用“xl”和“xxl”代替“3B”和“11B”。模型形状有点不同——较大的d_model和较小的num_heads和d_ff。
3.2 mT5

仅在mC4数据集进行预训练,与t5v1.1类似,训练包含101种语言,在跨语种表现好些。

3.3 byT5

byT5是在字节序列而不是句子片段子词标记序列上预训练的T5模型。主要为了避免不同tokenizer分词,词表带来的对语言模型的影响,考虑直接使用字节list(uft-8) 进行语言模型的实现。

目前广泛使用的预训练语言模型对应于单词或子单词单元的标记序列进行操作。在本文中,我们展示了标准Transformer体系结构可以在处理字节序列时进行最小的修改。我们仔细描述了参数计数、训练FLOP和推理速度方面的权衡,并表明字节级模型与其令牌级模型相比具有竞争力。我们还证明了字节级模型对噪声的鲁棒性明显更强,并且在对拼写和发音敏感的任务中表现更好。

3.4 UL2

基于t5结构的统一预训练和微调策略,实现的模型

本文为预训练模型提供了一个统一的框架,该框架在数据集和设置中普遍有效。我们首先将架构原型与预训练目标分开,这两个概念通常被混为一谈。接下来,我们对NLP中的自我监督提出了一个普遍而统一的观点,并展示了不同的训练前目标如何相互投射,以及不同目标之间的插值如何有效。然后,我们提出了混合名词(MoD),这是一个将不同的预训练范式结合在一起的预训练目标。我们进一步引入了模式切换的概念,其中下游微调与特定的预训练方案相关联。我们进行了广泛的消融实验,以比较多个预训练目标,并发现我们的方法通过在多个不同的设置中优于T5和/或GPT类模型,推动了Pareto前沿。

最后,通过将我们的模型扩展到20B的参数,我们在50个成熟的监督NLP任务上实现了SOTA性能,这些任务包括语言生成(具有自动和人工评估)、语言理解、文本分类、问答、常识推理、长文本推理、结构化知识基础和信息检索。我们的模型在上下文学习方面也取得了很好的效果,在零样本SuperGLUE上表现优于175B GPT-3,在一次性摘要上表现是T5-XXL的三倍。

3.5 Flan-T5

Flan是一种基于提示的预训练方法。Flan-T5是在Flan数据集上训练的T5模型,这些数据集包括:taskmaster2、djaym7/wiki_dialog、deepmind/code_contests、lambada、gsm8k、aqua_rat、esnli、quasc和qed。

猜你喜欢

转载自blog.csdn.net/be_humble/article/details/130084257