向量、矩阵与形状

本节目标

本节把上一课的一维向量扩展成矩阵与张量。重点不是背符号,而是为每个轴写出业务含义,在计算前做 shape 推导,并区分矩阵乘法、点积和逐元素乘法。

为什么需要

一条样本的特征是向量,一批样本是矩阵,模型权重也常是矩阵。大量 ML 错误首先是 shape 错误,而不是“算法太难”。

标量、向量、矩阵

  • 标量 :一个数,例如学习率 0.01。
  • 列向量 : 个有顺序的分量。
  • 矩阵 : 行、 列;常约定每行一个样本、每列一个特征。
  • 张量:零维、向量和矩阵向更高维的推广。例如 batch × sequence × hidden 是三维张量;每个轴都必须有明确语义。

的形状可写 (2,) 或 (2,1),二者在具体库中行为可能不同; 是 。

基本运算

同形向量相加、标量缩放:

矩阵乘法 要求 的列数等于 的行数:

元素公式:

例:

第一项 。它不同于逐元素乘法。

同形矩阵的逐元素乘法(Hadamard product)写作 。它保留 shape;矩阵乘法会收缩相邻内维。不要因为某个库用 * 或 @ 就跳过数学语义检查。

转置与批量视角

转置交换行列:。若每行是一条样本,线性预测可写:

为 , 为 ,输出为 :一次计算 条样本。

Shape 账本

对每个计算写一行账本:

名称Shape轴的语义
Xn × d_in样本 × 输入特征
Wd_out × d_in输出特征 × 输入特征
X @ W.Tn × d_out样本 × 输出特征
bd_out每个输出特征的偏置
Zn × d_out每条样本的输出表示

如果使用列样本约定,公式会改写,但语义应保持一致。一个项目可以选择任一约定,不能在中途悄悄切换。

可运行的矩阵向量乘法

from math import fsum
 
 
def matvec(matrix: list[list[float]], vector: list[float]) -> list[float]:
    if not matrix or not vector:
        raise ValueError("matrix and vector must be non-empty")
    columns = len(matrix[0])
    if columns != len(vector) or any(len(row) != columns for row in matrix):
        raise ValueError("matrix must be rectangular and inner dimensions must match")
    return [fsum(value * weight for value, weight in zip(row, vector))
            for row in matrix]
 
 
assert matvec([[1.0, 2.0], [3.0, 4.0]], [5.0, 6.0]) == [17.0, 39.0]

这段代码优先展示内维检查;真实张量库还会处理 dtype、device、batch 轴、稀疏布局和广播规则。

在 ML/Embedding 中的用途

  • token 表示常形成 batch × sequence × hidden 三维张量;矩阵是张量的二维特例。
  • Embedding 表可看作 vocabulary × dimension 矩阵,按 token ID 选行。
  • 检索库把每个文档向量堆成矩阵,可批量计算 query 与所有文档的得分。
  • 权重 的输入维度必须等于向量最后一维。

常见误区

  • 认为 ;矩阵乘法通常不可交换,甚至另一方向可能无法计算。
  • 忽略行向量/列向量约定,靠广播“算出一个结果”却语义错误。
  • 把维度数和样本数混淆。
  • 逐元素乘法与点积、矩阵乘法混为一谈。
  • 看到元素总数相同就随意 reshape;重排 shape 可能改变样本、token 和特征的对应关系。
  • 把广播成功当成语义正确,未检查偏置究竟加在哪个轴上。

练习与自测

  1. 为 32×768、 为 768×128,输出 shape 是什么?答 32×128。
  2. 手算上面的矩阵向量乘法并解释每行是如何与 组合的。
  3. 为 batch=4, sequence=128, hidden=768 写出每个轴的业务含义;说明为什么不能无说明地变成 512×768。
  4. 修改 matvec,为不规则矩阵、空输入和内维不匹配各写一个测试。
  • 计算前我会写 shape。
  • 我能解释矩阵乘法的内维条件。
  • 我能把批量预测写成 。
  • 我能区分矩阵乘法、点积和逐元素乘法。
  • 我会为 batch、sequence、feature 等轴写语义,而不只写数字。

参考资料

核验日期:2026-07-14。

上一节:坐标、点积、范数与相似度|下一步:线性组合、方程组与秩。