文本在进入大语言模型之前,必须先通过 分词(Tokenization) 转换成 token 序列。很多人会问:既然文本本身就是字符或单词,为什么不直接用 字符(character)单词(word) 作为模型输入?这正是子词分词算法(如 BPE)要解决的问题。
在这里插入图片描述


一、为什么不能直接用“字符”作为输入单位

如果使用 字符级(Character-level) 分词,每个字母或汉字都是一个 token。

例如:

Transformer

字符级表示:

T r a n s f o r m e r

存在的问题

1. 序列长度会非常长

字符粒度太细,一句话会被拆成很多 token,例如:

Deep learning models are powerful

字符级 token 可能是:

D e e p _ l e a r n i n g _ m o d e l s ...

序列长度会 增长数倍

而 Transformer 的计算复杂度与序列长度平方相关:

O(n^2)

序列越长,计算成本越高。


2. 语义表达能力弱

字符本身几乎没有语义。

例如:

c a t

模型需要通过很多层网络才能理解它是一个单词 cat

这会让训练变得更困难。


二、为什么不能直接用“单词”作为输入单位

另一种直觉是使用 词级(Word-level) 分词。

例如:

Deep learning models are powerful

token:

Deep | learning | models | are | powerful

看起来更合理,但也有严重问题。


1 词表规模会非常巨大

自然语言的词汇量非常大。

例如英语:

run
runs
running
runner

如果全部作为独立词汇,词表可能达到:

数百万甚至上千万

这会导致:

  • embedding矩阵巨大
  • 训练成本增加

2 OOV(未登录词)问题

如果词表中没有某个词:

ChatGPT
blockchain
microservice

模型就无法处理。

传统方法只能用:

<UNK>

代替。

这样语义信息会丢失。


三、BPE(Byte Pair Encoding)解决了什么问题

BPE 是一种 子词(Subword)分词算法

它的核心思想是:

通过统计文本中最常见的字符组合,不断合并字符,逐渐形成子词单位。

这样可以在 字符和单词之间找到一个平衡粒度


四、BPE 的基本过程

假设语料只有这些单词:

low
lower
newest
widest

初始状态:全部拆成字符

l o w
l o w e r
n e w e s t
w i d e s t

第一步:统计最常见的字符对

例如:

e s

出现最多。

合并:

es

第二步:继续统计

可能出现:

lo

再合并。

不断重复这个过程。


最终可能得到:

low
er
new
est
wide

这些就是 子词 token


五、BPE 的优点

1 词表规模可控

通常:

30k – 100k token

既不会太大,也不会太小。


2 可以处理未登录词

即使遇到新词:

microservice

也可以拆成:

micro + service

或者:

micro + serv + ice

模型仍然可以理解。


3 序列长度适中

相比字符:

token数量减少

相比单词:

语义更灵活

4 能捕捉词内部结构

例如:

unhappy

可以拆成:

un + happy

模型可以学习:

un = 否定前缀

六、总结

为什么不用字符或单词作为输入单位:

方法 问题
字符级 序列太长、语义弱
单词级 词表巨大、OOV问题

BPE 的作用是:

在字符和单词之间找到一个合适的子词粒度。

优势:

  • 控制词表规模
  • 避免未登录词问题
  • 减少序列长度
  • 保留一定语义信息

因此 BPE 以及类似的子词分词算法(如 WordPiece、SentencePiece)成为大语言模型的标准分词方案。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐