
Transformer 架构的核心功能可以简单概括为:输入一串 token,预测下一个 token。这里的 token 本质上是输入文本的数字化表示。那为什么不直接用现成的 Unicode 呢?毕竟它理论上能编码全世界所有文字。
💡 一个形象的类比:霍夫曼编码。如果你学过霍夫曼编码,会发现思路很像——都是基于频率统计,反复合并,最终得到一套高效的编码方案。但关键区别在于:霍夫曼每次合并频率最低的两个符号,输出变长比特串,目标是最大化压缩率,并且数学上保证全局最优;而 BPE/WordPiece 每次合并频率最高的相邻符号对,输出变长的 token ID 序列,目标是平衡序列长度和词表大小——词表太大,最后一层 softmax 就抗不住了。所以它们“长得很像”,但解决的问题本质不同。
token的编码方式首要考虑的就是序列长度。给定一段文字转换成 token 序列后,越短越好,因为 Transformer 迭代次数越少,算力消耗越小。那能不能无限扩大 token 的表示能力?比如搞一个超大的词表,让每个 token 代表很长的一段短语——但代价是:Transformer 最后一层要输出词表里每个词的概率,词表太大直接导致内存爆炸,而且大量低频词几乎没机会更新,反而拖累模型效果。所以实际 tokenizer 需要在序列长度和词表大小之间找平衡。目前主流算法有 BPE、WordPiece 和 SentencePiece,它们的思路大致相同:给定海量语料和一个目标词表大小 V,从字符/字节出发,反复合并最高频的相邻单元对,直到词表达到 V。以 GPT 使用的 BPE 为例:它通过贪心策略逐步合并,不保证全局最优,但实践中效果足够好。另一个关键优势是 Subword 机制——罕见词不会被粗暴丢弃,而是拆成常见的子词单元(如 tokenization → token + ization),既控制词表大小又不丢失信息。