先这样答
BPE 分词器的核心机制可以分为训练和编码两个阶段,而词表大小的设定主要是基于模型参数分布与上下文长度的综合取舍。
在训练阶段,算法首先从最基础的字符级词表开始。接着,它会在整个训练语料中统计相邻符号对的出现频率,找出频率最高的符号对,将其合并成一个新的 token,并加入词表中。这个统计和合并的过程会不断迭代,直到词表达到预设的目标大小。通过这种自底向上的合并机制,语料中的高频词会被作为完整的 token 保留下来,而低频词或生僻词则会被拆解为更基础的子词。
在编码阶段,当输入一段新文本时,分词器并不仅仅是做简单的查表匹配。它会严格按照训练阶段学到的合并规则及其先后顺序,对新文本进行贪心切分。这意味着同样的合并序列会被应用到新文本上,确保分词结果的一致性。
关于词表大小的权衡,主要是在嵌入层参数量和序列长度之间做选择。大词表会导致嵌入层和输出层的参数量增多,但好处是能把文本切成更短的序列,提高词汇覆盖率,让罕见词也能整体存储。小词表能节省嵌入层参数,但代价是同一段文本会被切成更长的序列,在模型上下文预算紧张时会带来压力。现代模型的词表通常在数万到十几万级别,如果是多语言模型,为了覆盖不同语种,词表会被大幅撑大。
在实际工程中,分词策略直接影响模型的推理成本与上下文利用率。例如,中文通常一个字对应一到两个 token,这就是底层分词机制决定的。而针对数字或代码这类词汇边界敏感的任务,通常还需要在 BPE 基础上做特殊的分词处理。
面试官会怎么追问
-
「中文经常出现一个字对应多个 token 的情况,根源是什么?」 根源在于 BPE 训练语料的分布。如果训练语料中中文占比较低,中文字符的组合频率无法达到合并阈值,就会保留为字节或较短的子词片段,导致一个汉字被切分成多个 token。这在多语言模型中尤为常见。
-
「数字和代码切分不好会影响模型表现,一般怎么处理?」 对于数字,通常会强制按位切分,避免将长串数字随机合并为单一 token,这有助于模型学习对齐的算术逻辑。对于代码,会针对连续空格、缩进或特定操作符设计专门的预分词规则,保留代码的结构语义。
-
「词表变大除了增加嵌入层参数,还会对模型训练带来什么直接影响?」 词表变大会直接增加输出层计算 Softmax 的开销,拖慢训练和推理速度。同时,如果词表过大而部分 token 对应的训练语料不足,会导致这些 token 的嵌入向量更新不充分,影响模型的整体表达能力。
回答的坑
混淆训练和编码的匹配逻辑,错误地认为编码时是按词表中最长的 token 直接匹配,而忽略了必须按照训练时学到的合并顺序进行贪心切分。
只谈词表大小对模型参数的影响,忽略了词表大小决定了文本切分后的序列长度,而序列长度直接关系到注意力机制的计算复杂度和上下文窗口的消耗。
同系列的题