11

矩阵乘法——一次变换一整批向量

阅读约 8 分钟第 11/60 课

上一章节学了点积:两个向量对应位置相乘再求和,得到一个数字。这一章节要看的是矩阵乘法——它本质上就是一批点积同时计算。

矩阵乘法是神经网络的计算原语。Sophia 从输入到输出的所有核心操作——嵌入查表、注意力计算、前馈网络——底层都是矩阵乘法。理解了它,后面的章节就不再是黑盒。

矩阵是什么

矩阵就是一个数字方阵——一排一排的数字整齐地排列成行和列。

A = | 1  2  3 |
    | 4  5  6 |

这是一个 2 行 3 列的矩阵,简写为 2×3 矩阵。

向量是矩阵的特殊情况:一行多列的矩阵(行向量),或者一列多行的矩阵(列向量)。上一章节的 1,536 维向量就是一个 1×1,536 的矩阵。

上一个单元结尾提到,一段文本经过嵌入层之后变成一个 5×1,536 的矩阵——5 个 token,每个 token 一个 1,536 维的向量。这就是一个矩阵。

矩阵乘法的规则

两个矩阵相乘有一个前提条件:第一个矩阵的列数必须等于第二个矩阵的行数。

如果 A 是 m×n 矩阵,B 是 n×p 矩阵,那 A×B 的结果是一个 m×p 矩阵。

结果矩阵的每一个位置是怎么算出来的?第 i 行、第 j 列的值 = A 的第 i 行 与 B 的第 j 列 的点积。

用一个具体的数字例子:

A = | 1  2  3 |       B = | 7  10 |
    | 4  5  6 |            | 8  11 |
                           | 9  12 |
    (2×3)                  (3×2)

A 有 3 列,B 有 3 行——匹配。结果是 2×2 矩阵。

结果[1,1] = A第1行 · B第1列 = 1×7 + 2×8 + 3×9  = 7+16+27 = 50
结果[1,2] = A第1行 · B第2列 = 1×10 + 2×11 + 3×12 = 10+22+36 = 68
结果[2,1] = A第2行 · B第1列 = 4×7 + 5×8 + 6×9  = 28+40+54 = 122
结果[2,2] = A第2行 · B第2列 = 4×10 + 5×11 + 6×12 = 40+55+72 = 167

A × B = | 50   68  |
        | 122  167 |

用 Python 写出来:

def matmul(A, B):
    m = len(A)          # A 的行数
    n = len(A[0])       # A 的列数 = B 的行数
    p = len(B[0])       # B 的列数
    result = []
    for i in range(m):
        row = []
        for j in range(p):
            # 第 i 行和第 j 列的点积
            val = 0
            for k in range(n):
                val += A[i][k] * B[k][j]
            row.append(val)
        result.append(row)
    return result

三层循环——这就是为什么矩阵乘法的计算量随着矩阵大小的增长而急剧上升。一个 1,536×1,536 的矩阵乘以另一个 1,536×1,536 的矩阵,需要约 1,536³ ≈ 36 亿次乘加。GPU 专门为大规模并行乘加设计——它能在毫秒级完成这个计算。

矩阵乘法 = 一批线性变换

矩阵乘法在神经网络中的含义不只是一堆数字相乘。它代表的是变换。

回到第 02 章节的神经元。一个神经元接收输入向量、乘以权重、求和——这就是输入向量和权重向量的点积。一层有很多个神经元,每个神经元有自己的权重向量。把所有神经元的权重排成一个矩阵,那「输入通过一层」这个操作就变成了一次矩阵乘法:

输入向量 (1×1536) × 权重矩阵 (1536×1536) = 输出向量 (1×1536)

输入是 1,536 维的,输出也是 1,536 维的。权重矩阵把输入向量从一个位置「搬」到了另一个位置——这就是线性变换。不同的权重矩阵执行不同的变换:有的旋转,有的拉伸,有的投影。

如果是一批 token 同时通过同一层呢?假设有 5 个 token,每个是 1,536 维的向量,排成一个 5×1,536 的矩阵:

输入矩阵 (5×1536) × 权重矩阵 (1536×1536) = 输出矩阵 (5×1536)

一次矩阵乘法就把 5 个 token 全部变换了。这就是矩阵乘法的威力:不管有多少个 token,只要排成一个矩阵,一次操作就能批量处理。GPU 的并行能力在这里被完美利用——5 个 token 和 500 个 token 的计算可以同时进行。

神经网络里到处都是矩阵乘法

Sophia 从输入到输出的计算过程,可以简化成一连串的矩阵乘法(每两个矩阵乘法之间插入一个激活函数):

token ID 序列
  ↓ 嵌入层(查表 = 特殊的矩阵乘法)
5 × 1536 矩阵
  ↓ 注意力层(矩阵乘法 × 3:计算 Q、K、V)
5 × 1536 矩阵
  ↓ 前馈网络(矩阵乘法 × 2 + 激活函数)
5 × 1536 矩阵
  ↓ ……重复 28 层……
  ↓ 输出层(矩阵乘法:1536 维 → 65536 维)
5 × 65536 矩阵(每个 token 对 65536 个候选词的预测概率)

注意最后一步:输出层把 1,536 维的向量映射到 65,536 维——词表中每个 token 各占一个维度,数值代表模型认为下一个词是该 token 的可能性。

你不需要记住这个流程的每一步——后面的章节会逐一展开。现在只需要记住:矩阵乘法是神经网络里所有计算的基础操作。 理解了矩阵乘法,你就有了阅读后面所有架构细节的数学基础。

这个单元学了什么

三个章节串起来:

  1. 向量(第 09 章节):一组数字描述一个词的含义。1,536 个数字 = 1,536 个维度。含义相近的词,向量相近。
  2. 点积(第 10 章节):两个向量对应位置相乘再求和。衡量方向的一致性 = 衡量相似度。
  3. 矩阵乘法(本章节):一批点积同时计算。神经网络的核心计算原语。

有了这三个工具,下一个单元就可以进入 Transformer 的核心——注意力机制。一个词怎么「看见」它前面的词?它怎么决定关注哪些词、忽略哪些词?答案就藏在矩阵乘法和点积的组合里。