ByT5 是 [Google's T5] 的无分词器版本,其架构大体上遵循 [MT5]。
ByT5 仅在 [mC4] 上进行预训练,未经过任何有监督训练,平均跨度掩码为 20 个 UTF-8 字符。因此,该模型在用于下游任务之前必须进行微调。
ByT5 在噪声文本数据上表现尤为出色,例如,google/byt5-xl 在 [TweetQA] 上的性能显著优于 mt5-xl。
论文: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
import argparse
import torch
from openmind import is_torch_npu_available
from openmind import AutoTokenizer
from openmind_hub import snapshot_download
from transformers import T5ForConditionalGeneration
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()
if args.model_name_or_path:
model_path = args.model_name_or_path
else:
model_path = snapshot_download(
"FuJianAscend/byt5-xl",
revision="main",
resume_download=True,
ignore_patterns=["*.h5", "*.ot", "*.msgpack"]
)
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模型,以及我们实验中使用的所有代码和数据。