site logo

Marico's space

Transformer 架构如何驱动现代大语言模型

AI技术与应用 2026-05-20 17:36:09 10

前阵子把 Transformer 的整个数据流程从头到尾梳理了一遍,发现这玩意儿的设计比我想象中精巧得多。这篇文章就把从文本输入到模型输出的完整链路拆开来讲,配合具体例子,争取让没接触过 NLP 的后端也能搞懂 ChatGPT 这些大模型到底在"想"什么。

先说个背景。现在我们用 ChatGPT、通义千问这些对话模型时,本质上是在和一套序列预测算法打交道。人类说话是从想法到文字,而大模型走的是完全不同的路——它把文字转成数字、算来算去、再转回文字,中间这套转换逻辑才是理解 LLM 的关键。

大多数现代大语言模型的核心都依赖 Transformer 架构。这套东西 2017 年被 Google 提出后,几乎一统江湖。它的结构说简单也简单,就三块:

把词转成数字的嵌入层、堆叠在一起做计算的 Transformer 层、把结果转回文字的输出层。

Transformer 的核心能力是并行处理所有词——不是挨个处理,而是一起算。这就让它能从海量文本里学到词和词之间的复杂关系,比传统 RNN 那套顺序处理强了不止一个量级。

下面进入正题,逐一拆解这五个步骤。

Step 1: 从文字到 Token

模型拿到文本后,第一步得把它变成能计算的东西。这个过程叫分词(Tokenization),就是把句子拆成最小单元——Token。但要注意,Token 不一定等于完整单词。它可能是子词、词片段,甚至单个字符。

举个例子,输入 "我爱大模型!" 分词器可能拆成:["我", "爱", "大", "模型", "!"]。"模型" 可能本身就是一个 Token,也可能被拆成 ["大", "模型"],取决于训练时用的词表。

每个唯一的 Token 都会被分配一个整数 ID:

  • "我" 对应 ID 150
  • "爱" 对应 ID 8942
  • "大" 对应 ID 3301
  • "模型" 对应 ID 1847
  • "!" 对应 ID 254

这些 ID 就是随意编的,150 和 151 之间没什么关系,纯粹是查表用的标识符。一个词表通常包含 5 万到 10 万个不等的 Token,都是模型在预训练阶段从海量文本里统计出来的。

Step 2: Token 转成 Embedding

Token ID 直接喂给神经网络是行不通的——它们只是孤零零的编号,彼此之间没有任何语义关联。模型真正需要的是连续的数值向量。

Embedding 就是干这个的:把每个 Token ID 映射成一个多维向量,实数表示,维度从几百到几千不等。GPT-3 用的就是 12288 维的 Embedding。

下面是个五维简化示例(真实模型往往是 768 到 4096 维):

  • Token "狗" → [0.23, -0.67, 0.45, 0.89, -0.12]
  • Token "狼" → [0.25, -0.65, 0.47, 0.91, -0.10]
  • Token "汽车" → [-0.82, 0.34, -0.56, 0.12, 0.78]

看出来了没?"狗"和"狼"的向量非常接近,因为都是动物,而"汽车"的向量完全不在一个频道上。这就是 Embedding 的魔力——它把语义相似的词映射到向量空间里相近的位置。

为什么需要这么多维度?单维根本不够用。举个例子:

  • "股票" = 5.2(金融含义)
  • "资本" = 5.3(类似金融含义)
  • "稀有" = -5.2(反义词:不常见)
  • "债务" = -5.3(资本的反义)

问题来了:"稀有"和"债务"都是负数,数值还相近,意味着它们"相关"?这显然不对。数百个维度让模型能在不同方向上编码不同属性,避免这种冲突。

Embedding 空间里甚至能做数学运算。"国王"的向量减去"男人"的向量,加上"女人"的向量,结果约等于"女王"。这些关系不是人为设定的,而是模型从海量文本中自己学出来的。

Step 3: 加上位置信息

Transformer 本身是不理解词序的。"狗追猫"和"猫追狗"在它看来就是同一组 Token,光看向量完全分不清。

解决办法是 Positional Encoding(位置编码)。每个位置都有对应的位置向量,和 Token 的词义向量加在一起。

比如"狗"出现在位置 2:

  • 词向量:[0.23, -0.67, 0.45, 0.89, -0.12]
  • 位置2的向量:[0.05, 0.12, -0.08, 0.03, 0.02]
  • 合并后:[0.28, -0.55, 0.37, 0.92, -0.10]

这样既保留了词的含义,又包含了它出现在句子里哪个位置的信息。这个合并后的向量才会流进后面的 Transformer 层。

Step 4: Attention 机制

这是 Transformer 最核心的部分,叫自注意力机制(Self-Attention)。每个 Transformer 层都会执行 Attention 操作,对每个 Token 都要算出三样东西:Query(查询)、Key(键)、Value(值)。

可以把这个过程理解成"模糊匹配查字典":Query 是你想找什么,Key 是字典里有哪些词条,Value 是每个词条对应的内容。Attention 就是把 Query 和所有 Key 比一遍,算出相似度,再用相似度做权重,把所有 Value 加权求和。

拿个具体例子跑一遍。句子:"小猫坐在垫子上,因为它很舒服。"

模型处理到"它"的时候,必须搞清楚"它"指什么。流程是这样的:

  • "它"的 Embedding 生成一个 Query 向量,大意是在问:"我在指哪个名词?"

  • 这个 Query 和前面所有 Token 的 Key 逐一比对,算出相似度得分:

    • "小"(形容词):0.05
    • "猫"(名词):8.3
    • "坐"(动词):0.2
    • "在"(介词):0.03
    • "垫"(名词):4.1
    • "子"(量词):0.1
    • "上"(方位词):0.8
    • "因为"(连词):0.1
    • "很"(副词):0.2
    • "舒服"(形容词):0.6
  • 这些原始分数通过 Softmax 转成加起来等于 1 的权重:

    • "猫"权重:0.75(75%)
    • "垫子"权重:0.20(20%)
    • 其余 Token:总共 0.05(5%)

最后,模型把每个 Token 的 Value 向量按权重相加:

Output = (0.75 × Value_猫) + (0.20 × Value_垫子) + (0.03 × Value_小) + ...
Enter fullscreen mode Exit fullscreen mode

结果就是"猫"的 Value 贡献了 75%,"垫子"贡献了 20%,其他的基本被忽略。这个加权结果就成了"它"的新向量表示,包含了上下文信息——"它"最可能指的是"猫"。

这个 Attention 过程在每个 Transformer 层都会发生,但每层学到的模式不一样:

  • 浅层学基础pattern:语法、常见词搭配。处理"猫"时,浅层可能重点关注"小",因为它们学到冠词和名词经常一起出现。

  • 中间层学句法结构:主谓关系、短语结构。中间层会搞清楚"猫"是"坐"的主语,"在垫子上"是介词短语表位置。

  • 深层提取抽象语义:整句在说什么、蕴含什么信息。深层可能理解这是在描述一个物理场景,暗示猫处于舒服或休息的状态。

每一层都在前一层的基础上精炼表示,上一层的输出作为下一层的输入,逐步叠加上下文理解。

有一点要注意:只有最后一层 Transformer 层才负责预测下一个 Token。所有中间层都在做同一件事——把表示转成对后面更有用的形式,但它们自己并不输出 Token。中间层输出的还是向量,这些向量流向下一层,直到最后一层才做预测。这个层层叠加、每层专注不同层面的设计,让大模型能捕捉极其复杂的语言规律。

Step 5: 转回文字

经过所有 Transformer 层后,得到的向量要转换成文字。这一步叫 Unembedding(或叫解码层):把向量和所有 Token 的 Embedding 比对一遍,给每个 Token 打分。

比如要补全"我喜欢吃",模型输出的分数可能是:

  • "米饭":65.2

  • "面条":64.8

  • "饺子":64.1

  • "食物":58.3

  • "火锅":57.9

  • "汽车":-12.4

  • "42":-45.8

这些分数通过 Softmax 转成概率:

  • "米饭":28.3%

  • "面条":24.1%

  • "饺子":18.9%

  • "食物":7.2%

  • "火锅":6.1%

  • "汽车":0.0001%

  • "42":0.0000001%

分数接近的 Token 概率也接近(65.2 和 64.8 → 28.3% 和 24.1%),分数低的 Token 概率趋近于零。

关键来了:模型并不是选概率最高的那个,而是按照这个概率分布随机抽一个。就像转盘抽奖,每个 Token 占的扇形大小和它的概率成正比。"米饭"占 28.3%,"饺子"占 18.9%,"42"占的面积小到几乎看不见。

为什么不直接选最高概率的?因为这样输出会变得单调重复。每次都选"米饭",生成的文章就千篇一律了。随机采样让模型有时选"面条"、有时选"火锅",偶尔还能抽到低概率的选项产生意想不到的效果——这正是大模型看起来有"创意"的原因之一。

自回归生成循环

上面的过程是生成一个 Token,但实际上模型要一个 Token 一个 Token 地往外吐,直到凑成完整句子。每生成一个 Token,都要完整走一遍上面的流程。

拿"法国的首都是哪里"做例子:

第一轮:

  • 输入:["法国", "的", "首都", "是"]

  • 所有层处理一遍

  • 随机采样:"北京"(80%)

  • 目前输出:"法国的首都是北京"

第二轮:

  • 输入:["法国", "的", "首都", "是", "北京"]

  • 所有层重新处理一遍(5个 Token)

  • 采样:"巴黎"(92%)

  • 输出:"法国的首都是北京巴黎"

第三轮:

  • 输入:["法国", "的", "首都", "是", "北京", "巴黎"]

  • 所有层处理

  • 采样:"。"(65%)

  • 输出:"法国的首都是北京巴黎。"

第四轮:

  • 输入:["法国", "的", "首都", "是", "北京", "巴黎", "。"]

  • 处理一遍

  • 采样:[EoS] 结束符(88%)

  • 停止,输出完整句子

这个 [EoS](End of Sequence)就是告诉模型"说完了"的标记。每生成一个新 Token,之前所有的 Token 都要重新过一遍 Transformer,所以回复越长,生成越慢——这是 Transformer 的平方复杂度决定的。

这种"用前面的输出接着生成"的方式叫自回归(Autoregressive)生成。前面一旦有个 Token 选得意外(比如"我喜欢吃粉笔"这种低概率词),后面的所有 Token 都会被这个选择影响。就像蝴蝶效应,一开始的偏差会传导到整句话。

训练和推理:两套完全不同的模式

Transformer 运行有两种场景:训练(Training)和推理(Inference)。

训练阶段,模型从海量文本里学语言规律。参数从随机值开始,边看文本边调整。就像小孩学说话,看的例子多了,自己就能总结出规律。

训练过程是这样的:

  • 输入文本:"小猫坐在垫子上。"
  • 喂给模型:"小猫坐在垫"
  • 随机初始参数下,模型瞎猜:

    "香蕉":25%

    "汽车":22%

    "垫子":3%(正确答案概率极低)

    "大象":18%

算出来"垫子"应该有更高概率才对,差了多少?用反向传播(Backpropagation)把这个误差往回传,调整所有参数:

  • Embedding 层微调
  • 所有层的 Attention 权重微调
  • 输出层微调

每次调整的幅度都很小(0.245 → 0.247),但架不住见过的文本多。"坐""在""垫"这几个 Token 反复以各种姿势出现,模型慢慢就学会了它们的搭配关系。训练一次要几周时间,烧掉几百张 GPU,花费几百万美元。训完以后参数就固定了,不再改了。

推理阶段就简单了,模型用已经冻结的参数跑:

  • 用户输入:"补全这个:小猫坐在垫"

  • 模型用学好的参数处理,输出:"垫子"(85%)、"地上"(8%)、"椅子上"(3%)
  • 采样返回"垫子",完成

推理过程只是"回忆"训练时学到的知识,并不会产生新的学习。你跟 ChatGPT 聊再多,它也不会因此变得更懂你——那些对话记录不会改写模型权重。想让它学会新东西,只有重新训练一条路,而这就需要天文数字的算力了。

总结

Transformer 架构用一套很优雅的方式解决了"理解和生成人类语言"这个问题。文字转成向量表示、用 Attention 机制捕捉词与词之间的关系、多层叠加逐步提取越来越抽象的特征——靠着这三板斧,现代 LLM 能输出连贯、有用的文本。

生成每个 Token 的完整链路包括七个步骤:分词 → 生成 Embedding → 加入位置编码 → 流经 Transformer 层做 Attention → Unembedding 成分数 → 按概率采样 → 转回文字。每个步骤承接上一步的结果,把原始文本变成模型能操作的数学表示,最后再变回人能读的文字。

搞清楚这个流程,就能理解大模型的能力边界在哪。本质上,LLM 是一个复杂的模式匹配机器——它从海量数据里学到了"这个词后面通常跟什么",然后按照学到的规律不停地预测下一个最可能的 Token。说到底,还是统计。

原文链接:https://dev.to/gaborcselle/how-transformers-architecture-powers-modern-llms-4ddn