minbpe:BPE算法的极简实现 github 地址:karpathy/minbpe
1.BPE 算法 BPE(Byte Pair Encoding) 是大模型的 tokenizer 常用的算法。它对输入文本的字节进行编码。
该算法因 GPT-2 的论文和代码而被广泛使用于 LLM。Sennrich et al. 2015被认为是 BPE 在 NLP 应用中的原始参考。
简单来说,bpe 把文本看作 utf-8 编码的字节,然后将出现次数最多的相邻字节合并,生成一个新的编码。如此反复操作。
2.minbpe 简介 2.1quickstart from minbpe import BasicTokenizer tokenizer = BasicTokenizer() text = "aaabdaaabac" # 训练 tokenizer.train(text, 256 + 3) # 256tokens, 3merges # 编码 print(tokenizer.encode(text)) # 解码 print(tokenizer.decode([258, 100, 258, 97, 99])) # 保存 tokenizer.save("toy") # writes two files: toy.model (for loading) and toy.vocab (for viewing) 英语字母一个字母对应一个字节。对于"aaabdaaabac",先计算相邻两字节的出现次数,然后选择次数最多的进行合并(“aa”,4次)。
“a”“a”合并为“aa”,编码为256。
然后再计算相邻两字节的出现次数,再合并。
在 toy.vocab 中可以看到所有字符及对应的编码。
toy.vocab ...... [a][a] -> [aa] 256 [aa][a] -> [aaa] 257 [aaa][b] -> [aaab] 258 2.2minbpe和GPT-4分词器功能相同 # 1.证明RegexTokenizer与GPT-4的分词器性能一致 text = "hello123!!!? (안녕하세요!) 😉" # pip install tiktoken import tiktoken enc = tiktoken.get_encoding("cl100k_base") print(enc.encode(text)) # [15339, 4513, 12340, 30, 320, 31495, 230, 75265, 243, 92245, 16715, 57037] from minbpe import GPT4Tokenizer tokenizer = GPT4Tokenizer() print(tokenizer.encode(text)) # [15339, 4513, 12340, 30, 320, 31495, 230, 75265, 243, 92245, 16715, 57037] # 2.标记特殊token text = "<|endoftext|>hello world" print(enc.encode(text, allowed_special="all")) # [100257, 15339, 1917] # ours print(tokenizer.encode(text, allowed_special="all")) # [100257, 15339, 1917] 调用 encode 时必须显示声明处理特殊标记。allowed_special 参数可以设置为"all"、“none"或一个特殊token列表。
...