雅客网站建设,网站如何挂马教程,2345网址导航怎么彻底删掉,花之语网页设计代码我们已经完成了对机器学习和深度学习核心数学理论的全面探索。我们从第一阶段的经典机器学习理论#xff0c;走到了第二阶段的深度学习“黑盒”内部#xff0c;用线性代数、微积分、概率论、优化理论等一系列数学工具#xff0c;将神经网络的每一个部件都拆解得淋漓尽致。
…我们已经完成了对机器学习和深度学习核心数学理论的全面探索。我们从第一阶段的经典机器学习理论走到了第二阶段的深度学习“黑盒”内部用线性代数、微积分、概率论、优化理论等一系列数学工具将神经网络的每一个部件都拆解得淋漓尽致。
我们已经知道CNN通过局部卷积核捕捉空间模式RNN通过循环结构处理序列信息。它们在各自的领域取得了辉煌的成就。然而当人类迈向通用人工智能的星辰大海时我们发现这两种架构都遇到了瓶颈。RNN的顺序处理机制使其无法并行且难以捕捉长距离依赖CNN的固定感受野则限制了其对全局关系的理解。
我们需要一种全新的、更强大的架构它能够同时看到整个序列并动态地、智能地判断出序列中任意两个元素之间的重要性无论它们相隔多远。我们需要一种能够真正理解“上下文”的机制。
2017年一篇名为《Attention Is All You Need》的论文横空出世它所提出的Transformer模型彻底改变了深度学习的版图。而Transformer的核心正是我们今天要深入剖析的、完全构建于线性代数之上的暴力美学——自注意力机制 (Self-Attention)。
欢迎来到本系列第三阶段大型语言模型 (LLM) 的数学世界。在这一阶段我们将看到之前学习的所有数学知识是如何在LLM这个宏伟的舞台上被推向极致。而我们今天的第一站就是用线性代数这把手术刀来解剖Transformer的心脏。 【硬核数学 · LLM篇】3.1 Transformer之心自注意力机制的线性代数解构《从零构建机器学习、深度学习到LLM的数学认知》
欢迎来到本系列文章的第三幕也是最激动人心的部分——大型语言模型LLM的数学原理。在前两个阶段我们已经为自己装备了从经典机器学习到深度学习的全套数学武器。现在我们将用这些武器去攻克当今人工智能领域最璀璨的明珠Transformer模型。
在深入LLM的宏伟殿堂之前我们必须首先理解其革命性的基石——自注意力机制Self-Attention。这个机制的出现彻底摆脱了传统RNN和CNN在处理序列数据时的束缚用一种极其优雅且高度并行的计算方式实现了对长距离依赖的完美建模。
你可能会惊讶地发现这个听起来高深莫测的“注意力”机制其底层完全是由我们最熟悉的线性代数——矩阵乘法、向量点积、线性变换——所构建的。它是一场精心编排的、在超大规模尺度上进行的“矩阵战争”。
今天我们将从线性代数的视角对自注意力机制进行一次彻底的、从零开始的解构。我们将看到简单的矩阵运算是如何被巧妙地组合起来从而赋予模型“关注”的能力。我们还将探讨当模型规模扩展到LLM级别时这些线性代数运算面临的挑战以及相应的工程解决方案如模型并行化和KV缓存。
第一部分挣脱枷锁 —— 从RNN的困境到Attention的诞生
为了理解自注意力机制的革命性我们必须先回顾它所要解决的问题。在Transformer出现之前处理序列数据如文本、时间序列的王者是**循环神经网络RNN**及其变体LSTM, GRU。
RNN的“顺序依赖”之痛
RNN的核心思想是“循环”。它在处理一个序列时会像人阅读一样一个词一个词地进行。在每个时间步 t t tRNN会接收当前的输入 x t x_t xt 和上一个时间步传递过来的隐藏状态 h t − 1 h_{t-1} ht−1然后计算出新的隐藏状态 h t h_t ht。 h t f ( W h h h t − 1 W x h x t ) h_t f(W_{hh}h_{t-1} W_{xh}x_t) htf(Whhht−1Wxhxt) 这种结构虽然直观却带来了两个致命的“原罪”
计算瓶颈 h t h_t ht 的计算依赖于 h t − 1 h_{t-1} ht−1 的完成。这意味着整个序列的处理必须是串行的无法利用现代GPU强大的并行计算能力。当序列很长时这个过程会非常缓慢。长距离依赖问题信息需要通过隐藏状态一步步地传递。对于长句子句子开头的信息在传递到句子末尾时很容易被“稀释”或“遗忘”梯度消失/爆炸问题。模型很难学习到相距很远的两个词之间的关系。
我们需要一种机制能够让模型在处理任何一个词时都能直接看到句子中的所有其他词并动态地判断哪些词对当前词的理解最重要。这个思想就是注意力Attention。
注意力的核心思想查询、键、值 (Query, Key, Value)
注意力机制的灵感来源于人类的认知过程。当你看一张复杂的图片时你不会同时关注所有细节而是将注意力集中在某些关键区域。在处理语言时也是如此。
为了在数学上实现这一点注意力机制引入了一个非常优雅的抽象查询Query, Q、键Key, K和值Value, V。
Query (Q)代表当前需要被处理的元素它发问“我应该关注谁”Key (K)代表序列中所有可被关注的元素它们各自举着一块“牌子”上面写着自己的“身份”或“特征”用于回答Query的询问。Value (V)同样代表序列中所有可被关注的元素但它们携带的是自身的“内容”或“信息”。如果一个Key被Query高度关注那么对应的Value就会被更多地传递出去。
注意力机制的计算过程可以分为三步
计算相似度将Query与每一个Key进行比较计算它们的相似度或“匹配分数”。这通常通过向量点积来实现。归一化分数将这些原始的匹配分数通过一个Softmax函数转换成一个权重分布。所有权重加起来等于1代表了注意力的分配比例。加权求和用这些权重去对所有的Value进行加权求和得到最终的输出。权重越高的Value其信息在最终输出中的占比就越大。
一个“查询”向外探寻与众多“键”建立连接连接的强度注意力权重各不相同。最终被高度关注的“键”所对应的“值”被汇集起来形成了一个全新的、融合了上下文信息的表示。
而自注意力机制Self-Attention就是将这个Q-K-V框架应用在同一个序列内部。序列中的每一个元素既是Query当它作为处理中心时也同时是Key和Value当它作为被关注的对象时。它允许序列中的任意两个元素直接计算关系从而完美地解决了RNN的两个核心痛点。
第二部分矩阵的交响乐 —— 自注意力的线性代数实现
现在让我们卷起袖子用线性代数的语言来精确描述自注意力机制的每一步。我们将看到整个过程就是一系列精心设计的矩阵乘法。
假设我们有一个输入序列例如句子“Thinking Machines”。 首先我们需要将这些单词转换成计算机能够理解的向量。
从单词到向量嵌入表示 (Embedding)
我们通过一个嵌入层 (Embedding Layer) 将每个单词映射到一个高维向量。这个嵌入层本质上是一个巨大的查找表一个矩阵其中每一行对应一个单词的向量表示。
假设我们的嵌入维度是 d m o d e l d_{model} dmodel例如512。那么输入序列就被转换成一个形状为 (序列长度, d m o d e l d_{model} dmodel) 的矩阵我们称之为 X X X。对于“Thinking Machines”序列长度为2所以 X X X 是一个 2 × 512 2 \times 512 2×512 的矩阵。
生成Q, K, V线性变换的艺术
自注意力的核心在于序列中的每个输入向量 x i x_i xi 都要扮演三个不同的角色Query、Key和Value。为了让它们拥有执行不同任务的能力我们通过三个独立的、可学习的权重矩阵 W Q , W K , W V W_Q, W_K, W_V WQ,WK,WV 对输入矩阵 X X X 进行线性变换矩阵乘法来生成Q, K, V矩阵。 Q X W Q K X W K V X W V Q XW_Q \\ K XW_K \\ V XW_V QXWQKXWKVXWV X X X输入矩阵形状为 (序列长度, d m o d e l d_{model} dmodel)。 W Q , W K , W V W_Q, W_K, W_V WQ,WK,WV三个权重矩阵它们是模型需要通过训练学习的参数。它们的形状通常是 ( d m o d e l d_{model} dmodel, d k d_k dk)其中 d k d_k dk 是Q、K向量的维度通常设为64。 Q , K , V Q, K, V Q,K,V最终生成的查询、键、值矩阵形状为 (序列长度, d k d_k dk)。
这一步是自注意力的第一个关键。通过可学习的线性变换模型能够学会如何将一个输入向量“投影”到三个不同的子空间中让它分别携带最适合用于“查询”、“被匹配”和“提供内容”的信息。
注意力公式矩阵运算的巅峰对决
有了Q, K, V矩阵后我们就可以执行注意力计算了。著名的注意力公式如下 Attention ( Q , K , V ) softmax ( Q K T d k ) V \text{Attention}(Q, K, V) \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V Attention(Q,K,V)softmax(dk QKT)V 这个公式虽然简洁却蕴含了自注意力的全部精髓。让我们一步步地拆解它
Step 1: 计算注意力分数 (Attention Scores) Scores Q K T \text{Scores} QK^T ScoresQKT 这是整个机制的核心——计算所有Query与所有Key之间的相似度。 Q Q Q 的形状是 (序列长度, d k d_k dk)。 K K K 的形状是 (序列长度, d k d_k dk)所以 K T K^T KT (K的转置) 的形状是 ( d k d_k dk, 序列长度)。 Q K T QK^T QKT 的结果是一个形状为 (序列长度, 序列长度) 的矩阵。 这个注意力分数矩阵是理解自注意力的关键。它的第 i i i 行就代表了序列中第 i i i 个词作为Query时对序列中所有其他词作为Key的关注程度。这完美地实现了让任意两个词直接进行交互的目标。
Step 2: 缩放 (Scaling) Scaled Scores Scores d k \text{Scaled Scores} \frac{\text{Scores}}{\sqrt{d_k}} Scaled Scoresdk Scores 我们将分数矩阵中的所有元素都除以一个缩放因子 d k \sqrt{d_k} dk 。 d k d_k dk 是Key向量的维度。 为什么需要缩放 这是出于数值稳定性的考虑。当 d k d_k dk 比较大时 Q Q Q 和 K K K 中向量的点积结果可能会变得非常大。如果将这些大数值直接输入到Softmax函数中会导致梯度变得极其微小梯度消失使得模型难以训练。除以 d k \sqrt{d_k} dk 可以将点积的方差稳定在1附近从而保证了训练的稳定性。这体现了我们在第二阶段学习的数值计算知识的重要性。
Step 3: Softmax归一化 Weights softmax ( Scaled Scores ) \text{Weights} \text{softmax}(\text{Scaled Scores}) Weightssoftmax(Scaled Scores) Softmax函数被独立地应用于分数矩阵的每一行。它将每一行的分数转换成一个和为1的概率分布。这个结果我们称之为注意力权重矩阵它的形状仍然是 (序列长度, 序列长度)。矩阵的第 i i i 行现在表示第 i i i 个词应该将多少比例的“注意力”分配给序列中的每一个词。
Step 4: 加权求和 Output Weights ⋅ V \text{Output} \text{Weights} \cdot V OutputWeights⋅V 最后我们将注意力权重矩阵与Value矩阵 V V V 相乘。
Weights 的形状是 (序列长度, 序列长度)。 V V V 的形状是 (序列长度, d v d_v dv)。通常 d v d k d_vd_k dvdk最终输出 Output 的形状是 (序列长度, d v d_v dv)。
这一步的本质是对于输出序列中的每一个位置 i i i其对应的输出向量是所有输入向量的Value的加权平均而权重就是由第 i i i 个Query和所有Key计算出的注意力权重。 这个流程图用纯粹的矩阵运算完整地展示了自注意力机制的计算过程。整个过程没有任何循环和递归所有计算都可以大规模并行这正是它相比RNN的巨大优势。
第三部分规模的挑战 —— LLM时代的线性代数
自注意力机制虽然强大但它的核心计算 Q K T QK^T QKT 带来了巨大的计算和内存开销其复杂度是序列长度的平方即 O ( n 2 ) O(n^2) O(n2)。当序列长度 n n n 达到数千甚至数万时LLM处理长文档的场景这会成为一个难以承受的瓶颈。
此外LLM的参数量动辄千亿单个权重矩阵如 W Q W_Q WQ可能就大到无法装入单个GPU的显存中。这些规模上的挑战催生了一系列基于线性代数的优化技术。
多头注意力从不同角度审视关系
单个自注意力机制可能会让模型只学会关注一种特定类型的关系例如只关注语法上的主谓关系。为了让模型能够同时关注来自不同“表示子空间”的信息Transformer引入了多头注意力Multi-Head Attention。
其思想非常直接
将原始的 W Q , W K , W V W_Q, W_K, W_V WQ,WK,WV 矩阵拆分成 h h h 组 h h h 是头的数量例如12更小的矩阵 W Q 1 , … , W Q h W_Q^1, \dots, W_Q^h WQ1,…,WQh; W K 1 , … , W K h W_K^1, \dots, W_K^h WK1,…,WKh; W V 1 , … , W V h W_V^1, \dots, W_V^h WV1,…,WVh。并行地执行 h h h 次独立的自注意力计算得到 h h h 个不同的输出矩阵 O u t p u t 1 , … , O u t p u t h Output_1, \dots, Output_h Output1,…,Outputh。每一个输出被称为一个“头”。将这 h h h 个头的输出拼接Concatenate在一起然后通过一个新的可学习权重矩阵 W O W_O WO 进行线性变换将它们融合起来并恢复到原始的 d m o d e l d_{model} dmodel 维度。
多头注意力允许模型在不同的“表示子空间”中并行地学习不同类型的词间关系。一个头可能学习句法关系另一个头可能学习语义关系还有一个头可能学习指代关系。这极大地增强了模型的表达能力。从线性代数的角度看这本质上是在并行地执行多组小规模的矩阵运算是分布式线性代数思想的体现。
KV缓存为推理加速的线性代数智慧
在LLM进行文本生成推理时它是一个自回归的过程生成一个词然后将这个词作为新的输入再生成下一个词。
假设模型已经生成了 t t t 个词现在要生成第 t 1 t1 t1 个词。在计算自注意力时第 t 1 t1 t1 个词的Query需要与前面所有 t t t 个词的Key和Value进行计算。在下一步生成第 t 2 t2 t2 个词时它的Query又需要和前面 t 1 t1 t1 个词的Key和Value计算。
我们注意到对于已经生成的词它们的Key和Value向量是不会改变的。如果我们每次都重新计算所有词的K和V会造成巨大的浪费。
KV缓存KV Cache 就是为了解决这个问题。在每一步生成后我们将当前步计算出的Key和Value向量缓存起来。在下一步我们只需要为新生成的词计算其自身的K和V然后将它们追加到缓存的K和V矩阵后面即可。 这个序列图展示了KV缓存的工作原理。通过缓存并重复利用之前计算好的Key和Value矩阵KV缓存将每次推理的计算量从 O ( n 2 ) O(n^2) O(n2) 降低到了 O ( n ) O(n) O(n)只与当前步和序列总长度相关极大地提升了LLM的生成速度。这是对自注意力线性代数过程深刻理解后才能产生的绝妙优化。
模型并行化与低秩近似
模型并行化当LLM的权重矩阵如 W Q W_Q WQ大到单个GPU无法容纳时就需要分布式线性代数。例如张量并行Tensor Parallelism 会将一个巨大的矩阵乘法 Y X A YXA YXA 切分到多个GPU上。例如将矩阵 A A A 按列切分 A [ A 1 , A 2 ] A [A_1, A_2] A[A1,A2]那么 Y [ X A 1 , X A 2 ] Y[XA_1, XA_2] Y[XA1,XA2]可以让GPU1计算 X A 1 XA_1 XA1GPU2计算 X A 2 XA_2 XA2最后再将结果拼接起来。这使得训练千亿参数模型成为可能。低秩近似为了解决 O ( n 2 ) O(n^2) O(n2) 的复杂度问题研究者们发现注意力矩阵通常是低秩的Low-Rank即它的大部分信息可以被少数几个奇异值所捕获。这意味着我们或许不需要计算完整的 Q K T QK^T QKT 矩阵而是可以通过一些技巧如Linformer, Performer等来近似它从而将复杂度降低到 O ( n ) O(n) O(n)。这直接应用了我们在第一阶段学习的奇异值分解SVD和低秩近似的思想。
融会贯通线性代数LLM的第一语言
今天我们从RNN的困境出发见证了自注意力机制的诞生并用线性代数的“手术刀”将其解剖得淋漓尽致。我们看到这个驱动了整个LLM革命的强大引擎其本质就是一场超大规模的、精心编排的矩阵运算。
嵌入表示是词语在向量空间中的“坐标”。线性变换 ( W Q , W K , W V W_Q, W_K, W_V WQ,WK,WV)是将输入投影到不同功能子空间的“透镜”。矩阵乘法 ( Q K T QK^T QKT 和 Weights ⋅ V \text{Weights} \cdot V Weights⋅V)是实现信息交互和聚合的“万能胶水”。分布式线性代数和KV缓存则是将这套理论在巨大规模上付诸实践的“工程奇迹”。
线性代数不再仅仅是我们在第一阶段学习的用于数据表示和降维的基础工具。在LLM时代它已经成为了模型架构本身的核心语言。理解了自注意力机制中的线性代数就等于拿到了打开Transformer黑盒的第一把钥匙。
接下来我们将继续我们的LLM探索之旅。我们将看到概率论是如何指导LLM进行文本生成的优化理论是如何支撑千亿参数模型的稳定训练的而我们今天建立的对自注意力机制的理解将贯穿始终。 习题
第1题维度计算 在一个标准的自注意力模块中假设输入序列长度为100嵌入维度 d m o d e l d_{model} dmodel 为512Q、K、V的投影维度 d k d_k dk 和 d v d_v dv 均为64。请问在计算完 Q K T QK^T QKT 之后得到的注意力分数矩阵的形状是什么
第2题多头注意力的目的 为什么Transformer模型要使用多头注意力Multi-Head Attention而不是单一的、更大维度的自注意力其主要目的是什么 A. 为了减少总的计算量。 B. 为了让模型能够并行地从不同的表示子空间中学习信息。 C. 为了解决梯度消失问题。 D. 为了能够处理更长的序列。
第3题KV缓存的应用场景 KV缓存技术主要在哪种场景下发挥巨大作用为什么 A. 在模型训练Training时因为可以减少每个epoch的时间。 B. 在模型推理Inference进行文本生成时因为可以避免对过去token的Key和Value进行重复计算。 C. 在模型进行微调Fine-tuning时因为可以冻结部分参数。 D. 在计算注意力分数矩阵时用来缓存 Q K T QK^T QKT 的结果。 答案
第1. 答案 形状是 (100, 100)。
输入矩阵 X X X 的形状是 (100, 512)。经过 W Q W_Q WQ 和 W K W_K WK形状为512x64投影后Q和K矩阵的形状都是 (100, 64)。 K K K 的转置 K T K^T KT 的形状是 (64, 100)。 Q ⋅ K T Q \cdot K^T Q⋅KT 的矩阵乘法结果形状是 (100, 64) (64, 100) (100, 100)。这个矩阵的维度只与序列长度有关与嵌入维度无关。
第2. 答案B 多头注意力的总计算量与单头注意力大致相当因为每个头的维度减小了。它并不能直接解决梯度消失问题或处理更长的序列复杂度依然是平方级。其核心设计思想是分而治之让不同的头关注不同方面的信息例如句法、语义等就像让一个专家委员会从不同角度分析问题一样从而增强模型的表达能力。因此B是正确的。
第3. 答案B KV缓存是一种推理时Inference-time 的优化。在训练时整个序列是已知的模型并行地处理所有token因此不存在“过去”和“未来”的token无法使用KV缓存。在自回归的文本生成任务中模型逐个token生成文本每一步都会在前一步的基础上进行。此时前面所有token的Key和Value是固定不变的缓存它们可以避免大量的重复计算极大地提高生成效率。因此B是正确的。