前面我的笔记完成了从宏观全景图到具体场景落地的完整思路。
也理解了大模型应用的大体开发流程,需要什么技术,哪些技术用于什么用途。
然而,如果想在大模型时代成为系统架构师,而不是工具使用者的话,仅仅停留在表面会用是不可以的。
如果,你面对生成内容偏离预期、响应速度缓慢、上下文理解混乱等情况,你选择反复调整提示词碰碰运气,还是说分析背后原因——是模型注意力机制没有捕获到关键信息?还是说位置编码导致长文本失效?还是说解码策略引入了不必要的随机性?
所以说啊,真正的掌控力,来自于对底层逻辑的理解。
我们不说复杂的数学推导,来用类比 来进行比喻类的说明。走进大模型的终究核心——神经网络架构:Transformer。它就是ChatGPT、Llama等主流大模型的技术基石。
1. RNN到Transformer
Transformer并不是一开始就出现的东西,在探究Transformer之前,我们还是要知道一些演变过程中的关键节点。
1.1 循环神经网络
业界在Transformer出现之前,主流的语言模型其实是RNN:也就是循环神经网络, 还有它的变体:LSTM(Long Short Term Memory:长短期记忆网络)和GRU(Gated Recurrent Unit:门控循环单元)。RNN的雏形可以追溯到1990年代了。
RNN的核心思维,是通过循环连接建模序列数据的时序依赖。
我们要搞懂几件事情:
1.1.1 RNN 出现的目的是什么?
因为在RNN出现以前,普通的神经网络有一个问题:
它更擅长处理”固定长度、彼此独立“的输入:
- 一张图片
- 一组固定维度的特征
但是语言、语音、时间序列并不是这样的。
比方说我说一句话:
我 今天 要去 公司 上班
这里每个词都和前面的词有关系。
你理解”上班”的时候,前面的“我” “今天” “要去公司” 都会影响到其含义。
所以就需要一种网络:
- 能够按照语序处理数据
- 能够“记住前面看到过的内容”
- 能够把前面的信息传递给后面
这就是RNN的出发点。
1.1.2 RNN的核心思想便是:有记忆的网络
你直接把RNN理解为一个边读边记笔记的人。
它并不是一次性把整句话都给读完,而是一个词一个词的去读的:
- 先读第一个词
- 更新一下“脑海里的状态”
- 再读第二个词
- 再更新一下状态
- 循坏。。。
这种“脑海中的状态“,我们可以称之为Hidden State(隐藏状态)
1.1.3 RNN的直观理解
假如说我的句子是:
我 喜欢 学习 AI
RNN的处理方式是:
- 输入: 我
输出一个隐藏状态 h1 - 输入: 喜欢 + 上一个记忆h1
输出一个隐藏状态h2 - 输入:学习 + h2
输出一个h3 - 输入:AI + h3
输出一个h4
也就是说! RNN每一步都依赖于:
- 当前输入 x_t
- 上一步记忆 h_{t-1}
然后算出:
- 当前输出
- 当前新的记忆 h_t
所以说,他才叫做循环神经网络,不是因为代码写了loop,而是”状态会循环传递“
1.1.4 可以理解成”滚动上下文“
RNN的本质就是
用一个不断更新的状态,去压缩之前看到过的所有的信息。
比如说你读到第四个词了,理论上h4就包含了:
- 第一个词的信息
- 第二个词的信息
- 第三个词的信息
- 当前第四个词的信息
所以说,RNN在当初很适合用来:
- 语言模型
- 机器翻译
- 文本分类
- 语音识别
- 时间序列预测
1.1.5 简单的RNN 类比示例
你可以把RNN想象成你在听别人讲话:
对方一句一句的说,你的大脑不会每次都从头去听,而是会保留前文的印象
比如说:
- ”小明今天没有来。。。因为。。。“
- 听到”因为“的时候,你还记得”小明今天没有来“
这就是RNN最想模拟的东西:
当前理解 = 当前输入 + 之前记住的内容
1.1.6 那为什么RNN还不够好?
RNN优势非常明显:
- 天然适合序列
它可以按照时间同步处理,很符合语言和时间序列的结构。 - 参数共享
每一步都用同一套参数,不用每个位置都单独训练一套 - 有”上下文记忆“
后面的计算会依赖于前面的状态
但是它还有几个问题:
这里也就是理解Transformer之前,最重要的一点!
越远的记忆越丢失
你看这句话:
我小时候住在上海,后来搬到北京,大学的时候去了成都,毕业之后在深圳找的工作,所以我最熟悉的城市并不是上海,反而是深圳
当模型读到”深圳“的时候,前面”我小时候住在上海“ 以及离得很远了。
理论上RNN可以记住前文。
但是实际上,离得越远的信息,越容易丢失。
这就叫做
长距离依赖问题
也就是说:
- 短距离关系还行
- 太远的关系就很难抓住了
为什么会丢掉?
可以先粗略地理解成“记忆被冲淡了”
因为上面说了,RNN是一步步传递状态的:
h1 -> h2 -> h3 -> ... -> ht
每一步都会对旧信息做一次变化。
变化的次数一多,前面的信息就会模糊起来有点像:
- 你把一句话转述给20个人
- 后来内容就变形了。
这就是LSTM和GRU出现的原因。
它们的目的就是让RNN改良,让“重要信息不要那么容易丢掉了”
训练的很慢,不能够很好的并行
RNN是按照顺序进行计算的:
- 先算第一个词
- 之后才能计算第二个词
- 再然后才可以计算第三个词
因为第二步是依赖于第一步的hidden state的
这也就意味着,它无法像transformer一样,在训练的时候将一整句话高效且并行地计算掉
造成的核心问题就是:
- 训练速度慢
- 长序列效率差
- GPU利用率不够理想
梯度消失/梯度爆炸
这个有点复杂,不过问题不大。我们只需要知道:
训练神经网络靠的是反向传播
而RNN序列很长的时候,梯度就需要跨很多步才能传回去。于是就会出现:
- 梯度消失: 前面的信息直接几乎就学不到了
- 梯度爆炸:数值特别大,训练很不稳定
综上所述,只需要记住一点:RNN在长序列训练上,数学上也不稳定
1.1.7 LSTM和GRU
简单来说就是可以理解成更高级一点的RNN
主要是因为RNN老忘东西,后来大伙做了改进版。
本质上依然是上面提到的h_t和x_t的循环。但是加上了更加复杂的门控机制
所谓的门我们现在深究,意义也不大。但是你可以这么理解:
- 什么该记住
- 什么该遗忘
- 什么该继续传下去
这样一来,就比普通的RNN更加擅长处理长距离依赖的问题。
神经网络训练的发展路线说白了就是:
普通RNN > LSTM/GRU -> Transformer
1.2 解编码架构
解码——编码 (Encodr-Decoder) 架构,如图所示:这是一种新的神经架构,包括了一个编码器(Encoder)和一个解码器(Decoder),用来将源语言解码为固定长度的向量表示(包含语义和上下文信息),并且从该向量表示解码成目标语言
是不是有点蒙了,没事,我整理了一份口诀:
源句子:我 / 喜欢 / AI
↓
Embedding
↓
Encoder RNN 逐个读取
↓
得到整句语义状态
↓
传给 Decoder RNN
↓
从 <START> 开始逐词生成
↓
I → like → AI → <EOS>然后我们再来看一份图:假如我们的任务是把中文翻译成英文。
源输入:我 / 喜欢 / 学习
↓
[嵌入层 Embedding]
↓
[编码器 Encoder]
先读“我” → 再读“喜欢” → 再读“学习”
↓
得到一句话的大概意思
“说话的人喜欢学习”
↓
[解码器 Decoder]
从 <开始> 出发,逐步生成英文
↓
第1步:I
第2步:like
第3步:studying
第4步:<结束>你可以理解成两个人合作:
- 编码器: 一个负责听中文、理解意思的人
- 解码器: 一个负责把这个意思用英文说出来的人
反正就是
编码器负责把源句子的意思提炼出来、解码器再根据这个意思一步步生成目标句子。
后来出现了一个叫做attention的东西。
因为大伙发现不行啊,要是一直循环神经网络,RNN最后都会压缩成一个最终状态,长句子信息容易丢失不说,压力也很大。于是改进了一下:
- 编码器不仅仅输出最后一个状态
- 而是把每个时间步的隐藏状态都给保留起来
- 然后在解码生成每一个词语的时候,都去”看一眼“输入序列的所有位置
- 决定当前应该重点关注什么地方
2017年,谷歌提出了Transformer架构,彻底就改变了这一局面。它的核心就是:抛弃循环架构,完全依赖于”注意力机制“(attention)来建模词与词之间的关系。不过要注意的是,Transformer本质上也是一种编码器—解码器架构。
然后Transformer的出现,就把这个attention进一步升级成了Self-Attention
不要只看解码器输入
序列里的每个位置,都可以直接和其他位置建立联系
比方说:
小明把书放在桌子上,因为它太重了
这里的”它“可能要去关注前面的“书”或者“桌子”
在self-attention里,“它”这个位置就可以直接去查看整句话中其他的位置。
再举一个很简单的例子:
我输入中文:
我 喜欢 苹果
输出英文:
I like apples
没有attention的话
编码器:把整句话压成一个”总体的意思“
解码器:全靠这个总意思往外生成
有一个问题:
- 丢细节
有Attention的话
解码器生成I的时候,主要看”我“
生成like的时候,主要看”喜欢”
生成apples的时候,主要看“苹果”
如此一来,翻译效果更准。
到了Self-Attention之后
输入端自己内部也会做更强的关联建模:
- 比方说“苹果”会结合前面的”喜欢“
- ”我“会结合后面的内容
- 每个词都不是孤立的理解
所以Transformer在这些attention(注意力机制)出现之后,架构就成为了这样的:

让我们用最简单的人话来讲解一下这张图:
假如我们的任务是:
把中文翻译成英文
我们输入句子:
我 喜欢 学习 AI
第一层:嵌入层
先把每个词语都变成向量。
比方说:- 我 -> 转为向量
- 喜欢 -> 转为向量
- 学习 -> 转为向量
- AI -> 转为向量
但是,这还不够,因为模型不知道顺序
加位置编码
把“第几个词”的这个信息也加进去
这样模型才知道:
“我” 在第一个位置
“喜欢”在第二个位置
“学习”在第三个位置不这么做的话,Transformer会把句子看成一堆无序的Token
进入编码器
主要做两个核心的事情多头自注意力
让句子里面每个词语都可以看到其他的词
比如说“学习”可以关注:- 谁在学习? “我”
- 喜欢什么? “学习 AI”
这样每个词语的表示就不是孤立无援的,而是带动上下文的。
前馈网络
对于每个位置的表示再做一次非线性的加工,增强表达能力
最后中间的位置加上:- 残差连接
- 层归一化
倒也不用了解这些是干嘛的,只需要知道,这些都是为了训练更加稳定。
最后编码器输出的就是:对整句话输入的上下文化表示
这不是一个词典式的向量,而是一组“已经理解过上下文”的表示。
进入解码器
解码器开始生成英文。
比方说从<START>开始:第一层:掩蔽多头自注意力
解码器先看“自己已经生成了什么”。
比如说现在已经生成了:- I
- like
那么,它在生成下一个词语的时候,只能看前面这两个,不能看未来的东西。
“掩蔽”的作用就是这个了
第二层:编码器-解码器注意力
然后解码器去看编码器输出的中文信息
比如说:- 现在要生成like
- 它现在就会重点关注中文里的“喜欢”
这一步就相当于:
一边看自己已经说了什么,一边回头看原文第三层:前馈网络
再进一步地进行加工与表示
最后再经过全连接层(里面其实还有线性层、softmax之类的),不过主要还是生成输出下一个词语的概率。然后选择一个高概率的词语进行输出。比如:- I:0.65
- He:0.12
- She:0.23
编码器的核心组件就是多头自注意力机制(Multi-Head Self-Attention)。
解码器的核心组件则是掩蔽多头自注意力和编码器-解码器注意力机制(Cross-Attention)
这其中,自注意力机制使得序列中每个位置的表示,都可以直接与其他位置建立联系,并根据相关性聚合信息,从而显著提升了序列内部的信息交互能力。
而多头注意力机制则更进一步:
它通过并行地使用多个注意力头,从不同子空间、不同角度去建模词与词之间的关系,因此能够捕获更加丰富、多样的依赖模式。
这种设计带来了几个重要优势:
- 并行化训练更强:相比 RNN 按时间步顺序计算,Transformer 可以对序列中的各个位置并行计算,训练效率大幅提升。
- 全局依赖建模能力更强:任意两个位置之间都可以直接建立联系,无论它们在序列中相距多远。
- 可扩展性更好:模型结构更适合堆叠和扩展,为大规模预训练模型的发展奠定了基础。
没有Transformer,就没有如今的AI大模型时代浪潮。
2. Transformer 架构的全景图
Transformer实际上整体采用的就是“编码器——解码器(Encoder-Decoder)”的结构:

用机器翻译为例,Encoder(编码器)负责理解输入句子(比如说Hello !world!),提取语义特征之后。Decoder负责根据编码结果,逐词生成目标语言(你好!世界!)
不过也有一些模型,比如ChatGPT这种,只用到了decoder部分,因为它不需要翻译或者编码输入,直接基于上下文预测下一个词语。
2.1 输入表示:词语是如何被“数字化”的?
模型是无法处理文字的,必须要把它处理成向量。这个过程实际上被分成了三部分:
Tokenization(分词)
首先,将句子切成基本单元(Token)。例如:“我喜欢学习AI.” -> 分词结果:
["我", "喜欢", "学习", "AI", "。"]每个Token会被映射到一个唯一的ID,比如 “AI” -> 1024
- 词嵌入(Word Embedding)
每个Token ID通过查表转换为一个高维向量,这个向量蕴含语义信息。例如,“国王“和”王后“的向量距离比较近。 位置编码(Positional Encoding)
由于Transformer没有顺序处理机制,不像RNN那样,天然有顺序机制。所以必须显示地告诉模型:这个词语在第几个位置。于是引入了位置编码——这是一种基于正弦函数的固定模式,加到词向量上面,让模型可以感知词序。举个例子:
你想象一下,你在听一个脱口秀,演员说了10句话。如果这些话被打乱播放,这个脱口秀的笑点就完全get不到了。位置编码就像是给每句话贴上时间戳,让模型知道”哪一句话先说,哪一句话后说。“
2.2 核心引擎:自注意力机制
上面提到的self-attention,是的,这里再细讲一下。
这玩意儿可以说是Transformer最革命性的设计,大模型理解上下文的关键所在。
2.2.1 自注意力机制到底是啥啊?
这是一种让每个词都根据上下文来动态调整它的自身表示(向量)的机制。对于每个词而言,会根据与上下文其他词的相关性来重新计算,从而得到新的向量表示。
这样可以帮助神经网络模型更好地捕捉到词和词之间的动态紧密关系,从而实现精确的预测输出。
简单来说,就是让句子里的每个词语去关注其他的词语,根据相关性来分配”注意力权重“
如:
”猫咪坐在垫子上,它挺舒服的“。 大模型处理”它“的时候,会自动计算”它“和”猫咪“ ”垫子“ ”舒服“ 等词语的相关性,最后发现”它“最有可能指代的就是”猫“,于是给”猫“分配了更高的注意力权重。
2.2.2 自注意力怎么工作的?(三步)
也就是老是被提及的 QKV框架。