CS336 lecture1
Tokenization(5.25-5.26)
核心在于将一段文本(无论是句子、段落还是文档)分割为更小的可管理单元,即“token”。

1. 字符级分词
以单个字符作为最小 token,直接按字符切割文本,不考虑词语、语义。
例如:单词“hello”会被标记为[“h”, “e”, “l”, “l”, “o”]。
缺点:序列变长,增加计算复杂度。
举个实际例子: 句子:I love artificial intelligence
- 词级分词 tokens:[I, love, artificial intelligence] 统计词数 Lw=4
- 字符级分词 拆分:I, l, o, v, e, a, r, t, i, f, i, c, i, a, l, i, n, t, e, l, l, i, g, e, n, c, e 统计字符数 Lc=30
自注意力计算量对比
词级计算量:O(Lw2⋅d)=O(42d)=16d 字符级计算量:O(Lc2⋅d)=O(302d)=900d
仅这一句,字符级计算量就是词级的 56 倍以上。序列越长,L2 带来的平方级爆炸会越严重。
2. 词级分词
以完整词语作为最小 token,按照语言词汇边界切分,是最贴合人类语感的分词方式。
例如,句子“I love coding”会被标记为[“I”, “love”, “coding”]。
缺点:难以处理罕见词,词汇无穷多
3. 子词级分词
折中方案:把词语拆成有意义的子片段(子词),介于字符和完整单词之间,是当前 LLM 标配。
例如,单词“unbelievable”可能被标记为[“un”, “believ”, “able”]。
子词级分词的常用算法包括字节对编码(BPE)、WordPiece(用于BERT)和SentencePiece。
3.1 字节对编码(BPE)
字节对编码(BPE)一种子词分词算法,通过迭代合并高频相邻的字符/子词对进行文本压缩。该方法在保留常见完整词的同时拆分罕见词,既高效处理未知词又避免词汇膨胀。
参考原文链接:https://blog.csdn.net/youmaob/article/details/149573655
训练阶段,构建子词词典:
- 预分词:语料库所有输入文本首先被分词为更小的单元,通常通过空格或标点分割。例如,句子“applied deep learning”可能被分割为[“applied”, “deep”, “learning”]。
- 初始词汇表:初始词汇表由文本中的所有单个字符组成。例如,单词“deep”会被拆分为[“d”, “e”, “e”, “p”]。
- 迭代合并:BPE 迭代合并最频繁相邻的字符或token对。例如,如果对(“e”, “e”)是最频繁的,会被合并为单个标记"ee",并添加到词汇表中。
- 词汇表更新:合并过程持续到达到预定义的词汇表大小,每次合并操作都会创建新token并添加到词汇表。
推理阶段,最终分词:(贪心最长匹配)
- 对新文本,从最长子词开始匹配,优先用已学子词;没匹配上就退到字符 / 字节。
3.2 WordPiece
- 原生 BPE:按相邻符号对的出现频率合并,谁出现次数高就合并谁。
- WordPiece:不看纯频率,而是计算似然得分,优先合并能最大提升语言模型概率(具有语义倾向的合并)的符号对,更偏向语义与上下文。
得分公式,设符号对(A,B):
$$ Score(A,B)=\frac {count(A,B)} {count(A)count(B)} $$
- count(A, B): 相邻共现次数
- count(A)/count(B):单个符号出现次数
迭代合并时,计算所有相邻符号对的得分,每次合并得分最高的一对,生成新子词,加入词汇表。
3.3 SentencePiece
BPE / WordPiece 都有一个前提:必须先按空格切出 “单词”,再对单词做子词拆分。这对中文、日文、泰语等无空格语言很麻烦,还要额外的分词工具,多语言场景更乱。
实现方式:
- 作为字符流的输入:SentencePiece 不先将文本分割为单词,而是将整个输入文本视为包括空格在内的连续字符序列。
对英文需将空格换为“_”,对中文不做处理。
例如:I love China → ▁I▁love▁China
- 合并算法:采用与 BPE 类似的合并算法或一元分词器:
1)模式 A:BPE
- 初始化:每个 Unicode 字符(含 _)为一个单元
- 迭代:合并频率最高的相邻对
- 停止:词表大小达到预设(如 32k / 50k)
2)模式 B:Unigram
方向和 BPE 相反:从大到小剪枝
- 初始:收集所有高频子串,形成超大词表
- 迭代:删掉对概率损失最小的子词
- 停止:词表缩到目标大小
| 算法 | 合并依据 | 是否需要预分词 | 典型应用场景 |
|---|---|---|---|
| BPE | 基于频率 | 是,英文按空格切单词;中文需额外分词工具 | GPT 等模型,处理 OOV 词 |
| WordPiece | 基于概率得分 | 是,规则同 BPE,依赖词边界 | BERT 等模型,捕捉语义子词 |
| SentencePiece | 类 BPE 或 Unigram | 否,直接处理整句 Unicode 字符流,语言无关 | 多语言任务,词边界不明确的语言(如中文、日文) |
更多推荐
所有评论(0)