什么是分词
语言模型读到的不是一串连续的字符,而是一串切好的「词元(token)」,每个词元对应一个整数编号。分词(tokenization)就是这道切割工序:把一段文本切成词元,再查出它们的编号。切分的单位可以是一个完整单词、单词的一部分、一个字符,甚至一个字节。单位选得粗,生僻词就没法表示;选得细,同一句话会变成很长的序列,处理和计算的代价随之上升。
怎么工作:字节对编码
今天最常用的一类分词器建立在字节对编码(byte pair encoding,BPE)之上。BPE 最初是一种数据压缩算法:它用一张转换表把一段字符串编码成更短的字符串[1]。过程是一个循环。从一串字节(或词元)出发,统计相邻对的出现次数,取出最频繁的那一对,把所有出现的位置替换成一个尚未使用的新词元,并把这次合并记进查找表;如此重复,直到词表达到目标大小[1]。解码则沿着查找表反向走,按相反的顺序把合并逐个拆开,还原出原始字符串[1]。
举个虚构的小例子:假设语料里「es」是出现最频繁的相邻对,它就被合并成一个新词元,文本中所有「e」后面跟「s」的地方都改写成「es」;下一轮最频繁的对可能是「est」,再合并一次。结果是常见的字符串逐渐拥有自己的词元,而生僻字符串仍由若干个模型已经认识的小片段拼成。
在语言模型里,这个算法是被改造过的:用的不是压得最小的版本,而是用来产生一套好用的词元[1]。另一个变体是字节级 BPE(byte-level BPE),它先把文本转成 UTF-8 字节流,这样任何文本都能被编码[1]。
从哪来
Philip Gage 于 1994 年在《A New Algorithm for Data Compression》一文中首次描述了 BPE[1]。此后很长一段时间它是一种压缩技术,直到 Sennrich、Birch 和 Haddow 在 2015 年把它引入神经机器翻译,论文题为《Neural Machine Translation of Rare Words with Subword Units》[1]。这篇 2015 年 8 月首次提交的论文针对的是「开放词表」问题:翻译系统带着一份固定的词表,词表之外的词只能一律当作未知词。他们的做法是把生僻词和未知词编码成若干子词单元(subword unit)的序列[2]。论文比较了多种切分方法,包括字符 n-gram(character n-gram)模型和基于 BPE 压缩算法的切分[2]。在 WMT 15 英德和英俄翻译任务上,子词模型相对回退词典基线分别提升了 1.1 和 1.3 BLEU[2]。
今天用在哪里
字节级 BPE 是 GPT-2 采用的方案,也被 BERT 系模型采用,包括 RoBERTa、BART 和 DeBERTa[1]。GPT-3.5 和 GPT-4 的词表大小为 100,258 个词元[1]。实际好处是覆盖面:子词分词让模型能把生僻或没见过的词表示成更小单元的序列,而不是一个未知词标记,所以训练数据里没有的词也不至于一片空白[1]。
局限
局限来自设计本身。词表大小是一个取舍:目标词表越大,越多完整字符串拥有自己的词元,剩下要拆碎的片段越短;目标词表越小,同一句话就会变成更长的词元序列[1]。合并表是靠统计出来的,哪些字符串能拥有独立词元,取决于语料里出现了什么[1]。另外,分词是模型之前的一道独立工序:文本被切在哪里,模型就从哪里开始看,它没有办法钻进一个词元内部去看里面的部分。由于解码是逐条反向拆开合并,编码再解码可以还原出可被编码的原文;而字节级方案保证任何文本都能被编码[1]。
注释与来源
- Byte pair encodinghttps://en.wikipedia.org/wiki/Byte_pair_encoding
- Neural Machine Translation of Rare Words with Subword Unitshttps://arxiv.org/abs/1508.07909
引用本页: 分词(Tokenization). TellWorld, https://www.tellworld.net/zh/learn/tokenization. 更新于 2026-11-07