ByT5 是 [Google's T5] 的无分词器版本,其架构大致遵循 MT5。
ByT5 仅在 [mC4] 上进行预训练,不包含任何有监督训练,平均跨度掩码为 20 个 UTF-8 字符。因此,该模型在用于下游任务前必须进行微调。
ByT5 在含噪声文本数据上表现尤为出色,例如,google/byt5-large 在 TweetQA 上的性能显著优于 mt5-large。
论文: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_large_pt",
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 模型,以及我们实验中使用的所有代码和数据。