普通视图

发现新文章,点击刷新页面。
今天 — 2025年12月6日首页

LLM 原理 - 输入预处理

作者 子洋
2025年12月6日 16:01

前言

最近在学习大模型的实现原理,为了更好地理解整个流程,我把学习中的关键概念和实现细节整理成了笔记。一方面帮助自己梳理思路、加深印象,另一方面也作为日后复习和查阅的基础。内容会按照模型的实际处理流程展开,希望能以清晰易懂的方式记录大模型的核心机制。

大模型原理概述

大模型最经典的架构图来自《Attention Is All You Need》,从这张图可以看到 Transformer 的基础结构是由“编码器”和“解码器”两部分组成的。虽然现在的大模型(像 GPT、LLaMA 这种)大多只保留了右侧的解码器结构,但它们整体的工作流程仍然遵循 Transformer 的思路。

整体原理可以简单理解成:

  1. 用户输入的文本会先经过 tokenizer 切成 token,再通过 embedding 转成向量。
  2. 这些向量会被送入 Transformer 的多层结构中处理。
    每一层都会做自注意力(Mulit-Head Attention,多头自注意力,让模型去关注上下文里的其他词)、前馈网络(Feed-Forward Network)、残差连接(Add)、层归一化(Norm)等操作,层数越多,模型对上下文的理解就越深。
  3. 最后一层会把处理后的向量经过线性变换,然后通过 softmax 得到一个概率分布。
    这个概率分布表示:“在所有 token 里,下一步最可能是哪个”。
  4. 模型会根据这个概率分布选出下一个 token(可能是选最高概率,也可能按概率采样)。
  5. 选出来的这个 token 会被加回当前输入,让模型继续推理下一个。
    模型就是这样不断循环:一步一步预测下一个 token,逐渐拼出完整的句子。
  6. 当所有 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。

它解决了三件关键问题:

  1. 文本如何变成模型能算的数字
  2. 模型如何知道每个 token 的意思
  3. 模型如何知道 token 的顺序

当这三步都准备好了,Transformer 才真正进入“理解和生成”的阶段。

❌
❌