模型:
google/byt5-small
ByT5是一个无需分词的版本,基本上遵循了 MT5 的架构。
ByT5仅在 mC4 上进行了预训练,不包括任何有监督训练,平均遮罩长度为20个UTF-8字符。因此,在使用该模型进行下游任务之前,需要进行微调。
ByT5在处理嘈杂的文本数据方面表现出色,例如,google/byt5-small在 TweetQA 上明显优于 mt5-small 。
论文: 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-small') 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-small') tokenizer = AutoTokenizer.from_pretrained('google/byt5-small') 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模型,以及我们实验中使用的所有代码和数据。