我不确定这是不是一个bug/特性,有时候修改预训练分词器的normalizer是有效的,但有时候它不起作用。
例如,对于"mistralai/Mistral-7B-v0.1"
有效,但对于"mistralai/Mistral-7B-v0.3"
无效:
from transformers import AutoTokenizer
from tokenizers.normalizers import Sequence, Replace, Prepend
tokenizer_name = "mistralai/Mistral-7B-v0.1"
old_tok = AutoTokenizer.from_pretrained(tokenizer_name)
assert old_tok.backend_tokenizer.normalizer != None
new_normalizer = Sequence(
[Prepend('▁'), Replace('▁', ' '), Replace("foo", "bar"), Replace('<br>', '\n')]
)
old_tok.backend_tokenizer.normalizer = new_normalizer
new_tokenizdr_name = f"new_tokenizer-{tokenizer_name}"
old_tok.save_pretrained(new_tokenizdr_name)
old_tok = AutoTokenizer.from_pretrained(tokenizer_name)
new_tok = AutoTokenizer.from_pretrained(new_tokenizdr_name)
[out]:
>>> print(' '.join(old_tok.batch_decode(old_tok("I foo you<br>hello world")['input_ids'])))
<s> I foo you < br > hello world
>>> print(' '.join(new_tok.batch_decode(new_tok("I foo you<br>hello world")['input_ids'])))
<s> I bar you
hello world
上述过程对于"mistralai/Mistral-7B-v0.3"
不起作用。
2条答案
按热度按时间ff29svar1#
我认为这确实是一个bug,另一个用户发现间接覆盖类是修改后缺失的normalizer的一个解决方法。
https://stackoverflow.com/questions/78612251/how-do-we-add-modify-the-normalizer-in-a-pretrained-huggingface-tokenizer/78624238#78624238
bfnvny8b2#
这是一个"bug",但可能会一直重新转换(如果在tokenizer_config.json中将
from_slow
设置为True
,则会重新转换)。