LLM WIKI · 课程精读

LEARNING UNIT · 08

残差流与超连接

把普通残差、反向残差和超连接统一为可视化的前向信息流与反向梯度流。

已整理章节
10 节
单元来源
9 条视频
总时长
21:56
状态
已发布
学习位置
8 / 20
01

主题讲解 · 02:30

可视化 Hyper-Connections:聚合、分发与流间混合

学习目标

  • 找到 Hyper-Connections 在 Transformer block 中的作用位置。
  • 区分残差流扩展率、模型维度和 FFN 中间维度。
  • 用“聚合—子层—分发—流间混合”读懂多流图。
  • 把板书中的 AmA_mArA_rBB 对应到矩阵运算。
  • 说明“主子层计算不会随流数直接倍增”的适用边界。

前置与衔接

传统 pre-norm Transformer 的一个子层可抽象为:

y=x+F(Norm(x)).y=x+F(\operatorname{Norm}(x)).

其中 FF 可以是 attention, 也可以是 FFN。

残差旁路绕过子层, 在子层输出处做加法。

图 1

传统 Transformer 在 attention 和 FFN 子层外各保留一条残差旁路。

原视频 · 00:20 ↗

Hyper-Connections 仍然围绕这两类子层工作, 改变的是残差状态的组织方式:

  • 传统残差维护一条状态流。
  • Hyper-Connections 维护多条并行状态流。
  • 子层每次只接收聚合后的一个模型维度向量。

ASR 多次把 Hyper-Connections 识别为“超链接”, 把“残差流”识别为“参差流”。

本课统一使用:

超连接(Hyper-Connections)残差流

核心讲解

1. 普通残差是单流基线

设一个 token 的隐藏向量为:

xRd.x\in\mathbb R^d.

子层先把 xx 变换为 F(x)F(x), 再与原输入相加:

x=x+F(x).x'=x+F(x).
图 2

普通残差把子层输出与同一条输入流相加,可视为残差流宽度为一。

原视频 · 00:40 ↗

板书把 FFN 画成“先变长、再变短”:

RdRdffRd.\mathbb R^d \rightarrow \mathbb R^{d_{ff}} \rightarrow \mathbb R^d.

这里的“变长”发生在特征维度, 与残差流数量是两条不同的轴。

2. 残差流扩展增加的是哪一维

设扩展率为 nn

对一个 token, 把多条残差流按行堆叠:

X=[(x(1))T(x(2))T(x(n))T]Rn×d.X= \begin{bmatrix} (x^{(1)})^T\\ (x^{(2)})^T\\ \vdots\\ (x^{(n)})^T \end{bmatrix} \in\mathbb R^{n\times d}.

nn 是残差流轴, dd 是模型特征轴。

若输入含 TT 个 token, 完整状态可写成:

XRT×n×d.X\in\mathbb R^{T\times n\times d}.

不要把 nn 错当成 token 数, 也不要把它错当成 FFN 的 dffd_{ff}

3. 子层前:把多流聚合成一个输入

沿残差流轴给出聚合系数:

AmRn.A_m\in\mathbb R^n.

本课采用“流为行”的记号, 聚合结果为:

x~=AmTXRd.\tilde x=A_m^TX \in\mathbb R^d.

分量形式为:

x~=i=1n(Am)ix(i).\tilde x = \sum_{i=1}^{n}(A_m)_i x^{(i)}.
图 3

扩展为多条残差流后,先沿残差流轴加权聚合,再把一个模型维度向量送入子层。

原视频 · 01:00 ↗

关键 shape 是:

(1×n)(n×d)=1×d.(1\times n)(n\times d) = 1\times d.

所以即使 n=2n=2, 送进 FFN 的仍是一个 dd 维向量, 不是把两条流拼接成 2d2d 维输入。

随后子层计算:

z=F(x~),zRd.z=F(\tilde x), \qquad z\in\mathbb R^d.

4. 子层后:把一个输出分发回多流

令分发系数为:

BRn.B\in\mathbb R^n.

外积:

BzTRn×dBz^T\in\mathbb R^{n\times d}

把同一个子层输出按不同权重写回 nn 条流。

图 4

子层输出按分发权重写回多条残差流,同时保留流间混合。

原视频 · 01:20 ↗

只做分发还不够, 因为旧的多流状态也需要继续传递。

5. 残差流之间:用矩阵做全连接混合

令:

ArRn×nA_r\in\mathbb R^{n\times n}

表示旧残差流之间的混合。

于是一个便于理解的统一式为:

X=ArX+BzT,X' = A_rX+Bz^T,

其中:

z=F(AmTX).z=F(A_m^TX).

检查 shape:

ArX:(n×n)(n×d)n×d,A_rX: (n\times n)(n\times d) \rightarrow n\times d,
BzT:(n×1)(1×d)n×d.Bz^T: (n\times1)(1\times d) \rightarrow n\times d.

这个式子不是在声明所有代码库都使用同一变量布局, 而是把视频拓扑整理成一种 shape 自洽的记号。

若实现把流放在列上, 相应矩阵和转置会改变, 但聚合、分发和流间混合的角色不变。

6. 同一机理如何包围 attention 与 FFN

attention 子层和 FFN 子层都接收 dd 维表示, 再输出 dd 维表示。

因此两者外侧都可复用:

  1. AmA_m 聚合多流。
  2. 子层 FF 执行主计算。
  3. BB 分发子层输出。
  4. ArA_r 混合并传递旧流。

残差流宽度在子层之间保持 nn, 只有进入具体子层前才聚合回一个输入。

7. HC 块矩阵的三个参数角色

视频最后把连接画成一个块矩阵, 重点不是死记矩阵排版, 而是识别三类参数:

  • AmA_m:多流到单输入的聚合权重。
  • BB:单输出到多流的分发权重。
  • ArA_r:多流到多流的混合权重。
图 5

HC 参数块可按聚合向量、输出分发向量和残差流混合矩阵理解。

原视频 · 02:00 ↗

8. “计算量不会翻倍”的准确边界

若扩展率从 11 变为 nn, 主 attention 或 FFN 仍只处理聚合后的一个 dd 维输入, 所以主子层计算不会机械变成 nn 份。

但不能据此说总成本完全不变。

新增成本至少包括:

  • 保存 nn 条残差状态。
  • 沿流轴执行聚合和分发。
  • 计算 ArXA_rX 的流间混合。
  • 生成或维护连接参数。

所以更准确的结论是:

跟练与练习

跟练:逐项核对 shape

给定:

XR3×d,Am,BR3,ArR3×3,X\in\mathbb R^{3\times d}, \quad A_m,B\in\mathbb R^3, \quad A_r\in\mathbb R^{3\times3},

依次写出:

AmTX,F(AmTX),BF(AmTX)T,ArXA_m^TX, \quad F(A_m^TX), \quad BF(A_m^TX)^T, \quad A_rX

的 shape。

结果应依次为:

d,d,3×d,3×d.d, \quad d, \quad 3\times d, \quad 3\times d.
编者练习

设两条一维残差流为: X=[24],Am=[0.750.25],X=\begin{bmatrix}2\\4\end{bmatrix}, \quad A_m=\begin{bmatrix}0.75\\0.25\end{bmatrix}, Ar=I2,B=[11],F(u)=2u.A_r=I_2, \quad B=\begin{bmatrix}1\\-1\end{bmatrix}, \quad F(u)=2u. 求聚合输入、子层输出与新残差流 XX'

查看参考答案

聚合输入:
x~=AmTX=0.75×2+0.25×4=2.5.\tilde x=A_m^TX=0.75\times2+0.25\times4=2.5.
子层输出:
z=F(2.5)=5.z=F(2.5)=5.
新状态:
X=ArX+Bz=[24]+[55]=[71].X'=A_rX+Bz = \begin{bmatrix}2\\4\end{bmatrix} + \begin{bmatrix}5\\-5\end{bmatrix} = \begin{bmatrix}7\\-1\end{bmatrix}.
本题只演示三类运算,
不表示真实模型必须允许任意负分发权重。

常见误区

误区 1:扩展率二就是把模型维度变成 2d2d

扩展的是残差流轴, 不是子层接收的特征轴。

误区 2:两条流都各跑一次 FFN

视频结构先聚合出一个输入, 主 FFN 只执行一次, 再把结果分发回多流。

误区 3:AmA_mArA_rBB 都是同一种矩阵

在本课行流约定下, Am,BA_m,B 是长度 nn 的向量, ArA_rn×nn\times n 的流混合矩阵。

误区 4:超连接只作用在 FFN

它同样包围 attention 子层, 并在相邻子层和层之间持续传递多流状态。

误区 5:扩展残差流没有任何额外开销

主子层不复制, 不代表状态存储、流间混合和参数生成免费。

本课小结

  • Hyper-Connections 与普通残差都围绕 attention 和 FFN 子层工作。
  • 普通残差可视为单流,多流状态可表示为 XRn×dX\in\mathbb R^{n\times d}
  • AmA_m 聚合多流,BB 分发子层输出,ArA_r 混合旧残差流。
  • 一种 shape 自洽的统一式是 X=ArX+BF(AmTX)TX'=A_rX+B F(A_m^TX)^T
  • 扩展的是残差流轴,不是 token 轴、模型维度或 FFN 中间维度。
  • 主子层不随流数直接复制,但多流状态和混合仍带来额外成本。
02

主题讲解 · 02:27

Hyper-Connections 残差流:从 Attention 到 FFN 的跨层传递

学习目标

  • 追踪一组多流状态如何穿过 attention、FFN 与下一层。
  • 区分 token 轴、残差流轴和特征轴。
  • 解释每个子层入口的聚合与出口的分发。
  • 说明“上一子层输出就是下一子层输入”的准确对象。
  • 避免把单 token 示意误解为 attention 只处理单个 token。

前置与衔接

上一课把一个 Hyper-Connections 子层抽象为:

X=ArX+BzT,z=F(AmTX).X' = A_rX+Bz^T, \qquad z=F(A_m^TX).

其中:

  • XRn×dX\in\mathbb R^{n\times d} 是一个 token 的 nn 条残差流。
  • AmA_m 聚合多流。
  • FF 是 attention 或 FFN 子层。
  • BB 分发子层输出。
  • ArA_r 在残差流轴上混合旧状态。

本课不再只看一个子层, 而是沿网络深度追踪整组状态。

核心讲解

1. 扩展率三表示每个 token 有三条流

若序列长度为 TT、 模型维度为 dd、 残差流扩展率为 n=3n=3, 整层状态可写成:

RRT×3×d.R\in\mathbb R^{T\times3\times d}.

对第 ii 个 token:

RiR3×d.R_i\in\mathbb R^{3\times d}.

三条流分别是:

ri(1),ri(2),ri(3)inRd.r_i^{(1)}, r_i^{(2)}, r_i^{(3)}in\mathbb R^d.
图 1

扩展率为三时,同一个 token 在残差流轴上维护三条模型维度向量。

原视频 · 00:20 ↗

板书为了可读只追踪 token 1, 但同样的多流结构存在于每个 token。

2. Attention 前先沿流轴聚合

对 token ii, 聚合为:

r~i=AmTRi=k=13(Am)kri(k)Rd.\tilde r_i = A_m^TR_i = \sum_{k=1}^{3}(A_m)_k r_i^{(k)} \in\mathbb R^d.

对所有 token 同时执行, 得到:

R~RT×d.\widetilde R\in\mathbb R^{T\times d}.
图 2

三条残差流先汇聚为一个向量,再投影生成该 token 的 Q、K、V。

原视频 · 00:40 ↗

随后才做标准 attention 投影:

Q=R~WQ,K=R~WK,V=R~WV.Q=\widetilde RW_Q, \quad K=\widetilde RW_K, \quad V=\widetilde RW_V.

3. token 1 的 QKV 只是追踪视角

视频把 token 1 的投影标成 q1,k1,v1q_1,k_1,v_1

这不表示 token 1 独立完成 attention。

自注意力仍然使用整条序列:

Attention(Q,K,V)=softmax(QKTdk)V.\operatorname{Attention}(Q,K,V) = \operatorname{softmax} \left( \frac{QK^T}{\sqrt{d_k}} \right)V.

例如 q1q_1 会与所有允许位置的 key 比较, 再对相应 value 加权求和。

多流聚合发生在进入 attention 之前, 不会取消 token 之间的注意力交互。

4. Attention 输出重新分发到三条流

令 attention 对 token ii 的输出为:

oiRd.o_i\in\mathbb R^d.

分发项为:

BoiTR3×d.B o_i^T \in\mathbb R^{3\times d}.

与流间混合项相加:

Riatt=ArRi+BoiT.R_i^{\mathrm{att}} = A_rR_i+B o_i^T.
图 3

attention 输出通过分发系数写回三条残差流,使流宽保持不变。

原视频 · 01:00 ↗

输出 shape 仍是:

RiattR3×d.R_i^{\mathrm{att}} \in\mathbb R^{3\times d}.

所以 attention 子层不会消耗掉扩展轴, 它在出口被恢复。

5. Attention 输出就是 FFN 的多流输入

视频反复强调“输出做输入”。

图 4

attention 超连接的输出状态直接成为 FFN 超连接的输入状态。

原视频 · 01:20 ↗

准确说, 成为 FFN 超连接输入的是整组状态:

RattRT×3×d,R^{\mathrm{att}} \in\mathbb R^{T\times3\times d},

而不是刚才聚合得到的单条 R~\widetilde R, 也不是裸 attention 输出 OO

FFN 入口会使用自己的聚合参数:

r~iffn=(Amffn)TRiatt.\tilde r_i^{\mathrm{ffn}} = (A_m^{\mathrm{ffn}})^T R_i^{\mathrm{att}}.

因此即使前后两个聚合结果都画成一条向量, 它们通常不是同一个数值。

6. FFN 重复聚合—变换—分发

FFN 主分支可抽象为:

fi=Wdownϕ(Wupr~iffn),f_i = W_{\mathrm{down}} \phi \left( W_{\mathrm{up}} \tilde r_i^{\mathrm{ffn}} \right),

具体实现可能采用行向量布局、bias 或门控分支。

子层输出再写回多流:

Riffn=ArffnRiatt+BffnfiT.R_i^{\mathrm{ffn}} = A_r^{\mathrm{ffn}} R_i^{\mathrm{att}} + B^{\mathrm{ffn}}f_i^T.
图 5

FFN 同样执行聚合、子层变换与重新分发,并在残差流之间进行混合。

原视频 · 01:40 ↗

attention 与 FFN 的内部计算不同, 但外侧多流接口相同。

7. 多流状态怎样跨 Transformer 层

\ell 层 FFN 的输出:

R(,ffn)R^{(\ell,\mathrm{ffn})}

直接成为第 +1\ell+1 层 attention 的输入:

R(+1,in)=R(,ffn).R^{(\ell+1,\mathrm{in})} = R^{(\ell,\mathrm{ffn})}.
图 6

上一层 FFN 的多流输出继续进入下一层 attention,形成贯穿深度的残差流。

原视频 · 02:00 ↗

因此“残差流”不是某个子层内部的临时缓存, 而是贯穿网络深度的隐藏状态表示。

每个子层都执行一次:

多流状态聚合输入子层输出多流状态.\text{多流状态} \rightarrow \text{聚合输入} \rightarrow \text{子层输出} \rightarrow \text{多流状态}.

跟练与练习

跟练:画出三个轴

给定:

T=4,n=3,d=8,T=4, \qquad n=3, \qquad d=8,

请依次标注:

  • 多流状态 RR 的 shape。
  • 聚合后 attention 输入的 shape。
  • Q、K、V 的 token 轴是否仍为 44
  • attention 分发后状态的 shape。

答案应为:

R:4×3×8,R:4\times3\times8,
R~:4×8,\widetilde R:4\times8,

Q,K,V \text{ 仍各含 }4\text{ 个 token 位置},

Ratt:4×3×8.R^{\mathrm{att}}:4\times3\times8.
编者练习

判断下面哪一个量会直接成为 FFN 超连接的输入状态:

  1. attention 前聚合得到的 R~\widetilde R
  2. 裸 attention 输出 OO
  3. attention 输出经分发与流间混合后的 RattR^{\mathrm{att}}
查看参考答案

选择 3。
Hyper-Connections 子层的接口是“多流状态进、多流状态出”。
R~\widetilde R 是 attention 的临时聚合输入,
OO 是主子层输出,
只有:
Ratt=ArR+BOR^{\mathrm{att}} = A_rR+B O
恢复了完整残差流轴,
可直接交给下一个 FFN 超连接子层。

常见误区

误区 1:扩展率三表示序列有三个 token

扩展率描述残差流轴, 序列长度描述 token 轴, 两者相互独立。

误区 2:每条残差流都单独做一次完整 attention

视频结构先沿流轴聚合, 再执行一次主 attention, 最后分发回多流。

误区 3:画 token 1 就表示 attention 只看 token 1

token 1 只是局部追踪视角。

q1q_1 仍会与序列中的 key 交互。

误区 4:attention 的聚合向量直接送进 FFN

attention 后先恢复完整多流状态, FFN 再从该状态做自己的聚合。

误区 5:不同子层的波浪号向量必然相等

两次聚合面对的多流状态和连接参数均可能不同, shape 相同不代表数值相同。

本课小结

  • 每个 token 都可拥有 nndd 维残差流,整层状态为 T×n×dT\times n\times d
  • attention 前沿流轴聚合,Q、K、V 仍在完整 token 序列上计算。
  • attention 输出经分发和流间混合后恢复多流 shape。
  • attention 的完整多流输出才是 FFN 超连接的输入状态。
  • FFN 使用同样的外侧机理,但内部是扩维、非线性和还原。
  • 多流状态从上一层 FFN 持续流入下一层 attention,贯穿整个网络深度。
03

主题讲解 · 02:16

Hyper-Connections 如何退化为 Pre-Norm 传统残差

学习目标

  • 写出 Hyper-Connections 子层的聚合、混合与分发形式。
  • 解释块矩阵中 AmA_mArA_rBB 的角色。
  • 推导扩展率为一、三个参数均为一时的传统残差。
  • 说明为什么直接退化得到的是 pre-norm 而不是 post-norm。
  • 区分“这一参数特例不直接覆盖”与“结构绝对无法表达”。

前置与衔接

采用“残差流为行”的记号, 一个多流子层可写成:

x~=AmTX,\tilde x=A_m^TX,
z=F(Norm(x~)),z=F(\operatorname{Norm}(\tilde x)),
X=ArX+BzT.X'=A_rX+Bz^T.

其中:

XRn×d,Am,BRn,ArRn×n.X\in\mathbb R^{n\times d}, \quad A_m,B\in\mathbb R^n, \quad A_r\in\mathbb R^{n\times n}.

不同论文或实现可能交换行列布局, 本课记号只用于让 shape 和板书角色一致。

视频把这些连接压进一个块矩阵:

HC=[0BTAmAr].HC= \begin{bmatrix} 0 & B^T\\ A_m & A_r \end{bmatrix}.

块的确切左右乘方向取决于状态排布, 但三个参数的语义不变。

核心讲解

1. 先回看扩展率三的多流结构

视频用扩展率 n=3n=3 说明一般 HC。

对一个 token:

X=[(x(1))T(x(2))T(x(3))T]R3×d.X= \begin{bmatrix} (x^{(1)})^T\\ (x^{(2)})^T\\ (x^{(3)})^T \end{bmatrix} \in\mathbb R^{3\times d}.
图 1

扩展率为三的 HC 先把三条残差流聚合成一个子层输入。

原视频 · 00:20 ↗

聚合参数 AmA_m 把三条流汇成:

x~=AmTXRd.\tilde x=A_m^TX\in\mathbb R^d.

子层输出仍是一个 dd 维向量, 随后经 BB 写回三条流。

2. 三类连接分别做什么

Hyper-Connections 子层包含三类边。

第一类, 多流到单输入:

AmTX.A_m^TX.

第二类, 旧多流到新多流:

ArX.A_rX.

第三类, 单个子层输出到多流:

BzT.Bz^T.
图 2

子层输出被分发回多条流,同时残差通道通过矩阵进行流间混合。

原视频 · 00:40 ↗

ArA_r 是矩阵, 因为它允许每条旧流影响每条新流。

AmA_mBB 在这一简化视角中是向量, 因为一个负责多到一, 另一个负责一到多。

3. 从图上的边找到块矩阵参数

图 3

块矩阵中的聚合向量、流混合矩阵和分发向量分别对应图中的三组边。

原视频 · 01:00 ↗

板书逐项对应为:

  • 紫色多流全连接:ArA_r
  • 多条流汇成一条:AmA_m
  • 一条输出写回多条:BB

这比死记:

[0BTAmAr]\begin{bmatrix} 0 & B^T\\ A_m & A_r \end{bmatrix}

更稳健, 因为实现换成列流布局时, 块的位置或转置可能变化, 连接角色仍然相同。

4. 扩展率为一时,所有对象退化成标量

令:

n=1.n=1.

此时:

X=xTR1×d,X=x^T\in\mathbb R^{1\times d},
Am=[am],B=[b],Ar=[ar].A_m=[a_m], \quad B=[b], \quad A_r=[a_r].

统一式变成:

x=arx+bF(Norm(amx)).x' = a_rx + bF \left( \operatorname{Norm}(a_mx) \right).

选择:

am=1,b=1,ar=1,a_m=1, \qquad b=1, \qquad a_r=1,

就得到:

x=x+F(Norm(x)).x' = x+F(\operatorname{Norm}(x)).
图 4

单流时把聚合、分发和残差混合都设为一,HC 退化为子层输出加恒等旁路。

原视频 · 01:40 ↗

在视频块矩阵约定下, 对应:

HC=[0111].HC= \begin{bmatrix} 0 & 1\\ 1 & 1 \end{bmatrix}.

左上角的零属于块结构约定, 不应被理解成第四个可自由设为一的残差参数。

5. 为什么得到的是 pre-norm

pre-norm 残差块为:

y=x+F(Norm(x)).y=x+F(\operatorname{Norm}(x)).

归一化位于主子层分支内部, 残差旁路上的 xx 不经过它。

图 5

pre-norm 把归一化放在子层分支内,因此单位化 HC 参数可直接恢复 pre-norm 残差块。

原视频 · 02:00 ↗

HC 的聚合、子层计算和线性流混合已经包围了这条分支, 所以把多流参数单位化就能直接恢复上式。

6. 为什么同一设置不直接得到 post-norm

post-norm 残差块为:

y=Norm(x+F(x)).y=\operatorname{Norm}(x+F(x)).

归一化位于残差加法之后, 也就是整个混合结果的外部。

只把:

Am,Ar,BA_m, A_r, B

设成常数, 只能改变线性聚合、混合和分发。

它不能凭空把一个非线性归一化算子移动到整个和式外部。

因此准确结论是:

这不表示任何扩展公式都绝对无法覆盖 post-norm。

视频也预告可以另写结构公式处理, 但没有在本课给出推导。

跟练与练习

跟练:从多流公式逐项退化

从:

X=ArX+BF(Norm(AmTX))TX'=A_rX+B F(\operatorname{Norm}(A_m^TX))^T

开始, 依次代入:

n=1,Am=[1],Ar=[1],B=[1].n=1, \quad A_m=[1], \quad A_r=[1], \quad B=[1].

每一步都检查 shape, 最终应得到:

x=x+F(Norm(x)).x'=x+F(\operatorname{Norm}(x)).
编者练习

下面两个结构中, 哪一个能由单流 HC 的 Am=Ar=B=1A_m=A_r=B=1 直接得到? (a)y=x+F(Norm(x)),(a)\quad y=x+F(\operatorname{Norm}(x)), (b)y=Norm(x+F(x)).(b)\quad y=\operatorname{Norm}(x+F(x)).

查看参考答案

直接得到 (a)(a)
单位化三类连接后,
旧流以恒等路径保留,
归一化后的子层输出以单位权重写回:
y=x+F(Norm(x)).y=x+F(\operatorname{Norm}(x)).
结构 (b)(b) 把 Norm 放在整个加法之后。
改变线性连接系数不会自动交换 Norm 与加法的次序,
所以需要修改算子结构,
不能只复用同一参数特例。

常见误区

误区 1:HC=[0,1,1,1]HC=[0,1,1,1] 是所有实现的扁平参数 API

它是视频块矩阵布局的简写。

实际实现可能改变流轴方向、块顺序与参数化。

误区 2:扩展率三退化时仍保留三条流

传统残差特例先令扩展率 n=1n=1, 然后矩阵和向量才成为标量一。

误区 3:pre-norm 与 post-norm 只差一个名称

二者算子顺序不同: 一个在主分支内部归一化, 一个在残差合流后归一化。

误区 4:把连接权重设为一可以移动 Norm

线性系数只能改变线性组合, 不能把非线性归一化跨过加法节点。

误区 5:不能直接退化就等于永远无法表达

本课只证明特定参数设置直接覆盖 pre-norm。

post-norm 是否能由另一公式覆盖, 需要单独定义和验证。

本课小结

  • HC 的三类参数分别承担多流聚合、流间混合和输出分发。
  • 在视频块约定中可写为 [0BTAmAr]\begin{bmatrix}0&B^T\\A_m&A_r\end{bmatrix}
  • 令扩展率为一,再设 Am=Ar=B=[1]A_m=A_r=B=[1],得到传统恒等残差。
  • 若子层内部使用 Norm,退化式正是 x+F(Norm(x))x+F(\operatorname{Norm}(x))
  • post-norm 把 Norm 放在加法之后,不能由同一线性参数特例直接产生。
  • 参数退化结论必须与算子顺序和具体布局一起阅读。
04

主题讲解 · 02:53

mHC 的双随机约束:传统残差为何是单流特例

学习目标

  • 识别 mHC 中 pre 聚合、post 分发与 residual mixing 三类连接。
  • 写出残差流混合矩阵的双随机约束。
  • 用全一向量解释行和、列和条件。
  • 证明 1×11\times1 双随机矩阵只能是 [1][1]
  • 说明传统残差成为单流特例还需要哪些单位连接。

前置与衔接

mHC 是 manifold-constrained Hyper-Connections。

它保留一般 Hyper-Connections 的多流结构, 同时对残差流混合矩阵施加约束。

采用本单元的行流记号, 一个子层可抽象为:

x~=(Hpre)TX,\tilde x=(H^{\mathrm{pre}})^TX,
z=F(x~),z=F(\tilde x),
X=HresX+HpostzT.X'=H^{\mathrm{res}}X+H^{\mathrm{post}}z^T.

其中:

XRn×d,X\in\mathbb R^{n\times d},
HresRn×n.H^{\mathrm{res}}\in\mathbb R^{n\times n}.

ASR 把 manifold-constrained 识别成“流行约束”, 把 doubly stochastic matrix 识别成“双水晶矩阵”。

本课分别按:

流形约束双随机矩阵 理解。

核心讲解

1. mHC 对哪一个对象施加约束

视频先给出三条条件:

Hres1n=1n,H^{\mathrm{res}}\mathbf1_n = \mathbf1_n,
1nTHres=1nT,\mathbf1_n^T H^{\mathrm{res}} = \mathbf1_n^T,
Hijres0.H^{\mathrm{res}}_{ij}\ge0.
图 1

mHC 要求残差流混合矩阵非负,并使每一行、每一列的元素和都为一。

原视频 · 00:20 ↗

这三个条件共同定义双随机矩阵。

需要注意, 约束对象是流间混合矩阵 HresH^{\mathrm{res}}, 不是 FFN 的 WupW_{\mathrm{up}}WdownW_{\mathrm{down}}

2. 三类 H 各自承担什么工作

扩展率为 nn 时:

  • HpreH^{\mathrm{pre}}:把 nn 条流聚合为子层输入。
  • HpostH^{\mathrm{post}}:把一个子层输出分发回 nn 条流。
  • HresH^{\mathrm{res}}:把旧的 nn 条流混合为新的 nn 条流。
图 2

双随机约束施加在残差流之间的混合矩阵,而不是 FFN 权重矩阵。

原视频 · 00:40 ↗

视频画出的紫色全连接对应 HresH^{\mathrm{res}}

它沿残差流轴混合, 不会在模型特征维度上替代子层权重。

3. pre 聚合保持主子层输入宽度

n=3n=3 为例:

XR3×d.X\in\mathbb R^{3\times d}.

pre 聚合得到:

x~=(Hpre)TXRd.\tilde x = (H^{\mathrm{pre}})^TX \in\mathbb R^d.
图 3

多条残差流先经 pre 聚合得到一个子层输入。

原视频 · 01:00 ↗

FFN 或 attention 仍接收一个 dd 维表示, 所以残差流扩展不等于把主子层复制三份。

4. post 分发恢复多流状态

子层输出:

z=F(x~)Rd.z=F(\tilde x)\in\mathbb R^d.

post 分发项:

HpostzTR3×d.H^{\mathrm{post}}z^T \in\mathbb R^{3\times d}.
图 4

子层输出经 post 分发写回多条残差流,同时保留受约束的流间混合。

原视频 · 01:20 ↗

完整输出为:

X=HresX+HpostzT.X' = H^{\mathrm{res}}X + H^{\mathrm{post}}z^T.

第一项传递和混合旧残差状态, 第二项注入新子层信息。

5. 行和为一怎样写成矩阵式

设:

1n=[11].\mathbf1_n = \begin{bmatrix} 1\\ \vdots\\ 1 \end{bmatrix}.

若矩阵第 ii 行为 hiTh_i^T, 则:

(Hres1n)i=hiT1n=j=1nHijres.(H^{\mathrm{res}}\mathbf1_n)_i = h_i^T\mathbf1_n = \sum_{j=1}^{n}H^{\mathrm{res}}_{ij}.

因此:

Hres1n=1nH^{\mathrm{res}}\mathbf1_n=\mathbf1_n

等价于每一行元素和为一。

6. 列和为一怎样写成矩阵式

同理:

(1nTHres)j=i=1nHijres.(\mathbf1_n^TH^{\mathrm{res}})_j = \sum_{i=1}^{n}H^{\mathrm{res}}_{ij}.

所以:

1nTHres=1nT\mathbf1_n^TH^{\mathrm{res}} = \mathbf1_n^T

等价于每一列元素和为一。

图 5

行和与列和为一可分别写成矩阵乘全一向量后保持不变。

原视频 · 01:40 ↗

再加上:

Hijres0,H^{\mathrm{res}}_{ij}\ge0,

每一行和每一列都可看成非负权重分配。

双随机矩阵集合是一个受约束的凸集合, 但本课不需要进一步使用 Birkhoff 分解。

7. 为什么 n=1n=1 时只能得到 [1][1]

当扩展率为一:

Hres=[h].H^{\mathrm{res}}=[h].

行和条件给出:

h=1.h=1.

列和条件给出同一个结果, 非负条件也自然满足。

因此唯一的 1×11\times1 双随机矩阵是:

Hres=[1].H^{\mathrm{res}}=[1].
图 6

扩展率为一时,唯一可行的双随机混合矩阵是 1×1 的 [1],结构回到传统残差。

原视频 · 02:20 ↗

8. 从 Hres=[1]H^{\mathrm{res}}=[1] 到传统残差还差一步

Hres=[1]H^{\mathrm{res}}=[1] 只保证旧流恒等传递。

要精确得到普通残差:

y=x+F(x),y=x+F(x),

还需选择单位 pre 和 post 连接:

Hpre=[1],Hpost=[1].H^{\mathrm{pre}}=[1], \qquad H^{\mathrm{post}}=[1].

于是:

x~=x,\tilde x=x,
y=[1]x+[1]F(x)=x+F(x).y=[1]x+[1]F(x)=x+F(x).

因此结论包含两层:

  1. mHC 的约束允许且强制单流 Hres=[1]H^{\mathrm{res}}=[1]
  2. 再取单位聚合和单位分发,就恢复传统残差加法。

跟练与练习

跟练:检验一个 2×22\times2 矩阵

判断:

H=[0.70.30.30.7]H= \begin{bmatrix} 0.7&0.3\\ 0.3&0.7 \end{bmatrix}

是否双随机。

逐项检查:

  • 第一行和为 11
  • 第二行和为 11
  • 第一列和为 11
  • 第二列和为 11
  • 所有元素非负。

所以它满足约束。

编者练习

设: H(a)=[a1a1aa].H(a)= \begin{bmatrix} a&1-a\\ 1-a&a \end{bmatrix}.aa 的取值范围, 使 H(a)H(a) 成为双随机矩阵。

查看参考答案

无论 aa 取何值,
每一行与每一列的和都为:
a+(1a)=1.a+(1-a)=1.
还需满足元素非负:
a0,1a0.a\ge0, \qquad 1-a\ge0.
因此:
0a1.0\le a\le1.
端点 a=1a=1 是单位矩阵,
a=0a=0 是交换两条流的置换矩阵。

常见误区

误区 1:双随机表示随机采样矩阵

这里的“随机”是矩阵论术语, 指非负且行列和为一, 不表示每次前向都随机抽样。

误区 2:约束施加在 FFN 权重上

mHC 此处约束的是残差流混合矩阵 HresH^{\mathrm{res}}

FFN 的模型维度权重承担另一种计算。

误区 3:只要 Hres=[1]H^{\mathrm{res}}=[1] 就自动是传统残差

还需使 pre 聚合和 post 分发都为单位连接, 才能得到 x+F(x)x+F(x)

误区 4:行和为一已经自动推出列和为一

一般方阵中二者相互独立。

mHC 明确同时要求两种条件。

误区 5:扩展率一仍存在隐藏的多流混合

n=1n=1 时只有一条流, HresH^{\mathrm{res}} 也只有一个元素, 不存在不同流之间的混合自由度。

本课小结

  • mHC 对残差流混合矩阵 HresH^{\mathrm{res}} 施加双随机约束。
  • 双随机要求 H1=1H\mathbf1=\mathbf11TH=1T\mathbf1^TH=\mathbf1^T 且元素非负。
  • pre 聚合、post 分发与 residual mixing 是三类不同连接。
  • 扩展率为一时,唯一的双随机混合矩阵是 [1][1]
  • 再令 pre 和 post 连接为一,就得到 y=x+F(x)y=x+F(x)
  • 传统残差因此是 mHC 的合法单流边界点,而不是与 mHC 无关的另一套结构。
05

主题讲解 · 02:49

线性层与 FFN 反向传播:从矩阵微分到 Shape

学习目标

  • 从标量链式法则过渡到矩阵乘积的反向传播。
  • 用 Frobenius 内积推导中间矩阵梯度的顺序与转置。
  • 推导线性层的输入梯度、权重梯度和 bias 梯度。
  • 用 shape 检查 dX=dYWTdX=dYW^T
  • 追踪两层 FFN 中梯度经过 WdownTW_{\mathrm{down}}^TWupTW_{\mathrm{up}}^T 的顺序。
  • 识别激活函数和门控 FFN 不可省略的反向分支。

前置与衔接

视频的核心口诀是:

这个口诀适合记忆, 但矩阵不满足交换律, 不能像标量那样随意重排。

本课采用以下约定:

  • 样本或 token 排在矩阵的行上。
  • 梯度与对应变量 shape 相同。
  • 标量损失记为 LL
  • 用 Frobenius 内积:
A,BF=tr(ATB).\langle A,B\rangle_F=\operatorname{tr}(A^TB).

梯度定义为:

dL=XL,dXF.dL=\langle \nabla_XL,dX\rangle_F.

一旦更换列向量布局或梯度排布约定, 公式外观会变化, 但 shape 与微分必须一致。

核心讲解

1. 标量乘积中的“替换”口诀

设:

y=abcd,y=abcd,

其中 a,b,c,da,b,c,d 是互不依赖的标量。

bb 求导:

yb=acd.\frac{\partial y}{\partial b}=acd.

若上游梯度为:

gy=Ly,g_y=\frac{\partial L}{\partial y},

链式法则给出:

Lb=agycd.\frac{\partial L}{\partial b}=a\,g_y\,c\,d.
图 1

标量乘积中,对某个因子求导等价于用上游梯度替换该因子并乘其余因子。

原视频 · 00:40 ↗

由于标量乘法可交换, 上式写成 gyacdg_yacdacdgyacdg_y 都相同。

这项自由在矩阵情形中消失。

2. 矩阵乘积必须先建立 shape

设:

ARm×p,BRp×q,CRq×r,DRr×s.A\in\mathbb R^{m\times p}, \quad B\in\mathbb R^{p\times q}, C\in\mathbb R^{q\times r}, \quad D\in\mathbb R^{r\times s}.

前向:

Y=ABCDRm×s.Y=ABCD\in\mathbb R^{m\times s}.

上游梯度:

GY=YLRm×s.G_Y=\nabla_YL\in\mathbb R^{m\times s}.
图 2

矩阵乘积的次序不能交换,反传必须根据微分和 shape 决定转置位置。

原视频 · 01:00 ↗

目标是:

GB=BLRp×q.G_B=\nabla_BL\in\mathbb R^{p\times q}.

如果候选公式最终不是 p×qp\times q, 无需继续算, 它一定不对。

3. 用微分推导中间矩阵梯度

只让 BB 变化:

dY=A(dB)CD.dY=A(dB)CD.

代入损失微分:

dL=tr(GYTA(dB)CD).dL=\operatorname{tr}\left(G_Y^TA(dB)CD\right).

利用 trace 的循环不变性:

dL=tr(CDGYTA(dB)).dL=\operatorname{tr}\left(CDG_Y^TA(dB)\right).

与:

dL=tr(GBTdB)dL=\operatorname{tr}(G_B^TdB)

比较, 得到:

GB=ATGYDTCT=ATGY(CD)T.G_B=A^TG_YD^TC^T=A^TG_Y(CD)^T.
图 3

对 Y=ABCD 中的 B 求梯度时,上游梯度左乘 A 的转置、右乘 CD 的转置。

原视频 · 01:20 ↗

shape 检查:

(p×m)(m×s)(s×r)(r×q)=p×q.(p\times m)(m\times s)(s\times r)(r\times q)=p\times q.

这里的右侧转置顺序必须反转:

(CD)T=DTCT,(CD)^T=D^TC^T,

不能写成 CTDTC^TD^T

4. 线性层的输入梯度

考虑无 bias 线性层:

Y=XW,Y=XW,

其中:

XRN×din,WRdin×dout,YRN×dout.X\in\mathbb R^{N\times d_{in}}, \quad W\in\mathbb R^{d_{in}\times d_{out}}, Y\in\mathbb R^{N\times d_{out}}.

NN 可以把 batch 与 token 位置展平在一起。

给定:

GY=YLRN×dout,G_Y=\nabla_YL\in\mathbb R^{N\times d_{out}},

输入梯度为:

GX=GYWT.G_X=G_YW^T.
图 4

线性层 Y=XW 的输入梯度为 dX=dY W 的转置权重乘法。

原视频 · 01:40 ↗

shape 为:

(N×dout)(dout×din)=N×din.(N\times d_{out})(d_{out}\times d_{in})=N\times d_{in}.

这正好把输出特征维度投影回输入特征维度。

5. 逐行看就是共享的反向投影

把上游梯度按行写成:

GY=[g1Tg2TgNT].G_Y=\begin{bmatrix}g_1^T\\g_2^T\\\vdots\\g_N^T\end{bmatrix}.

则:

GX=[g1TWTg2TWTgNTWT].G_X=\begin{bmatrix}g_1^TW^T\\g_2^TW^T\\\vdots\\g_N^TW^T\end{bmatrix}.
图 5

按 batch 或 token 行观察时,每一行上游梯度都通过同一个 W 转置投影回输入维度。

原视频 · 02:00 ↗

这不是逐行执行不同的线性层, 而是矩阵乘法的分块解释: 所有行共享同一个 WW

6. 线性层还必须计算参数梯度

视频重点展示 GXG_X, 但训练线性层还需:

GW=XTGY.G_W=X^TG_Y.

shape 为:

(din×N)(N×dout)=din×dout.(d_{in}\times N)(N\times d_{out})=d_{in}\times d_{out}.

若前向包含广播 bias:

Y=XW+1NbT,Y=XW+\mathbf1_Nb^T,

则:

Gb=GYT1N=i=1NGY,i,:.G_b=G_Y^T\mathbf1_N=\sum_{i=1}^{N}G_{Y,i,:}.

也就是沿 batch/token 行做归约。

所以“乘 WTW^T”只回答输入梯度, 不是线性层反向传播的全部输出。

7. 两层 FFN 按前向相反顺序反传

先看包含激活的标准两层 FFN:

Z=OWup,H=ϕ(Z),X=HWdown.Z=OW_{\mathrm{up}}, \qquad H=\phi(Z), \qquad X=HW_{\mathrm{down}}.

shape 设为:

ORN×d,WupRd×dff,WdownRdff×d.O\in\mathbb R^{N\times d}, \quad W_{\mathrm{up}}\in\mathbb R^{d\times d_{ff}}, \quad W_{\mathrm{down}}\in\mathbb R^{d_{ff}\times d}.

给定输出梯度 GXG_X, 先经过最后一个线性层:

GH=GXWdownTRN×dff.G_H=G_XW_{\mathrm{down}}^T\in\mathbb R^{N\times d_{ff}}.

再经过激活函数:

GZ=GHϕ(Z).G_Z=G_H\odot\phi'(Z).

最后经过上投影:

GO=GZWupTRN×d.G_O=G_ZW_{\mathrm{up}}^T\in\mathbb R^{N\times d}.
图 6

两层 FFN 反传按前向相反顺序依次乘 W-down 与 W-up 的转置。

原视频 · 02:20 ↗

若为视频中的纯线性简图, 可把 ϕ\phi 视为恒等函数, 于是 GZ=GHG_Z=G_H

8. 门控 FFN 的边界

现代 LLM 常用 SwiGLU 等门控 FFN, 结构不再只有一条上投影:

U=OWup,G=OWgate,H=USiLU(G),X=HWdown.U=OW_{\mathrm{up}}, \qquad G=OW_{\mathrm{gate}}, \qquad H=U\odot\operatorname{SiLU}(G), \qquad X=HW_{\mathrm{down}}.

反向时梯度会在逐元素乘法处分成两支, 分别回到 WupW_{\mathrm{up}}WgateW_{\mathrm{gate}}, 再在输入 OO 处相加。

因此视频的两次转置投影是基础骨架, 不能替代真实激活与门控分支的导数。

跟练与练习

跟练:用 shape 检查线性层

给定:

X:32×768,W:768×3072,GY:32×3072.X:32\times768, \quad W:768\times3072, \quad G_Y:32\times3072.

则:

GX=GYWT:(32×3072)(3072×768)=32×768,G_X=G_YW^T: (32\times3072)(3072\times768) =32\times768,
GW=XTGY:(768×32)(32×3072)=768×3072.G_W=X^TG_Y: (768\times32)(32\times3072) =768\times3072.

两个结果必须分别与 XXWW 同 shape。

编者练习

设: Y=ABCD,Y=ABCD, 其中: A:2×3,B:3×4,C:4×5,D:5×6,A:2\times3, \quad B:3\times4, \quad C:4\times5, \quad D:5\times6, 且: GY:2×6.G_Y:2\times6. 写出 GBG_B 并检查 shape。

查看参考答案

由矩阵微分:
GB=ATGYDTCT.G_B = A^TG_YD^TC^T.
shape 依次为:
(3×2)(2×6)(6×5)(5×4)=3×4.(3\times2) (2\times6) (6\times5) (5\times4) = 3\times4.
结果与 BB 的 shape 相同。
也可写成:
GB=ATGY(CD)T,G_B=A^TG_Y(CD)^T,
但不能写成 ATGYCTDTA^TG_YC^TD^T
因为转置乘积要反序。

常见误区

误区 1:矩阵可以完全照搬标量的交换次序

矩阵乘法通常不可交换。

每次反传都应通过微分或 shape 检查转置顺序。

误区 2:线性层反传只有 dX=dYWTdX=dYW^T

还需要计算:

dW=XTdY,dW=X^TdY,

有 bias 时还要沿样本行归约得到 dbdb

误区 3:转置只转每个矩阵,不反转乘积次序

正确恒等式为:

(CD)T=DTCT.(CD)^T=D^TC^T.

误区 4:两层 FFN 反向仍先乘 WupTW_{\mathrm{up}}^T

反向按前向相反顺序, 先过 down 投影, 再过激活, 最后过 up 投影。

误区 5:真实 LLM FFN 都是两个纯线性层

激活函数需要逐元素导数, SwiGLU 等门控结构还会产生两条反向分支。

本课小结

  • 标量“替换求导目标”口诀进入矩阵后必须保留乘法次序。
  • Y=ABCDY=ABCD,有 BL=AT(YL)DTCT\nabla_BL=A^T(\nabla_YL)D^TC^T
  • 对行样本布局的 Y=XWY=XW,输入梯度是 dX=dYWTdX=dYW^T
  • 权重梯度是 dW=XTdYdW=X^TdY,bias 梯度沿 batch/token 轴归约。
  • 两层 FFN 先反传 WdownTW_{\mathrm{down}}^T,再过激活导数,最后反传 WupTW_{\mathrm{up}}^T
  • 视频矩阵图是基础骨架;真实门控 FFN 还需处理逐元素乘法和分支梯度累加。
06

主题讲解 · 00:42

Transformer 残差连接:两次同形状张量相加

学习目标

  • 在一层 Transformer 中定位 attention 与 FFN 外侧的两条残差旁路。
  • 写出残差更新 y=x+F(x)y=x+F(x),并解释逐元素相加的 shape 条件。
  • 区分残差流的模型维度与 attention 内部的 Q、K、V 维度。
  • 理解 FFN 内部可以升维,但输出必须回到模型维度才能残差相加。
  • 识别板书省略的 Norm,以及 Pre-Norm、Post-Norm 的结构差异。

前置与衔接

本课只回答一个很具体的问题:

图 1

把 token 残差流画大后,两条粉色旁路分别跨过 attention 与 FFN。

原视频 · 00:00 ↗

设序列长度为 TT,模型维度为 dd, 残差流写成:

XRT×d.X\in\mathbb R^{T\times d}.

一层 decoder block 通常包含两个主要子层:

  1. attention;
  2. FFN。

每个子层都接收一个 T×dT\times d 张量, 最终也要返回一个 T×dT\times d 张量, 这样才可以与旁路上的输入逐元素相加。

视频为了突出残差位置, 没有展开 LayerNorm/RMSNorm、dropout、多头拆分与门控 FFN。 这些省略不改变本课的 shape 主线。

核心讲解

1. 为什么要把残差流画大

如果把 XX、Q、K、V 都画成同样大的小块, 读者容易误以为它们在结构中的地位完全相同。

图 2

蓝色大矩形表示模型维度上的 token 表示,Q、K、V 是 attention 内部投影。

原视频 · 00:15 ↗

更准确的层次是:

  • XX 是贯穿 block 的残差流;
  • Q、K、V 是 attention 内部由 XX 投影得到的工作张量;
  • attention 最终还要经过输出投影回到 dd 维;
  • FFN 虽暂时升到 dffd_{ff},末端仍要降回 dd 维。

因此残差相加并不要求 Q、K、V 与 XX 的所有内部 shape 相同。 真正要对齐的是子层入口与子层最终出口。

2. 一层里有两处残差相加

图 3

一条旁路跨过 attention,另一条旁路跨过 FFN;每个子层各做一次残差相加。

原视频 · 00:20 ↗

把两个子层分别记为 A()A(\cdot)M()M(\cdot), 最简化的更新可以写成:

H=X+A(X),H=X+A(X),
Y=H+M(H).Y=H+M(H).

第一处把 attention 的输入写回 attention 输出; 第二处把 FFN 的输入写回 FFN 输出。

注意第二条旁路携带的是 HH, 不是最初的 XX

3. attention 旁路的 shape 条件

图 4

attention 子层的输入与最终输出在模型维度上逐元素相加。

原视频 · 00:25 ↗

若:

XRT×d,X\in\mathbb R^{T\times d},

那么多头 attention 拼接并经过 WOW_O 后应得到:

A(X)RT×d.A(X)\in\mathbb R^{T\times d}.

于是:

Hij=Xij+A(X)ijH_{ij}=X_{ij}+A(X)_{ij}

对每个 token 位置 ii 与模型通道 jj 都有定义。

如果 attention 内部总 head 维度与 dd 不同, 也可以由 WOW_O 投影回 dd; 残差相加检查的是投影后的输出,而不是中间 head 张量。

4. FFN 先升维,再回到残差维度

设:

WupRd×dff,WdownRdff×d.W_{up}\in\mathbb R^{d\times d_{ff}}, \qquad W_{down}\in\mathbb R^{d_{ff}\times d}.

简化 FFN 为:

M(H)=ϕ(HWup)Wdown.M(H)=\phi(HW_{up})W_{down}.

中间激活的 shape 是:

T×dff,T\times d_{ff},

但最终输出重新变成:

M(H)RT×d.M(H)\in\mathbb R^{T\times d}.
图 5

FFN 虽在内部升维,末端仍投影回模型维度,因此可与子层输入相加。

原视频 · 00:35 ↗

所以“同形状”不是要求 FFN 内部从不改变维度, 而是要求旁路汇合点两端同形状。

5. Norm 放在哪里取决于架构

视频省略 Norm, 因此上面的 X+A(X)X+A(X) 是结构骨架。

Pre-Norm 常写成:

H=X+A(Norm(X)),H=X+A(\operatorname{Norm}(X)),
Y=H+M(Norm(H)).Y=H+M(\operatorname{Norm}(H)).

Post-Norm 的典型写法是:

H=Norm(X+A(X)).H=\operatorname{Norm}(X+A(X)).

两者残差相加的位置仍可识别, 但 Norm 在子层之前还是相加之后不同。

不要仅凭一条旁路图就推断具体模型采用哪一种。

跟练与练习

跟练:检查两个残差汇合点

给定:

X:128×4096,X:128\times4096,

attention 拼接输出为 128×4096128\times4096, FFN 中间激活为 128×11008128\times11008

判断:

  • XX 能否直接与 attention 拼接输出相加?可以。
  • XX 能否直接与 FFN 中间激活相加?不可以。
  • FFN 经 down projection 变成 128×4096128\times4096 后能否相加?可以。
编者练习

设 Pre-Norm block 为: H=X+A(Norm(X)),H=X+A(\operatorname{Norm}(X)), Y=H+M(Norm(H)).Y=H+M(\operatorname{Norm}(H)).XRB×T×dX\in\mathbb R^{B\times T\times d}, 写出 AAMM 在各自汇合点必须返回的 shape, 并指出第二条旁路携带哪个张量。

查看参考答案

AA 必须返回:
B×T×d,B\times T\times d,
才能与 XX 相加得到同 shape 的 HH
MM 也必须返回:
B×T×d,B\times T\times d,
才能与 HH 相加得到 YY
第二条旁路携带的是第一处残差更新后的 HH
不是原始 XX

常见误区

误区 1:Q、K、V 必须与残差流完全同 shape

QKV 是子层内部张量; 残差要求对齐的是子层入口与最终输出。

误区 2:FFN 升维后就不能使用残差

FFN 中间可以升维, 只要 down projection 在汇合前恢复模型维度即可。

误区 3:两条旁路都直接复制最初的 X

第二个子层接收的是第一次残差更新后的 HH

误区 4:看到旁路就能判断 Pre-Norm 或 Post-Norm

必须同时检查 Norm 相对子层与加法的位置。

误区 5:同 shape 就可以随意广播相加

残差语义要求位置与通道一一对应。 依赖意外 broadcasting 往往意味着 shape 设计有误。

本课小结

  • 一层 Transformer 通常在 attention 与 FFN 外侧各有一条残差旁路。
  • 残差更新的骨架是 y=x+F(x)y=x+F(x)
  • 可相加的是子层入口和最终投影回模型维度的出口。
  • Q、K、V 与 FFN 中间维度都属于子层内部,不必与残差流全程同形状。
  • 第二条旁路携带第一次残差更新后的表示。
  • Pre-Norm 与 Post-Norm 的差别需要结合 Norm 位置判断。
07

主题讲解 · 02:11

从标量边权到向量残差流:理解 Hyper-Connections

学习目标

  • 解释感知机连边为什么等价于标量加权和。
  • 解释 Hyper-Connections 连边为什么表示向量线性组合。
  • 用矩阵视角统一两类连边。
  • 区分超连接、传统残差和归一化算子。

前置与衔接

本课需要熟悉矩阵乘法、线性组合和 Transformer 残差旁路。

视频用“感知机连边”对照“超连接连边”,重点是连边所携带对象的粒度。

核心讲解

1. 感知机的边连接标量

设输入为 x1,x2,x3x_1,x_2,x_3,一个输出神经元可写成

yj=ixiwij.y_j=\sum_i x_iw_{ij}.

图中每条边给一个输入标量乘一个标量权重。

图 1

感知机中的每条边给输入标量乘一个权重,再在输出节点求和。

原视频 · 00:20 ↗

多个输出一起计算时:

Y=XW.Y=XW.

所以网络图中的许多边可以整齐地排成权重矩阵。

图 2

神经网络边权可排成矩阵,矩阵乘法一次完成多个标量加权和。

原视频 · 00:40 ↗

矩阵乘法的每个输出元素本质上仍是一个加权和。

2. Hyper-Connections 的边连接整条向量流

Hyper-Connections 不只保留一条残差流,而是维护多条并行向量流。

若有 mm 条流,可把它们堆成

X=[x(1)x(2)x(m)].X=\begin{bmatrix} x^{(1)}\\ x^{(2)}\\ \vdots\\ x^{(m)} \end{bmatrix}.

其中每个 x(r)x^{(r)} 本身都是一个特征向量。

图 3

Hyper-Connections 将多个残差流作为并行向量通道,在子层前后汇聚与分发。

原视频 · 01:00 ↗

子层前可以汇聚若干流,子层后再把结果分发到多条流。

3. 向量加权和怎样计算

若汇聚系数为 ara_r,送入子层的向量可写成

h=r=1marx(r).h=\sum_{r=1}^{m}a_rx^{(r)}.

这里 ara_r 是标量,但它乘的是整条向量。

图 4

超连接的一条边给整条向量流乘标量系数,多个向量再逐元素相加。

原视频 · 01:20 ↗

若把所有流堆叠成张量,流维度上的线性组合仍可由小矩阵乘法实现。

这与感知机的共同点是“乘权重再相加”。

不同点是:感知机边通常连接标量分量,超连接边在残差流轴上混合向量通道。

4. 传统残差是一个特殊连接模式

普通残差层写成

y=x+F(x).y=x+F(x).

它只有一条恒等旁路与一条变换分支。

视频展示某个特定连接矩阵时,多流超连接会退化为这种加法模式。

图 5

特定连接系数把 Hyper-Connections 退化为传统残差旁路。

原视频 · 02:00 ↗

因此传统残差可以看作更一般流混合结构的特例。

本课依据视频板书解释该特例,不把某个符号排列扩展为所有 Hyper-Connections 实现的固定 API。

5. 残差、归一化与超连接不是一回事

残差连接决定计算图的加法旁路:x+F(x)x+F(x)

LayerNorm 对每个 token 的特征做均值中心化和方差归一化,再施加仿射参数:

LN(x)=γxμσ2+ϵ+β.\operatorname{LN}(x)=\gamma\odot\frac{x-\mu}{\sqrt{\sigma^2+\epsilon}}+\beta.

RMSNorm 不减均值,只按均方根缩放:

RMSNorm(x)=γxmean(x2)+ϵ.\operatorname{RMSNorm}(x)=\gamma\odot \frac{x}{\sqrt{\operatorname{mean}(x^2)+\epsilon}}.

Hyper-Connections 则改变残差流数量及流之间的汇聚、分发方式。

三者可能出现在同一个 Transformer block 中,但承担不同职责。

图中标注的 pre-norm 只是归一化相对子层和残差加法的位置,不等于超连接本身。

跟练与练习

原视频练习

编者练习

两条残差流 x(1)=(1,2)x^{(1)}=(1,2)x(2)=(3,4)x^{(2)}=(3,4),汇聚权重为 (2,1)(2,-1)。求汇聚向量。

查看参考答案

h=2x(1)x(2)=2(1,2)(3,4)=(1,0).h=2x^{(1)}-x^{(2)} =2(1,2)-(3,4)=(-1,0).
权重作用于整条向量,随后按对应分量求和。

常见误区

  • “向量连边”不是给每个分量随意使用不同拓扑;通常是流轴上的受控线性组合。
  • 矩阵实现相同不代表感知机层与超连接在语义上相同。
  • 传统残差是特殊连接模式,不等于 LayerNorm 或 RMSNorm。
  • pre-norm 描述归一化位置,不是残差边权的名称。
  • 视频中的具体 HC 矩阵符号应结合原实现定义,不宜脱离上下文机械复用。

本课小结

  • 感知机连边表示标量加权和。
  • Hyper-Connections 连边表示多条向量流的线性组合。
  • 两者都可用矩阵乘法实现,但混合轴与语义不同。
  • 传统残差是一般连接模式的一个特例。
  • 归一化、残差旁路和多流混合应分别理解。
08

主题讲解 · 03:02

前向残差为什么会产生反向梯度直通项

学习目标

  • Y=F(X)+XY=F(X)+X 推导输入梯度。
  • 理解单位雅可比产生的梯度直通项。
  • 区分“额外直通贡献”与“完整梯度原封不动”。
  • 判断 pre-norm 与 post-norm 对残差梯度路径的影响。

前置与衔接

需要掌握链式法则、雅可比和计算图中加法节点的反传规则。

本课解释残差连接为何帮助深层网络传播梯度。

核心讲解

1. 前向图有两条路径

残差层写成

Y=F(X)+X.Y=F(X)+X.

一条路径经过 FF,另一条是恒等旁路。

图 1

前向 Y=F(X)+X 的恒等旁路,在反向产生一条把上游梯度直接加回 X 的路径。

原视频 · 00:20 ↗

前向加法节点会在反向把同一上游梯度复制给两个输入分支。

2. 没有残差时只有雅可比分支

Y=F(X),Y=F(X),

则以列向量梯度约定可写为

XL=JF(X)TYL.\nabla_XL=J_F(X)^T\nabla_YL.
图 2

没有残差时,输入梯度由上游梯度与 F 的雅可比收缩得到。

原视频 · 01:00 ↗

对矩阵输入,JFJ_F 可视作高阶雅可比,公式中的乘法表示合适轴上的张量缩并。

视频采用另一种梯度排布约定,把上游梯度写在左侧;两种写法只要 shape 与转置一致即可。

3. 残差增加单位雅可比

Y=F(X)+X,Y=F(X)+X,

YX=JF(X)+I.\frac{\partial Y}{\partial X}=J_F(X)+I.
图 3

残差中的 X 对自身求导得到单位雅可比 I。

原视频 · 01:40 ↗

II 的作用是把任意同形状上游梯度保持原样。

4. 展开得到两项梯度贡献

XL=JF(X)TYL+YL.\nabla_XL =J_F(X)^T\nabla_YL+\nabla_YL.
图 4

展开后,输入梯度等于经过 F 雅可比的分支加上原样上游梯度。

原视频 · 02:00 ↗

第二项就是恒等旁路提供的梯度直通项。

图 5

反向图用一条镜像旁路表示上游梯度直接累加到输入梯度。

原视频 · 02:20 ↗

图上应画成:上游梯度一份进入 FF 的反向,另一份沿旁路直接到 XX,最后两份相加。

5. “原封不动”只描述其中一项

直通项的确等于 YL\nabla_YL

但完整输入梯度还包含 JFTYLJ_F^T\nabla_YL

两项可能同向增强,也可能部分抵消;深层网络仍可能出现梯度爆炸、数值不稳或优化困难。

所以更准确的结论是:残差提供一条不必穿过 FF 雅可比的加法路径,而不是保证总梯度恒等于上游梯度。

6. pre-norm 与 post-norm 的差异

pre-norm block 常写成

Y=X+F(N(X)),Y=X+F(N(X)),

其中 NN 可以是 LayerNorm 或 RMSNorm。

此时

XL=YL+JN(X)TJF(N(X))TYL.\nabla_XL=\nabla_YL+J_N(X)^TJ_F(N(X))^T\nabla_YL.

单位直通项仍在归一化之外。

post-norm 若写成

Y=N(X+F(X)),Y=N(X+F(X)),

则上游梯度先经过 JNTJ_N^T,恒等分支也不再是未经归一化雅可比的裸直通。

LayerNorm 与 RMSNorm 的雅可比又不同:LayerNorm包含均值中心化,RMSNorm不减均值。

无论使用哪一种,它们都是主分支或加法后的归一化算子,不应与残差加法混为一谈。

跟练与练习

原视频练习

编者练习

标量函数 y=x2+xy=x^2+x,损失对输出的梯度为 gg。求损失对 xx 的梯度,并指出残差直通项。

查看参考答案

dydx=2x+1,\frac{dy}{dx}=2x+1,
所以
dLdx=g(2x+1)=2xg+g.\frac{dL}{dx}=g(2x+1)=2xg+g.
gg 是残差旁路带来的直通项,2xg2xg 是主分支的梯度贡献。

常见误区

  • 前向残差不是在反向“新增参数”,而是加法节点的链式法则结果。
  • 直通项不等于完整输入梯度;完整梯度是多条路径之和。
  • 残差能缓解梯度消失,但不保证所有层梯度严格无衰减。
  • LayerNorm、RMSNorm 的导数不是单位阵。
  • pre-norm 与 post-norm 的裸直通路径不同,不能共用一句结论覆盖。

本课小结

  • Y=F(X)+XY=F(X)+X 的雅可比为 JF+IJ_F+I
  • 单位项把上游梯度直接贡献给输入梯度。
  • 主分支梯度与直通梯度在输入处相加。
  • pre-norm 保留归一化之外的恒等旁路,post-norm 则先受归一化雅可比影响。
  • 残差改善梯度传播,但不是总梯度稳定的绝对保证。
09

主题讲解 · 03:06

在 Transformer 反向图中追踪残差梯度

学习目标

  • 在 Transformer 前向图中找到两处残差加法。
  • 在反向图中画出加法节点的分流与累加。
  • 区分主分支梯度、直通梯度与跨层总梯度。
  • 理解残差、LayerNorm/RMSNorm 和线性层反传的不同角色。

前置与衔接

本课把“最简 Transformer 反传图”与“前向残差对应反向直通项”结合起来。

重点不是重新推导所有 attention 公式,而是在复杂计算图上正确放置残差梯度。

核心讲解

1. 先保留主分支骨架

简化前向 attention 为

QKTA,AVO,QK^T\rightarrow A,\qquad AV\rightarrow O,

再让 OO 经过 FFN 得到下一表示。

图 1

绿色旁路把 Transformer 的前向残差流与反向梯度直通路径上下对应。

原视频 · 00:00 ↗

绿色线表示旁路,蓝色与粉色矩阵表示子层主分支。

2. 前向 attention 与 FFN 主线

图 2

前向主线依次计算 QKᵀ、注意力权重与 V 的加权组合,再进入 FFN。

原视频 · 00:20 ↗

真实 attention 应区分 score、softmax 概率和输出投影;视频为可视化简洁用 AA 概括中间注意力矩阵。

这一主分支包含矩阵乘法、softmax、投影与 FFN 非线性。

3. 没有残差时,梯度只能走主分支

图 3

不计残差时,梯度依次反传经过 FFN 与注意力的矩阵运算。

原视频 · 00:40 ↗

从层输出梯度开始,反向依次经过 FFN、输出 OO、注意力概率、score,再回到 Q/K/V 投影。

每个线性层对输入的梯度遵循

dX=dYWT,dX=dYW^T,

同时参数还需累积

dW=XTdY.dW=X^TdY.

所以“反向乘转置权重”只是输入梯度分支,不是线性层训练的全部。

4. 前向残差在加法节点合流

对任一子层,先写最简单形式

y=x+F(x).y=x+F(x).
图 4

前向残差把子层输入直接加到子层输出,形成主分支与旁路的合流。

原视频 · 01:20 ↗

Transformer block 通常在 attention 子层和 FFN 子层各有一次残差加法。

输入沿旁路绕过子层,最终与子层输出逐元素相加。

5. 反向在同一节点分流

设上游梯度为 gyg_y

加法节点对两个输入的局部导数都为单位映射,因此:

gmain=gy,gskip=gy.g_{main}=g_y,\qquad g_{skip}=g_y.

主分支继续经过 FF 的反向,旁路直接传到输入。

图 5

反向传播沿绿色旁路复制上游梯度,并与主分支梯度在输入处相加。

原视频 · 02:00 ↗

输入处的总梯度为

gx=JF(x)Tgy+gy.g_x=J_F(x)^Tg_y+g_y.

它是两条贡献的累加,不是二选一。

6. 跨层时继续累加

图 6

当前层的直通梯度最终累加到前一层输出梯度,而不是替代主分支梯度。

原视频 · 02:40 ↗

当前层的旁路梯度到达前一层输出后,还要与来自当前层主分支的梯度以及其他使用该张量的路径共同累加。

反向图中的“绿色通道”表示一条低复杂度局部路径,不表示整网只剩这一条路径。

7. 为什么它能缓解梯度消失

如果某个主分支雅可比很小,JFTgyJ_F^Tg_y 可能接近零。

残差仍提供 gyg_y 这一项,使梯度不必只依赖主分支连乘。

但完整梯度可能在不同路径间抵消,也可能被多层放大。

因此残差“缓解”梯度消失,不等于严格保证梯度范数无损或恒定。

8. 归一化位置会改变结论的精确形式

pre-norm 常写成

y=x+F(N(x)),y=x+F(N(x)),

单位旁路在归一化 NN 之外,因此存在裸直通项 gyg_y

NN 可以是 LayerNorm 或 RMSNorm;两者局部雅可比不同,但只作用在主分支中。

post-norm 若写成

y=N(x+F(x)),y=N(x+F(x)),

上游梯度会先经过 JNTJ_N^T,再在加法节点分流。

所以视频的绿色裸直通图最适合解释无归一化简图或 pre-norm 结构,不能不加说明地套到 post-norm。

LayerNorm 会减均值并按标准差缩放;RMSNorm 不减均值,只按均方根缩放。它们不是残差边,也不替代梯度累加。

跟练与练习

原视频练习

编者练习

y=x+Wxy=x+Wx,已知上游列向量梯度为 gg。求输入梯度,并指出主分支与旁路贡献。

查看参考答案

主分支 WxWx 的输入梯度为 WTgW^Tg
恒等旁路的输入梯度为 gg
因此
xL=WTg+g=(WT+I)g.\nabla_xL=W^Tg+g=(W^T+I)g.

常见误区

  • 绿色直通项不是完整梯度,完整梯度还要加主分支贡献。
  • 残差缓解梯度消失,不保证总梯度范数始终不变。
  • 线性层反向除了 dX=dYWTdX=dYW^T,还必须计算 dWdW
  • LayerNorm/RMSNorm 是归一化算子,不是残差旁路。
  • pre-norm 的裸直通项不能无条件照搬到 post-norm。
  • 视频的 AA 是简图记号,严格推导仍要区分 score 与 softmax 概率。

本课小结

  • Transformer 的 attention 与 FFN 子层都可配残差加法。
  • 前向加法在反向把上游梯度复制到主分支与旁路。
  • 输入梯度是主分支雅可比贡献与单位直通贡献之和。
  • 残差提供更短梯度路径,但不是绝对无衰减保证。
  • 归一化位置决定直通项是否先经过 LayerNorm/RMSNorm 雅可比。
10

单元综合

残差流与超连接:统一前向状态和反向梯度

单元能力目标

本单元最终要建立一种“双向读图”能力:

  • 正向看状态如何跨过 attention、FFN 与网络层;
  • 反向看上游梯度如何沿每条前向边返回,并在共享输入处累加。

面对普通残差、Hyper-Connections 或 mHC,应能先写出统一的前向骨架,再从该骨架推出反向信息流,而不是分别死记多套图。

需要能够完成以下检查:

  1. 区分 token 轴、残差流轴、模型特征轴与 FFN 中间维度。
  2. 找到每个子层入口、出口、旁路和汇合点,并验证相加张量同 shape。
  3. 对线性层、加法节点和多流混合写出正确的反向转置与梯度累加。
  4. 解释普通残差如何成为 Hyper-Connections 与 mHC 的单流特例。
  5. 判断 pre-norm 与 post-norm 中是否存在不经过归一化雅可比的裸直通项。

把这些能力合在一起,前向和反向可以概括为:

前向:多路信息在节点处汇合,\text{前向:多路信息在节点处汇合},
反向:梯度沿边反传,并在共同来源处相加.\text{反向:梯度沿边反传,并在共同来源处相加}.

概念连接

1. 普通 Transformer 残差先给出单流基线

设一层输入为

XRT×d.X\in\mathbb R^{T\times d}.

忽略 Norm 的位置细节,一层中两次残差更新可写成

H=X+A(X),H=X+A(X),
Y=H+M(H),Y=H+M(H),

其中 AA 表示 attention 子层,MM 表示 FFN 子层。

第一条旁路携带 XX,第二条旁路携带已经更新过的 HH

残差相加要求子层入口和最终出口同 shape:

A(X),M(H)RT×d.A(X),M(H)\in\mathbb R^{T\times d}.

这不要求子层内部所有张量都保持 T×dT\times d

  • attention 内部可以拆成 Q、K、V 与多个 head;
  • FFN 可以暂时升到 dffd_{ff}
  • 汇合前只需经过输出投影恢复模型维度 dd

因此残差流是贯穿 block 的状态,QKV 与 FFN 中间激活只是子层内部工作张量。

2. 一条前向恒等边对应一个反向单位项

对单个残差子层

y=x+F(x),y=x+F(x),

加法节点在反向把同一个上游梯度交给两条输入边。

采用列向量梯度约定:

gx=JF(x)Tgy+gy=(JF(x)T+I)gy.g_x =J_F(x)^Tg_y+g_y =\left(J_F(x)^T+I\right)g_y.

第一项来自主分支,第二项来自恒等旁路。

所谓“梯度直通”只描述第二项原样通过;完整输入梯度仍是两条贡献之和。

两项可能同向增强,也可能部分抵消,所以残差提供短梯度路径,但不保证总梯度范数恒定。

3. 线性层的前向与反向构成基本积木

对行样本布局的线性层 Y=XWY=XW

GX=GYWT,GW=XTGY.G_X=G_YW^T, \qquad G_W=X^TG_Y.

GXG_XGWG_W 必须分别与 XXWW 同 shape;前者用转置权重返回输入,后者在样本/token 轴归约。

Z=OWupZ=OW_{up}H=ϕ(Z)H=\phi(Z)X=HWdownX=HW_{down},反向按前向相反顺序:

GH=GXWdownT,GZ=GHϕ(Z),GO=GZWupT.G_H=G_XW_{down}^T, \qquad G_Z=G_H\odot\phi'(Z), \qquad G_O=G_ZW_{up}^T.

门控 FFN 还会在逐元素乘法处分叉,最后在共同输入处累加;不能用两次转置投影替代激活与门控导数。

4. Hyper-Connections 把单流状态扩成多流状态

单个 token 的状态为 XRn×dX\in\mathbb R^{n\times d},整条序列为 RRT×n×dR\in\mathbb R^{T\times n\times d}。三个轴不能混淆:

  • attention 在 token 轴上建立位置间交互;
  • Hyper-Connections 在线性连接中组织残差流轴;
  • attention 与 FFN 的主子层接收模型特征轴 dd

残差流扩展为 nn 条,不表示 token 数变成 nn,也不表示模型维度变成 ndnd

5. 多流子层统一为聚合、变换、分发与混合

采用“流为行”的记号,令

Am,BRn,ArRn×n.A_m,B\in\mathbb R^n, \qquad A_r\in\mathbb R^{n\times n}.

先沿流轴聚合:

x~=AmTXRd.\widetilde x=A_m^TX\in\mathbb R^d.

再执行一个主子层:

z=F(Norm(x~))Rd.z=F(\operatorname{Norm}(\widetilde x))\in\mathbb R^d.

最后把旧流混合,并把新子层输出分发回多流:

X=ArX+BzTRn×d.X'=A_rX+Bz^T\in\mathbb R^{n\times d}.

三类连接的角色分别是:

  • AmA_m:多流到单输入的聚合;
  • BB:单输出到多流的分发;
  • ArA_r:旧多流到新多流的混合与传递。

attention 和 FFN 内部计算不同,但都可以复用这个多流接口:

多流状态单个子层输入单个子层输出多流状态.\text{多流状态} \rightarrow \text{单个子层输入} \rightarrow \text{单个子层输出} \rightarrow \text{多流状态}.

attention 的完整多流输出才会成为 FFN 的输入;FFN 输出又继续成为下一层 attention 的多流输入。

6. 多流前向式直接决定多流反向式

XX' 的上游梯度为

GRn×d.G'\in\mathbb R^{n\times d}.

从旧流混合项

Xres=ArXX'_{res}=A_rX

返回的梯度为

GXres=ArTG.G_X^{res}=A_r^TG'.

从分发项

Xsub=BzTX'_{sub}=Bz^T

返回到子层输出的梯度为

gz=(G)TBRd.g_z=(G')^TB\in\mathbb R^d.

gx~=JFNorm(x~)Tgz,g_{\widetilde x} =J_{F\circ\operatorname{Norm}}(\widetilde x)^Tg_z,

再通过聚合式 x~=AmTX\widetilde x=A_m^TX 返回多流:

GXsub=Amgx~T.G_X^{sub}=A_mg_{\widetilde x}^T.

两条路径在旧状态 XX 处相加:

GX=ArTG+Amgx~T.G_X =A_r^TG' +A_mg_{\widetilde x}^T.

这就是普通残差反向公式的多流推广:

  • ArTGA_r^TG' 是广义旁路贡献;
  • Amgx~TA_mg_{\widetilde x}^T 是经过分发、主子层与聚合返回的贡献。

同一个张量若还被其他计算使用,来自那些路径的梯度也必须继续累加。

7. 普通残差是多流公式的单流边界

n=1,Am=Ar=B=[1].n=1, \qquad A_m=A_r=B=[1].

前向式退化为

x=x+F(Norm(x)),x'=x+F(\operatorname{Norm}(x)),

即 pre-norm 普通残差。

反向式同时退化为

gx=gx+JFNorm(x)Tgx.g_x =g_{x'} +J_{F\circ\operatorname{Norm}}(x)^Tg_{x'}.

所以“普通残差是特例”不仅是前向拓扑结论,也在反向梯度流中保持一致。

Am,Ar,BA_m,A_r,B 设为一只能恢复该算子顺序,不能把 Norm 移动到加法之后。

8. mHC 约束流间混合,但保留同一信息流骨架

mHC 把流间混合记作 HresH^{res},并要求

Hres1=1,1THres=1T,Hijres0.H^{res}\mathbf1=\mathbf1, \qquad \mathbf1^TH^{res}=\mathbf1^T, \qquad H^{res}_{ij}\ge0.

即行和、列和均为一且元素非负;约束对象是残差流混合矩阵,不是 attention 或 FFN 的特征维度权重。

n=1n=1 时,唯一的双随机矩阵是 Hres=[1]H^{res}=[1];再配合单位 pre 聚合与 post 分发,便得到普通残差。

在反向中,旁路使用 (Hres)T(H^{res})^T;双随机矩阵的转置仍满足行列和为一与非负条件。

但“双随机”不等于“单位阵”,也不等于完整梯度原样不变:多流之间仍可能发生重分配,完整梯度仍要加上主子层路径。

对比与决策

1. 三种连接结构放在同一张表里

结构前向状态旁路/混合主子层接口反向短路径
普通残差T×dT\times d 单流恒等加法ddd\to dgyg_y
Hyper-ConnectionsT×n×dT\times n\times d 多流一般 ArA_r 混合先聚合到 dd,再分发ArTGA_r^TG'
mHC同样是多流双随机 HresH^{res}同样聚合、子层、分发(Hres)TG(H^{res})^TG'

主 attention 或 FFN 通常只处理聚合后的一个 dd 维表示,因此残差流数增大不要求把昂贵主子层复制 nn 次。

总成本仍会增加多流状态存储、聚合、分发、流间混合与连接参数维护,不能说完全免费。

2. 残差、Norm 与超连接分别回答什么

机制核心问题常见误解
残差加法旧状态如何绕过子层并与新信息合流等同于归一化
LayerNorm/RMSNorm特征如何归一化自动产生恒等旁路
Hyper-Connections多条残差流如何聚合、混合和分发每条流各跑一次完整子层

pre-norm 与 post-norm 描述 Norm 相对于主子层和残差加法的位置,不是连接权重的名称。

3. pre-norm 与 post-norm 的反向差别

pre-norm:

y=x+F(N(x)).y=x+F(N(x)).

反向为

gx=gy+JN(x)TJF(N(x))Tgy.g_x =g_y +J_N(x)^TJ_F(N(x))^Tg_y.

单位旁路位于 Norm 外部,因此存在裸直通项 gyg_y

post-norm:

y=N(x+F(x)).y=N(x+F(x)).

上游梯度先经过 JNTJ_N^T,然后才在加法节点分流。

因此不能把 pre-norm 的绿色裸直通图无条件套到 post-norm。

4. 一套稳定的前向/反向读图顺序

遇到新的残差结构时,依次执行:

  1. 写清 token、流、模型特征与中间特征四类轴。
  2. 把每个子层圈成“同 shape 输入、同 shape 最终输出”的黑盒。
  3. 标出所有前向分叉、线性变换与加法汇合。
  4. 反向逐边取局部导数:线性映射回输入时使用转置,加法节点复制上游梯度。
  5. 在一个变量被多条路径使用的位置,把所有梯度贡献相加。
  6. 最后检查每个梯度是否与对应变量同 shape,并确认 Norm 的算子顺序。

综合训练

编者练习

考虑一个两流、一维特征的简化 Hyper-Connections 子层: X=[24],Am=[0.50.5],X= \begin{bmatrix} 2\\4 \end{bmatrix}, \qquad A_m= \begin{bmatrix} 0.5\\0.5 \end{bmatrix}, Ar=[0.750.250.250.75],B=[10.5].A_r= \begin{bmatrix} 0.75&0.25\\ 0.25&0.75 \end{bmatrix}, \qquad B= \begin{bmatrix} 1\\0.5 \end{bmatrix}.F(u)=2uF(u)=2u,忽略 Norm,并给定输出上游梯度 G=[12].G'= \begin{bmatrix} 1\\2 \end{bmatrix}. 完成以下任务:

  1. 检查 ArA_r 是否为双随机矩阵。
  2. 计算聚合输入 x~\widetilde x、子层输出 zz 与新状态 XX'
  3. 分别计算反向旁路贡献 ArTGA_r^TG' 与主子层贡献 Amgx~A_mg_{\widetilde x}
  4. 求总输入梯度 GXG_X,并说明为什么两条贡献必须相加。
  5. n=1n=1 且三个连接参数全为一,验证公式退化为普通残差的前向和反向。
查看参考答案

ArA_r 的每行、每列元素和均为一,且元素非负,因此它是双随机矩阵。
前向计算为
x~=AmTX=0.5×2+0.5×4=3,z=F(3)=6,ArX=(2.5,3.5)T,Bz=(6,3)T,X=(8.5,6.5)T.\begin{aligned} \widetilde x&=A_m^TX=0.5\times2+0.5\times4=3,\\ z&=F(3)=6,\\ A_rX&=(2.5,3.5)^T,\\ Bz&=(6,3)^T,\\ X'&=(8.5,6.5)^T. \end{aligned}
反向计算为
GXres=ArTG=(1.25,1.75)T,gz=(G)TB=1×1+2×0.5=2,gx~=F(3)gz=2×2=4,GXsub=Amgx~=(2,2)T,GX=GXres+GXsub=(3.25,3.75)T.\begin{aligned} G_X^{res}&=A_r^TG'=(1.25,1.75)^T,\\ g_z&=(G')^TB=1\times1+2\times0.5=2,\\ g_{\widetilde x}&=F'(3)g_z=2\times2=4,\\ G_X^{sub}&=A_mg_{\widetilde x}=(2,2)^T,\\ G_X&=G_X^{res}+G_X^{sub}=(3.25,3.75)^T. \end{aligned}
XX 同时影响旧流混合项与主子层项,所以链式法则要求把两条路径的贡献相加。
若令 n=1n=1Am=Ar=B=1A_m=A_r=B=1,则 x=x+F(x)=3xx'=x+F(x)=3x;给定上游梯度 gg',反向为 gx=g+F(x)g=3gg_x=g'+F'(x)g'=3g'
这同时恢复了普通残差的前向加法与反向单位直通项。
自检标准:
XX'GXG_X 都必须保持两流一维的 shape;
• 旁路反传必须使用 ArTA_r^T
• 主分支梯度必须先经 BB 汇聚,再经过 FF,最后经 AmA_m 分发;
• 总输入梯度不能只保留其中一条路径。

进入下一单元前

  • 已能在 Transformer block 中找出 attention 与 FFN 的两次残差汇合,并说明第二条旁路携带的是第一次更新后的状态。
  • 已能区分残差流、QKV、FFN 中间激活与最终子层输出的 shape 角色。
  • 已能从 y=x+F(x)y=x+F(x) 推出 gx=JFTgy+gyg_x=J_F^Tg_y+g_y,且不会把直通项误当成完整梯度。
  • 已能对线性层同时写出输入梯度与参数梯度,并按相反顺序追踪 FFN 反向。
  • 已能用 AmA_mBBArA_r 解释多流聚合、输出分发与旧流混合。
  • 已能从多流前向式推出 GX=ArTG+Amgx~TG_X=A_r^TG'+A_mg_{\widetilde x}^T,并用 shape 检查每一项。
  • 已能说明普通 pre-norm 残差是单流单位连接特例,而 post-norm 需要保留不同算子顺序。
  • 已能检验双随机流混合矩阵,并理解该约束不等于梯度恒等传递。

若以上任一项仍依赖背图而无法从前向式重新推出,应先回到“逐边局部导数、共享输入处累加”这一规则,再进入后续训练动态主题。