模型:
google/byt5-xxl
ByT5是一个无需分词的版本,其结构基本遵循 MT5 的架构。
ByT5只经过 mC4 的预训练,没有进行任何带监督训练,使用平均长度为20个UTF-8字符的Span-Mask。因此,在该模型可用于下游任务前,需要进行微调。
ByT5在处理噪声文本数据方面表现得特别好,例如,google/byt5-xxl 在 TweetQA 上表现明显优于 mt5-xxl 。
论文: ByT5: Towards a token-free future with pre-trained byte-to-byte models
作者: Linting Xue, Aditya Barua, Noah Constant, Rami Al-Rfou, Sharan Narang, Mihir Kale, Adam Roberts, Colin Raffel
ByT5在处理原始的UTF-8字节上工作,可以在没有分词器的情况下使用:
from transformers import T5ForConditionalGeneration import torch model = T5ForConditionalGeneration.from_pretrained('google/byt5-xxl') input_ids = torch.tensor([list("Life is like a box of chocolates.".encode("utf-8"))]) + 3 # add 3 for special tokens labels = torch.tensor([list("La vie est comme une boîte de chocolat.".encode("utf-8"))]) + 3 # add 3 for special tokens loss = model(input_ids, labels=labels).loss # forward pass
但是,对于批量推断和训练,建议使用一个分词器类进行填充:
from transformers import T5ForConditionalGeneration, AutoTokenizer model = T5ForConditionalGeneration.from_pretrained('google/byt5-xxl') tokenizer = AutoTokenizer.from_pretrained('google/byt5-xxl') model_inputs = tokenizer(["Life is like a box of chocolates.", "Today is Monday."], padding="longest", return_tensors="pt") labels = tokenizer(["La vie est comme une boîte de chocolat.", "Aujourd'hui c'est lundi."], padding="longest", return_tensors="pt").input_ids loss = model(**model_inputs, labels=labels).loss # forward pass
大多数广泛使用的预训练语言模型是基于对应于单词或子词单元的标记序列进行操作的。将文本编码为标记序列需要使用分词器,通常作为与模型独立的工具创建。而直接在原始文本(字节或字符)上操作的无标记模型具有许多优点:它们可以直接处理任何语言的文本,对噪声更加抗干扰,并通过消除复杂且容易出错的文本预处理流程来减少技术债务。由于字节或字符序列比标记序列更长,过去关于无标记模型的研究通常引入了新的模型架构,旨在分摊直接在原始文本上操作的成本。在本文中,我们展示了一个标准Transformer架构可通过最小修改来处理字节序列。我们仔细考察了参数数量、训练FLOP和推断速度等方面的权衡,并表明字节级模型与标记级模型相比具有竞争力。我们还证明了字节级模型对噪声更加稳健,并在对拼写和发音敏感的任务上表现更好。作为我们的贡献的一部分,我们发布了基于T5架构的一组新的预训练字节级Transformer模型,以及我们实验中使用的所有代码和数据。