Transformer 与大模型工作原理

学习目的:不需要成为模型专家,但如果完全不理解它是怎么工作的,很多工程上的决策会做错。比如为什么模型会幻觉、为什么上下文窗口很重要、为什么 Prompt 写法会影响输出质量——这些都跟本文的内容有关。

一、模型到底是什么东西?

1783479789

从程序员视角理解

作为 Java 程序员习惯了:代码 + 数据 → 输出。

大模型从本质上也是一个函数

1
f(输入文字) → 输出文字

但这个函数的参数不是 if-else 写出来的,而是从海量数据中学习出来的,存储在数十亿甚至数千亿个浮点数里。

1
2
3
4
5
6
7
8
GPT-4:约 1.8 万亿参数(每个参数是一个 float32,占 4 字节)
→ 参数文件大小约 7TB

DeepSeek-V3:约 6710 亿参数
→ 量化后约 400GB,需要多张高端 GPU

Llama 3.1 8B(小模型):约 80 亿参数
→ 量化后约 5GB,普通电脑可以跑

可以把模型想象成一本书,但这本书里没有文字,只有数十亿个调好的旋钮,每个旋钮的刻度共同决定了模型的”知识”和”能力”。

模型只做一件事

模型实际上只做一件事:预测下一个 Token 的概率分布

1
2
输入:["今天", "天气", "很"]
输出:{"好": 0.40, "差": 0.25, "热": 0.20, "糟": 0.10, ...}

然后采样选一个词,加入序列,再预测下一个……如此循环,直到生成结束符。

整个 ChatGPT、整个智能客服、整个代码助手,底层都是这一个动作反复执行。

二、Transformer 之前:RNN 的问题

Transformer 出现之前,处理文字序列最主流的是 RNN(循环神经网络)

RNN 的工作方式很像人读文章:一个字一个字读,同时维护一个”记忆状态”,把前面读过的信息压缩进去。

1
2
3
4
5
读入"今" → 更新记忆状态 h1
读入"天" → 更新记忆状态 h2(h2 包含了"今""天"的信息)
读入"天" → 更新记忆状态 h3
读入"气" → 更新记忆状态 h4
...

听起来挺合理?但有两个致命缺陷。

缺陷一:长距离依赖丢失

想象这句话:

“我在陕西长大,后来去杭州读书,又在广州工作了十年,现在终于回到了我魂牵梦绕的故乡——**___**”

人类一眼就知道应该填”陕西”。但 RNN 读到这里,”陕西”已经是几十步之前的信息了,早就被后来的内容覆盖得差不多了。

缺陷二:无法并行计算

RNN 必须一步一步顺序计算,读完第 N 个词才能读第 N+1 个词,没法利用 GPU 的并行计算能力。训练大规模 RNN 要几个月,严重限制了模型规模。

三、Transformer:注意力机制的革命

img

核心思想

Transformer 完全抛弃了顺序处理的方式。它的核心思想是:

处理每个词时,同时看整个句子里所有其他词,计算它们之间的关联程度。

这就是注意力机制(Attention)

直觉理解

还是那句话:我在陕西长大,后来去杭州读书,又在广州工作了十年,现在终于回到了我魂牵梦绕的故乡

当模型处理”故乡”这个词时,注意力机制会让它向整个句子”提问”:

1
2
3
4
5
6
7
8
"故乡"问:"谁和我最相关?"

"陕西":相关度 85% ← 高度关注
"长大":相关度 70% ← 比较关注
"我" :相关度 60%
"杭州":相关度 20%
"广州":相关度 15%
"十年":相关度 5%

通过这种方式,无论”陕西”和”故乡”之间隔了多少词,模型都能直接建立关联,不存在 RNN 那种”遗忘”问题。

多头注意力

实际上,Transformer 不止做一次注意力计算,而是同时做多个(比如 16 个),每个从不同角度关注句子:

  • 第 1 个头:关注语法关系(主谓宾)
  • 第 2 个头:关注语义相似性
  • 第 3 个头:关注指代关系(”它”指什么)
  • 第 4 个头:关注时间顺序关系
  • ……

最后把所有头的结果合并,得到全面的理解。

这个可以类比代码审查——一个人盯性能,一个人盯安全,一个人盯可读性,最后汇总意见比一个人全看更全面。

为什么 Transformer 能并行

注意力机制的关键特性:每个词与其他词的关系可以同时计算,互不依赖

一句 100 个词的句子,可以同时在 GPU 的 100 个计算单元上并行处理,而不是像 RNN 那样排队。这才有了后来 GPT-3、GPT-4 这种超大规模模型的可能。

四、大模型是怎么学会知识的

预训练:海量填空题

大模型的训练第一阶段叫预训练(Pre-training),过程极其简单粗暴:

收集海量文本(维基百科、书籍、代码、网页……),然后反复做一件事:

给模型看一段文字,遮住最后一个词,让模型预测它是什么。

1
2
3
4
5
6
7
8
9
输入:"Java 是一种面向对象的编程___"
正确答案:"语言"
模型预测:"语言"(正确)→ 小小奖励
模型预测:"工具"(错误)→ 调整参数

输入:"Spring Boot 的核心注解是___"
正确答案:"@SpringBootApplication"
模型预测:"@Component"(错误)→ 调整参数
...

就这么一道填空题,重复做了数万亿次,模型就学会了语言语法、世界常识、编程规则、各种专业知识。

听起来简单,但这就是大模型的核心训练逻辑。

参数怎么调整

每次预测完,模型会计算”预测错了多离谱”(损失值),然后用反向传播算法,从后往前微调每一个参数,让下次预测更准确。

数十亿参数,每个都微调一点点,重复万亿次,最终就是大模型。

训练 GPT-4 大约消耗了约 25,000 块 A100 GPU、约 90-100 天、约 1 亿美元成本。所以大家现在用 API 几毛钱一次,其实挺划算的。

微调:让模型变成”好助手”

预训练完的模型只会”续写文章”,不懂得回答问题,也不知道拒绝有害请求。还需要两步:

指令微调(SFT):用大量人工标注的”问题-答案”对来训练,让模型学会对话格式。

RLHF(人类反馈强化学习):让真人对多个回答打分,训练一个”奖励模型”,再用强化学习让大模型往高分方向走。

这两步把”会续写文章的模型”变成了”会聊天的助手”,ChatGPT 的成功很大程度上来自 RLHF 做得好。

五、大模型的能力边界

模型知识的特点

通过预训练,模型掌握了大量知识,但这些知识有局限:

  • 有截止日期:训练数据是某个时间点前的,之后发生的事一概不知
  • 有分布偏差:互联网上什么多,模型就对什么熟悉(英文 > 中文,热门话题 > 冷门领域)
  • 是隐式知识:知识藏在数十亿参数里,无法直接查询或修改

幻觉:为什么模型会”一本正经地胡说八道”

img

这是大模型最著名的问题。

根本原因:模型的目标是生成”看起来合理的下一个 Token”,而不是”保证事实正确”。

当模型不知道某件事时,它不会说”我不知道”,而是会根据训练数据的模式,生成一个”听起来像真的”答案:

1
2
3
4
5
用户:张三在2024年发表了哪些论文?
模型(如果不知道张三):
"张三在2024年发表了《深度学习在医学影像中的应用》
和《基于Transformer的跨模态学习研究》两篇论文..."
→ 完全是捏造的,但格式和语气都很真实

幻觉无法从根本上消除,因为这是这种生成方式的固有特性。工程上的应对手段:给模型提供真实数据(RAG)、要求模型引用来源、对关键信息进行二次验证。

模型没有持久化记忆

这是很多初学者的误解:以为把信息”告诉”模型,模型就会”记住”。

实际上,训练时学到的知识存在参数里,无法精确修改;API 调用时传入的信息只存在于上下文窗口,这次对话结束就消失了。模型没有持久化记忆,除非大家在外部存储并每次带入。


六、理解这些对开发有什么用

知道模型有知识截止日期 → 涉及最新信息的场景,必须用 RAG 把实时数据注入上下文。

知道模型没有持久化记忆 → 多轮对话系统必须自己管理历史消息,每次调用时把相关历史带上。

知道幻觉无法消除 → 关键业务场景(医疗、法律、财务)必须有人工审核或数据验证环节,不能完全信任模型输出。

知道 Prompt 影响概率分布 → System Prompt 写得好,相当于把模型的”注意力”引导到正确方向;写得差,模型就按训练数据里最常见的模式来补全,结果偏。