8. 理解 Tokenizer

什么是 Tokenizer(分词器)?

Pasted image 20260625180812.png

如果只用一句话解释:

Tokenizer 就是大模型和人类语言之间的翻译器。

它负责把文本变成数字(Token ID),再把数字还原成文本。

因为神经网络根本不认识:

你好
ChatGPT
Transformer

它只认识:

[1532, 8756, 42, 998]

所以在进入模型之前,必须经过 Tokenizer。


为什么需要 Tokenizer?

假设有一句话:

我喜欢机器学习

计算机看到的其实只是:

UTF-8字节流

而 Transformer 的输入要求是:

Embedding向量

中间必须经过:

文字
 ↓
Tokenizer
 ↓
Token ID
 ↓
Embedding
 ↓
Transformer

完整流程:

"我喜欢机器学习"

        │
        ▼
Tokenizer

        │
        ▼
[315, 892, 1256, 87]

        │
        ▼
Embedding

        │
        ▼
[[0.1,0.3,...],
 [0.7,0.2,...],
 ...]

最早的做法:按单词切分

例如:

I love machine learning

直接按空格切:

["I", "love", "machine", "learning"]

然后建立词表:

I        → 1
love     → 2
machine  → 3
learning → 4

变成:

[1,2,3,4]

看起来很简单。

但问题巨大。


问题1:词表会无限大

例如:

dog
dogs
dogging
dogged

到底算几个词?

再比如:

ChatGPT
ChatGPT-4
ChatGPT-5
ChatGPT-Pro

新词天天出现。

如果全部加入词表:

词表 = 无限大

模型根本存不下。


问题2:遇到新词怎么办?

训练时:

apple
banana
orange

测试时:

watermelon

词表里没有:

watermelon

就变成:

<UNK>

(Unknown)

信息直接丢失。


所以出现了 Subword(子词)

现代大模型几乎都采用:

Subword Tokenization

核心思想:

不按单词切,而按“常见片段”切。

例如:

unbelievable

切成:

un
believe
able

即使没见过:

unbelievably

也能切:

un
believe
ably

模型依然能理解。


BPE:GPT 系列经典方案

现代 Tokenizer 的祖师爷之一:

Byte Pair Encoding (BPE)

最早用于压缩算法,后来被 NLP 使用。

GPT-2、GPT-3 的 tokenizer 基本都属于 BPE 家族。Causal


BPE 是怎么训练出来的?

假设语料:

low
lower
lowest

初始状态:

l o w
l o w e r
l o w e s t

统计最常出现的相邻字符:

l + o

出现很多次。

合并:

lo

得到:

lo w
lo w e r
lo w e s t

继续统计:

lo + w

继续合并:

low

最终:

low
er
est

成为词表。


举个真实例子

GPT Tokenizer 可能会把:

understanding

切成:

under
stand
ing

因为这些片段出现频率很高。

而不会切成:

u
n
d
e
r
...

这样效率太低。


Token 不等于字

很多初学者容易误解:

1 Token = 1 个字

实际上不是。

例如:

hello

可能是:

["hello"]

1 Token。


中文:

你好

可能:

["你", "好"]

2 Token。


复杂词:

internationalization

可能:

["inter",
 "national",
 "ization"]

3 Token。


所以:

字符数 ≠ Token数

Tokenizer 是如何训练的?

现代 Tokenizer(BPE、SentencePiece)通常经历:

第一步:收集语料

例如:

Wikipedia
Common Crawl
Books
Github

几十 TB 数据。


第二步:统计频率

统计:

机器
学习
深度学习
Transformer

出现次数。


第三步:构建词表

保留最常见的:

50000
100000
128000

个 Token。

例如 Llama 系列常见规模约为十万级词表。Causal


SentencePiece

2018 年 Google 提出了著名的:

SentencePiece论文

其特点是:

不依赖空格

传统英文:

I love AI

先按空格切。


SentencePiece:

I▁love▁AI

把空格本身也作为符号学习。

因此:

英文
中文
日文
韩文

都能统一处理。(Hugging Face)


Tokenizer 在训练中的位置

完整训练链路:

Pasted image 20260625180834.png

可以理解为:

Tokenizer = 编译器前端

Transformer 则是:

CPU

CPU 不认识高级语言。

Transformer 不认识自然语言。

都需要先翻译。


一个直观例子

输入:

我爱北京天安门

Tokenizer 可能输出:

["我",
 "爱",
 "北京",
 "天安门"]

对应 ID:

[128, 52, 981, 3476]

进入 Embedding:

128 → 向量A
52  → 向量B
981 → 向量C
3476→ 向量D

最终形成:

[B,L,D] = [1,4,4096]

送入 Transformer。


从训练大模型的角度理解

你正在学习从零训练大模型,可以把 Tokenizer 看成:

Tokenizer = 把文本压缩成模型能处理的离散符号

它主要解决三个问题:

1. 文本如何数字化
2. 未登录词(OOV)如何处理
3. 词表大小如何控制

因此整个训练流程实际上是:

海量文本
    │
    ▼
Tokenizer训练
    │
    ▼
生成词表(vocab)
    │
    ▼
文本→Token
    │
    ▼
Embedding训练
    │
    ▼
Transformer训练

可以说:

Tokenizer 是整个大模型训练流水线的第一步。没有 Tokenizer,就没有后面的 Embedding、Attention 和 Transformer。