🧠 什么是 Token?
在自然语言处理中,Token 是文本的基本单位。它可以是一个字符、一个词、一个子词,甚至是一个标点符号。Token 的定义取决于所采用的标记化(tokenization)方法。
🔄 文本如何转换为数字?
在训练语言模型时,文本需要被转换为数字形式。这一过程通常包括以下步骤:
- 标记化(Tokenization):将文本分解为 tokens。
- 构建词汇表(Vocabulary):为每个 token 分配一个唯一的数字 ID。
- 数字化(Numericalization):将文本中的 tokens 替换为对应的数字 ID。
例如,句子 "hello world"
可能被标记化为 ["hello", "world"]
,然后根据词汇表转换为 [1, 2]
。
🔤 常见的标记化方法
1. Word-based Tokenization(基于词的标记化)
将文本按空格或标点符号分割成单词。这种方法简单直观,但存在以下问题:
- 词汇表过大:需要为每个单词分配一个唯一的 ID,导致词汇表庞大。
- 处理未登录词困难:对于训练数据中未出现的单词,模型难以处理。
示例:
- 输入文本:
"I love NLP"
- 标记化结果:
["I", "love", "NLP"]
- 数字化表示:
[1, 2, 3]
2. Character-based Tokenization(基于字符的标记化)
将文本分解为单个字符。这种方法可以有效减少词汇表大小,但可能导致以下问题:
- 信息丢失:字符级别的表示可能无法捕捉到词汇的完整语义。
- 序列长度增加:同一文本的 token 数量增加,可能影响模型的处理效率。
示例:
- 输入文本:
"I love NLP"
- 标记化结果:
["I", " ", "l", "o", "v", "e", " ", "N", "L", "P"]
- 数字化表示:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
🔬 Subword-based Tokenization:BPE(字节对编码)
BPE 是一种子词级别的标记化方法,旨在平衡词汇表大小和语义表达能力。它通过迭代地合并最频繁的字符对来构建子词单元,并被广泛应用于 GPT、BERT 等大语言模型。BPE 的过程可以概括为以下五个阶段:
1. 初始化词汇表
- 拆分字符:首先将语料库拆分为最小单位——单个字符。例如,对单词
lower
拆分得到l o w e r</w>
,并在每个词尾添加特殊结束符(如</w>
),以区分不同词。 - 构建初始词表:记录所有出现过的字符,作为初始 token 集。
2. 统计相邻字符对频率
遍历所有词,统计每个相邻字符(或已合并的子词)对的出现次数。BPE 通过这一统计来识别语言中最常见的模式,以决定接下来要合并的符号对。
3. 合并最频繁的符号对
找到出现频率最高的字符对,并将它们在整个数据集中合并成新的子词。例如,如果 (w, e)
是最高频组合,则将其合并为 we
;更新所有相关词,并把新子词加入词汇表。
4. 重复步骤直到达到词表大小
BPE 是一个迭代过程。每次合并后,统计新的相邻符号对并继续合并,直到词汇表达到预设大小或不再有需要合并的符号对。
5. 构建最终词汇表并应用到文本
最终词汇表既包含初始的字符,又包含所有合并得到的高频子词。新词可以通过这些子词组合表示,因此任何新词都能拆解为已知的子词序列。
示例:BPE 分词过程演示
以以下词汇集为例:huggingface
、hugging
、face
、hug
、hugger
、learning
、learner
、learn
。将每个词拆分为字符并加上结束符,然后执行频次统计和合并。以下是前几次合并:
(h, u)
→hu
(hu, g)
→hug
(hug, g)
→hugg
(i, n)
→in
(in, g)
→ing
(l, e)
→le
(le, a)
→lea
(lea, r)
→lear
执行 8 次合并后,词表扩大至 20 个 token,其中包括基本字符(h
,u
,g
,i
等)和新合成的子词(hug
,hugg
,ing
,lear
等)。词 huggingface
经过标记化后为 hugg ing f a c e </w>
,learning
则为 lear n ing </w>
,其余词也可以用类似方式表示。
🧪 BPE 的优缺点
优点:
- 处理未登录词:通过把词拆解为子词,BPE 可以用已有的子词组合来表示训练集中未出现的词汇。
- 减少词汇表大小:相比基于词的标记化,BPE 可以显著缩小词表规模,使模型更高效。
- 提升泛化能力:子词级表示允许模型学习更细粒度的语言结构,对不同领域、不同语言具有更好的泛化能力。
缺点:
- 合并规则依赖语料:不同语料得到的合并规则差异较大,多语言场景下可能需要复杂的处理。
- 语义完整性可能受损:如果合并过度,某些合成词的语义仍可能分割,需根据任务选择合适的词表大小。
📝 总结
标记化是自然语言处理的核心步骤,它将文本转换为模型可处理的数字形式。基于词和基于字符的标记化方法简单易理解,但分别存在词汇表过大和序列过长的问题。BPE 作为一种子词级标记化算法,以初始化字符集为基础,通过迭代合并高频符号对构建新的子词单元。这种方法兼顾了词表大小和语义表达能力,既能处理未登录词,也能保留足够的语义信息。因此,现代大语言模型通常采用 BPE 或其变种(如 WordPiece、SentencePiece)作为默认的标记化方案。