概念界定

逐元素运算是在张量对应位置的元素之间执行相同操作;广播是在满足特定 shape 规则时,让较小张量沿某些轴自动扩展参与计算。二者共同构成深度学习中 bias、mask、gate、residual 和 normalization 的基础运算规则。

背景与问题

大模型代码中并非所有计算都是矩阵乘法。大量操作是逐元素加法、乘法、比较、指数、归一化和 mask。许多 shape 错误、mask 错误和隐性 bug 都来自对广播语义理解不清。

定义与记号

逐元素加法示例:

A: [B, T, D]
B: [B, T, D]
C = A + B: [B, T, D]

广播加法示例:

X: [B, T, D]
b: [D]
Y = X + b: [B, T, D]

Attention mask 示例:

scores: [B, H, T, T]
mask:   [B, 1, 1, T]

mask 可以广播到 head 维度和 query position 维度。

直观解释

广播可以理解为“在缺失的轴上复用同一组数值”。例如 bias [D] 会被加到每个 batch、每个 token 的 hidden vector 上。它通常不是物理复制数据,而是通过张量视图和 stride 规则完成。

基本性质

  • 广播要求对应维度相等,或其中一个维度为 1。
  • 广播合法不等于语义正确,尤其是 mask 和 attention score 场景。
  • 逐元素乘法不同于矩阵乘法,不会做行列内积。
  • residual connection 通常要求两个张量 shape 完全一致。

示例

SwiGLU 中的 gate 结构可以看作逐元素乘法:

gate:  [B, T, D_ff]
value: [B, T, D_ff]
out = gate * value

Causal mask 通常通过给非法位置加一个极小值实现:

masked_scores = scores + mask

其中 mask 在非法位置上接近 -inf,使 softmax 后这些位置权重接近 0。

常见误解

  • 误解:广播会真的复制出一个大张量。
    • 正确理解:多数框架会用视图语义避免真实复制,但后续操作可能触发物化。
  • 误解:shape 能广播就说明代码正确。
    • 正确理解:轴的语义可能错位,尤其是 [B, T, 1][B, 1, T]
  • 误解:*@ 只是写法不同。
    • 正确理解:* 通常是逐元素乘法,@ 通常是矩阵乘法。

相关概念