tokenizers 如何添加byte_fallback令牌?

epggiuax  于 2个月前  发布在  其他
关注(0)|答案(5)|浏览(45)

备选标题

如何使分词器的行为类似于Llama

背景

Llama分词器认为byte_fallback tokens并不是特殊的。当它解码时,除了特殊tokens(unk、pad、bos、eos)之外,它不会移除这些tokens。

我想要实现的目标

我想要创建一个行为类似于Llama的分词器。然而,我只能够将byte_fallback tokens添加为特殊tokens。

from tokenizers import Tokenizer
from tokenizers import decoders, pre_tokenizers
from tokenizers.models import BPE
from tokenizers.processors import TemplateProcessing
from tokenizers.trainers import BpeTrainer
from tokenizers import AddedToken

from datasets import load_dataset

dataset = load_dataset("tapaco")

def topaco_generator():
    for i in dataset['train']:
        yield i['paraphrase']

bpe_trainer = BpeTrainer(
    special_tokens=["<unk>", "<s>", "</s>", "<pad>"]
    + [f"<0x{i:02X}>" for i in range(256)]  # byte_fallback tokens
)

tokenizer = Tokenizer(BPE(byte_fallback=True))
tokenizer.pre_tokenizer = pre_tokenizers.Sequence(
    [pre_tokenizers.Metaspace(), pre_tokenizers.Digits(individual_digits=True)]
)
tokenizer.enable_padding(pad_id=3, pad_token="<pad>")
tokenizer.post_processor = TemplateProcessing(
    single="<s> $A </s>",
    pair="<s> $A </s> $B </s>",
    special_tokens=[
        ("<s>", 1),
        ("</s>", 2),
    ],
)
tokenizer.decoder = decoders.Sequence(
    [
        decoders.Metaspace(),
        decoders.ByteFallback(),
    ]
)
# my attempt to add byte_fallback as non-special tokens
# tokenizer.add_tokens([AddedToken(content=f"<0x{i:02X}>", special=True, normalized=False) for i in range(256)])

tokenizer.train_from_iterator(topaco_generator(), trainer=bpe_trainer)
tokenizer.save("topaco_tokenizer.json")

tokenizer = Tokenizer.from_file("topaco_tokenizer.json")

text = "I love you more than I can say 🤗"
encoded_text = tokenizer.encode(text)
print(encoded_text.tokens)
# My work around to preverse byte_fallback tokens
# and remove other special tokens
decoded_text = tokenizer.decode(encoded_text.ids, skip_special_tokens=False)
print(decoded_text.removeprefix('<s> ').removesuffix('</s>'))

问题

无论我在代码中尝试使用不同的位置(训练前、训练后)以及不同的AddedToken参数来执行这行代码 tokenizer.add_tokens([AddedToken(content=f"<0x{i:02X}>", special=True, normalized=False) for i in range(256)]),我都无法达到Llama的行为。

ffx8fchx

ffx8fchx1#

对不起,我没有时间检查这个。tokens应该直接添加到词汇表中,而不是作为特殊tokens。训练器应该处理这个问题,但目前还不支持。

7fyelxc5

7fyelxc53#

两个训练师都还没有支持这个功能。我会在某个时候处理这个问题的!

h9vpoimq

h9vpoimq4#

这个问题已经过期,因为它已经打开了30天,没有活动。请移除过期标签或评论,否则将在5天内关闭。

chhqkbe1

chhqkbe15#

没有时间再次体验,但是的,它正在将这个添加到培训师中!

相关问题