从反向传播看 QKV:注意力只是计算图里的几个节点

Transformer QKV计算图手绘指南:从矩阵维度到缩放点积原理 Transformer中的Self-Attention是现代大模型的核心机制,其本质是一种基于向量相似度的动态信息检索过程。它通过Query、Key、Value三组线性变换,在同一语义空间中构建‘查询-匹配-获取’的信息流动路径;缩放点积(除以√dₖ)源于点积结果的方差控制,防止softmax饱和导致注意力稀疏化,保障梯度稳定与多意图建模能力。该机制支撑了长程依赖建模、并行化训练与高效推理等关键技术价值,在机器翻译、文本摘要、对话生成等序列到序列任务中发挥基础作用。本文聚焦QKV的物理意义、维度流与可调试实 阅读详情

从反向传播看 QKV:注意力只是计算图里的几个节点

一句话版:继续沿用上一篇《反向传播通关指南》的框架——“每层只管局部导数,剩下的交给链式法则连乘”。Q、K、V 在结构上就是三个 Linear 层(也就是上一篇那块最熟悉的积木 y=wx+by=wx+by=wx+b,只是放大成了矩阵);attention 本身只是计算图里多出来的几个节点(矩阵乘 → 缩放 → softmax → 矩阵乘),每个节点照旧只有一个局部导数。真正神奇的地方在于:Q/K/V 的"语义角色"不是写死的,而是反向传播把梯度推了几万步之后"涌现"出来的。

前置阅读:blog_backprop.md(反向传播 + autograd + minidnn)。
配套:transformer_architecture.md(Transformer 整体架构、KV Cache、硬件视角)。

适合读者:已经看懂反向传播(“三块积木 + 链式法则 + 计算图”),想从"训练/梯度"的角度而不是只看公式的角度理解 QKV 的人。
你将收获:一套"QKV 不神秘"的心智模型、一组算到底的具体数字(前向 + 反向)、以及一个能解释"为什么 Q/K/V 会变得有用"的关键洞察。


0. 前置:只靠反向传播文章的三个结论

从 blog_backprop.md 里带走三句话,后面全靠它们:

  1. 导数 = 谁影响谁:反向传播只关心相邻两层,每段当成单变量求导,然后连乘。
  2. 三块积木:线性层 y=wx+by=wx+by=wx+b、激活层 a=tanh⁡(z)a=\tanh(z)a=tanh(z)、损失 L=(out−y)2L=(out-y)^2L=(out−y)2——任何网络都能用它们拼出来。
  3. autograd = 链式法则 × 计算图:前向时每个运算记成一个节点(值 + 输入 + 反向函数),反向时按拓扑序倒着遍历、逐个调用反向函数。loss.backward() 和 175B 参数的大模型,机制完全一样。

本文要做的只有一件事:把第 2 条"积木"和第 3 条"计算图",原封不动地搬到 attention 上。


1. 结构上:QKV 就是三个 Linear 层

先复习上一篇的第一块积木:

y=wx+b⟹∂y∂w=x,∂y∂b=1,∂y∂x=wy = wx + b \qquad\Longrightarrow\qquad \frac{\partial y}{\partial w}=x,\quad \frac{\partial y}{\partial b}=1,\quad \frac{\partial y}{\partial x}=wy=wx+b⟹∂w∂y​=x,∂b∂y​=1,∂x∂y​=w

而 attention 的三个投影,数学形式一模一样:

Q=XWQ,K=XWK,V=XWVQ = XW_Q,\qquad K = XW_K,\qquad V = XW_VQ=XWQ​,K=XWK​,V=XWV​

其中 X∈RL×dmodelX \in \mathbb{R}^{L\times d_{model}}X∈RL×dmodel​(LLL 个 token,每行一个 token 的向量),WQ/WK/WV∈Rdmodel×dheadW_Q/W_K/W_V \in \mathbb{R}^{d_{model}\times d_{head}}WQ​/WK​/WV​∈Rdmodel​×dhead​ 是三个独立的参数矩阵。

所以局部导数可以直接照抄上一篇的速查表,只是把标量乘法换成矩阵乘法(GEMM)——这正是 blog_backprop.md 第 4 节预告的"标量 → 矩阵,导数同一套":

上一篇(标量/向量)Q/K/V 版(矩阵)
dW=X⊤dZdW = X^\top dZdW=X⊤dZdWQ=X⊤dQ,dWK=X⊤dK,dWV=X⊤dVdW_Q = X^\top dQ,\quad dW_K = X^\top dK,\quad dW_V = X^\top dVdWQ​=X⊤dQ,dWK​=X⊤dK,dWV​=X⊤dV
dX=dZ W⊤dX = dZ\,W^\topdX=dZW⊤dXQ=dQ WQ⊤dX_Q = dQ\,W_Q^\topdXQ​=dQWQ⊤​(Q 这一路)
db=∑ndZdb = \sum_n dZdb=∑n​dZdbQ=∑ndQdb_Q = \sum_n dQdbQ​=∑n​dQ(K、V 同理)

结论 1(本节核心):W_Q / W_K / W_V 和你手写的 W1 / W2 没有任何本质区别——它们都是"要更新的参数",更新规则都是

W←W−η ∂L∂WW \leftarrow W - \eta\,\frac{\partial L}{\partial W}W←W−η∂W∂L​

Q/K/V 的名字(query/key/value)不是结构决定的,是用途决定的。结构上,它们只是三个并排的 Linear 层,从同一份输入 XXX 出发、各自线性投影到 dheadd_{head}dhead​ 维。

注意力引擎

输入 X (L×d)

Q = XW_Q
(Linear)

K = XW_K
(Linear)

V = XW_V
(Linear)

QKᵀ / √d

softmax

P·V

输出投影

上图中,带参数(要训练)的只有三个 Linear 和最后的输出投影;中间的 QKᵀ、√d、softmax、P·V 都是无参数节点——它们只是负责"怎么组合信息",本身没有权重可更新。


2. 一个具体数字例子:前向算到底

为了把"只是几个节点"落到实处,照抄上一篇"拿真实数字从头算"的风格。设 2 个 token、d=2d=2d=2:

X=[1234],WQ=[0.5−110.5],WK=[1001],WV=[0.5001]X=\begin{bmatrix}1&2\\3&4\end{bmatrix},\qquad W_Q=\begin{bmatrix}0.5&-1\\1&0.5\end{bmatrix},\qquad W_K=\begin{bmatrix}1&0\\0&1\end{bmatrix},\qquad W_V=\begin{bmatrix}0.5&0\\0&1\end{bmatrix}X=[13​24​],WQ​=[0.51​−10.5​],WK​=[10​01​],WV​=[0.50​01​]

① 三次投影(就是三个 Linear 前向)

Q=XWQ=[2.505.5−1],K=XWK=[1234],V=XWV=[0.521.54]Q = XW_Q = \begin{bmatrix}2.5&0\\5.5&-1\end{bmatrix},\qquad K = XW_K = \begin{bmatrix}1&2\\3&4\end{bmatrix},\qquad V = XW_V = \begin{bmatrix}0.5&2\\1.5&4\end{bmatrix}Q=XWQ​=[2.55.5​0−1​],K=XWK​=[13​24​],V=XWV​=[0.51.5​24​]

② 匹配打分:S=QK⊤/dS = QK^\top / \sqrt{d}S=QK⊤/d​

这里的上标 ⊤^\top⊤ 是转置(不是逆):把 KKK 沿主对角线翻转、行变列,好让 QQQ 的第 iii 行能和 KKK 的第 jjj 行对齐做内积。

K=[1234]  ⇒  K⊤=[1324]K = \begin{bmatrix}1&2\\3&4\end{bmatrix} \;\Rightarrow\; K^\top = \begin{bmatrix}1&3\\2&4\end{bmatrix}K=[13​24​]⇒K⊤=[12​34​]

矩阵乘法是"行 × 列,对应相乘再相加",逐个元素算:

QK⊤=[2.505.5−1][1324]=[2.5×1+0×22.5×3+0×45.5×1+(−1)×25.5×3+(−1)×4]=[2.57.53.512.5]QK^\top = \begin{bmatrix}2.5&0\\5.5&-1\end{bmatrix}\begin{bmatrix}1&3\\2&4\end{bmatrix} = \begin{bmatrix} 2.5\times1+0\times2 & 2.5\times3+0\times4\\ 5.5\times1+(-1)\times2 & 5.5\times3+(-1)\times4 \end{bmatrix} = \begin{bmatrix}2.5&7.5\\3.5&12.5\end{bmatrix}QK⊤=[2.55.5​0−1​][12​34​]=[2.5×1+0×25.5×1+(−1)×2​2.5×3+0×45.5×3+(−1)×4​]=[2.53.5​7.512.5​]

再除以 d=2\sqrt{d}=\sqrt2d​=2​ 防止数值爆炸:

S=QK⊤2=[1.775.302.478.84]S = \frac{QK^\top}{\sqrt2} = \begin{bmatrix}1.77&5.30\\2.47&8.84\end{bmatrix}S=2​QK⊤​=[1.772.47​5.308.84​]

SijS_{ij}Sij​ 的含义:第 iii 个 token 的 query 与第 jjj 个 token 的 key 的匹配度(内积越大越"像")。比如 S12=7.5S_{12}=7.5S12​=7.5:token 1 的 query [2.5, 0][2.5,\,0][2.5,0] 和 token 2 的 key [3, 4][3,\,4][3,4] 内积 =2.5×3+0×4=7.5=2.5\times3+0\times4=7.5=2.5×3+0×4=7.5,远大于它和自己 key 的内积 2.5×1+0×2=2.52.5\times1+0\times2=2.52.5×1+0×2=2.5。

③ softmax 归一化:P=softmax(S)P = \mathrm{softmax}(S)P=softmax(S)(按行)

P=[0.0280.9720.0020.998]P = \begin{bmatrix}0.028&0.972\\0.002&0.998\end{bmatrix}P=[0.0280.002​0.9720.998​]

softmax 就是"先指数、再按行归一化",拿第 1 行 [1.77, 5.30][1.77,\,5.30][1.77,5.30] 算一遍:

e1.77=5.87,e5.30=200.3,分母=5.87+200.3=206.2e^{1.77}=5.87,\qquad e^{5.30}=200.3,\qquad \text{分母}=5.87+200.3=206.2e1.77=5.87,e5.30=200.3,分母=5.87+200.3=206.2

P11=5.87206.2≈0.028,P12=200.3206.2≈0.972P_{11}=\frac{5.87}{206.2}\approx0.028,\qquad P_{12}=\frac{200.3}{206.2}\approx0.972P11​=206.25.87​≈0.028,P12​=206.2200.3​≈0.972

读法:第 iii 行 = 第 iii 个 token 注意所有 token 的权重,每行加起来等于 1。上面这组数表明:token 2 几乎只注意自己(0.998),token 1 则主要注意 token 2(0.972)——这就是"注意力"这个名字的来源:不是所有 token 平均看待,而是按相关性加权。

④ 加权求和:O=PVO = PVO=PV(输出是 V 的加权平均,权重就是 softmax 那一行)

O=PV=[0.0280.9720.0020.998][0.521.54]=[1.4723.9431.4983.997]O = PV = \begin{bmatrix}0.028&0.972\\0.002&0.998\end{bmatrix}\begin{bmatrix}0.5&2\\1.5&4\end{bmatrix} = \begin{bmatrix}1.472&3.943\\1.498&3.997\end{bmatrix}O=PV=[0.0280.002​0.9720.998​][0.51.5​24​]=[1.4721.498​3.9433.997​]

还是"行 × 列":OOO 的每个元素 = PPP 的一行与 VVV 的一列点积。比如第 1 行第 1 列:

O00=0.028×0.5+0.972×1.5=1.472O_{00} = 0.028\times0.5 + 0.972\times1.5 = 1.472O00​=0.028×0.5+0.972×1.5=1.472

——token 1 的输出 = 把自己对 token 2 的 V 拿大头(0.972),混上自己的一小部分(0.028)。

一句话直觉:Q 说"我在找什么",K 说"我身上有什么标签",两者内积 = 匹配度;softmax 把匹配度变成权重;V 说"我能提供什么内容";最后按权重把 V 加权求和 = 按匹配度收集信息。


3. 反向传播穿过 attention:也只是几个局部导数

上一篇的灵魂是"每个运算 = 一个节点 + 一个存好的反向函数"。attention 拆开就是 5 个节点,每个节点都有现成的局部导数:

节点前向反向要算的局部导数
缩放内积S=QK⊤/dS = QK^\top/\sqrt{d}S=QK⊤/d​dQ=(dS/d) K,dK=(dS/d)⊤QdQ = (dS/\sqrt{d})\,K,\quad dK = (dS/\sqrt{d})^\top QdQ=(dS/d​)K,dK=(dS/d​)⊤Q
softmaxP=softmax(S)P = \mathrm{softmax}(S)P=softmax(S)dS=P⊙(dP−1 (P⊤dP))dS = P\odot\big(dP - \mathbf{1}\,(P^\top dP)\big)dS=P⊙(dP−1(P⊤dP))
加权求和O=PVO = PVO=PVdP=dO V⊤,dV=P⊤dOdP = dO\,V^\top,\quad dV = P^\top dOdP=dOV⊤,dV=P⊤dO

再往后,dQ,dK,dVdQ,dK,dVdQ,dK,dV 各自流进自己的 Linear,用第 1 节那张表(dWQ=X⊤dQdW_Q = X^\top dQdWQ​=X⊤dQ 等)把梯度累积到 W_Q / W_K / W_V 上,W_K 还要额外累积到 XXX(dXK=dK WK⊤dX_K = dK\,W_K^\topdXK​=dKWK⊤​),因为 XXX 同时被三路共享。

注意 softmax 的反向长这样、而不是"每个元素除一下就完事"——因为 softmax 的每个输出 PijP_{ij}Pij​ 依赖同一行所有输入 SikS_{ik}Sik​(分母是整行求和)。但这也只是一个局部导数,公式查表即可,和 tanh⁡\tanhtanh 的 1−a21-a^21−a2 地位相同。

用第 2 节那组数字,把反向也走一遍。设损失只关心 OOO 的 (0,0)(0,0)(0,0) 元素,L=(O00−2)2L = (O_{00} - 2)^2L=(O00​−2)2,于是

dO=∂L∂O=[2(1.472−2)000]=[−1.057000]dO = \frac{\partial L}{\partial O} = \begin{bmatrix}2(1.472-2)&0\\0&0\end{bmatrix} = \begin{bmatrix}-1.057&0\\0&0\end{bmatrix}dO=∂O∂L​=[2(1.472−2)0​00​]=[−1.0570​00​]

从 dOdOdO 往回,每一步只算"局部斜率"(对照第 1 节的表逐项代入):

节点局部导数代入结果
O=PVO=PVO=PV → VVVdV=P⊤dOdV = P^\top dOdV=P⊤dOdV=[−0.0300−1.0270]dV = \begin{bmatrix}-0.030&0\\-1.027&0\end{bmatrix}dV=[−0.030−1.027​00​]
O=PVO=PVO=PV → PPPdP=dO V⊤dP = dO\,V^\topdP=dOV⊤dP=[−0.528−1.58500]dP = \begin{bmatrix}-0.528&-1.585\\0&0\end{bmatrix}dP=[−0.5280​−1.5850​]
softmaxdS=P⊙(dP−1(P⊤dP))dS = P\odot(dP - \mathbf{1}(P^\top dP))dS=P⊙(dP−1(P⊤dP))dS=[+0.029−0.02900]dS = \begin{bmatrix}+0.029&-0.029\\0&0\end{bmatrix}dS=[+0.0290​−0.0290​]
QK⊤/dQK^\top/\sqrt{d}QK⊤/d​ → QQQdQ=(dS/d) KdQ = (dS/\sqrt{d})\,KdQ=(dS/d​)KdQ=[−0.041−0.04100]dQ = \begin{bmatrix}-0.041&-0.041\\0&0\end{bmatrix}dQ=[−0.0410​−0.0410​]
QK⊤/dQK^\top/\sqrt{d}QK⊤/d​ → KKKdK=(dS/d)⊤QdK = (dS/\sqrt{d})^\top QdK=(dS/d​)⊤QdK=[0.0510−0.0510]dK = \begin{bmatrix}0.051&0\\-0.051&0\end{bmatrix}dK=[0.051−0.051​00​]

再各走一步就到权重(三个 Linear 的局部导数):

dWV=X⊤dV=[−3.1100−4.1670],dWQ=X⊤dQ=[−0.041−0.041−0.082−0.082],dWK=X⊤dK=[−0.1030−0.1030]dW_V = X^\top dV = \begin{bmatrix}-3.110&0\\-4.167&0\end{bmatrix},\qquad dW_Q = X^\top dQ = \begin{bmatrix}-0.041&-0.041\\-0.082&-0.082\end{bmatrix},\qquad dW_K = X^\top dK = \begin{bmatrix}-0.103&0\\-0.103&0\end{bmatrix}dWV​=X⊤dV=[−3.110−4.167​00​],dWQ​=X⊤dQ=[−0.041−0.082​−0.041−0.082​],dWK​=X⊤dK=[−0.103−0.103​00​]

然后和上一篇一模一样:W←W−η dWW \leftarrow W - \eta\,dWW←W−ηdW,梯度下降一步,损失下降,循环。

这个结果你也可以像上一篇第 4 节那样,用"数值梯度验证"(有限差分)复核——softmax 和注意力处处可导,两条独立路径应该对得上。整个 attention 路径上没有任何需要"特判"的魔法。


4. 关键洞察:Q/K/V 的角色是梯度"训练"出来的

这是从反向传播视角看 QKV 最大的收获。回到上一篇第 2 节:训练 = 反复问 ∂L/∂W\partial L/\partial W∂L/∂W,然后更新。

  • 初始时刻:W_Q / W_K / W_V 是随机数,此时注意力模式(PPP)毫无规律,softmax 近似均匀分布——所有 token 平均注意,等于没注意。
  • 每一轮:前向算出 LLL 和 PPP;反向把梯度流回三个投影;更新 WQ,WK,WVW_Q,W_K,W_VWQ​,WK​,WV​。
  • 梯度在"教"它们什么:损失 LLL 隐含着"这个位置该参考哪些位置的信息"(比如"it"后面应该参考"the cat")。梯度 ∂L/∂WQ\partial L/\partial W_Q∂L/∂WQ​ 就朝能产生这种注意力模式的方向去推投影权重。
  • 几万步之后:WQW_QWQ​ 学会了"提出对的查询",WKW_KWK​ 学会了"给出对的标签",WVW_VWV​ 学会了"给出有用的内容"。

所以 Q/K/V 不是被谁"设计"成 query/key/value 的——是反向传播把这三个普通参数矩阵训练成了有这个分工。它们只是三个并排的 Linear 层,只是恰好处在"匹配"(QKᵀ)和"取值"(×V)这两个运算的两侧,于是梯度就把语义装进了它们。

注意力模式逐渐从'均匀'变成'有选择'

随机初始化
W_Q W_K W_V

前向:算出注意力 P 和损失 L

反向:梯度流回
dW_Q dW_K dW_V

更新:W ← W − η·dW

最终:Q 会找、K 会给标签、V 会给内容
(角色涌现)

这和你上一篇"梯度是负的 → 说明 w1w_1w1​ 该变大"是同一件事:梯度不解释语义,但它会找到让损失下降的方向。attention 只是让这条方向里多了一类"选择性组合"的算子。


5. 为什么是 QKV 这种结构?(还有别的吗)

一句话版:QKV 不是唯一可能的结构,而是"选择性收集信息"这个需求下,表达能力 × 可训练性 × 硬件速度三者权衡的产物。想知道它好在哪,最好的办法是想象"去掉 Q"或"去掉 V"会退化到什么程度——那正是其它结构存在的理由。

5.1 先看需求:attention 要解决两个子问题

每个 token 输出时要做两件不同的事:

  1. 决定"该参考谁、参考多少" —— 匹配/打分(对应 Q⋅KQ\cdot KQ⋅K);
  2. 把参考对象的"内容"拿过来 —— 取值/收集(对应 ×V\times V×V)。

所以结构天生需要两条不同的信息通道:一条管"谁重要"(Q/K),一条管"给什么内容"(V)。

5.2 Q 和 K 为什么要分开:匹配必须是非对称的

看打分矩阵 Sij=Qi⋅KjS_{ij} = Q_i \cdot K_jSij​=Qi​⋅Kj​:SijS_{ij}Sij​(i 问 j)和 SjiS_{ji}Sji​(j 问 i)相互独立、可以不一样——语言正是这样(词序、方向、主谓宾角色都带着方向性)。

如果不用 Q/K 分开,直接用输入自己打分 S=XX⊤S = XX^\topS=XX⊤:

  • 对称:Sij=SjiS_{ij} = S_{ji}Sij​=Sji​,注意力方向无法区分;
  • 对角占优:自己和自己的内积最大,softmax 后每行几乎只注意自己 → 退化成"没注意别人";
  • 不可学习:XX⊤XX^\topXX⊤ 没有可训练参数,学不出"该找谁"。

而 Q=XWQ, K=XWKQ = XW_Q,\ K = XW_KQ=XWQ​, K=XWK​ 是两个独立可训练的投影,等于给每个 token 两顶帽子:“我想找什么”(Q) 和 “我身上有什么标签”(K)。一个 token 可以"自己想要猫",但"身上贴着狗",别人就能按"狗"这个标签找到它——这正是第 4 节"角色由梯度训练出来"的落点。

5.3 V 为什么要单独:匹配和内容是两种职责

V=XWVV = XW_VV=XWV​ 让"哪些位置值得被看"(由 SSS 决定)和"这些位置实际提供什么"(由 VVV 决定)解耦:

  • 一个 token 可以"特别显眼、被大家注意"(K 有强标签),但实际内容(V)是另一套向量;
  • 没有 V、直接用输入加权(O=PXO = PXO=PX)也能做,但"被注意的资格"和"携带的内容"被迫共用同一个向量,互相牵制、表达能力受限。

加权求和 O=PVO = PVO=PV 本质上是一个可学习的"软查表":先定位(Q/K),再取值(V)。

5.4 其它结构真的存在

结构打分方式优点缺点
QKV(本文)QK⊤/d→softmaxQK^\top/\sqrt d \to \mathrm{softmax}QK⊤/d​→softmax非对称、可学习、一个 GEMM 搞定、GPU 极快O(L²) 复杂度;三次投影的参数开销
加性注意力(Bahdanau)v⊤tanh⁡(W1hi+W2sj)v^\top\tanh(W_1 h_i + W_2 s_j)v⊤tanh(W1​hi​+W2​sj​)早年主流、灵活不是纯矩阵乘,硬件不友好、慢
无投影自相似XX⊤XX^\topXX⊤零参数、最省对称、对角占优、不可学习(退化)
线性注意力ϕ(Q)ϕ(K)⊤\phi(Q)\phi(K)^\topϕ(Q)ϕ(K)⊤(去掉 softmax)可结合律 → O(L) 复杂度表达不了尖锐的"赢者通吃"
MQA / GQA多头之间共享 K/VKV Cache 省内存、推理快每头表达能力略降

QKV 选的是点积(乘性)注意力这一支:矩阵乘 = GEMM = 硬件最爱,加 d\sqrt dd​ 缩放是为了数值稳定。

5.5 优劣势清单

优势

  • 非对称匹配 → 能表达方向性、词序、角色关系;
  • Q/K/V 三个独立投影 → 梯度能分别"教"它们扮演不同角色(呼应第 4 节);
  • 结构统一 → 自注意力、跨注意力(Q 来自序列 A,K/V 来自序列 B)、多头,都只是改输入;
  • 计算全是矩阵乘,GPU 友好。

代价

  • 三次投影:输入 ddd 维 → 3 个 d×dd\times dd×d 投影,参数和算力不便宜;
  • O(L²) 的注意力矩阵:序列一长就爆炸,所以才有 FlashAttention、稀疏/线性注意力、GQA 等后续改造;
  • 结构假定了"匹配 → 收集"这个配方是对的;位置信息要另加位置编码(RoPE 等);
  • 超参数多(dheadd_{head}dhead​、nheadsn_{heads}nheads​…),调起来麻烦。

一句话直觉:Q 负责问、K 负责被找到、V 负责给内容。想验证这个设计值钱在哪,就试着"去掉 Q"或"去掉 V",看它会退化到什么程度——那是替代结构存在的理由。


6. 主流开源模型在这个基础上升级了什么?

一句话版:从 2017 到现在的旗舰开源模型(Llama、Mistral、Qwen、DeepSeek…),没有推翻 QKV,而是围着它的几个痛点做手术——O(L²) 复杂度、位置编码、KV Cache 内存、数值稳定。你学会的这套前向 + 反向,换上它们的"外壳"后依然成立。

6.1 先给一张总览:痛点 → 主流解法

博客里的痛点(第 5.5 节)主流开源模型的解法
O(L²) 的注意力矩阵FlashAttention、滑动窗口、稀疏注意力、线性注意力
位置信息要另加编码RoPE(旋转位置编码)+ YaRN/NTK 长上下文缩放
三次投影 / KV 开销大KV Cache、MQA → GQA、DeepSeek 的 MLA
d\sqrt dd​ 只能粗略压内积QK-Norm(对 Q、K 先归一化)
单头表达能力有限多头 + GQA 分组(本质还是那套 QKV)

6.2 推理内存:GQA 是默认项,MLA 更进一步

  • KV Cache:生成时把历史 K/V 存下来、不重算——推理标配。
  • MQA / GQA(Llama 2/3、Mistral、Qwen):多头之间共享 K/V(GQA 是每 ggg 个头一组共享),KV Cache 大幅缩小。打分逻辑 QK⊤QK^\topQK⊤ 完全不变,只是 K/V 的头数变少了。
  • MLA(DeepSeek-V2/V3):把 K/V 先压进一个低维"潜向量",用的时候再展开,KV Cache 缩到约 1/10。等于"KV 也加了个瓶颈层"。

6.3 位置编码:RoPE 取代正弦/绝对位置

  • RoPE(旋转位置编码):把位置信息旋转进 Q/K 的内积——QQQ、KKK 各乘一个随位置旋转的矩阵,内积天然带"相对位置"。现在开源旗舰几乎全套用它(呼应第 5.5 节"位置要另加编码",它就是那个答案)。
  • 长上下文:RoPE 不能无限外推,于是有 YaRN、NTK 缩放、dynamic RoPE——训练 4K 的模型推理能撑到 128K+。

6.4 复杂度 O(L²):软硬兼施

  • FlashAttention(工程层,不改模型):不把 L×LL\times LL×L 矩阵物化到显存,分块算 + 反向重算,速度显存双赢。PyTorch 的 sdpa 默认就是它。
  • 滑动窗口(Mistral):每 token 只看附近窗口,外加少量全局层。
  • 稀疏注意力(DeepSeek-V3.2 / NSA):对打分做 top-k 选择,只算重要的那部分——就是第 5.4 节表格里"稀疏/线性注意力"那一行,现在真落地了。

6.5 数值稳定与结构级创新

  • QK-Norm(Qwen3、Gemma 2):算 QK⊤QK^\topQK⊤ 之前先对 Q、K 做归一化——比 d\sqrt dd​ 更彻底地控制内积尺度(第 2 节那个 d\sqrt dd​ 的进阶版)。
  • 模型块层面:Pre-norm + RMSNorm + SwiGLU(Llama 系)已成新基线,但不动 attention 本身。
  • MoE(DeepSeek-V3、Mixtral):换的是 FFN(专家路由),attention 还是普通 GQA/MLA——QKV 这块地基至今没人推翻。
  • Hybrid(Jamba):attention 与状态空间模型(Mamba)交替堆叠,长序列便宜、短序列精确。
  • MTP(DeepSeek-V3):一次预测多个下一个 token,纯训练技巧。

一句话直觉:你刚学会的 QKV 是所有主流模型 attention 的地基;升级都发生在"地基之上"——位置怎么进(RoPE)、KV 怎么省(GQA/MLA)、L×L 怎么躲(FlashAttention/稀疏)、数值怎么稳(QK-Norm)。


7. 一张图看懂:Attention + FFN 组成一个 Transformer Block

把前 6 节拼起来看——一个 Transformer Block = 注意力子层(QKV)+ 前馈子层(FFN),两件事交替、残差相连:

① 横向:token 之间通信

② 纵向:单个 token 内部加工

FFN 前馈子层 —— 想清楚 / 存知识

W1(d → 4d)

激活
GELU / SiLU / SwiGLU

W2(4d → d)

注意力子层(QKV)—— 谁该参考谁

Q = XW_Q

S = QKᵀ/√d
打分

K = XW_K

P = softmax(S)
权重

O = P·V
加权求和

V = XW_V

输入 x(L 个 token,每行一个向量)

+ 位置编码(RoPE)

+ 残差(x + O)

归一化

+ 残差

归一化

输出 → 下一个 Block(重复 N 次)

这张图里的两个关键澄清:

  1. token 是什么:token 不是权重矩阵,而是输入数据——序列里的一个单元(一个词/子词/图像块)。XXX 的每一行就是一个 token 的向量;WQ/WK/WVW_Q/W_K/W_VWQ​/WK​/WV​(以及 FFN 的 W1,W2W_1,W_2W1​,W2​)才是权重矩阵(参数)。本文例子里 2 个 token,就是 XXX 有 2 行。
  2. 左半是本文(QKV,你已会算),右半是上一篇的 MLP(FFN):注意力负责"token 之间通信",FFN 负责"每个 token 独自加工"。整个 Transformer = 这两件事交替 N 次。

一句话:attention 决定"该听谁的",FFN 决定"听完怎么想";token 是数据(XXX 的行),QKV/FFN 里的 WWW 才是要训练的权重。

还有一个关键:图里的"+ 残差"是给梯度修的"直达高速路"。

每个子层都套着 out=x+F(x)out = x + F(x)out=x+F(x)(FFF 是 attention 或 FFN)。它存在的意义:

  • 反向时梯度至少是 1:对"加法节点"求导得 ∂out/∂x=1+∂F/∂x\partial out/\partial x = 1 + \partial F/\partial x∂out/∂x=1+∂F/∂x,那个 “111” 来自直达路——梯度能绕过子层直接传回前一层,不会随着深度连乘而消失;
  • 每层只需学"增量":最坏情况 F=0F=0F=0,输出仍是 xxx(等价恒等映射),先不掉分、再慢慢精修;
  • 所以 Transformer 能堆几十上百层:没有残差,深网梯度会消失、前面学不动(这是 ResNet 2015 的关键贡献,Transformer 全盘继承)。

一句话:attention 决定"该听谁的",FFN 决定"听完怎么想",残差决定"梯度能不能一路穿回去";token 是数据(XXX 的行),QKV/FFN 里的 WWW 才是要训练的权重。


8. 收尾:和上一篇的"下一步"接上

readme.md 第 4 节说过:把 MLP 的 W 换成 Q/K/V 投影、把 h@W 换成 softmax(QKᵀ/√d)V,attention 也只是计算图里的几个节点,反向传播完全一样自动。本文把这句话兑现了:

上一篇的 MLPTransformer 的 attention
W1, W2(2 个 Linear)W_Q, W_K, W_V + 输出投影(4 个 Linear)
z=wx+b→tanh⁡→outz=wx+b \to \tanh \to outz=wx+b→tanh→outQK⊤/d→softmax→×VQK^\top/\sqrt{d} \to \mathrm{softmax} \to \times VQK⊤/d​→softmax→×V
局部导数:dW=X⊤dZdW=X^\top dZdW=X⊤dZ同一套,加上 softmax / 矩阵乘的局部导数
训练循环:前向 → 损失 → 反向 → 更新完全一样

完整的心智模型一句话:

QKV = 你早已会算的三个 Linear 层(上一篇的第一块积木,变大了);attention = 计算图里多出的几个无参数节点(每个节点只需一个局部导数);它们的语义角色 = 梯度下降几万步之后"涌现"的结果。 你手写的 60 行 autograd,放到 attention 上一样能自动算出 ∂L/∂WQ\partial L/\partial W_Q∂L/∂WQ​。

下一步建议(呼应 readme.md 的路线图):动手写一个 attention_backprop.py 小实验——用 numpy 手写 softmax(QKᵀ/√d)V 的前向 + 反向,再用有限差分验证梯度,然后用它替换 backprop_lab.py 里的线性层,你就能亲眼看到"注意力的梯度到底从哪来"。


附:本文用到的公式速查

积木局部导数
线性层 Y=XW+bY = XW + bY=XW+bdW=X⊤dY,  db=∑ndY,  dX=dY W⊤dW = X^\top dY,\ \ db=\sum_n dY,\ \ dX = dY\,W^\topdW=X⊤dY,  db=∑n​dY,  dX=dYW⊤
缩放内积 S=QK⊤/dS = QK^\top/\sqrt{d}S=QK⊤/d​dQ=(dS/d)K,  dK=(dS/d)⊤QdQ = (dS/\sqrt{d})K,\ \ dK = (dS/\sqrt{d})^\top QdQ=(dS/d​)K,  dK=(dS/d​)⊤Q
softmax P=softmax(S)P = \mathrm{softmax}(S)P=softmax(S)dS=P⊙(dP−1(P⊤dP))dS = P\odot(dP - \mathbf{1}(P^\top dP))dS=P⊙(dP−1(P⊤dP))
加权求和 O=PVO = PVO=PVdP=dO V⊤,  dV=P⊤dOdP = dO\,V^\top,\ \ dV = P^\top dOdP=dOV⊤,  dV=P⊤dO

规则没变:每一层只管它对"直接输入"的导数,剩下的交给链式法则连乘;要更新的参数永远在分母里(∂L/∂WQ\partial L/\partial W_Q∂L/∂WQ​),分子永远是损失 LLL。

PyTorch手写注意力机制:从QKV计算到显存优化的全流程解析 注意力机制是Transformer架构的核心计算单元,本质是一种基于查询-键匹配度的动态加权聚合操作。其原理依赖点积相似度计算与缩放因子1/√dₖ的数值稳定性保障,技术价值在于实现长程依赖建模与并行化高效训练。典型应用场景包括BERT文本理解、LLaMA大语言模型推理及语音识别中的编码-解码对齐。工程落地中,QKV线性变换、mask注入时机、Softmax数值保护及多头reshape内存布局等细节,直接决定模型收敛性、显存占用与推理延迟——本文以PyTorch 2.0为基准,逐帧还原标准Scaled Dot 阅读详情

相关推荐

Transformer注意力机制:从QKV物理接口到GPU显存实操指南

Attention是现代大模型的核心计算单元,其本质并非抽象公式,而是一个具备输入输出、内存开销与硬件约束的可执行模块。理解其原理需回归计算图视角:QKV三分离保障查询意图动态性、键值解耦与梯度鲁棒性;缩放因子1/√dₖ不仅是数学归一化,更是FP16精度下防止QKᵀ溢出的关键工程设计;multi-head实现依赖张量重塑而非循环,直接受限于GPU并行架构。这些细节共同构成Attention的‘物理接口协议’,决定它能否稳定嵌入Positional Encoding、LayerNorm与FFN等周边模块。本文

weixin_31062533的博客 321

PyTorch反向传播与Transformer手撕指南:从计算图到QKV实现

反向传播是深度学习训练的基石,本质是计算图上的梯度自动传递机制;Transformer则通过Query-Key-Value三元关系建模序列依赖,其核心在于注意力权重的可微分计算与多头并行设计。理解二者需突破公式背诵,聚焦张量形状匹配、计算图构建与数值稳定性——这正是PyTorch autograd与nn.MultiheadAttention底层运作的关键。掌握梯度流向、QKV维度变换、Positional Encoding物理约束,才能真正调试模型、规避RuntimeError与梯度消失/爆炸。本文以可验证

weixin_29483277的博客 260

从零手写Transformer:代码级拆解QKV、LayerNorm与多头注意力

Transformer是现代大模型的基石架构,其核心在于通过自注意力机制实现序列元素间的动态全局关联。原理上,它摒弃RNN的时序依赖,以Query-Key-Value三元组建模语义匹配,辅以LayerNorm保障深层训练稳定性,再通过多头机制解耦不同关系粒度。技术价值体现在并行计算高效性、长程依赖建模能力及模块化可扩展性,广泛应用于机器翻译、文本分类、语音识别与视觉理解等任务。本文聚焦工程落地,将抽象公式映射到PyTorch张量操作,详解位置编码选型、残差连接顺序、mask广播陷阱等真实开发中高频踩坑点,带

weixin_29029995的博客 229

Transformer不是黑盒:详解反向传播如何更新QKV和FFN参数 | 收藏备用

本文从工程视角解析Transformer的反向传播机制。Transformer本质上仍是神经网络,通过Embedding、Multi-Head Attention和FFN等组件构建。所有Linear层(Q、K、V、O及FFN)都含有可训练参数W和b。注意力机制中的矩阵乘法、softmax等操作支持梯度传播,使整个Attention路径成为可导的链式结构。Transformer与CNN、RNN一样,通过标准的反向传播进行端到端优化,没有"魔法",只有矩阵计算和参数更新。

bugyinyin的博客 619

手写Transformer注意力机制:从QKV计算到梯度稳定实战

Transformer的注意力机制是现代大语言模型的核心组件,其本质是基于查询(Query)、键(Key)、值(Value)的相似性建模与加权聚合。理解其原理需深入缩放点积、位置编码、masking策略及梯度传播路径等关键技术环节。缩放因子√dₖ源于中心极限定理对点积方差的归一化需求,而位置编码则决定模型对绝对/相对位置的感知能力——sinusoidal编码提供外推保障,learnable embedding提升短序列收敛效率。在工程实践中,QKV权重初始化、dropout插入位置、attention ma

weixin_30660027的博客 503

深度学习基础机制:概率建模、反向传播、注意力与图网络

深度学习的核心并非不断堆叠新模型,而是概率建模、反向传播、注意力机制等可复用的底层语言。以条件分布假设推导均方误差与交叉熵,用链式法则和计算图组织梯度,再把注意力理解为按相关性加权的矩阵汇总,图神经网络则通过消息传递聚合邻居信息。掌握这些原理后,面对新架构可快速定位其损失假设、信息汇聚方式与训练配方,并在长序列建模、多任务学习、图数据分析和数值稳定、显存优化等工程场景中迁移使用。这些贯穿回归分类、Transformer与图模型的基础主线,在《Deep Learning: Foundations and Co

weixin_32597009的博客 197

Transformer 注意力机制深度剖析:从点积到多头注意力的计算图与工程实现

Transformer 注意力机制的核心是 Scaled Dot-Product Attention,其通过 Q-K-V 三元组的点积运算实现序列位置的动态关联。除以 $\sqrt{d_k}$ 的缩放操作是维持 softmax 梯度有效性的关键设计。多头注意力通过将投影空间拆分为多个低维子空间,使模型能同时捕获不同语义层面的关联模式。工程实现中需重点关注数值稳定性(使用 -inf 而非极小值做掩码)与内存效率(合并 QKV 投影、使用 contiguous 确保内存连续)。

lady_mumu的博客 1908

Linux - xarray 工具类

第三层节点直接与绿色的值绑定,若需要像数组一样通过下标访问绿色的值对象那么需要给每一个节点进行编码,这样通过根节点即可访问到具体的对象。对于未使用到的小数组不申请空间,这样只需设计一种方法将这些非连续的小数组在一个数据结构中组织在一起即可,对于这个数组结构需要具有结构紧凑并且能够快速定位到对应的小数组段上,这时候树形结构上场了。一个很大的数组必然可以由一个个小数组拼接而成,若定义一个最小粒度的数组长度,比如长度4,那么从宏观上看一个大数组就由一个个长度为4的小数组排队而成。

ymf604的专栏 1085

反向传播实战指南:梯度消失爆炸诊断与计算图调试

反向传播是深度学习模型训练的核心机制,本质是基于链式法则的责任归因过程,用于计算损失函数对各参数的梯度。其工程实现依赖计算图的精确构建与自动微分调度,直接决定梯度流动的稳定性与效率。当出现梯度消失、梯度爆炸、梯度为零或梯度不一致等异常时,往往并非算法错误,而是初始化失当、激活函数饱和、计算图污染或内存复用冲突所致。掌握梯度幅值扫描、数值微分验证、拓扑排序调试及混合精度保护等实操方法,可系统性定位并修复问题。本文聚焦反向传播在真实训练场景中的行为表征与工程干预,覆盖从MLP到Transformer的典型调试路

weixin_30509393的博客 585

声音特征提取--Demon谱分析(舰船水声)

不同频带的DEMON谱线相互之间也不一样,有的频带内会发生线谱遗失,有的频带内的线谱并不是真正的谱线。当舰船航速达到某个极限时,螺旋桨的高速旋转将产生空化噪声,由螺旋桨产生的一系列周期信号被空化噪声调制,在频域上表现为将低频的离散线谱线性搬移到较高频率噪声所处的频率周围,这些周期信号在频域是离散的线谱系列,对应舰船的轴频、叶频以及谐波频率,由于舰船辐射噪声低频部分还有其它噪声源,很难从低频段直接提取出螺旋桨产生的线谱系列,而是要先对高频段的调制信号进行解调,通过低通滤波得到信号的低频包络谱,即。

qq_52631753的博客 6506

STM32H750xx【QSPI】轮询方式读写GD25Q64E

本文详细介绍了GD25Q64E其特性、引脚定义及功能说明,重点阐述了在STM32H750平台上通过CubeMX配置QuadSPI接口的步骤,包括时钟设置、参数优化等。文章提供了完整的BSP驱动开发流程,涵盖写使能、四线模式使能、ID读取、解除保护、扇区擦除、整片擦除、页编程和数据读取等关键功能实现,并通过读写测试验证了DummyCycles参数对数据准确性的影响。

honmy18的博客 1422

Transformer从原理到实现:注意力机制、QKV与训练陷阱详解

深度学习序列建模中,Transformer已成为核心架构,其并行计算与全局注意力机制为自然语言处理等任务带来革命性突破。理解Transformer的关键在于掌握自注意力原理:通过Q(查询)、K(键)、V(值)三组向量对序列内部进行加权交互,使任意位置间的信息通路缩短为常数步长。缩放点积注意力除以根号d_k的细节、多头注意力对多子空间的并行观察、位置编码对顺序信息的补充,共同保障了模型的表达力与稳定性。在实际工程中,mask设计、warmup学习率调度、序列长度引发的显存开销等陷阱直接影响训练成败。本文从张量

weixin_30607125的博客 306

ncl泰勒图(均方根误差、标准差、相关系数)

ncl泰勒图(均方根误差、标准差、相关系数)

weixin_61281699的博客 8007

从零手搓AI工程:手写自动微分与注意力机制,告别调包

自动微分与注意力机制是AI工程的核心底层技术。自动微分通过计算图与链式法则实现梯度自动计算,是深度学习框架的基石;注意力机制则通过Query-Key-Value建模序列依赖,成为Transformer与大语言模型的基础。从零手写这些组件,能帮助开发者建立对梯度流动、张量运算和数值稳定性的工程直觉,从而在模型调试、推理优化和部署中精准定位问题。这一能力在模型训练不收敛、显存溢出或推理延迟等场景中尤为关键。本文围绕从零构建AI工程的学习路径,深入拆解自动微分引擎、全连接层、优化器及多头注意力的手写实现,并分享训

weixin_29483277的博客 264

持续集成介绍及Jenkins自动化测试部署

学习持续集成及jenkins的自动化测试部署

ouihsiad的博客 4577

MATLAB基础应用精讲-【强化学习】Actor - Critic 算法(附python代码实现)

这种架构结合了策略梯度方法(Policy - Gradient Methods)和价值函数估计方法(Value Function Estimation Methods)的优点。在强化学习中,智能体(Agent)需要通过与环境(Environment)的交互来学习最优的行为策略,以获得最大的累积奖励(Cumulative Reward)。

qq_36130719的博客 363

从计算图到梯度推导:自注意力 C++/CUDA 扩展的完整实现逻辑

<think>我们根据要求,基于给定内容生成不超过150字的文章摘要。内容是关于PyTorch生态的C++自注意力算子优化。摘要需要简洁概括项目核心、技术要点和优势。字数控制在150字以内。需要提取关键信息:纯C++基于ATen实现多头自注意力,作为PyTorch扩展,支持前后向,精度对齐,减少Python调度开销,性能提升,无侵入兼容。概括即可。注意字数。</think>本文介绍了一种PyTorch底层性能优化方案:用纯C++基于ATen框架实现多头自注意力算子,作为自定义扩展无缝接入PyTorch,完整

chen1415886044的博客 362

华为OD机试双机位C卷-水库溃坝填补(Py/Java/C/C++/Js/Go)

华为OD机试(机考)双机位C卷 【水库溃坝填补】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。水库溃坝填补。

qq_45776114的博客 2109

反向传播卡了我两周,用链式法则拆解注意力机制后我一晚就通了

从神经网络的多次放弃到真正搞懂反向传播,我花了整整两周死磕链式法则,却在一个晚上通过计算图彻底打通了注意力机制的梯度流。本文记录了从手推标量计算图到实现自注意力模型的全过程,告诉你如何借助 AWS 深度学习入门课用实验而非公式掌握反向传播,最终让文本分类准确率从 87% 跳到 93.4%。

weixin_47315004的博客 8

LLM 大模型学习必知必会系列(十一):大模型自动评估理论和实战以及大模型评估框架详解

LLM 大模型学习必知必会系列(十一):大模型自动评估理论和实战以及大模型评估框架详解

丨汀、的博客 3216

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Transformer注意力机制底层调试实战:QKV、Masking与Scaling详解

注意力机制是Transformer架构的核心计算单元,其本质是基于查询(Q)、键(K)、值(V)三者间相似性建模的加权聚合过程。原理上依赖缩放点积(Scaling)抑制方差膨胀,通过掩码(Masking)控制信息流动路径,并以多头并行提升表征鲁棒性。该技术价值在于平衡长程依赖捕获与计算效率,在机器翻译、文本生成、跨模态对齐等场景中不可替代。然而工业落地常因QKV初始化失当、mask dtype/device不一致、scaling因子误设等细节导致梯度异常、显存暴增或权重坍缩。本文聚焦可调试、可打印、可可视化

weixin_34224941的博客 417

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Attention推理优化:QKV拼接、Softmax与MatMul三算子融合实战

Transformer模型的推理性能瓶颈往往不在算力,而在访存开销与kernel启动次数。Attention计算中的QKV拼接、Softmax与MatMul三个算子,若单独执行会产生大量中间张量读写,严重消耗显存带宽。算子融合技术将多个计算步骤合并为单个CUDA kernel,让中间结果留在寄存器或共享内存中,从而显著降低访存流量。这一优化思路在LLM推理、长序列解码等场景中收益明显,尤其适合decoder自回归生成与部署优化。从三算子分离执行的痛点出发,剖析在线Softmax与流式累加的实现细节,并给出实

weixin_29062865的博客 222

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

深度学习反向传播与LoRA梯度计算全解析

反向传播是深度学习模型训练的核心机制,通过链式法则实现从输出层到输入层的梯度传递。其技术价值在于支持自动微分系统,使复杂神经网络的参数更新成为可能,广泛应用于自然语言处理、计算机视觉等领域。本文以Transformer模型为切入点,深入解析标准注意力机制和LoRA(Low-Rank Adaptation)微调技术的梯度计算原理。通过矩阵求导法则和PyTorch实现,详细展示QKV投影、残差连接等关键组件的梯度计算链路,特别剖析LoRA中低秩矩阵BA的梯度传播特性。理解这些机制能有效提升模型调试效率,解决梯度

WGH100817的博客 298

Transformer Multi-Head Attention 8头并行:从PyTorch代码看计算图与显存占用分析

本文深入解析了Transformer多头注意力机制(Multi-Head Attention)在PyTorch中的实现与显存优化策略。通过分析8头并行计算图、显存占用情况及性能瓶颈,提供了梯度检查点、混合精度训练等实用优化技巧,帮助开发者提升模型效率与部署效果。

weixin_29046611的博客 291

【Transformer专栏】Transformer架构全景与自注意力机制深度解析

本文是Transformer深度解析系列的第一篇,全面解析Transformer的整体架构与核心自注意力机制。下一篇将深入探讨编码器堆叠设计、FFN优化与训练稳定性策略。在深度学习处理序列数据的早期,循环神经网络(RNN)及其变体LSTM、GRU曾是主流选择。这些模型通过隐状态传递信息,能够处理变长序列。然而,它们存在两个根本性瓶颈:RNN在理论上可以捕获任意长度的依赖关系,但实际训练中面临的根本问题源自其计算图结构。考虑一个简单的RNN单元更新方程:ht=σ(Whht−1+Wxxt+b) h_t = \s

m0_50709695的博客 1694

手撕Transformer:从PyTorch源码级实操理解QKV与形状本质

Transformer是现代大模型的核心架构,其本质是一套基于张量运算的可微分信息处理流程。理解它不在于复现论文公式,而在于掌握输入输出的形状变换规律、QKV投影的物理意义,以及LayerNorm、残差连接等组件在数值稳定性与梯度流中的工程价值。本文以Hugging Face transformers库和PyTorch为工具,聚焦多头注意力、位置编码、前馈网络等关键模块,通过NumPy可视化、torch.profiler性能剖析、shape追踪调试等实操手段,揭示大模型内部的数据流动与内存行为。特别适合希望

weixin_30832405的博客 330
上一篇: 反向传播:从手算梯度,到手写框架,最后拿去预测房价
下一篇: 损失函数在标量和矩阵上的求导对比
inquisiter
博客等级 码龄10年 374粉丝 228原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值