字节对编码(BPE)如何处理等频字符对?以HuggingFace实现为例
BPE分词器等频合并规则及HuggingFace实现解析
一、首次合并的核心逻辑
BPE的核心逻辑是优先合并出现频率最高的相邻字符对,但当多个字符对频率相同时,合并顺序完全由具体实现的平局处理规则决定——原始BPE论文并没有对此做强制要求。
在你的训练语料中,DC、BC、CD、BA、AB均出现2次,属于典型的等频场景,首次合并哪一对,全看你用的BPE工具的规则设定。
二、BPE对等频情况的常见处理方式
不同BPE实现会自定义等频时的合并规则,常见的有三类:
- 字典序规则:把字符对当成字符串,按字典序(正序或逆序)排序,选最前或最后的对合并
- 出现位置规则:按字符对在语料中首次(或最后)出现的位置排序,优先合并先出现(或后出现)的对
- 反向字符对规则:把字符对反转后再按字典序排序,选排序结果最优的对合并
三、不同BPE实现的规则差异
不同工具的规则差异很明显:
- 早期基础BPE实现:大多用正字典序,优先合并字典序靠前的字符对
- HuggingFace的
ByteLevelBPETokenizer:采用的是字符对逆字典序规则,同时默认会把输入转为小写统一处理。具体来说,当多个字符对频率相同时,会直接比较字符对的字典序,优先合并字典序更大的那个(比如小写的ba比ab大,因为b的ASCII码高于a)。另外,它是基于字节级的BPE,会把输入转成字节序列处理,这和普通字符级BPE的统计逻辑略有区别。
四、对你的分词结果的解释
你得到的['d', 'c', 'b', 'babcd', 'c', 'babcd'],核心原因是ByteLevelBPETokenizer在等频时优先选了字典序更大的ba(小写)进行合并:
- 首次合并
b和a成ba,语料序列变成d c b ba b c d c ba b c d - 后续合并中,
ba和相邻的b合并成bab,接着bab和c合并成babc,再和d合并成babcd - 重复这个合并逻辑,最终得到你看到的分词结果
至于为什么没优先合并字典序更大的dc,可能是因为训练时你设置的vocab_size较小,合并到一定步数就停止了;或者字节级处理的统计逻辑和你手动统计的字符对频率有细微差异。
内容的提问来源于stack exchange,提问作者Nikolay Klimenko
相关产品推荐
相关产品推荐

