LLM 架构的演进

---
title: "LLM 架构的演进"
author: "Amit Shekhar"
source_url: "https://outcomeschool.com/blog/evolution-of-llm-architecture"
published_at: "2026-09-21T00:00:00.000Z"
fetched_at: "2026-09-21T14:12:55Z"
updated_at: "2026-09-22T10:18:10Z"
language: "zh"
review_status: "draft"
---

# LLM 架构的演进

![](https://outcomeschool.com/static/images/blog/evolution-of-llm-architecture.png)

本文将介绍 LLM 架构的演进,逐步回顾大语言模型如何从一次只读一个词的简单设计,发展成我们今天使用的庞大 AI 模型。我们还会看到:早期模型为什么总会遗忘,注意力机制如何解决这个问题,Transformer 如何移除拖慢速度的部分,扩大模型规模为什么能让模型变得更聪明,混合专家模型如何降低大模型的运行成本,目前还存在哪些问题,以及接下来可能出现什么。

本文将涵盖以下内容:

- 什么是 LLM 架构?
- 第一阶段:一次读取一个词(RNN)
- 第二阶段:注意力机制
- 第三阶段:Transformer
- 第四阶段:规模扩展
- 第五阶段:混合专家模型(MoE)
- 第六阶段:新方向
- 演进历程总结

我是 **Amit Shekhar**,[Outcome School](https://outcomeschool.com) 创始人。我教过并指导过许多开发者,他们凭借自己的努力获得了高薪技术工作,帮助多家科技公司解决了各自的难题,还创建了许多被头部公司采用的开源库。我热衷于通过开源项目、博客和视频分享知识。

我在 Outcome School 教授 [AI 与机器学习](https://outcomeschool.com/program/ai-and-machine-learning)。

现在开始吧。

## 什么是 LLM 架构?

**LLM 架构是大语言模型的蓝图。它描述模型如何读取文本、如何记住读过的内容,以及如何生成下一个词。**

我们先拆开这个名称来看。

**LLM = Large(大)+ Language(语言)+ Model(模型)**

- **Language(语言)**:它处理的是文本,也就是我们每天读写的词语。
- **Model(模型)**:它是一种计算机程序,已经从海量文本中学会了规律。
- **Large(大)**:它从极其庞大的文本中学习,并拥有数量极其庞大的内部参数。

**架构**就是设计。假设我们要盖一栋房子,架构就是那份规划:房间放在哪里、门要开多大、水路怎样铺设。每栋房子用的都是砖块和水泥,但规划决定了房子最终好不好。

LLM 也是如此。不同模型所用的数字和数学原理大致相似,但架构决定了模型如何读取、记忆和回答。

LLM 架构的每一次重大进步,都是因为之前的设计存在问题。

- 最早的模型会忘记自己读过的内容。
- 后来,注意力机制解决了遗忘问题,但模型仍然很慢。
- 再后来,Transformer 让模型快了起来,但没人知道模型究竟该做多大。
- 随后,规模扩展让模型更聪明了,运行成本却变得太高。
- 接着,混合专家模型降低了成本。
- 而这段演进仍在继续。

所以,理解今天的 LLM,最好的办法就是沿着这条时间线走一遍,每次看一个问题,再看一个解决方案。

别担心,下面会逐一详细讲解。

## 第一阶段:一次读取一个词(RNN)

在 Transformer 出现之前,读取文本最流行的设计是 **[循环神经网络(Recurrent Neural Network,RNN)](https://outcomeschool.com/blog/recurrent-neural-network)**。

神经网络是一种计算机程序,由大量相互连接的数值组成,可以从示例中学习规律。给它展示大量示例,让它从中学习,这个过程叫作**训练**。这里不用担心内部细节。对于本文,我们只需要知道每种设计如何读取文本。

**注意:** 模型并不是按完整单词读取文本。它会先把文本切成称为 **[token](https://outcomeschool.com/blog/bpe-in-llms)** 的小片段。一个 token 可以是完整单词、单词的一部分或一个标点符号。为了便于理解,本文会统一说“词”;但每当我们说“词”时,模型实际处理的都是 token。

假设我们给 RNN 一个句子:“The cat sat on the mat.”(猫坐在垫子上。)

RNN 从左到右,一次读取一个词。每读完一个词,它就更新一份很小的记忆,然后继续读下一个词。这份记忆就像一张小纸条。读完“The”后,纸条上会记下一些关于“The”的内容;读完“cat”后,纸条会被改写,用来记住“The cat”;如此继续,直到句末。

最后,整个句子都被压缩进这一张小纸条里。

我们用一张图来理解:

```text
 Word:     The       cat       sat       on        the       mat
            |         |         |         |         |         |
            v         v         v         v         v         v
 Note:   [note] -> [note] -> [note] -> [note] -> [note] -> [note]
                                                              |
                                                              v
                                                   the whole sentence
                                                   lives in this one note
```

这里只有一张纸条。从一张纸条指向下一张纸条的箭头表示,每读完一个词,同一张纸条就会被改写。过去唯一能传递下去的东西就是这张纸条,没有其他内容。

处理短句时,这种方法还算有效。但问题来了。

**问题一:它会遗忘。**

假设文本很长,比如一整段话。模型读到末尾时,纸条已经被改写了太多次,开头的词几乎消失了。如果这一段以“Riya went to the market”(Riya 去了市场)开头,以“and then she bought”(然后她买了)结尾,模型就很难记住“she”指的是 Riya。

```text
 Riya  went  to  the  market  and  then  she  bought
  |                                       |
  |   the note is rewritten again and     |
  |   again between these two words       |
  v                                       v
 "Riya" is written into       by now "Riya" has mostly
 the note at the very start   faded out of the note
```

这里可以看到,“Riya”一开始被写进了纸条,但后面的每个词都会再覆盖一点纸条中的内容。等模型读到“she”时,“Riya”已经所剩无几。

**问题二:训练很慢。**

模型必须先读第一个词,才能读第二个词;先读第二个词,才能读第三个词。也就是说,它不能同时读取所有词。所以,即使计算机性能很强,可以并行处理数千项任务,RNN 仍然只能一步一步地使用它。

LSTM 和 GRU 是 RNN 的改进版本,大幅缓解了遗忘,却没有彻底消除它;一次只读一个词的缓慢方式也依然存在。

这种方法的问题就是容易遗忘、训练缓慢。下面看看下一种方法如何解决这些问题。

## 第二阶段:注意力机制

这时,**注意力机制(Attention)** 登场了。

**注意力机制让模型在处理当前词时,可以回看输入中的每一个词,并决定该在每个词上投入多少注意力。**

简单来说,我们不再只保留一张小纸条,而是把整页内容都摊开放在面前。需要理解某个词时,就去查看此前哪些词与它有关。

我们用图来看看两者的区别:

```text
 RNN:

   Riya -> went -> to -> the -> market -> and -> then -> she
   (one small note passed along the chain, rewritten at each step)

 Attention:

   Riya   went   to   the   market   and   then   she
    ^      ^      ^    ^      ^       ^      ^     |
    |      |      |    |      |       |      |     |
    +------+------+----+------+-------+------+-----+
             "she" looks directly at every earlier word
```

在 RNN 中,“she”只能看到沿着链条传到它这里的那张纸条。而在注意力机制中,“she”可以直接连接此前的每一个词,沿途不会丢失任何内容。

**注意力机制 = 查看每个词 + 判断每个词的重要程度 + 按重要程度把它们混合起来**

还是用刚才的例子:“Riya went to the market and then she bought mangoes.”(Riya 去了市场,然后她买了芒果。)

模型处理“she”时,注意力机制让它查看前面的所有词,并询问:哪些词有助于理解“she”?答案是“Riya”。因此,模型会给“Riya”很高的注意力,而给“to”和“the”等词较低的注意力。

### 注意力机制如何决定关注哪里

通过示例最容易理解。

假设模型正在处理“she”。为了便于理解,我们只看前面的 4 个词。注意力机制会给每个词一个分数,表示它有多重要,再把这些分数转换成总和为 1 的权重。

- Riya:0.70
- went:0.10
- market:0.15
- then:0.05

可以看到,“Riya”获得了 70% 的注意力。接下来,模型对“she”的理解将主要来自“Riya”,少部分来自“market”,其他词只占很小一部分。

看看模型如何根据这些权重构建对“she”的理解:

```text
   0.70 x Riya    ----+
   0.10 x went    ----+
   0.15 x market  ----+----> understanding of "she"
   0.05 x then    ----+
   ----
   1.00  (the weights add up to 1)
```

这里,前面的每个词都乘以自己的权重,然后再全部加在一起。因为“Riya”的权重最大,结果也就主要来自“Riya”。

注意力机制就是这么回事:**将其他词加权混合,而权重表示每个词有多重要。**

这个简单的思想,正是每个现代 LLM 的核心。

### 查询、键和值

在注意力机制内部,每个词都扮演三种角色。我们用图书馆来打个比方。

- **查询(Query,Q)**:我们正在提出的问题。处理到“she”时,查询就是“这个人是谁?”
- **键(Key,K)**:每本书上的标签。前面的每个词都带有一个说明自身内容的标签。“Riya”这个词带有类似“人名”的标签。
- **值(Value,V)**:书里的内容,也就是这个词实际携带的信息。

模型将查询与每个键进行比较。匹配程度高的键会得到高分。接着,模型根据这些分数对值进行加权收集,得到我们上面看到的加权混合结果。

整个流程如下:

```text
 Query from "she": who is this person?
          |
          v
 Compare the query with every key:
   Key of "Riya"   : a person's name  -> strong match
   Key of "went"   : an action        -> weak match
   Key of "market" : a place          -> weak match
          |
          v
 Collect the values, weighted by the match
          |
          v
 Understanding of "she", built mostly from the value of "Riya"
```

这里,查询就是问题,键决定哪些词能很好地回答它,值则是我们最终收集的信息。键只用于匹配,实际内容来自值。

我们另有一篇详细介绍 [Q、K、V 背后数学原理](https://outcomeschool.com/blog/math-behind-attention-qkv)的文章,通过真实数字逐步解释了这个过程。

### 自注意力

当一个句子中的词关注同一句子里的其他词时,我们称之为 **[自注意力(Self-Attention)](https://outcomeschool.com/blog/self-attention-in-transformers)**。也就是这个句子在观察自身。LLM 内部采用的正是这种注意力机制。

### 多头注意力

一次注意力只能关注一种关系,但一个句子中存在许多关系。“she”和“Riya”在语义上相关,“bought”和“mangoes”在语法上相关,诸如此类。

因此,我们不只运行一次注意力,而是并排运行多次注意力。每一次称为一个**头(head)**。一个头学习追踪名字,另一个学习追踪语法,还有一个学习追踪位置,等等。最后,我们把所有头发现的内容合并起来。

这就叫作 **[多头注意力(Multi-Head Attention)](https://outcomeschool.com/blog/multi-head-attention-in-transformers)**。它就像一支阅读团队,每位读者都在同一个句子中寻找不同的东西。

```text
                   The sentence
                        |
         +--------------+--------------+
         |              |              |
         v              v              v
    +----------+   +----------+   +----------+
    |  Head 1  |   |  Head 2  |   |  Head 3  |
    |  tracks  |   |  tracks  |   |  tracks  |
    |  names   |   |  grammar |   | position |
    +----------+   +----------+   +----------+
         |              |              |
         +--------------+--------------+
                        |
                        v
               Combine all the heads
```

这里,所有头同时读取同一个句子,但每个头寻找的是不同类型的关系。最后,我们把它们各自找到的内容合并成一个结果。

注意力机制解决了遗忘问题,因为输入中的词不再会被挤出记忆。每个词都可以被直接查看。

不过最初,注意力机制只是叠加在 RNN 之上。RNN 仍然一次读取一个词,注意力机制只是帮助模型回看 RNN 已经读过的内容。因此,一次只读一个词的缓慢方式依然存在。

这种方法的问题在于,模型仍然一次只读一个词,速度很慢。下面看看下一种方法如何解决这个问题。

如果想深入学习注意力机制、Q、K、V 矩阵、自注意力和多头注意力,可以查看 Outcome School 的 [AI 与机器学习课程](https://outcomeschool.com/program/ai-and-machine-learning)。

## 第三阶段:Transformer

2017 年,一篇题为《Attention Is All You Need》的论文提出了一个大胆的问题:既然真正发挥作用的是注意力机制,为什么还要保留 RNN?

于是,研究人员彻底移除了 RNN,只用注意力机制和几个简单的数学组件构建模型。这个模型就叫作 **[Transformer](https://outcomeschool.com/blog/decoding-transformer-architecture)**。

**Transformer 是一种同时读取输入中所有词,并利用注意力机制理解它们之间关系的模型。**

### Transformer 内部有什么

Transformer 由许多层层堆叠的 block 组成。每个 block 有两个主要部分:

- **多头注意力**:词与词彼此查看并收集信息,这是“看”的步骤。
- **[前馈网络(Feed-Forward Network)](https://outcomeschool.com/blog/feed-forward-networks-in-llms)**:每个词单独经过的一层简单数学运算,用来处理刚才收集到的信息,这是“想”的步骤。

我们会堆叠许多个这样的 block。前面的 block 学习语法等简单规律,更深的 block 学习语义和推理等更复杂的规律。小模型大约有 12 个 block,大模型则有 100 个甚至更多。

这些 block 的堆叠方式如下:

```text
             Input words
                  |
                  v
   +-----------------------------+
   |  Block 1                    |
   |   Multi-Head Attention      |  <- looking step
   |   Feed-Forward Network      |  <- thinking step
   +-----------------------------+
                  |
                  v
   +-----------------------------+
   |  Block 2                    |
   |   Multi-Head Attention      |
   |   Feed-Forward Network      |
   +-----------------------------+
                  |
                  v
                . . .
                  |
                  v
   +-----------------------------+
   |  Block N                    |
   |   Multi-Head Attention      |
   |   Feed-Forward Network      |
   +-----------------------------+
                  |
                  v
        Predict the next word
```

词从顶部进入,依次通过每个 block,最后一个 block 预测下一个词。每个 block 都执行同样的两个步骤:先看,再想。

### 词序问题

这里有一个有意思的问题。Transformer 会同时读取所有词,因此它天然不知道哪个词先出现。“Dog bites man”(狗咬人)和“Man bites dog”(人咬狗)在它看来没有区别。

于是,**位置编码(Positional Encoding)** 派上了用场。在词进入模型之前,我们给每个词添加一个小信号,注明它的位置:第一个词、第二个词、第三个词,依此类推。这样模型就知道顺序了。

最初的 Transformer 使用固定信号。现代 LLM 会用更新的方法完成同一件事,例如 LLaMA 等许多模型采用的 **[旋转位置嵌入(Rotary Position Embedding,RoPE)](https://outcomeschool.com/blog/math-behind-rope-rotary-position-embedding)**。方法发生了变化,思想没有变:告诉模型每个词位于哪里。

### 编码器、解码器和纯解码器架构

最初的 Transformer 分成两部分。

- **编码器(Encoder)**:读取并理解输入。
- **解码器(Decoder)**:参考编码器理解到的内容和自己已经写出的内容,一次一个词地生成输出。

这种架构是为翻译而设计的:读取英语,写出法语。

后来,研究人员发现,生成文本只需要解码器这一半。给它一些词,它会预测下一个词;再把这个词加入输入,继续预测下一个。这就是 **[纯解码器 Transformer(Decoder-only Transformer)](https://outcomeschool.com/blog/encoder-vs-decoder-in-transformers)**,GPT 和今天几乎所有聊天模型采用的都是这种设计。

```text
 Encoder-Decoder (built for translation):

   "The cat sat"  --->  [ Encoder ]  --->  [ Decoder ]  --->  "Le chat s'est assis"

 Decoder-only (used by chat models):

   "The capital of India is"      --->  [ Decoder ]  --->  "New"
   "The capital of India is New"  --->  [ Decoder ]  --->  "Delhi"
```

这里,纯解码器模型只有一条信息流。它生成的词会被加回输入,然后再次预测。这个循环不断继续,直到回答完成。

这个循环称为自回归生成。我们另有一篇详细介绍[自回归模型](https://outcomeschool.com/blog/autoregressive-models)的文章,解释其工作原理。

### Transformer 为什么胜出

Transformer 会并行处理所有词。这与 [GPU](https://outcomeschool.com/blog/how-does-a-gpu-work-for-deep-learning) 完美契合,因为 GPU 这种芯片本来就是为了同时完成数千次小型计算而设计的。用 RNN 需要数周的训练,换成 Transformer 后只需数天。

```text
 RNN (one word per step):

   Step 1    Step 2    Step 3    Step 4    Step 5    Step 6
    The   ->  cat   ->  sat   ->  on    ->  the   ->  mat

 Transformer (all words in one step):

   Step 1
    The     cat     sat     on      the     mat
     |       |       |       |       |       |
     +-------+-------+-------+-------+-------+
                  all processed together
```

RNN 处理 6 个词需要 6 个步骤,而且每一步都必须等待上一步完成。Transformer 一步就能处理全部 6 个词,所以所有 GPU 核心都能同时保持忙碌。

我们另有一篇详细介绍 [RNN 与 Transformer 区别](https://outcomeschool.com/blog/how-do-rnns-and-transformers-differ)的文章,从头到尾讲解了这项对比。

**注意:** 这种并行读取适用于输入处理和训练。生成回答时,模型仍像上面的纯解码器循环一样,一次输出一个词。读取可以并行,写出仍要逐词进行。请记住这一点,后面讲到 KV Cache 时还会用到。

这种速度打开了通往下一阶段的大门。既然训练这么快,为什么不用更多数据训练一个更大的模型?

以上就是 Transformer。它解决了训练缓慢的问题。接下来的重大问题是:模型究竟应该做多大?

如果想深入学习 Transformer 架构、位置编码和编码器—解码器架构,并从零构建大语言模型(LLM),可以查看 Outcome School 的 [AI 与机器学习课程](https://outcomeschool.com/program/ai-and-machine-learning)。

## 第四阶段:规模扩展

**规模扩展(Scaling)是指从三个方面增大模型:更多参数、更多训练数据和更多算力。**

下面逐一理解。

- **参数(Parameters)**:模型的内部设置。可以把模型想成一块有数十亿个小旋钮的巨大面板。训练过程会稍微转动每个旋钮,让预测变得更准确。旋钮的数量就是参数量。
- **数据(Data)**:模型用于学习的文本,包括书籍、网站、文章、代码等等。
- **算力(Compute)**:训练期间完成的计算总量。算力更多,意味着用更多 GPU 运行更长时间。

### 出人意料的发现

大约在 2020 年,研究人员发现了一件出人意料的事:同时增加参数、数据和算力时,模型会以平稳而可预测的方式变得更好,没有突然出现无法突破的高墙。模型越大,效果就持续越好。

这就是所谓的**规模定律(Scaling Laws)**。它给出了一个公式:投入多少算力,模型大致就能达到怎样的质量。

因此,模型规模迅速增长。

- GPT-2 约有 15 亿个参数。
- 仅仅一年后,GPT-3 就拥有约 1750 亿个参数,规模扩大了 100 多倍。

GPT-3 还能完成 GPT-2 做不到的事情。它可以写文章、回答问题,甚至编写代码,而且并没有针对这些具体任务接受专门训练。这些只在规模增大后才出现的新能力,被称为**涌现能力(emergent abilities)**。

**注意:** 一些研究人员认为,这些能力并不是突然出现的。它们会随着规模平稳增长,只是我们的测量方式让它们看起来像突然出现。这个术语仍被广泛使用,因此值得了解。

### 平衡数据与模型规模

随后出现了一次修正。2022 年,一篇名为 Chinchilla 的研究论文发现,许多大模型训练得并不充分:参数太多,数据却太少。

结论很简单:**要获得最佳效果,数据量必须随参数量一起增长。** 使用更多数据训练的小模型,可以胜过使用较少数据训练的大模型。因此,LLaMA 等后来的模型会用数万亿个 token 训练。

**给你的一点简短建议**

无论身处哪个技术领域,都应该熟悉以下主题:

- LLM
- RAG
- MCP
- Agent
- 微调(Fine-tuning)
- 量化(Quantization)

我们把这些内容汇总在一个视频里:

[AI 工程详解:LLM、RAG、MCP、Agent、微调与量化](https://www.youtube.com/watch?v=lnfWvX66FUk)

不必停下来观看——先加入书签,有空时再看。未来的你会感谢现在的自己。

现在回到正题。

### 成本问题

规模扩展奏效了,但也带来了一个新问题。

在普通 Transformer 中,每处理一个词,所有参数都会参与计算。如果一个模型有 1750 亿个参数,而我们向它提出一个包含 100 个词的问题,那么处理这 100 个词中的每一个时,全部 1750 亿个参数都会工作。这种模型称为**稠密模型(dense model)**,因为所有部分始终处于激活状态。

```text
 Dense model:

   word 1    --->  all 175 billion parameters work  --->  output
   word 2    --->  all 175 billion parameters work  --->  output
   word 3    --->  all 175 billion parameters work  --->  output
    ...
   word 100  --->  all 175 billion parameters work  --->  output
```

无论这个词是简单的“the”,还是复杂的技术术语,整个模型都会处理它。对于简单的词,也没有办法少做一点计算。

所以,模型规模翻倍,每次回答的成本也会翻倍。训练变得非常昂贵,为数百万用户运行模型则更加昂贵。

这种方法的问题是,规模每增加一倍,运行成本也会同样增加。下面看看下一种方法如何解决这个问题。

## 第五阶段:混合专家模型(MoE)

这时,**[混合专家模型(Mixture of Experts,MoE)](https://outcomeschool.com/blog/mixture-of-experts)** 前来解围。

**混合专家模型是一种把模型拆分成许多称为“专家”的较小部分,并且每处理一个词只使用少数几个专家的架构。**

我们把它拆开来看。

**混合专家模型 = 许多专家 + 一个从中挑选少数专家的路由器**

假设我们走进一家大型医院。医院里有心脏、骨科、皮肤和眼科专家。我们进门后,接待人员会听取我们的问题,再把我们送到一两位相关医生那里。不会让四位医生检查每一名患者。

- 医生就是**专家(experts)**。
- 接待人员就是**路由器(router)**,也叫门控(gate)。
- 每名患者只被送到少数几位医生那里,这叫作**稀疏激活(sparse activation)**。

### MoE 在 Transformer 内部如何工作

还记得每个 Transformer block 内部的前馈网络吗?它就是注意力之后的“思考”步骤。在 MoE 模型中,这一个前馈网络会被许多个前馈网络取代,它们就是专家。专家前面还有一个小型路由器。

对于每个词:

- 路由器查看这个词,并给每个专家打分。
- 它挑选得分最高的少数专家,通常是前 1 个或前 2 个。
- 只有这些专家会处理这个词。
- 它们的输出会被合并,然后向后传递。

注意力部分保持不变,只有“思考”步骤变成了一支专家团队。

我们用图来理解:

```text
             Word comes in
                    |
                    v
 +--------------------------------------+
 |         Multi-Head Attention         |   same as before
 +--------------------------------------+
                    |
                    v
 +--------------------------------------+
 |                Router                |   gives a score to each expert
 +--------------------------------------+
   |    |    |    |    |    |    |    |
  0.4  0.1  0.3  0.0  0.1  0.0  0.1  0.0     scores
   |         |
   v         v
 [E1] [E2] [E3] [E4] [E5] [E6] [E7] [E8]     8 experts
  on   off  on   off  off  off  off  off     only the top 2 work
   |         |
   +----+----+
        |
        v
 Combine the two outputs and pass forward
```

这里,路由器给专家 1 和专家 3 的分数最高,所以处理这个词时,只有这两个专家工作,另外六个保持空闲。处理下一个词时,路由器可以选择另一对专家。

### 总参数量与激活参数量

这是核心思想,我们用数字来理解。

假设一开始有一个约 70 亿参数的模型,我们在每个 block 中把原本单一的前馈网络(“思考”步骤)替换成 8 个专家前馈网络。这就是 Mixtral 8x7B 的基本设计。这个名称表示:8 个专家建立在 70 亿参数基础模型的架构上。模型并不会因此变成 8 × 7 = 560 亿参数,因为注意力部分和其他共享组件并没有被复制,只有前馈网络被复制了 8 份。加上共享部分,整个模型总计约有 470 亿个参数。

**注意:** 为了便于理解,这里的数字经过了取整。

处理每个词时,路由器只会从 8 个专家中选 2 个。因此,每处理一个词,实际参与运算的约有 130 亿个参数。

- **总参数量**:约 470 亿。这是模型拥有的知识量。
- **激活参数量**:约 130 亿。这是处理每个词时完成的工作量。

```text
 Total parameters (what the model knows):

   [ shared parts ] [E1] [E2] [E3] [E4] [E5] [E6] [E7] [E8]   = about 47 billion

 Active parameters (what works for one word):

   [ shared parts ] [E1]      [E3]                            = about 13 billion
```

8 个专家全都存在于模型内部,但处理任意一个词时,只有 2 个专家会与共享部分一起启动。

也就是说,模型拥有 470 亿参数模型的知识,运行成本却接近 130 亿参数模型。两者并不完全相等,因为路由器和共享部分也会完成一些工作,但这仍比运行全部 470 亿参数便宜得多。这正是 MoE 的精妙之处。

这样一来,我们便可以用 MoE 解决成本问题,同时不必牺牲知识容量。

DeepSeek-V3 等更大的模型把这个思路推进得更远。它的总参数量约为 6710 亿,但处理每个词时只会激活约 370 亿个参数。

### 每个专家会学到什么

还有一点值得注意:我们并不会告诉专家应该专攻什么。训练过程中,路由器与专家一起学习。最终,有些专家负责标点,有些负责数字,有些负责部分代码,还有一些负责特定类型的词。这种分工并不总是泾渭分明,却会自行形成。

### MoE 的问题

MoE 并非没有代价,它也有自己的问题。

- **内存**:虽然每个词只由 2 个专家处理,但 8 个专家都必须加载进内存,因为下一个词可能会被送到另一对专家那里。因此,MoE 节省的是计算量,而不是内存。
- **负载均衡**:如果路由器总把所有内容送给同两个专家,其他专家就永远学不到东西。因此,训练时需要增加一条额外的小规则,推动路由器分散工作量。没有它,MoE 就会失败。
- **训练复杂度**:路由决策会降低训练的稳定性,也更难把训练做对。

尽管如此,正是因为有了 MoE,我们才能让拥有数千亿参数的模型在合理时间内给出回答。如今,大多数规模最大的模型都会以某种形式采用 MoE。

以上就是混合专家模型。它解决了“思考”步骤的成本问题,但注意力步骤本身也有成本,这就把我们带到了当前正在发生的变化。

Outcome School 有一套完整课程,涵盖混合专家模型(MoE)、优化与规模扩展技术以及 LLM 内部原理,可以查看我们的 [AI 与机器学习课程](https://outcomeschool.com/program/ai-and-machine-learning)。

## 第六阶段:新方向

研究人员如今正在同时探索几个方向。下面看看其中重要的方向。

### 长上下文问题

我们一次提供给模型的文本称为**上下文(context)**。今天,我们想把整本书、长对话和大型代码库交给模型,这就产生了一个问题。

注意力机制会把每个词与其他每个词进行比较。如果输入有 1000 个词,就要进行 1000 × 1000 = 100 万次比较;如果输入有 10 万个词,就要进行 100 亿次比较。输入长度翻倍,比较成本就会变成四倍。

```text
 4 words  ->  4 x 4 = 16 comparisons

          The   cat   sat   on
   The     x     x     x     x
   cat     x     x     x     x
   sat     x     x     x     x
   on      x     x     x     x

 8 words  ->  8 x 8 = 64 comparisons   (2 times the words, 4 times the cost)
```

这里,每一行代表一个词查看每一列。增加一个词,就会增加完整的一行和一列,所以网格的增长速度远快于输入。

此外,模型生成回答时,会存储此前每个词的键和值,以免重新计算。这种存储称为 **[KV Cache](https://outcomeschool.com/blog/kv-cache-in-llms)**。面对长输入,KV Cache 会变得极其庞大,占用大量内存。

为了解决这个问题,人们提出了几种设计:

- **[分组查询注意力(Grouped Query Attention,GQA)](https://outcomeschool.com/blog/grouped-query-attention)**:多个注意力头共享同一组键和值,而不是每个头都拥有自己的键和值。这样可以大幅缩小 KV Cache,质量损失却很小。LLaMA 3 等许多模型都采用了这种方法。
- **[多头潜在注意力(Multi-Head Latent Attention,MLA)](https://outcomeschool.com/blog/kv-cache-compression)**:先把键和值压缩成较小的形式再存储,需要时再展开。DeepSeek 模型采用了这种方法。
- **[滑动窗口注意力(Sliding Window Attention)](https://outcomeschool.com/blog/how-does-sliding-window-attention-work)**:每个词只查看固定窗口内的邻近词,而不是查看所有词。信息仍然可以通过多个 block 的传递抵达远处。Mistral 采用了这种方法。

下面分别用图来看。先看 GQA:

```text
 Multi-Head Attention:                Grouped Query Attention:

   Head 1 -> own Key + Value            Head 1 --+
   Head 2 -> own Key + Value            Head 2 --+--> shared Key + Value (group A)
   Head 3 -> own Key + Value            Head 3 --+
   Head 4 -> own Key + Value            Head 4 --+

   Head 5 -> own Key + Value            Head 5 --+
   Head 6 -> own Key + Value            Head 6 --+--> shared Key + Value (group B)
   Head 7 -> own Key + Value            Head 7 --+
   Head 8 -> own Key + Value            Head 8 --+

   8 sets stored in the KV Cache        2 sets stored in the KV Cache
```

这里,注意力头会被分组,同一组里的所有头共享一套键和值。8 个头分成 2 组后,KV Cache 会缩小到原来的四分之一。每个头仍会提出自己的查询,因此质量几乎不变。

接下来看 MLA:

```text
 Normal attention:

   Key + Value (big)  ------------------------------->  stored in KV Cache (big)

 Multi-Head Latent Attention:

   Key + Value (big)  --> compress -->  small form  -->  stored in KV Cache (small)
                                             |
                                             v
                          expand back to full size only when needed
```

MLA 不会存储庞大的键和值,而是存储一份较小的压缩形式。模型需要时,再把压缩形式展开。因此,KV Cache 存储的内容少得多,模型回看时仍能获得完整信息。

最后来看滑动窗口注意力:

```text
 Full attention:

   w1   w2   w3   w4   w5   w6   w7   w8
    ^    ^    ^    ^    ^    ^    ^    |
    +----+----+----+----+----+----+----+
          w8 looks at all 7 earlier words

 Sliding Window Attention (window = 3):

   w1   w2   w3   w4   w5   w6   w7   w8
                        ^    ^    ^    |
                        +----+----+----+
          w8 looks only at the 3 nearest words

 How information still travels far:

   Block 1:  w5 gathers from w2, w3, w4
   Block 2:  w8 gathers from w5, w6, w7, and w5 already carries w2, w3, w4
```

在 Block 1 中,w5 已经从 w2、w3 和 w4 收集了信息。在 Block 2 中,w8 查看 w5 时,也会间接获得这些信息。因此,即使窗口很小,远处的信息仍能逐个 block 传递过来。

凭借这些方法,模型一次能读取的内容从大约 2000 个 token 增长到了 100 万个 token。

### 一种新的记忆:状态空间模型

一些研究人员重新采用了一次读取一个词的思路,但配上了聪明得多的记忆。这类模型称为**状态空间模型(State Space Models)**,其中较为流行的是 **Mamba**。

简单来说,Mamba 像 RNN 一样维护持续更新的记忆,因此其成本会随输入长度线性增长,而不是平方增长。但与旧式 RNN 不同,Mamba 会查看每个新到来的词,决定哪些内容应该保留在记忆中,哪些应该丢弃。因此,远处的重要信息会比在旧式 RNN 中保留得更好。

下面粗略展示成本的增长方式。数字仅用于比较,并非真实测量结果:

```text
 Input length:      1,000     2,000     4,000     8,000  words

 Attention cost:    1 unit    4 units   16 units  64 units   (squares)
 Mamba cost:        1 unit    2 units   4 units   8 units    (straight line)
```

每当输入长度翻倍,注意力机制的成本都会变成四倍,而 Mamba 的成本只会变成两倍。面对很长的输入,这种差距会变得非常大。

如今,我们也能看到 **混合架构(hybrid)** 模型:把少量注意力 block 与大量 Mamba block 结合起来,力求同时获得注意力机制的准确性与 Mamba 的速度。

### 用同一个模型处理文本、图像和音频

早期 LLM 只能读取文本。现在,同一种 Transformer 设计也被用于图像、音频和视频。图像会被[切分成许多小块](https://outcomeschool.com/blog/decoding-vision-transformer-vit),每个图像块都像单词一样变成一个 token,再由同一种注意力机制处理。音频和视频的处理方式与之类似。这类模型称为 **[多模态](https://outcomeschool.com/blog/multimodal-ai)** 模型。

### 不扩大模型,而是延长思考时间

多年以来,获得更聪明模型的方法就是把模型做得更大。现在有了第二种方法:让模型在回答之前思考得更久。

[推理模型](https://outcomeschool.com/blog/large-reasoning-models)在给出最终答案之前,会生成一条很长的思考步骤链。在这些步骤中,它们常常会尝试不同路径,并检查自己的工作。这叫作在 **推理时(inference time)** 进行规模扩展。“推理”指的就是模型回答问题的阶段。也就是说,我们不只在训练时投入更多算力,也在回答时投入更多算力。

因此,规模扩展如今有了两个方向:扩展训练规模,以及扩展思考规模。

## 演进历程总结

下面用一张图展示完整历程:

```text
 RNN  --->  Attention  --->  Transformer  --->  Scaling  --->  MoE  --->  New Directions

 forgets    fixes            removes the        makes the      cuts the   long context,
 and slow   forgetting       slow RNN           model smart    cost       Mamba, reasoning
```

这里,每个箭头都代表一个问题得到了解决。每个阶段都会保留上一阶段行之有效的部分,并修复其中最严重的问题。

为了便于理解,我们把完整历程列成表格。

| 阶段 | 核心思想 | 解决的问题 | 遗留的问题 |
| --- | --- | --- | --- |
| RNN | 用一份记忆,一次读取一个词 | 可以读取任意长度的文本 | 忘记开头的词,训练缓慢 |
| 注意力机制 | 通过权重查看前面的每个词 | 遗忘 | 底层仍使用 RNN,所以依然缓慢 |
| Transformer | 只用注意力机制,并行处理所有词 | 训练缓慢 | 模型应该做多大 |
| 规模扩展 | 增加参数、数据和算力 | 模型质量 | 成本随规模增长 |
| 混合专家模型 | 每个词只使用少数专家 | 大模型的运行成本 | 内存、负载均衡 |
| 新方向 | GQA、MLA、Mamba、多模态、推理 | 长上下文、新输入类型、更聪明的回答 | 仍在演进 |

这里的规律很清楚:每个阶段都保留上一阶段的优点,同时修复其中最严重的问题。

- 注意力机制保留了读取文本的思路,并解决了遗忘问题。
- Transformer 保留了注意力机制,并移除了拖慢速度的部分。
- 规模扩展保留了 Transformer,并把它做得更大。
- MoE 保留了模型规模,同时降低成本。
- 更新的思路保留了这一切,并继续向前推进,为我们带来更长的上下文、新的输入类型和更聪明的回答。

至此,我们应该已经理解了 LLM 架构从注意力机制到规模扩展,再到混合专家模型及后续方向的演进。下次听说一个新模型时,我们可以问一个简单的问题:它试图解决这条时间线上的哪个问题?

为 AI 工程面试做好准备:[AI 工程面试题](https://github.com/amitshekhariitbhu/ai-engineering-interview-questions)

这次就到这里。

谢谢。

**Amit Shekhar**, [Outcome School](https://outcomeschool.com) 创始人