Transformer 与大模型原理
Token 与 Embedding:大模型如何把文字变成数字
进阶 15 分钟 适合: 初学者 / 开发者 / 研究者
本课要点
- ▸大模型读写的单位是 token:常见词、词片段或字节,由 BPE 之类的算法决定。
- ▸上下文窗口、价格和速度都按 token 计算;同样的内容,用不同语言写,token 数可能差很多。
- ▸每个 token 编号对应一个 Embedding:由几百到上万个数字组成、在训练中学出来的向量。
- ▸在 Embedding 空间里,意思相近的内容彼此靠近,这是语义搜索和 RAG 的基础。
为什么不直接用字母或整词?
神经网络只能拿数字计算,所以文字要先变成一串编号。两个直观的方案都行不通:
- 整词:词表会有几百万项,遇到新词、错别字、人名就不认识。
- 单个字符:序列变得很长,模型又慢,也更难学到含义。
几乎所有大模型采用的折中方案是子词分词:常见词单独成为一个 token,少见的词拆成几块,最坏情况下退回到原始字节,所以永远不会出现“不认识”的输入。
BPE 怎样建立词表
**字节对编码(BPE)**由 Sennrich 等(2015) 引入神经网络,它从数据中学出词表:
- 先把单个字符(或字节)作为初始词表。
- 在大量语料里统计所有相邻的两两组合,把出现最多的一对合并成新 token(比如
t+h→th)。 - 不断重复,直到词表达到目标大小。
GPT-2 的词表有 50,257 个 token,Meta 的 Llama 3 约 128,000 个。SentencePiece 是一个常用库,直接在原始文本上做 BPE 或类似算法,很适合中文、日文这种没有空格分词的语言。
flowchart LR T["“大模型很有趣!”"] --> S["切成 token:'大' '模型' '很' '有趣' '!'"] S --> I["token 编号:如 1023, 52144, 3001, 8812, 6"] I --> E["查 Embedding 表:每个编号一个向量"] E --> M["Transformer 各层"]
(上面的切分和编号仅为示意,每个分词器都不同。)
token 数为什么重要
- 上下文窗口:“128K 上下文”的模型能同时看到约 128,000 个 token,提示词、文档和回答加在一起算。
- 费用与速度:API 按输入、输出 token 计费,生成速度用“每秒多少 token”衡量。
- 语言差异:主要用英文训练的分词器,处理很多其他语言时需要更多 token,同样一段话可能更贵。OpenAI 给出的英文经验值是约 4 个字符一个 token(帮助文档);中文请用实际的分词器去数,比如 tiktoken。
- 奇怪的失误:模型把
strawberry看成几个 token,而不是十个字母,这是它数字母、做某些算术时不可靠的原因之一。
Embedding:token 变成向量
分词之后,每个编号会从 Embedding 矩阵里取出一行:一个由几百到上万个数字组成的向量(GPT-3 最大的模型用的是 12,288 维)。一开始这些向量是随机的,训练中反向传播会像调整其他参数一样调整它们,于是在相似语境中出现的 token,向量也会变得相似。
这个思想比大模型更早。word2vec(Mikolov 等,2013)就展示了:从上下文学到的词向量会把关系编码成方向,著名的例子是 国王 − 男人 + 女人 落在 王后 附近。在大模型内部,初始的 token embedding 只是起点:每个 Transformer 层都会根据上下文改写它,所以“苹果”在“吃苹果”和“苹果公司”里,最终的向量并不一样(见 Transformer 与注意力机制)。
向量模型与语义搜索
另一个相关但独立的工具是向量模型(embedding 模型,例如 Sentence-BERT,以及许多商用和开源模型)。它把整句话或整篇文档映射成一个向量,让意思相近的文本彼此靠近,通常用余弦相似度衡量。这样就能按“意思”而不是按关键词搜索,这正是向量数据库和 RAG 的基础。
动手试试
常见问题
一个 token 等于几个字?
OpenAI 给出的经验值是:英文大约 4 个字符、约 3/4 个单词对应一个 token。中文因分词器而异,常见情况是一到两个汉字一个 token,准确数字要用对应模型的分词器去数。
为什么大模型数不清一个单词里有几个字母?
因为它通常把一个单词看成一两个 token,而不是一个个字母。要拼写或数字母,模型得记住每个 token 里面是哪些字母,这一点它往往记得不牢。
大模型里的 token embedding 和“向量模型”有什么区别?
token embedding 是大模型内部的第一层;向量模型(embedding 模型)是另一个独立的模型,把整句话或整篇文档变成一个向量,用于搜索、聚类和 RAG。