【收藏必看】大模型核心原理解析:从注意力机制到FlashAttention
这篇文章详细解析了大模型的核心技术原理,从注意力机制(QKV、自注意力、多头注意力)到Transformer的层结构(前馈神经网络、残差连接、层归一化),再到FlashAttention优化技术。通过生动比喻解释了这些技术如何解决AI的长距离依赖和并行计算问题,以及如何通过分块计算和Online Softmax技术优化计算效率,使大模型能处理更长文本。
01 注意力机制
- 直觉层面:人类是如何“注意”的?
想象在读一句话:“那只苹果掉在了地上,因为它熟透了。”
当读到“它”这个字时,你的大脑会瞬间自动回顾前面的词。为了理解“它”指代什么,你会重点关注“苹果”,而忽略“地上”或“那只”。
这就是注意力:
- 在没有注意力机制之前(如早期的 RNN):模型处理长句子时像个记性不好的人,读到后面就忘了前面。
- 有了注意力机制:模型可以随时“回头看”,并且知道看哪里、看多重。它能计算出“它”和“苹果”的关系最紧密(权重最高)。
- 核心原理:查询(Q)、键(K)与值(V)
这是理解注意力机制最关键的技术概念。Transformer 架构(大模型的基础)将输入的数据拆解为三个向量:
- Query (Q) - 查询:我想找什么?
- Key (K) - 键:特征的标签是什么?
- Value (V) - 值:实际包含的内容是什么?
举例说明:“想象去图书馆查资料,注意力机制的计算过程就像这样”:
2.1 提出 Query (Q):你拿着一张写着“量子力学”的纸条(Q)。
2.2 匹配 Key (K):你走过书架,把纸条(Q)和每本书脊上的分类标签(K)进行比对。
2.3 计算相关性(注意力分数):
- 标签是“物理学”的书,匹配度很高(分数高)
- 标签是“烹饪”的书,匹配度几乎为零(分数低)
2.4 加权提取 Value (V):你不会把所有书都借走,你只会把那些匹配度高(Key 和 Query 相似)的书的内容(Value)取出来,融合在一起。
在模型中:当模型处理一个词时,它会拿这个词的 Q,去和句子里所有其他词的 K 进行“点积”运算(计算相似度),算出权重后,再把这些词的 V 加权求和。
- 自注意力机制 (Self-Attention)
大模型中最常用的叫“自注意力”。意思是:自己查自己。
输入一句话:“I love AI”。在处理单词 “AI” 时:
- “AI” 发出 Query。
- 它去和 “I”, “love”, “AI” 这三个词的 Key 分别比对。
- 它发现 “love” 和 “AI” 的关联很强(动宾关系),于是分配更多的注意力权重给 “love”。
- 最终,“AI” 这个词的表示向量里,就融入了 “love” 的信息。
结果:经过这一层处理,单词不再是孤立的符号,而是包含了上下文信息的丰富向量。
- 多头注意力 (Multi-Head Attention)
如果只有一组注意力,可能只能捕捉到一种关系(比如语法关系)。但语言是复杂的。
“多头”就像是请了多个专家同时读这句话:
- 专家 A(头 1):关注语法结构(主谓宾)。
- 专家 B(头 2):关注指代关系(“它”是谁)。
- 专家 C(头 3):关注情感色彩(是褒义还是贬义)。
模型将这些“头”的结果拼接起来,就能从多个维度通过全方位地理解这句话。这就是为什么大模型能表现出惊人的理解力。
- 为什么它引发了 AI 革命?
在注意力机制出现之前(RNN/LSTM 时代),AI 面临两大难题:
- 长距离遗忘:文章写长了,开头的信息到结尾就丢了。
- 无法并行计算:必须读完第一个词才能读第二个词,训练极慢。
注意力机制解决了这两个问题:
- 全局视野:无论句子多长,它都能一步跨越距离,直接把结尾和开头联系起来(天涯若比邻)。
- 并行计算:它可以同时处理整篇文章的所有词,大大加快了训练速度(这也是 GPT 能做得这么大的原因)。
简单来说,大模型里的注意力机制就是一种资源分配方案:在处理海量信息时,不平均用力,而是根据上下文的相关性,给重要的信息高权重,给不重要的信息低权重,从而精准地捕捉数据间的深层逻辑关联。
问题及回答
问题一:计算注意力时,是单项的,还是双向的?在 I Love AI 时,计算 Love 时,处理前面的 I,也会关注后面的 You 吗?
答案是:这取决于使用的是哪种架构的模型。 它可以是双向的,也可以是单向的。
但在目前最火的生成式大模型(如 GPT、Claude、Llama)中,绝大多数情况下是单向的。
为了讲清楚,我们把“I Love AI”这个例子放在两种不同的场景下看:
- 单向注意力 (Unidirectional / Causal Attention)
- 代表模型:GPT 系列(以及几乎所有的聊天机器人)
- 这就是我们常说的“Decoder-only”架构。
- 场景:你要让模型像人说话一样,一个字一个字地往外蹦。
- 规则:为了预测下一个字,模型绝对不能偷看后面已经存在的字(否则就是作弊了,它就学不会预测了)。

处理过程,当模型在处理 “Love” 这个词时:
- 它能看到前面的 “I”。
- 它完全看不到后面的 “AI”(这部分会被一个叫“掩码/Mask”的东西挡住,在计算中强制归零)。
- 它的任务:根据 “I” 和 “Love” 的注意力计算,去猜后面那个词是 “AI” 还是 “You”。
结论:在 GPT 这种生成式模型里,计算 “Love” 时,只关注 “I”,不关注后面的词。 时间是单向流动的。
- 双向注意力 (Bidirectional Attention)
- 代表模型:BERT(主要用于理解任务,如情感分析、完形填空)
- 这就是我们常说的 Encoder-only(仅编码器)架构。
- 场景:模型不需要生成文本,而是要“理解”这句话是褒义还是贬义,或者是做完形填空(I Love [MASK])。
- 规则:既然句子都已经写完了,为了读懂意思,当然是前后的信息都要看。
处理过程,当模型在计算 “Love” 的特征时:
- 它会同时计算与 “I”(主语)的关联。
- 也会同时计算与 “AI”(宾语)的关联。
- 因为它知道后面是 “AI”,它才能确定这个 “Love” 是对技术的喜爱,而不是对人的喜爱。
结论:在 BERT 这种理解型模型里,计算 “Love” 时,既关注前面的 “I”,也关注后面的 “AI”。 它是拥有“上帝视角”的。
问题二:为什么现在的“大模型”主要是单向的?
你可能会问,双向看起来更聪明(能看到全文),为什么现在的 ChatGPT 等大模型主要用单向?
原因在于通用性:
- 双向模型(BERT):擅长做阅读理解和分类,但它不擅长写文章。因为它习惯了一眼看全貌,不知道怎么从无到有地顺序生成。
- 单向模型(GPT):虽然在处理某个词时看不到后面,但这种“根据上文预测下文”的能力,恰恰是人类语言生成的本质。只要数据量够大,单向模型也能涌现出极强的理解能力。
总结上面的例子 “I Love AI”:
- 如果你是在训练或使用 ChatGPT(生成式):在处理 Love 时,模型只能看见 I。它看不到 AI。它是根据 “I Love” 算出的概率,预测出了 “AI”。
- 如果你是在用 Google 搜索的语义分析(理解式):模型在分析 Love 时,同时也看见了 AI。它利用 “AI” 这个词来确认 “Love” 的具体语境。
问题三:多头注意力具体是怎么计算的?
要理解多头注意力(Multi-Head Attention,MHA)的具体计算过程,我们需要深入到矩阵运算的层面。
不要担心,只要你理解了“向量”是一排数字,我们就可以把这个过程拆解得非常清晰。
我们假设输入一句话:“I Love AI”,我们要计算这句话的自注意力。
核心逻辑:分而治之
多头注意力的核心思想是:把长的向量切成几段,每一段代表不同的特征空间(Subspace),分别计算,最后再拼回来。
假设我们的模型参数设置如下:
- 词嵌入维度(d_model):512(每个词用 512 个数字表示)。
- 头的数量(h):8 个头。
- 每个头的维度(d_k):512/8=64(每个头用 64 个数字就好了)。
下面是具体的计算 4 个步骤:
第一步:线性投影(Linear Projection) 这是“多头”产生的源头。
对于“Love”这个词,它最初的向量是 X(长度 512)。我们不直接用它算,而是先让它通过 8 组不同的线性变换矩阵(权重矩阵 W)。
对于第 i 个头(比如第 1 个头),我们有专属的权重矩阵:

计算公式:

直观理解:
- 虽然输入都是同一个“Love”,但头 1 的矩阵可能提取的是“词性特征”(算出 Q1);
- 头 2 的矩阵可能提取的是“时态特征”(算出 Q2);
- 头 3 的矩阵可能提取的是“指代特征”(算出 Q3)。
此时,我们就得到了 8 组不同的 Q,K,V向量,每组向量长度仅为 64。
第二步:独立计算注意力(Scaled Dot-Product Attention)
现在,8 个头就像 8 个独立的工人在平行工作。每个头只拿自己的 Q_i,K_i,V_i 去算分。
以头 1 为例,计算“Love”对“I”和“AI”的注意力:

得到结果 Z_1(长度 64)。
同时,其他 7 个头也在做完全一样的事情,分别得到 Z_2,Z_3,…Z_8。
注意:头 1 可能觉得 “AI” 重要(语义关联);头 2 可能觉得 “I” 重要(主谓搭配)。它们互不干扰。
第三步:拼接(Concatenation)
现在的局面是,我们手头有 8 个长度为 64 的小向量(Z_1 到 Z_8)。
为了恢复原来的维度,我们直接把它们首尾拼接起来。

拼接后的总长度 =64*8=512。这就变回了和最开始输入一样的维度。
第四步:最终线性融合(Final Linear Projection)
虽然拼起来了,但现在这 512 个数字里,前 64 个只包含头 1 的信息,后 64 个只包含头 2 的信息,它们之间还没“交流”过。
所以,最后需要乘上一个巨大的权重矩阵 W^O(Output Matrix)。

这一步的作用是:把 8 个头捕获到的不同侧面的信息(语法、语义、指代等)进行混合融通,整合成最终的输出向量。
总结:全流程图解
想象你要写一篇关于“Love”的分析报告(输出向量):
- 分发任务(投影):你找了 8 个实习生(Head),给每人发了一副不同颜色的眼镜(WQ,WK,W^V)。
- 独立调研(注意力计算): 戴红眼镜的实习生只看语法,他觉得 Love 和 I 关系紧密。 戴蓝眼镜的实习生只看语义,他觉得 Love 和 AI 关系紧密。
- 汇总报告(拼接):大家把各自写的 64 字短评交上来,你把它们按顺序贴在黑板上。
- 润色总结(最终投影):你作为主编(W^O),把这些零散的短评统筹修改,写成一篇连贯的 512 字深度文章。
问题四:在实际计算过程中,I Love AI,3 个单词向量自注意力计算是并发的,同步进行的吗?还是后面 Love 的计算,需要依赖I的计算结果?
答案分为两种情况:
- 在训练时: 是完全并发、并行的。
- 在推理时: 是串行的(必须要等前面算完)。
我们详细拆解这两种情况:
情况一:训练阶段(上帝视角)
状态:并发、同步进行
在训练时,我们已经拥有了完整的数据集(比如这句话就是 “I Love AI”)。虽然我们目的是训练模型学会“预测”,但我们为了效率,会把整句话一次性扔给 GPU。
1.矩阵并行运算
模型接收的输入不是一个词,而是一个 3 行 x 512 列的大矩阵(矩阵 X)。
- 第一行是 “I”
- 第二行是 “Love”
- 第三行是 “AI”
当模型计算 Q,K,V 时,它做的是矩阵乘法。GPU 会在同一瞬间,算出 3 个词所有的 Q、所有的 K,所有的 V。
2.Mask(掩码)的魔法
你可能会问:“如果不按顺序算,模型在算 ‘Love’ 的时候,岂不是偷看到了后面的 ‘AI’?”
这就用到了 Mask(掩码)矩阵。
虽然 GPU 并行计算了所有的注意力分数(Score),但在计算 Softmax 之前,我们会人为地给矩阵里“未来”的位置填上负无穷大(-∞)。
在算 “Love” 这一行时,虽然物理上算出了它和 “AI” 的关系,但 Mask 强行把它变成了 0。
结果:物理计算是并行的(为了快),但逻辑上被 Mask 限制成了单向可见。
**结论:**在训练时,计算 “Love” 不需要等 “I” 算完。它们是一起进炉子,一起出炉的。这就是 Transformer 能够取代 RNN 的最大原因——训练速度极快。
情况二:推理阶段(你和 ChatGPT 聊天时) 状态:串行、一步步进行
当你给模型输入 “I” 让它往下续写时,情况就不一样了。
1.必须排队
因为此时 “Love” 和 “AI” 根本还不存在!模型必须先算出 “Love”,把它输出出来,然后把 “Love” 填回输入端,才能开始算 “AI”。
- 第 1 步:输入 [I],算出 Love。
- 第 2 步:输入 [I, Love],算出 AI。
2.Love 的计算依赖 I 吗?
- 是的,有依赖。
- 当计算 “Love” 的注意力时,模型需要拿 “Love” 的 Q去和 “I” 的 K 进行匹配。
- 如果 “I” 的信息还没有被处理好(拿到 K 和 V),”Love” 是没法算的。
3.KV Cache(KV 缓存技术)
为了加速,实际推理中有一个极其重要的优化叫 KV Cache。
当算完第 1 步(”I” -> “Love”)后,模型会把 “I” 的 K 和 V 向量存起来(Cache)。
当进行第 2 步(算 “AI”)时:
- 模型不需要重新计算 “I” 和 “Love” 的 K,V。
- 它直接去缓存里读之前的 K,V。
- 它只需要针对新来的 “AI” 计算它自己的 Q,K,V,然后和缓存里的老数据进行交互。
结论:在推理时,虽然是串行的,但通过缓存技术,我们不需要每次都把前面的历史重算一遍,只需要计算“当前这个新词”和“过去所有词”的关系。
02 transformer 的层
(1)整体看层
transformer 有很多层,上述注意力的计算是发生在每一层。
如果一个大模型(比如 GPT-3)有 96 层,那么针对每一个词,上述的“多头注意力”计算就会连续进行 96 次。
但是,虽然计算公式是一样的,但每一层处理的内容和关注的重点是完全不同的。这是理解深度学习“深度(Deep)”二字的关键。
我们可以通过三个维度来深入理解这个过程:
一. 数据的接力棒:从“词义”到“思想”
你可以把这几十层想象成一个公司的层级架构,数据是从底层员工一层层往上传递给 CEO 的。
第 1 层(基层员工):
- 输入:最原始的词向量(Embeddings)。比如“I”、“Love”、“AI”的字典定义。
- 注意力关注点:这层主要关注邻近的词和语法结构。比如看到“Love”,它通过注意力机制发现前面是“I”,于是把它们拼在一起,确认这是一个动词。
- 输出:包含初步语法信息的向量。
中间层(中层管理):
- 输入:第 1 层的输出结果(不再是原始词向量了,而是融合了上下文的混合向量)。
- 注意力关注点:关注语义和短语搭配。比如它不再纠结“Love”是动词,而是开始分析“Love AI”这个搭配,可能意味着“对科技的热情”。
- 输出:包含更丰富语义信息的向量。
高层(高管/CEO):
- 输入:中间层的输出。
- 注意力关注点:关注逻辑、指代、语气、长距离依赖。在这一层,模型可能会把“AI”和几千字之前提到的“Deep Learning”联系起来,理解整篇文章的主旨。
- 输出:高度抽象的“思想”向量,用来预测下一个字。
结论:每一层的输入都是上一层的输出。随着层数加深,向量里包含的信息越来越抽象,越来越接近人类的“理解”。
二. 参数是独立的:每一层都有自己的“大脑”
这是一个非常重要的技术细节:
虽然每一层都在算 Q,K,V,都在算 Softmax,但每一层拥有的权重矩阵(WQ,WK,WV,WO)是完全独立的!
- 第 1 层的参数:专门训练用来识别简单的词法关系。
- 第 96 层的参数:专门训练用来识别复杂的逻辑推理。
它们互不共享。这也就是为什么大模型参数量这么大(比如 Llama-3 70B 有 700 亿个参数),因为这几百亿个参数被分摊到了几十个层里,每层都有好几亿个参数在各司其职。
三. “三明治”结构:层里不只有注意力
为了严谨,必须补充一点:Transformer 的“一层”(Block)里,并不是只有注意力机制。
它通常是一个“三明治”结构:
- 多头注意力(Multi-Head Attention):负责“左右看”,从上下文里吸取信息。
- 残差连接与归一化(Add & Norm):防止算着算着数据崩了。
- 前馈神经网络(Feed-Forward Network,FFN):负责“独立思考”。注意力机制是把大家的信息以此融合。FFN 是把融合后的信息进行消化、记忆和非线性变换。
- 残差连接与归一化(Add & Norm)。
这个“三明治”整体被称为一层。 数据穿过这层三明治,就被“升华”一次。
总结,回到例子“I Love AI”:
- 第 1 层的注意力计算:让“Love”知道它是“I”发出的动作。
- …中间几十层…:不断丰富“Love”的内涵,加入情感色彩、语境判断。
- 最后 1 层的注意力计算:此时的“Love”这个向量,已经不再是单纯的单词,它包含了整句话甚至整段话的逻辑。模型最后根据这个高度浓缩的向量,推断出如果后面还要接字,该接什么(比如接句号)。
所以,注意力机制就像是每一层都在进行的“信息筛选与融合大会”,开完一层会,大家对信息的理解就深一层。
(2)前馈神经网络(FFN)
FFN 是把融合后的信息进行消化、记忆和非线性变换。

如果不理解 FFN(前馈神经网络),就只理解了模型的一半。
我们可以把注意力机制和 FFN 做一个形象的对比:
- 注意力机制(Attention):像是“社交”。它的任务是去“看别人”,搞清楚大家之间的关系,把相关的信息搜集过来。
- 前馈神经网络(FFN):像是“大脑皮层的独立思考”。它的任务是不再看别人,而是盯着自己手头刚刚搜集到的信息,去查阅脑子里的知识库**,进行理解和推理。
我们把“消化”、“记忆”和“非线性变换”拆开来讲:
- “消化”:信息的独立整合
在注意力层(Attention)结束时,单词“Love”已经从周围吸取了“I”和“AI”的信息。它的向量里混合了主语、宾语的特征。
但是,这只是一堆混合的原材料。FFN 是按位置独立计算的(Position-wise)。
意思是,FFN 在处理“Love”这个向量时,完全切断它和“I”、“AI”的联系。它关起门来,独自面对“Love”这个混合向量,开始分析:
嗯,这个向量里包含‘动作’特征,也包含‘科技’语境,还包含‘肯定’的情绪。把它们揉碎了重组一下,这应该表示一种‘对技术发展的认可’。
这就是消化:将注意力机制“搜刮”来的外部信息,整合成内在的特征。
- “记忆”:存储静态知识的仓库
这是近年来研究最激动人心的发现:大模型学到的“死知识”(百科全书),很大程度上是存在 FFN 的参数里的。
FFN 的内部结构其实就是两个巨大的矩阵相乘。研究人员发现,这很像是一个Key-Value(键-值)存储器。
举个例子,当你想补全:“中国的首都是 [MASK]”。
注意力层:把“中国”和“首都”这两个词联系起来,告诉模型“我们要找一个地点”。
FFN 层:
- 输入向量激发了 FFN 中的某些神经元(Key),这些神经元代表了“中国+首都”这个概念。
- 这些神经元被激活后,输出了一个数值(Value),这个值对应的就是“北京”。
为什么说 FFN 是记忆?
因为大模型 2/3 的参数都在 FFN 里。注意力层只负责指路(根据上下文关注哪里),而 FFN 负责查字典(根据指路的结果提取具体的事实和知识)。
如果模型背错了知识(比如瞎说中国首都是上海),通常是 FFN 里的参数(权重)没训练好。
“非线性变换”:让模型变聪明。这是数学上的必要性,也是“智能”产生的根本。
FFN 的结构通常是:线性变换 -> 激活函数(ReLU/GELU) -> 线性变换。中间这个激活函数就是“非线性”的来源。
为什么要非线性?
如果只有线性变换(加法和乘法),无论你叠多少层神经网络(100 层、1000 层),这 1000 层最后都可以被数学简化成 1 层。也就是 2 x 2 x 2 = 8,和你直接乘 8 没区别。
模型就变成了简单的线性回归,它永远无法理解复杂的语言逻辑(比如双关语、反讽、逻辑陷阱)。
非线性做了什么?
激活函数(比如 ReLU)引入了“判断”和“折叠”的能力:它说:“如果这个信号大于 0,我就传递它;如果小于 0,我就把它关掉(置为 0)。”
这就像电路里的开关。有了非线性,神经网络才能把输入空间进行极度复杂的扭曲和分割。
它能区分:虽然“苹果”和“华为”经常一起出现,但在“吃”这个语境下,要把“华为”这个概念关掉(置 0),只保留“水果”的含义。
这种复杂的分类和决策能力,就是非线性变换带来的。
总结:一个生动的比喻
想象大模型是一个正在做阅读理解题的学生。
注意力机制(Attention):
- 这是眼睛。
- 学生读到“它”字,眼睛快速扫视前文,看到了“苹果”。
- 作用:建立连接,获取上下文。
前馈神经网络(FFN):
- 这是大脑。
- 眼睛告诉大脑:“现在的词是‘它’,指的是‘苹果’。”
- 大脑开始查阅记忆(FFN 的参数):苹果是什么?是红的、圆的、能吃的。
- 大脑进行非线性思考(激活函数):既然前文说是“掉在地上”,根据常识(非线性判断),这里应该强调它的“物理实体”属性,而不是“苹果公司”。
- 作用:理解概念、调用知识、进行推理。
所以,FFN 就是那个把看来的信息(融合后的信息)吃进去,通过查阅脑子里的百科全书(记忆),经过复杂的逻辑判断(非线性),最后产出理解结果的消化系统。
(3)残差和层归一化
在大模型的“三明治”结构中,Add & Norm 往往是最容易被忽视,但实际上是也是最不可或缺的组件。
没有它们,深达几十层甚至上百层的模型根本无法训练——它们会因为梯度消失或数值爆炸而“瘫痪”。
我们可以把它们看作是“保真直通车”(Add)和“数据质检员”(Norm)。
1.输入与输出(Input & Output)
在讲原理之前,先明确一个极其重要的前提:Add & Norm 不改变数据的形状(Shape)。
- 输入:一个向量 x(比如长度为 512)。这就是进入注意力层或 FFN 层之前的那个原始数据。
- 中间处理:注意力层或 FFN 层对 x 进行了一顿操作,算出了一个新的结果,记为 F(x)。
- 操作:将原始的 x 和新的 F(x)相加,然后进行归一化。
- 输出:一个新的向量 y(长度依然是 512)。
2.残差连接(Add / Residual Connection)
公式:Output=x+F(x)
怎么计算? 就是简单的元素对位加法。假设 x=【1,2】,经过一层处理后变化量 F**(x)=【0.1,-0.1】。那么 Add 的结果就是 【1.1,1.9】。**
作用是什么?它的核心作用是“防止遗忘”和“拯救梯度”。
直觉理解:传话游戏 想象有 100 个人排成一队传话(这就好比 100 层的深层网络)。
- 没有 Add:第 1 个人说了一句“我爱 AI”,传到第 100 个人时,因为中间每个人的理解偏差,可能变成了“吾爱阿姨”。这就叫信息丢失。
- 有 Add:第 1 个人把纸条传给第 2 个人,同时大喊一声告诉第 2 个人原话是什么。第 2 个人结合纸条和听到的大喊声,综合处理传给第 3 个人。
- 这就相当于:下一层不仅拿到了上一层的处理结果,还保留了上一层的原始信息。
深度学习视角:梯度高速公路
当模型很深时,反向传播(训练模型调整参数的过程)会因为层数太多,信号越来越弱(梯度消失),导致前几层的参数根本没法更新。
有 x+F(x),梯度可以直接沿着 x 这条“高速公路”一路无损地传回第一层。这是训练深层神经网络(Deep Learning)能成功的基石。
3.层归一化(Norm / Layer Normalization)
公式:

怎么计算?假设经过 Add 之后,向量是 z=【10,100,-50,…】。数值范围跨度很大,这会让模型很难学。
- 求平均(μ):算出这一个向量里所有数字的平均值。
- 求方差(σ):算出这些数字的离散程度。
- 标准化:把向量里的每个数字,减去平均值,再除以标准差。 结果:这就把数据强行拉回到了一个平均值为 0,方差为 1 的标准正态分布(大概都在 -2 到 +2 之间)。
- 缩放和平移(γ,β):这是可学习的参数。模型如果觉得“标准分布不好,我想让它稍微偏一点”,它可以通过调整这两个参数把数据再挪一挪。
作用是什么?它的核心作用是**“统一度量衡”和“稳定训练”**。
直觉理解:考试评分
- 有的层算出来的分数值很大(比如 0 到 10000),有的层算出来很小(0.001)。这就像两个老师改卷子,一个总分 1000 分,一个总分 10 分。
- 如果不统一,模型就会晕头转向,不知道哪个特征重要。
- Norm 的作用:强制把所有人的分数都转换成“标准分”(Z-score)。无论你之前是几千还是几位小数,现在大家都站在同一个起跑线上比较。
4.整体流程图解
回到 Transformer 的一层(比如 Post-LN 结构):
- Input x 进来了。
- 分流:一支队伍带着 x 去做注意力计算(或者 FFN),辛苦半天算出结果 F(x)。另一支队伍带着 x 啥也不干,直接走旁边的小路(Shortcut)。
- 汇合(Add):在出口处,把 F(x)和原始的 x 加起来。 此时 z=x+F(x)。
- 质检(Norm):看着 z 的数值乱七八糟的,赶紧做个归一化。 最终输出 y=Norm(z)。
总结:
- Add 告诉模型:“别忘了你原本长什么样(保留底色),所有的改变都只是在原有的基础上进行微调。”
- Norm 告诉模型:“不管你算出的数字多离谱,都给我规矩点,保持队形(数据分布稳定),这样下一层才好处理。”
计算细节:就像 FFN 一样,LayerNorm 也是严格按位置独立计算的。
LayerNorm 在处理“I”这个词的时候,完全不看“Love”和“AI”的数据。
为了透彻理解这个“独立性”,我们需要精准地定义一下大模型里的数据形状,以及 LayerNorm 到底是在哪个维度上进行“切一刀”计算的。
1.数据的形状(The Shape of Data)
假设我们的输入依然是 “I Love AI”。 在模型内部,这句话的数据是一个三维的张量(Tensor):
- 维度 1(Batch):1(只有这1句话)
- 维度 2(Sequence Length):3(有3个词:I, Love, AI)
- 维度 3(Hidden Dimension):512(每个词用 512 个数字表示特征)
你可以把它想象成 3 张独立的卡片,每张卡片上密密麻麻写着 512 个数字。
2.LayerNorm 怎么算?(单张卡片内部的操作)
当 LayerNorm 开始工作时,它是针对每一张卡片单独操作。
对于“I”这张卡片(512 个数字):
- 算平均值:把这 512 个数字加起来除以 512,得到 μI。
- 算方差:看这 512 个数字波动有多大,得到 σI。
- 归一化:把这 512 个数字,每个都减去 μI 再除以 σI。
关键点来了:
- 在算“I”的平均值时,完全不需要用到“Love”那张卡片上的任何数字。
- 哪怕把“Love”和“AI”这两个词删掉,或者换成“Hate”和“Apples”,“I”这个词经过 LayerNorm 计算后的结果(在归一化这一步)是完全不受影响的(假设它进入 LayerNorm 前的数值没变)。
这就是所谓的“按位置独立(Position-wise)”。
3.为什么要这么设计?
如果 LayerNorm 不是独立的(比如它是像 BatchNorm 那样跨样本计算,或者是跨词计算),会有什么问题?
问题:变长序列的处理,在推理(聊天)的时候,句子是不断变长的。
- 第一秒:I
- 第二秒:I Love
- 第三秒:I Love AI
如果 LayerNorm 也要看后面的词,那当“I”单独出现时,和“I”在“Love”前面时,它的归一化结果就会不一样。这就乱套了。
LayerNorm 保证了无论句子多长,每个词只管好自己的特征分布,不受邻居干扰。
4. 总结:Transformer 组件的“社交属性”
给 Transformer 里的三个核心组件贴上“社交标签”,来彻底理清它们的关系:

结论:在整个大模型的一层(Block)里,****只有注意力机制(Attention)是在搞“团队合作”,其他的组件(FFN,LayerNorm,Residual Add)全部都是各管各的“单兵作战”。
03 FlashAttention
FlashAttention 是大模型领域近年来最硬核、最落地的算法创新之一(由斯坦福大学 Tri Dao 等人提出)。
简单来说,它的核心作用只有一句话:少读写显存(HBM),多在缓存(SRAM)里算。
为了理解它具体怎么发挥作用,我们需要先理解 GPU 的存储结构,以及标准 Attention 为什么慢。
1.瓶颈在哪里?(GPU 的“内存墙”)
想象你是一个厨师(GPU 核心/计算单元),你要炒一道超级复杂的菜。
- HBM (显存 / High Bandwidth Memory):这是仓库。容量巨大(80GB),但离厨房很远,取一次菜要跑断腿(读写速度相对慢)。
- SRAM (片上缓存 / Shared Memory):这是案板。就在手边,拿菜极快,但空间极小(每组核心只有 100多 KB)。
标准的 Attention 计算过程(痛点):

结论:厨师大部分时间都在仓库和厨房之间来回跑路(IO 瓶颈),真正炒菜(计算)的时间反而很少。这就是 Memory Bound(内存受限)。
FlashAttention 的魔法:分块计算(Tiling)
FlashAttention 的核心思想是:既然案板(SRAM)小,那我就把矩阵切成无数个小块,每次只拿一小块在案板上把所有事情做完,绝不把中间结果写回仓库!
它利用了一个数学技巧,可以在不存储完整 N x N 矩阵的情况下,直接算出最终的 Softmax 结果。
FlashAttention 的流程(优化后):
**1.切块:**把 Q,K,V 切成很多小块(Block)。
**2.加载:**只从仓库拿一小块 Q_i 和一小块 K_j 到案板(SRAM)。
3.计算与更新:
- 在案板上直接算这一小块的 Score。
- 在案板上直接算这一小块的 Softmax(利用在线 Softmax 算法)。
- 在案板上直接乘上 V_j。
- 关键点:它不需要把中间那个巨大的 N x N 矩阵存下来!它只保留一个很小的统计量(比如最大值和和),用来不断更新最终结果。
**4.写回:**最后只把最终计算好的 Output 写回仓库。
结果:
- 显存读写量(HBM Access):减少了 8 倍甚至更多。
- 速度:提升了 2-4 倍。 显存占用:从 O(N)^2 变成了 O(N)(线性增长)。
- 这意味着你可以输入超级长的文本(比如 100k tokens)而不会爆显存。
总结
FlashAttention 并没有改变 Attention 的数学结果(算出来的数是一模一样的),它改变的是计算的顺序和内存管理方式。
- 以前:算一步,存一步,读一步,再算下一步。
- 现在(FlashAttention):在极小的超高速缓存(SRAM)里,把一连串复杂的计算一口气做完,坚决不访问慢速显存。
这就好比:你本来每切好一个土豆都要跑去仓库放好,再跑回来切下一个。现在你在案板旁边放个小碗,切好一个放碗里,全切完了再一次性端去仓库。效率自然天差地别。
细节问题:具体的数学技巧是什么?
利用了一个数学技巧,可以在不存储完整 N x N 矩阵的情况下,直接算出最终的 Softmax 结果。
这个数学技巧的名字叫 Online Softmax(在线 Softmax)。
它的核心魔力在于:它允许我们在不知道全局最大值(Global Max)和全局总和(Global Sum)的情况下,分块计算,并随时修正之前的计算结果。
为了理解这个技巧,我们需要先看一个**“考场打分”**的直观例子,然后再看数学原理。
1.直觉理解:分批改卷的难题
假设你是老师,你要给全班 1000 个学生打分(做归一化 Softmax)。 规则(Softmax 的数值稳定性要求):
- 找出全班的最高分(Max)。
- 每个人的分数减去最高分,算出指数(这样防止数值爆炸)。
- 算出所有人的指数总和(Sum)。
- 每个人的最终得分 = 自己的指数 / 总和。
困难(内存限制):你的桌子(SRAM)很小,一次只能放 10 张卷子。你不能把 1000 张卷子看完再找最高分。
常规做法(做不到):必须先看完 1000 张卷子找到最高分,才能开始算第 1 张卷子的归一化分数。这就要求把所有卷子存下来(显存爆炸)。
Online Softmax 的做法(数学技巧):
第一批(前 10 人):
- 你发现最高分是 80 分。
- 你假设全班最高就是 80,先算出这 10 个人的归一化分数。
- 暂存结果:{前 10 人分数,临时最高 80,临时总和}。
第二批(第 11-20 人):
- 糟糕!这批里有个学霸考了 90 分。
- 这意味着:你之前基于 80 分算的“前 10 人分数”全算错了(偏大了)!
关键技巧(Rescaling / 修正):
你不需要把前 10 张卷子拿回来重算。
你只需要用一个数学修正系数来更新之前的结果。
修正系数:

把之前算好的前 10 人的总和乘上这个系数,就把基准从 80 分“拉”到了 90 分。
结果:你就像开了天眼一样,虽然是一批批算的,但每算一批,都顺手把之前的误差给修正了。等到最后一批算完,结果和看完所有卷子算出来的一模一样。
2.数学原理

第三步:合并与修正(The Trick)
现在的目标是算出全局最大值 M_new 和全局总和 L_new。
1)新的全局最大值很简单:

2)新的全局总和(这是 trick 所在):

3.在 FlashAttention 里怎么用?

总结:Online Softmax 数学技巧。它通过记录当前的局部最大值,并在发现更大的值时,利用指数的性质(e^a-b)生成一个修正系数,从而动态地更新之前的计算结果。
这就避免了“必须一次性看完全部数据才能算 Softmax”的限制,使得**分块计算(Tiling)**成为可能,进而让数据可以一直留在高速缓存(SRAM)里,不需要反复读写显存(HBM)。
普通人如何抓住AI大模型的风口?
领取方式在文末
为什么要学习大模型?
目前AI大模型的技术岗位与能力培养随着人工智能技术的迅速发展和应用 , 大模型作为其中的重要组成部分 , 正逐渐成为推动人工智能发展的重要引擎 。大模型以其强大的数据处理和模式识别能力, 广泛应用于自然语言处理 、计算机视觉 、 智能推荐等领域 ,为各行各业带来了革命性的改变和机遇 。
目前,开源人工智能大模型已应用于医疗、政务、法律、汽车、娱乐、金融、互联网、教育、制造业、企业服务等多个场景,其中,应用于金融、企业服务、制造业和法律领域的大模型在本次调研中占比超过 30%。
随着AI大模型技术的迅速发展,相关岗位的需求也日益增加。大模型产业链催生了一批高薪新职业:
人工智能大潮已来,不加入就可能被淘汰。如果你是技术人,尤其是互联网从业者,现在就开始学习AI大模型技术,真的是给你的人生一个重要建议!
最后
只要你真心想学习AI大模型技术,这份精心整理的学习资料我愿意无偿分享给你,但是想学技术去乱搞的人别来找我!
在当前这个人工智能高速发展的时代,AI大模型正在深刻改变各行各业。我国对高水平AI人才的需求也日益增长,真正懂技术、能落地的人才依旧紧缺。我也希望通过这份资料,能够帮助更多有志于AI领域的朋友入门并深入学习。
真诚无偿分享!!!
vx扫描下方二维码即可
加上后会一个个给大家发
大模型全套学习资料展示
自我们与MoPaaS魔泊云合作以来,我们不断打磨课程体系与技术内容,在细节上精益求精,同时在技术层面也新增了许多前沿且实用的内容,力求为大家带来更系统、更实战、更落地的大模型学习体验。

希望这份系统、实用的大模型学习路径,能够帮助你从零入门,进阶到实战,真正掌握AI时代的核心技能!
01 教学内容

-
从零到精通完整闭环:【基础理论 →RAG开发 → Agent设计 → 模型微调与私有化部署调→热门技术】5大模块,内容比传统教材更贴近企业实战!
-
大量真实项目案例: 带你亲自上手搞数据清洗、模型调优这些硬核操作,把课本知识变成真本事!
02适学人群
应届毕业生: 无工作经验但想要系统学习AI大模型技术,期待通过实战项目掌握核心技术。
零基础转型: 非技术背景但关注AI应用场景,计划通过低代码工具实现“AI+行业”跨界。
业务赋能突破瓶颈: 传统开发者(Java/前端等)学习Transformer架构与LangChain框架,向AI全栈工程师转型。

vx扫描下方二维码即可
本教程比较珍贵,仅限大家自行学习,不要传播!更严禁商用!
03 入门到进阶学习路线图
大模型学习路线图,整体分为5个大的阶段:
04 视频和书籍PDF合集

从0到掌握主流大模型技术视频教程(涵盖模型训练、微调、RAG、LangChain、Agent开发等实战方向)

新手必备的大模型学习PDF书单来了!全是硬核知识,帮你少走弯路(不吹牛,真有用)
05 行业报告+白皮书合集
收集70+报告与白皮书,了解行业最新动态!
06 90+份面试题/经验
AI大模型岗位面试经验总结(谁学技术不是为了赚$呢,找个好的岗位很重要)

07 deepseek部署包+技巧大全

由于篇幅有限
只展示部分资料
并且还在持续更新中…
真诚无偿分享!!!
vx扫描下方二维码即可
加上后会一个个给大家发
更多推荐


所有评论(0)