Math-03.线性代数-02.向量与矩阵运算

本页梳理 ML 日常最高频的向量与矩阵运算。读 PyTorch 代码时,多数时间花在理解 shape@ 上。

段末注释广播(broadcasting)指 NumPy/PyTorch 按规则自动扩展较小数组的维度以匹配运算,无需显式复制(逻辑上对齐)。

系列入口00.系列规划 | 前置:01 总论


1. 向量与矩阵记号(D2)

图 1 向量与矩阵直观

  • 列向量 $\mathbf{x} \in \mathbb{R}^{d}$:$d \times 1$
  • 行向量 $\mathbf{x}^\top$:$1 \times d$
  • 矩阵 $A \in \mathbb{R}^{m \times n}$:$m$ 行 $n$ 列

ML 约定:一个样本常写为行向量 $\mathbf{x}_i^\top$($1 \times d$),batch 堆成 $X \in \mathbb{R}^{n \times d}$;PyTorch 线性层 nn.Linear(in, out) 实现 $\mathbf{y} = \mathbf{x} W^\top + \mathbf{b}$,其中 $W$ 为 out × in


2. 点积、外积与矩阵乘(D3)

图 2 乘法类型

点积(内积)

$$
\mathbf{a}^\top \mathbf{b} = \sum_{i=1}^d a_i b_i
$$

几何意义:$|\mathbf{a}||\mathbf{b}|\cos\theta$;归一化后为 cosine 相似度。

外积(秩-1 矩阵):

$$
\mathbf{a}\mathbf{b}^\top \in \mathbb{R}^{m \times n}, \quad [\mathbf{a}\mathbf{b}^\top]_{ij} = a_i b_j
$$

矩阵乘法 $C = AB$,$C_{ij} = \sum_k A_{ik} B_{kj}$:

形状 合法条件
$(m \times k)(k \times n)$ $A$ 列数 = $B$ 行数 → $C$ 为 $m \times n$
batch $(B,m,k)(B,k,n)$ 批维 $B$ 广播一致

结合律:$(AB)C = A(BC)$;一般不可交换 $AB \neq BA$。


3. 转置与基本性质(D3)

$$
(AB)^\top = B^\top A^\top, \quad (A^\top)^\top = A
$$

对称矩阵:$A = A^\top$(协方差、Hessian)。正交矩阵:$Q^\top Q = I$。


4. ML 中的典型 shape(D7)

图 3 ML 中的矩阵 shape

场景 张量 shape 运算
MLP 一层 $X$: $(B,d)$, $W$: $(k,d)$ X @ W.T → $(B,k)$
全连接 + bias $b$: $(k,)$ 广播加
嵌入查表 idx: $(B,L)$, $E$: $(V,h)$ E[idx] → $(B,L,h)$
Attention $Q,K$: $(B,h,L,d_k)$ $QK^\top$ → $(B,h,L,L)$
梯度 $\partial L/\partial W$ 与 $W$ 同形

$B$=batch,$L$=序列长,$h$=头数,$d_k$=每头维度。


5. 广播规则(D7)

NumPy/PyTorch 从最后一维对齐:

1
2
3
# (100, 20) + (20,) → (100, 20)  每列加同一 bias
# (100, 1) * (1, 20) → (100, 20) 外积式广播
# 错误:(100, 20) + (100, 1) 可广播;(100,20)+(100,19) 报错

建议:不确定时 print(tensor.shape)assert


6. 局限与常见错误(D8)

图 4 维度误用

误用 说明
混淆行/列向量 导致 $X^\top X$ vs $XX^\top$ 维度错误
隐式广播「凑巧能算」 逻辑错但 shape 合法
大矩阵 $(n,d)$ 当 $(d,n)$ 特征与样本颠倒
Python * vs @ * 逐元素乘,不是矩阵乘

7. NumPy / PyTorch 示例(D12)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import numpy as np
import torch

# NumPy
X = np.random.randn(64, 128) # batch=64, dim=128
W = np.random.randn(32, 128) # out=32, in=128
Y = X @ W.T # (64, 32)

# 点积 / cosine
a, b = W[0], W[1]
cos = a @ b / (np.linalg.norm(a) * np.linalg.norm(b))

# PyTorch(GPU 同理)
x = torch.randn(64, 128, device="cuda")
linear = torch.nn.Linear(128, 32).cuda()
y = linear(x) # 内部 x @ W.T + b

8. 小结

点积测相似、矩阵乘做批量线性变换、广播写简洁 batch 代码。下一篇:03 线性变换与秩04 特征值

系列导航01 总论 | 00 规划

-------------本文结束感谢您的阅读-------------