GGML计算基础:矩阵的基本运算
矩阵相乘
是神经网络中算力消耗最大的部分,通常占据 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 的寻址方式重复读取同一个数据,从而节省大量的显存带宽。