矩阵相乘
是神经网络中算力消耗最大的部分,通常占据 LLM 推理计算量的 95% 以上。
矩阵乘法 (Matrix Multiplication / GEMM)
这是最通用的矩阵运算形式,也是 AI 芯片中 Tensor Core 或 MAC 阵列的主要工作内容。
定义: 设矩阵 $A$ 的形状为 $(M \times K)$,矩阵 $B$ 的形状为 $(K \times N)$,则它们的乘积 $C = A \times B$ 的形状为 $(M \times N)$。
计算公式: 目标矩阵中第 $i$ 行第 $j$ 列的元素,等于 $A$ 的第 $i$ 行与 $B$ 的第 $j$ 列的对应元素乘积之和: $$ C_{ij} = \sum_{k=1}^{K} A_{ik} \cdot B_{kj} $$
工程视角:
- 维度约束:左矩阵的列数 ($K$) 必须等于右矩阵的行数 ($K$)。这个 $K$ 维度在运算中会被“消掉”(Reduction)。
- LLM 应用:全连接层 (Linear Layers)、注意力机制中的 $Q/K/V$ 投影。
- 硬件特性:典型的计算密集型算子。优化的核心在于提高数据复用率(Data Reuse),减少从 HBM/DRAM 读取数据的次数。
向量点积 (Vector Dot Product)
在数学上,点积是矩阵乘法的一种特例;在物理意义上,它是衡量相似度的工具。
- 定义:两个同维度向量 $\vec{a}$ 和 $\vec{b}$ 的运算。
- 计算公式:
$$ \vec{a} \cdot \vec{b} = \sum_{i=1}^{n} a_i b_i $$
结果:结果是一个标量 (Scalar),即一个单纯的数值。
工程视角:
- 几何意义:反映两个向量方向的一致性。方向越接近,点积越大。
- LLM 应用:Self-Attention 的核心逻辑。虽然代码实现通常是批量矩阵乘法 ($Q \times K^T$),但其数学本质是计算 Query 向量与 Key 向量的点积来获得注意力分数。
逐元素运算 (Element-wise Operations)
这类运算的特点是不改变矩阵形状,且计算之间互不依赖。它们通常对算力要求不高,但对显存带宽极其敏感。
逐元累积 (Hadamard Product)
常被称为 “Element-wise Product”。
- 定义: 两个形状完全相同的矩阵 $A$ 和 $B$ 进行运算。
- 计算公式:
$$ (A \odot B){ij} = A{ij} \times B_{ij} $$
- 工程视角:
- LLM 应用:
- 门控 (Gating):如 LLaMA 使用的 SwiGLU 激活函数,通过逐元素相乘来控制信息通过量。
- 掩码 (Masking):在 Attention 矩阵中,将不需要关注的位置乘以 0(或加负无穷)。
加法与减法
- 定义: 两个形状相同的矩阵对应位置相加或相减。
- 计算公式: $$(A \pm B){ij} = A{ij} \pm B_{ij}$$
- 工程视角:
- LLM 应用:
- 残差连接 (Residual Connection):$X + \text{Layer}(X)$。这是深层网络能够训练的关键。
- 偏置 (Bias):$Y = XW + b$。
- 硬件特性:典型的 Memory Bound 操作。因为每个数据读进来只做一次简单的加法就写回去了,算术强度(Arithmetic Intensity)极低。
标量乘法 (Scalar Multiplication)
- 定义: 一个单独的数值 $\lambda$ 乘以矩阵中的每一个元素。
- 计算公式:
$$ (\lambda A){ij} = \lambda \cdot A{ij} $$
- 工程视角:
- LLM 应用:
- 缩放 (Scaling):Attention 中的 $\frac{QK^T}{\sqrt{d_k}}$,防止点积数值过大导致 Softmax 梯度消失。
- 归一化 (Normalization):LayerNorm 中的 $\gamma$ 参数本质上也是一种特定维度的缩放。
结构变换 (Structural Transformations)
这类操作通常不涉及数值的改变,而是改变数据的排列方式或索引方式。
转置 (Transpose)
- 定义: 将矩阵的行和列互换。
- 公式: $$(A^T){ij} = A{ji}$$
- 工程视角:
- LLM 应用:多头注意力机制 (Multi-Head Attention) 中,为了并行计算多个头,需要频繁进行 (Batch, Seq, Head, Dim) 到(Batch, Head, Seq, Dim) 的维度置换(Permute,广义的转置)。
- 硬件挑战:转置意味着非连续的内存访问。在硬件设计中,通常需要专门的 Transpose Engine 或者利用 SRAM/寄存器文件进行巧妙的数据混洗,否则会严重导致 Cache Miss。
广播 (Broadcasting)
这是工程实现中极为重要的机制,允许不同形状的张量进行算术运算。
定义: 当两个矩阵形状不匹配时,自动将较小的矩阵在特定维度上进行逻辑上的复制,使其与大矩阵形状一致,再进行运算。
规则:
- 从最后面的维度开始对齐。
- 如果某个维度大小为 1,则可以扩展到任意大小。
工程视角:
- 例子:矩阵 $A(100 \times 256)$ 加上向量 $b(1 \times 256)$。系统会将 $b$ 在第 0 维复制 100 次。
- 硬件优势:优秀的 SDK 或 NPU 设计支持“隐式广播”,即不需要真的在内存中复制数据,只需利用 Stride(步长)为 0 的寻址方式重复读取同一个数据,从而节省大量的显存带宽。
评论