
🎪 摸鱼匠:个人主页
🎒 个人专栏:《大模型岗位面试题》
🥇 没有好的理念,只有脚踏实地!

文章目录
-
-
- 一、面试官到底在考什么?(考点解析)
- [二、核心原理:BPE 是怎么工作的?](#二、核心原理:BPE 是怎么工作的?)
-
- [1. 核心思想](#1. 核心思想)
- [2. 标准分词过程(训练阶段)](#2. 标准分词过程(训练阶段))
- 三、灵魂拷问:如何处理未登录词(OOV)?
-
- [❌ 错误回答(减分项)](#❌ 错误回答(减分项))
- [✅ 标准专业回答(加分项)](#✅ 标准专业回答(加分项))
- 四、手撕逻辑与案例演示
- 五、易错点与避坑指南(面试加分细节)
- 六、总结性回答范例(可以直接背诵版)
-
你好!咱们直接切入正题。这道题在 LLM 相关的面试中属于**"必考基础,但能分出深浅"**的题目。
很多候选人只会背"BPE 是合并高频字符对",但一旦问到**"具体怎么算的?"或者"遇到训练集里完全没有的生僻字怎么办?"**就容易卡壳。
下面我用专业深度的方式,帮你把这道题拆解透,包含考点、原理推导、标准答案、易错点以及一个手撕代码的逻辑演示。
一、面试官到底在考什么?(考点解析)
当面试官问出"BPE 分词过程及 OOV 处理"时,他其实想确认你三件事:
- 原理掌握度:你是否真的理解 BPE 是从"压缩算法"演变来的?是否清楚它是**自底向上(Bottom-up)**的贪心合并过程?
- 工程落地能力:在实际训练中,词表大小(Vocab Size)怎么定?合并次数(Merge Operations)和最终词表的关系是什么?
- 边界情况处理 :这是区分初级和高级的关键。OOV(未登录词)在纯 BPE 中理论上是不存在的 ,如果你回答"映射到
<UNK>",那就露怯了(除非你没理解基于字符初始化的精髓)。
二、核心原理:BPE 是怎么工作的?
1. 核心思想
BPE(Byte Pair Encoding)最早是用于数据压缩的,后来被 OpenAI 引入 NLP。
它的逻辑非常简单粗暴:"谁出现得最频繁,谁就合并成一个新词。"
通过不断合并高频相邻的字符(或子词),把长单词拆成有意义的"子词单元(Subword)"。
2. 标准分词过程(训练阶段)
假设我们有一个迷你语料库,目标是将词表扩充到一定大小。
初始状态 :
语料:("low", 5), ("lower", 2), ("newest", 6), ("widest", 3)
(括号内是词频)
第一步:字符级初始化
先把所有单词拆成单个字符,并在末尾加个特殊符号(比如 </w> 表示词尾,防止 low 和 lower 的前缀混淆)。
low:l o w </w>(出现 5 次)lower:l o w e r </w>(出现 2 次)- ...以此类推。
第二步:统计并合并(迭代过程)
- 统计频率 :遍历整个语料,统计所有相邻字符对的频率。
- 比如
e和s在newest和widest里都挨着,频率很高。 - 假设发现
(e, s)是全场最高频的对。
- 比如
- 执行合并 :把所有出现的
e s合并成新符号es。newest变成n ew es t </w>(注意:这里假设ew还没合并,仅作示意)。
- 更新词表 :把
es加入合并规则列表(Merge Rules)。 - 循环 :重复上述步骤,直到达到预设的词表大小(Vocab Size)或者合并次数(Num Merges)。
最终结果 :
你会得到一张表,里面既有单字符(如 z, q),也有常用词根(如 ing, tion, un),甚至完整的高频词(如 the, apple)。
三、灵魂拷问:如何处理未登录词(OOV)?
这是这道题的高光时刻。
❌ 错误回答(减分项)
"如果遇到没见过的词,我们就把它标记为
<UNK>或者<OOV>。"
点评 :这是 Word2Vec 时代的做法。在基于 BPE 的大模型(如 GPT, LLaMA)中,理论上不存在 OOV。
✅ 标准专业回答(加分项)
"在标准的 BPE 实现中(尤其是基于字符初始化的),不存在传统意义上的 OOV 问题。
原理如下:
- 字符级兜底 :BPE 的初始词汇表包含了输入文本中出现过的所有基础字符(包括字母、数字、标点,甚至在某些实现中是字节 Byte)。
- 强制分解 :当推理阶段遇到一个训练时从未见过的生词(比如一个新造词
'flork'或拼写错误的'giraffe'写成'giraff'),BPE 算法会尝试用已有的合并规则去匹配。- 退化机制 :如果整个词无法匹配任何长子词,它会**自动退化(Fallback)**为单个字符的序列。
- 例如:
'flork'->['f', 'l', 'o', 'r', 'k']。- 因为
f,l,o,r,k这些单字符一定在初始词表里(只要它们曾在训练语料的任意地方出现过)。极端情况 :
只有当输入文本中出现了训练语料中从未出现过的字符 (比如训练集全是英文,推理时来了一个生僻汉字或特殊 Emoji),这时候才会真正报错或映射为
<UNK>。
解决方案 :现代大模型(如 LLaMA, GPT-4)通常不再基于"字符"初始化,而是基于字节(Byte)初始化(即 Byte-level BPE)。因为字节的组合只有 256 种,这保证了任何 可能的字符串都能被分解为字节序列,从而实现了真正的零 OOV。"
四、手撕逻辑与案例演示
为了让你面试时更稳,我们来模拟一个简化的编码过程。
场景:
- 训练好的合并规则(Merge Rules):
h+e->hehe+l->hell+o->lo
- 输入词:
"hello" - 未知词:
"helo"(少了一个 l)
编码过程(推理阶段):
-
初始化:将输入拆分为字符列表。
"hello"->['h', 'e', 'l', 'l', 'o']"helo"->['h', 'e', 'l', 'o']
-
应用规则 1 (
h+e->he):"hello"->['he', 'l', 'l', 'o']"helo"->['he', 'l', 'o']
-
应用规则 2 (
he+l->hel):"hello"->['hel', 'l', 'o'](注意:只合并第一个匹配的he和紧随的l)"helo"->['hel', 'o']
-
应用规则 3 (
l+o->lo):"hello"->['hel', 'lo'](剩下的l和o合并)"helo"->['hel', 'o'](这里hel后面是o,没有l和o相邻的组合了,因为l已经被合并进hel了。或者取决于具体实现的贪心顺序,可能变成he,lo。但在标准 BPE 中,是按规则优先级顺序扫描的)- 修正逻辑 :实际上 BPE 是重复扫描直到不能合并。对于
"helo",在步骤 2 变成['he', 'l', 'o']。步骤 3 尝试找he+l,成功 ->['hel', 'o']。步骤 4 找l+o,此时序列是hel和o,没有相邻的l和o(l在hel内部),所以无法合并。 - 最终结果:
"helo"被切分为['hel', 'o']。
结论 :即使 "helo" 是个错别字,它也被成功编码成了已知子词的组合,模型依然能根据 hel 和 o 的向量推测出它的意思,而不会崩溃。
五、易错点与避坑指南(面试加分细节)
在回答完标准答案后,你可以主动补充以下几点,展示你的资深经验:
-
WordPiece vs BPE:
- 面试官可能会混用。你要指出:BERT 用的是 WordPiece ,它和 BPE 很像,但合并准则不同。BPE 是基于频率 (谁出现次数多合并谁),WordPiece 是基于语言模型似然度(合并后能让语言模型概率提升最大的是谁)。虽然实现类似,但数学目标不同。
- 话术:"虽然 GPT 系列用 BPE,BERT 用 WordPiece,但它们解决 OOV 的思路一致,都是 Subword 策略。"
-
空格的处理:
- 英文 BPE 通常会在单词前加空格(如
_hello),以区分词首和词中。如果不加,play和day里的ay会被视为一样,但play的词首p和happy中间的p在某些语境下可能需要区分。 - 中文处理:中文通常不需要空格,但需要处理字与字的结合。
- 英文 BPE 通常会在单词前加空格(如
-
解码(Decoding)的陷阱:
- 分词容易,还原难。有些子词带有特殊标记(如
##在 WordPiece 中,或Ġ在 BPE 中表示前导空格)。解码时必须正确处理这些标记,否则还原出的句子会全是粘连的或者空格错乱。
- 分词容易,还原难。有些子词带有特殊标记(如
-
词表大小的权衡:
- 词表太大:模型嵌入层(Embedding Layer)参数爆炸,显存占用高,且低频子词容易过拟合。
- 词表太小:序列长度(Sequence Length)变长,计算注意力矩阵的复杂度 O ( N 2 ) O(N^2) O(N2) 会急剧上升,推理变慢。
- 经验值:LLaMA-7B 词表约 32k,GPT-3 约 50k,一些多语言模型(如 mBART)可能到 250k+。
六、总结性回答范例(可以直接背诵版)
"BPE 是一种基于统计的子词分词算法,核心是通过迭代合并语料中频率最高的相邻字符对来构建词表。
关于过程:它从字符级开始,每一步都计算所有相邻对的频率,选出最高频的一对进行合并,生成新的子词符号,并将此规则记录下来。这个过程重复直到达到预设的词表大小。这使得高频词保持完整,低频词被拆解为常见的词根或词缀。
关于 OOV :这是 BPE 最大的优势。由于初始化时包含了所有基础字符(在现代大模型中甚至是所有字节),理论上不存在 OOV。遇到未登录词时,算法会利用已有的合并规则尽可能匹配长子词,无法匹配的部分会自动退化为更小的子词乃至单字符/单字节。这保证了模型永远能输入任何字符串,只是未知词的序列长度可能会稍长一些,语义由组成它的子词向量共同表达。
实际应用:像 LLaMA 和 GPT 都采用了基于字节的 BPE(Byte-level BPE),彻底解决了生僻字符和多语言混合场景下的 OOV 问题。"
希望这个深度解析能帮你在面试中从容应对!