ByT5 是 Google's T5 的无分词器版本,其架构大体上遵循 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 字节,无需分词器即可使用:
import argparse
import torch
from openmind import pipeline, is_torch_npu_available
from openmind import AutoModelForCausalLM, AutoTokenizer
from transformers import T5ForConditionalGeneration, AutoTokenizer
def parse_args():
parser = argparse.ArgumentParser()
parser.add_argument("--model_name_or_path",type=str,help="Path to model",default=None,)
args = parser.parse_args()
return args
if __name__ == '__main__':
if is_torch_npu_available():
device = "npu:0"
else:
device = "cpu"
args = parse_args()
model_path = args.model_name_or_path
model = T5ForConditionalGeneration.from_pretrained(model_path).to(device)
tokenizer = AutoTokenizer.from_pretrained(model_path)
model_inputs = tokenizer(["Life is like a box of chocolates.", "Today is Monday."], padding="longest", return_tensors="pt").to(device)
labels = tokenizer(["La vie est comme une boîte de chocolat.", "Aujourd'hui c'est lundi."], padding="longest", return_tensors="pt").input_ids.to(device)
with torch.no_grad():
logits = model(**model_inputs, labels=labels).logits
print(logits)大多数广泛使用的预训练语言模型都基于单词或子词单元对应的标记序列进行操作。将文本编码为标记序列需要一个分词器,该分词器通常作为独立于模型的组件创建。而直接对原始文本(字节或字符)进行操作的无标记模型则具有诸多优势:它们可以开箱即用地处理任何语言的文本,对噪声的鲁棒性更强,并且通过去除复杂且易错的文本预处理流水线,最大限度地减少了技术债务。由于字节或字符序列比标记序列更长,以往关于无标记模型的研究往往会引入新的模型架构,旨在分摊直接对原始文本进行操作的成本。在本文中,我们表明,只需进行少量修改,标准的Transformer架构即可用于处理字节序列。我们仔细分析了参数数量、训练FLOPs和推理速度方面的权衡,并证明字节级模型与标记级模型具有竞争力。我们还展示了字节级模型对噪声的鲁棒性显著提高,并且在对拼写和发音敏感的任务上表现更优。作为我们研究贡献的一部分,我们发布了一套基于T5架构的新的预训练字节级Transformer模型,以及我们实验中使用的所有代码和数据。
