LLM 原理 - 输入预处理
前言
最近在学习大模型的实现原理,为了更好地理解整个流程,我把学习中的关键概念和实现细节整理成了笔记。一方面帮助自己梳理思路、加深印象,另一方面也作为日后复习和查阅的基础。内容会按照模型的实际处理流程展开,希望能以清晰易懂的方式记录大模型的核心机制。
大模型原理概述
大模型最经典的架构图来自《Attention Is All You Need》,从这张图可以看到 Transformer 的基础结构是由“编码器”和“解码器”两部分组成的。虽然现在的大模型(像 GPT、LLaMA 这种)大多只保留了右侧的解码器结构,但它们整体的工作流程仍然遵循 Transformer 的思路。
整体原理可以简单理解成:
- 用户输入的文本会先经过 tokenizer 切成 token,再通过 embedding 转成向量。
-
这些向量会被送入 Transformer 的多层结构中处理。
每一层都会做自注意力(Mulit-Head Attention,多头自注意力,让模型去关注上下文里的其他词)、前馈网络(Feed-Forward Network)、残差连接(Add)、层归一化(Norm)等操作,层数越多,模型对上下文的理解就越深。 -
最后一层会把处理后的向量经过线性变换,然后通过 softmax 得到一个概率分布。
这个概率分布表示:“在所有 token 里,下一步最可能是哪个”。 - 模型会根据这个概率分布选出下一个 token(可能是选最高概率,也可能按概率采样)。
-
选出来的这个 token 会被加回当前输入,让模型继续推理下一个。
模型就是这样不断循环:一步一步预测下一个 token,逐渐拼出完整的句子。 - 当所有 token 都生成完成后,再通过 tokenizer 解码,就得到了最终的可读文本。
整体来说,大模型的生成过程并不是一次性输出整段文本,而是每次只预测一个 token,然后把它接回去继续算,直到生成结束。
输入预处理
输入预处理虽然在 Transformer 的架构图中只占了一小块,但如果把整个生成流程拆开来看,它其实是整个大模型的第一步,也是后面所有计算的基础。输入处理得好不好,直接影响到模型能不能正确理解你的话。
1. 训练阶段先要把词表准备好
在模型训练之前,会先收集海量的文本数据,然后训练一个 tokenizer。它的作用就是:
- 把人类的自然语言拆成模型可接受的最小单位(叫 token)
- 给每个 token 分配一个唯一的 token id
- 形成一个固定的词表(vocab)
token 不一定是字,也不一定是词,更不是固定长度。现代 tokenizer 通常是“子词模式”,比如:
我 | 今天 | 吃 | 了 | 橙 | 子
happy → hap | py
unbelievable → un | believe | able
也就是说,词表中既可能有完整的词,也可能是词的一部分,这样可以极大减少词表大小,让模型处理能力更灵活。
2. 用户输入时,先把句子拆成 token
当用户输入一句话,比如:
我今天想吃火锅
模型不会直接拿这个句子处理,而是:
- 按照训练好的 tokenizer 规则进行切分
- 得到对应的 token 序列
- 再查词表,把它们转成 token id
得到的结果类似这样的一个数组:
[123, 520, 11, 98, 8801]
也就是数字形式的 token 序列。
3. token id 需要转成向量(Embedding)
模型不能直接理解 token id,因为 token id 只是一个“编号”,不包含任何语义。所以下一步是通过 embedding table,把 token id 转换成对应的向量:
- 每个 token 变成一个高维向量(例如 4096 维)
- 所有 token 向量堆在一起就形成输入矩阵
向量的意义是:
让模型通过数字之间的关系来“理解”语言,比如相似的词向量更接近。
4. 生成位置 embedding 告诉模型位置顺序
Transformer 最大的特点是:
它的注意力机制没有顺序意识。
换句话说,如果没有额外的位置信息,它只知道有哪些 token,不知道谁在前、谁在后。
这会导致严重的问题,比如:
- “我吃了橙子”
- “橙子吃了我”
对模型来说,单看 token 本身完全一样,只是顺序不同,所以必须把位置告诉模型。
因此,模型会为每个 token 生成一个位置 embedding。
早期 Transformer 位置 embedding是正弦余弦序列,现代模型常用更先进的 RoPE(旋转位置编码)。但无论哪种方法,目的都是:
告诉模型“你现在看到的是第 1 个、第 2 个、第 3 个 token…”
5. token embedding 和 position embedding 合并
模型最终接收的是:
token 本身表达的含义(token embedding)
+
它在句子中的顺序(position embedding)
早期 Transformer 是直接做向量加法:
final_embedding = token_embedding + position_embedding
现代模型虽然底层机制更复杂(比如 RoPE 会作用到注意力的 Q、K 上),但整体来说:它们都是在让模型同时知道“词的语义”和“词的位置”。
这两个 embedding 合并之后,就是最终送入 Transformer Block 的输入。
6. 最终得到完整的输入矩阵
假设一句话拆成 10 个 token,每个 embedding 是 4096 维,那么模型的实际输入会是一个:
10 × 4096 的矩阵
这就是 Transformer 后面所有自注意力、多头机制和深层计算的起点。
总结一下
输入预处理的整个流程可以总结为:
把文本 → token → token id → token embedding → 加上位置 embedding → 得到最终的输入向量矩阵,送进 Transformer。
它解决了三件关键问题:
- 文本如何变成模型能算的数字
- 模型如何知道每个 token 的意思
- 模型如何知道 token 的顺序
当这三步都准备好了,Transformer 才真正进入“理解和生成”的阶段。