Transformer原理详解:LLM从接收用户输入到输出响应的过程是怎么样的?

0 阅读12分钟

LLM 从接收输入到输出响应,本质上是将离散的文字符号转化为连续的数学向量,再通过 Transformer 架构逐层处理,最终转回文字的过程。Transformer 于 2017 年由 Google 在论文《Attention Is All You Need》中提出,凭借自注意力机制替代了此前主流的循环神经网络(RNN),实现了对序列的并行处理,成为现代大语言模型的基础架构。GPT、Llama、DeepSeek 等主流模型,本质上都是在 Transformer 的框架上演化而来的。从原理上讲,一次完整的推理过程可以分为以下五个核心阶段。

image.png

一、输入预处理(Input Preprocessing)

模型无法直接读懂汉字或英文,只能处理数字。

  1. 分词(Tokenization)

输入文本首先被切分为更小的单元,称为 Token。Token 不一定等于一个完整的词,现代 LLM 普遍采用 BPE(Byte Pair Encoding)或 SentencePiece 等算法,根据语料中的频率统计,将文本切分为子词(subword)级别的单元。例如"人工智能"可能被切分为"人工"和"智能",而生僻词或专有名词则往往会被拆得更碎。这种做法的好处在于:既能覆盖罕见词汇,又能控制词表规模(通常在 3 万到 15 万之间)。

  1. 嵌入(Embedding)

每个 Token 会被映射到一个高维向量空间中的坐标,向量的维度通常在 512 到 8192 之间,取决于模型规模。这个向量并非人工设计,而是在预训练过程中通过梯度下降自动学习得到的。语义相近的词在这个空间中距离较近——"猫"和"狗"的向量彼此靠近,而"猫"和"汽车"则相距较远。

从数学结构上看,Embedding 本质上是一张查找表(lookup table),其维度为 |V| × d_model,其中 |V| 为词表大小,d_model 为模型隐层维度。输入的 Token ID 经过 one-hot 编码后,与这张表做矩阵乘法,就得到对应的初始向量表示。

  1. 位置编码(Positional Encoding)

Transformer 架构以并行方式处理整个输入序列,这意味着它天然无法感知词语的先后顺序——"猫吃鱼"和"鱼吃猫"在没有位置信息的情况下对模型是等价的。为解决这个问题,需要在 Embedding 向量上叠加位置编码。

原始 Transformer 论文采用正弦/ 余弦 函数构造固定的位置向量

PE(pos,2i)=sin(pos100002i/dmodel),PE(pos,2i+1)=cos(pos100002i/dmodel)PE_{(pos, 2i)} = \sin\left(\frac{pos}{10000^{2i/d_{model}}}\right), \quad PE_{(pos, 2i+1)} = \cos\left(\frac{pos}{10000^{2i/d_{model}}}\right)

这种设计让相邻位置的编码向量之间具有固定的线性关系,便于模型推断相对距离。

现代主流模型(如 Llama、DeepSeek)则转向 RoPE(Rotary Position Embedding,旋转位置编码) 。RoPE 的思路是:把位置信息编码为向量的旋转角度,在计算注意力时直接作用于 Query 和 Key 向量,使得两个位置之间的注意力权重只依赖于它们的相对位移,而非绝对位置。这种方式在长上下文泛化上表现更好。

二、预填充阶段(Prefill / Context Encoding)

目前主流的大模型(如 GPT、Llama、DeepSeek)多采用 Decoder-only 架构。拿到位置编码后的向量序列,模型进入最核心的计算阶段。

2.1 自注意力机制(Self-Attention)

自注意力机制的核心思想是:序列中每个位置的词,在形成自身表示时,应当参考序列中其他位置的信息,并根据相关程度分配不同的权重。

  1. QKV 的由来

对于输入序列中的每个词向量 xix_i,模型通过三组不同的权重矩阵 WQW^QWKW^K WVW^V ,分别将其投影为三个向量:

  • Query (查询向量 Q) :代表"这个词想要寻找什么信息"
  • Key(键向量 K) :代表"这个词提供了什么信息"
  • Value(值向量 V) :代表"如果这个词被选中,实际传递的内容是什么"
  1. 注意力权重的计算

每个词的 Query 与序列中所有词的 Key 做点积,衡量它们之间的相关程度,再经过 Softmax 归一化得到概率分布,最后加权求和所有词的 Value 向量:

Attention(Q,K,V)=Softmax(QKTdk)V\text{Attention}(Q, K, V) = \text{Softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V

分母中的 dk\sqrt{d_k} 是缩放因子,防止向量维度较高时点积结果过大,导致 Softmax 后梯度消失。

以"银行里的钱被取走了"为例:当模型计算"银行"这个词的注意力时,"钱"和"取"对应的权重会较高,而"里"和"的"权重较低——模型因此能判断此处的"银行"指金融机构而非河岸。

  1. 因果掩码(Causal Mask)

Decoder-only 架构在生成阶段需要遵循 "只能看到过去,不能看到未来" 的约束。为此,在计算注意力矩阵时会施加一个下三角掩码(causal mask)将未来位置的注意力权重强制置为负无穷,经过 Softmax 后趋向于零,从而阻断信息的"穿越"。

2.2 多头注意力(Multi-Head Attention)

单组 QKV 投影只能捕捉一种相关模式。多头注意力将 向量空间 切分为 hh 个子空间(通常 hh 为 8、16 或 32),在每个子空间中独立计算注意力,最后将所有头的输出拼接起来,再经过一个 线性变换 压缩回原始维度

MultiHead(Q,K,V)=Concat(head1,,headh)WO\text{MultiHead}(Q, K, V) = \text{Concat}(\text{head}_1, \ldots, \text{head}_h)W^O

不同的头会自发地学习到不同类型的依赖关系——有的头专注于句法结构(主语与谓语),有的头关注语义共指(代词与其指代的名词),有的头则捕捉长程依赖(段落首尾的逻辑呼应)

2.3 前馈网络(FFN)

先回忆一下注意力机制做的事:它让每个词去"看"序列中的其他词,把相关的信息收集过来。但收集完之后呢?这些信息还是一堆混在一起的向量,需要进一步处理,才能变成有用的东西。FFN 就是负责这一步的。

前馈网络(Feed-Forward Network)的结构本身很简单:先把向量"升维"(扩展到更大的空间),做一次非线性变换,再"降维"压缩回来。这个"升维再降维"的过程,相当于给模型更大的工作台,让它能在中间状态中表达更复杂的模式,最后再整理成紧凑的输出。它通常由两层线性变换加一个激活函数(如 GeLU 或 SwiGLU)组成,中间维度一般是 dmodeld_{model} 的 4 倍:

textFFN(x)=Activation(xW1+b1)W2+b2text{FFN}(x) = \text{Activation}(xW_1 + b_1)W_2 + b_2

有研究认为 FFN 是模型存储事实性知识的主要场所。研究者做了这样的实验:当你问模型"法国的首都是哪里",可以定位到某几层特定的 FFN 权重被激活,把"巴黎"这个答案"调出来"。如果修改FNN的权重,模型的回答就会改变。这说明 FFN 的权重矩阵并非只是在做抽象的数学变换,它在预训练过程中,把大量事实性知识以某种方式编码在了参数里。当然,这个说法目前仍是研究中的假说,FFN 的工作机制远比"存储知识"复杂,但这是目前最有共识的直觉。

2.4 残差连接与层归一化

GPT-3 有 96 层 Transformer Block,像 GPT-4 这样的模型据估计更深。信息从第 1 层流向第 96 层,相当于穿过了 96 道关卡,每道关卡都要做一堆矩阵运算。这里有一个深层神经网络的经典问题:梯度消失

训练神经网络依赖反向传播——把模型的预测误差从输出层一路向后传,告诉每一层的权重该怎么调整。但这个误差信号在每经过一层时都会被乘上一个小于 1 的系数(链式求导的结果),经过几十层之后,误差信号可能已经衰减到接近于零,前几层的权重几乎收不到有效的训练信号,就等于白训练了。

残差连接的解决方法就是:让每一层的输出 = "这一层的计算结果" + "这一层的原始输入"。 即每个子层(注意力层、FFN 层)的输出都会与输入做残差相加(residual connection),再经过层归一化(Layer Normalization):

xl+1=LayerNorm(xl+SubLayer(xl))x_{l+1} = \text{LayerNorm}(x_l + \text{SubLayer}(x_l))

残差连接解决了深层网络中梯度消失的问题,使得信号能够有效传播到几十层甚至上百层的深度。

层归一化解决的是另一个问题:随着信号经过多层变换,向量的数值可能越来越大或越来越小,分布变得很不稳定,导致训练不稳定。层归一化相当于在每一步之后,把向量的数值"拉回"到一个正常的范围——均值为 0、方差为 1——再加上两个可学习的缩放参数,让模型自己决定保留多少"幅度"。这两件事加在一起,才让几十层乃至上百层的深层网络变得可以稳定训练。

2.5 逐层深化的语义抽象

一个 Transformer Block = 一次注意力(收集信息)+ 一次 FFN(处理信息)。

把几十个这样的 Block 摞在一起,就是完整的模型。信息从第 1 层流向最后一层,每一层都在做微小但累积的改变:

  • 浅层(前几层) :主要在处理局部的表面模式,比如词性(这是动词还是名词)、相邻词之间的简单关系("非常"修饰的是什么)。
  • 中间层:开始捕捉更长的句法结构,比如主语和谓语之间的对应,嵌套从句的边界。
  • 深层(后几层) :处理更抽象的内容——这句话的意图是什么,上文提到的"它"指代的是哪个实体,回答这个问题需要调用哪方面的知识。

最终,序列中最后一个有效位置(通常是最新输入的 Token)的向量,携带了整个上下文的压缩表示,被送往输出层。

为什么是最后一个 Token?

模型在生成下一个词时,只需要一个向量来代表当前整个上下文的状态。因为有因果掩码的存在,序列中最后一个位置的 Token 在注意力计算时,已经"看过"了它之前所有位置的信息——它是唯一一个整合了全部历史的位置。所以模型取出这个位置在最后一层的输出向量,把它送入输出层做预测,就相当于拿到了整个上下文的压缩摘要。

三、KV 缓存(KV Cache)

理解 KV Cache 需要先明白自回归生成的计算瓶颈。

在生成阶段,每预测一个新 Token,理论上需要将已有的全部序列重新过一遍所有 Transformer Block,重新计算每一层的 Key 和 Value 矩阵。如果序列长度为 LL,模型有 NN 层,每生成一个词的计算量就是 O(LN)O(L \cdot N),随序列增长线性膨胀,代价极高。

KV Cache 的做法是:在 Prefill 阶段(处理初始输入时),将每一层每个位置计算得到的 Key 向量和 Value 向量全部缓存到显存中。之后每生成一个新 Token,只需计算该新 Token 对应的 Q、K、V,然后将新的 K、V 追加到缓存末尾,注意力计算时直接读取完整的 KV 缓存即可——新 Token 的 Query 与所有历史 Key 做点积,权重加权所有历史 Value,完成增量更新。

这样,每步生成的计算量从 O(L)O(L) 降至近似 O(1)O(1)(仅对新 Token 做计算),代价是显存占用随序列长度线性增长。这也是为什么长上下文推理对显存要求很高的根本原因。

四、自回归解码(Autoregressive Decoding)

大模型的生成方式是逐词预测,每次仅输出一个 Token

  1. 从向量到概率分布

最后一个 Transformer Block 的输出向量经过一个线性层(也称 LM Head,其权重矩阵维度为 d_model × |V|)映射为词表大小的 logit 向量(原始分数),再经过 Softmax 转化为概率分布:

P(tokeni)=ezijezjP(\text{token}_i) = \frac{e^{z_i}}{\sum_j e^{z_j}}

这个概率分布覆盖了词表中全部 Token,每个 Token 被赋予一个非负概率,所有概率之和为 1。

  1. 采样策略
  • 贪心解码(Greedy Decoding) :直接选取概率最高的 Token,结果确定但容易陷入重复和平庸。
  • 温度(Temperature)在 Softmax 之前将 logit 除以温度参数 TT T<1T < 1 时分布更尖锐,高概率词的优势被放大,输出趋于保守; T>1T > 1 时分布更平坦,低概率词有更多出头机会,输出更有随机性。
  • Top-p 采样(Nucleus Sampling) :只从累积概率达到阈值 pp 的 Token 子集中采样,动态过滤掉长尾的低质量选项。
  • Top-k 采样:每次只从概率最高的 kk 个 Token 中采样,简单有效。

实际部署中,这些策略往往组合使用。

  1. 自回归循环

采样得到的新 Token 会被追加到序列末尾,作为下一轮预测的输入背景,循环往复,直到触发停止条件。每一步的生成都以全部历史为条件,这也是"自回归"(autoregressive)名称的由来。

五、后处理与输出(Post-processing)

  1. 去分词(De-tokenization)

将逐步生成的 Token ID 序列转回人类可读的文本。由于 BPE 等分词算法在切分时可能引入特殊的空格或边界标记,去分词时需要将这些标记还原。

  1. 停止条件

生成过程在以下情况之一发生时终止:

  • 模型生成了特殊的终止符(如 <|endoftext|><|eot_id|>),这是模型在训练时学到的"我说完了"的信号;
  • 生成长度达到预设的最大 Token 数限制;
  • 在某些对话系统中,检测到角色切换标记(如生成了"User:"这样的前缀)时也会截断。

最终,去分词后的文本流式或一次性地呈现在用户面前,完成整个推理过程。

小结

将上述五个阶段串联起来,一次完整的 LLM 推理大致如下:

原始文本
  → 分词 + Embedding + 位置编码
  → Prefill:N 层 [Multi-Head Attention + FFN + 残差 + 归一化]
  → KV Cache 建立
  → 自回归解码循环:采样新 Token → 追加序列 → 查 KV Cache → 更新 → 采样 ...
  → 触发停止条件
  → 去分词
  → 输出文本

理解这条链路,有助于解释 LLM 的很多行为:为什么长对话消耗更多资源(KV Cache 增长)、为什么调高温度会让模型"发散"(Softmax 平坦化)、为什么模型有时会在句子中间截断(触发了最大长度限制)。Transformer 的设计并非魔法,每一个环节都有其数学上的必然性。