矩阵
Matrix由数字组成的矩形阵列,是线性代数的核心概念。
// 详细解释
矩阵 (Matrix)
矩阵是由数字按行和列排列成的矩形阵列,是线性代数的核心对象之一。深度学习中的大部分计算都可以抽象为矩阵运算——从最简单的全连接层到复杂的 Transformer 注意力机制,底层都是矩阵的线性变换。
矩阵的基本概念
code5 linesA = [ a₁₁ a₁₂ a₁₃ ] ← 第 1 行 [ a₂₁ a₂₂ a₂₃ ] ← 第 2 行 [ a₃₁ a₃₂ a₃₃ ] ← 第 3 行 ↑ 第 1 列
aᵢⱼ表示矩阵 A 中第 i 行、第 j 列的元素- 形状:m × n(m 行 n 列)
- 方阵:m = n(行数=列数)
- 对角矩阵:只有主对角线上有非零元素
- 单位矩阵 (I):对角线全 1、其他全 0 的方阵
矩阵运算
1. 加法
形状相同的矩阵可以相加,对应元素相加:
code2 lines[1 2] + [3 4] = [4 6] [5 6] [7 8] [12 14]
2. 标量乘法
一个数乘以矩阵,乘以每个元素:
code2 lines2 × [1 2] = [2 4] [3 4] [6 8]
3. 矩阵转置
把矩阵「翻转」,行变列、列变行:
code3 linesA = [1 2 3] Aᵀ = [1 4] [4 5 6] [2 5] [3 6]
性质:(Aᵀ)ᵀ = A,(A + B)ᵀ = Aᵀ + Bᵀ,(AB)ᵀ = BᵀAᵀ
4. 矩阵乘法(重中之重)
两个矩阵 A 和 B 能够相乘的条件是:A 的列数 = B 的行数
code4 linesA 的形状: (m, k) B 的形状: (k, n) ──────────────── A × B 的形状: (m, n)
结果矩阵 C = A × B 的每个元素:
code2 linescᵢⱼ = Σ (A 的第 i 行) · (B 的第 j 列) = Σ aᵢₖ × bₖⱼ
用图形记忆:
code3 linesB 的列 ↓ A 的行 → [ □ ] × [ □ ] = [ 数 ]
矩阵乘法不满足交换律:AB ≠ BA(一般情况下)
但满足结合律:A(BC) = (AB)C
分块视角:把整个矩阵乘法看作一组向量的点积
5. 矩阵 × 向量
这是矩阵乘法的特殊情况,也是最常见的深度学习运算:
code1 linesy = W · x
x:输入向量 (n, 1)W:权重矩阵 (m, n)y:输出向量 (m, 1)
这就是全连接层 (Linear/Dense Layer) 在做的事!
python5 linesimport torch linear = torch.nn.Linear(4, 3) # 输入 4 维,输出 3 维 x = torch.randn(4) y = linear(x) # shape = (3,) # 等价于: y = W @ x + b(W 是 3×4 的权重矩阵,b 是 3 维偏置)
6. 矩阵的逆
对于方阵 A,如果存在 A⁻¹ 使得 A × A⁻¹ = I(单位矩阵),则 A⁻¹ 称为 A 的逆矩阵。
什么时候存在逆? → 矩阵满秩(行列式 det(A) ≠ 0)
在 ML 中的用途:最小二乘解析解 w = (XᵀX)⁻¹ Xᵀy,但实际中从不直接计算逆(数值不稳定、计算复杂度高),改用 SGD 等迭代方法。
7. 行列式
code2 linesdet([a b]) = ad - bc [c d]
- 几何意义:线性变换对空间的缩放因子
- det = 0 → 矩阵不可逆(存在线性相关的行/列)
- det < 0 → 变换包含了「翻转」
矩阵在深度学习中的角色
1. 线性层 = 一次矩阵乘法 + 加偏置
code6 linesy = x · Wᵀ + b x: (batch, in_features) W: (out_features, in_features) → 转置后 (in_features, out_features) b: (out_features,) y: (batch, out_features)
2. 自注意力 = 三组矩阵乘法 + softmax
code5 linesQ = X · Wᵀ_Q (N, d_model) × (d_model, d_k) → (N, d_k) K = X · Wᵀ_K 同理 V = X · Wᵀ_V 同理 Attention(Q, K, V) = softmax(Q · Kᵀ / √d_k) · V
整个 Transformer 的核心就是:大量的矩阵乘法。
3. 梯度计算 = 矩阵链式法则
反向传播本质上是反复应用矩阵的链式求导法则:
code4 lines如果 y = W · x + b 则 dy/dW = xᵀ (梯度形状必须和原参数一致) dy/dx = Wᵀ dy/db = I
4. 卷积 = 特殊结构的稀疏矩阵乘法
卷积可以被展开为一个大的 Toeplitz 矩阵 × 向量化的图像:
code1 lines[特征图] = [稀疏卷积矩阵] × [图像展开成向量]
但实际实现中我们不会这么做(太浪费空间),而是用 im2col + 矩阵乘法来高效实现。
用 NumPy / PyTorch 操作矩阵
python36 linesimport numpy as np import torch # 创建矩阵 A_np = np.array([[1, 2, 3], [4, 5, 6]]) # 2×3 B_np = np.array([[7, 8], [9, 10], [11, 12]]) # 3×2 # 矩阵乘法 C_np = A_np @ B_np # 2×2 C_np = np.matmul(A_np, B_np) # 等价 # 转置 A_np.T A_np.transpose(0, 1) # 行列式 / 逆 (必须是方阵) M = np.array([[1, 2], [3, 4]]) np.linalg.det(M) # -2.0 (≈) np.linalg.inv(M) # 逆矩阵 # ========== PyTorch 版本 ========== A_t = torch.tensor([[1, 2, 3], [4, 5, 6]], dtype=torch.float32) B_t = torch.tensor([[7, 8], [9, 10], [11, 12]], dtype=torch.float32) C_t = A_t @ B_t # 矩阵乘法(推荐用 @) C_t = torch.matmul(A_t, B_t) # 等价 # 批量矩阵乘法 batch_A = torch.randn(32, 3, 4) # 32 个 3×4 矩阵 batch_B = torch.randn(32, 4, 5) # 32 个 4×5 矩阵 batch_C = torch.bmm(batch_A, batch_B) # 结果: 32×3×5 # 求逆 / SVD (用于数值计算) M = torch.randn(5, 5) M_inv = torch.inverse(M) U, S, V = torch.svd(M) # 奇异值分解
重要的矩阵类型
| 类型 | 定义 | 典型用途 |
|---|---|---|
| 对称矩阵 | A = Aᵀ | 协方差矩阵、核矩阵 |
| 正定矩阵 | 对所有非零 x, xᵀAx > 0 | 协方差、Hessian(凸优化中) |
| 正交矩阵 | AᵀA = I → 逆就是转置 | 特征分解、PCA、旋转变换 |
| 对角矩阵 | 只有对角线非零 | BatchNorm、缩放、PCA 特征值 |
| 上三角矩阵 | 对角线下方全 0 | LU/SVD 分解的中间结果 |
| 稀疏矩阵 | 大部分元素为 0 | 邻接矩阵、推荐系统、NLP one-hot |
矩阵微积分:机器学习的数学基础
标量对向量求导
如果 L 是一个标量(如 loss),x 是一个 n 维向量:
code1 lines∂L/∂x = [ ∂L/∂x₁, ∂L/∂x₂, ..., ∂L/∂xₙ ]ᵀ ← 梯度向量
在 PyTorch 中,loss.backward() 后,x.grad 就是这个梯度向量。
标量对矩阵求导
如果 W 是一个 m×n 矩阵,L 是标量:
code1 lines∂L/∂W 是一个 m×n 矩阵,其 (i,j) 元素 = ∂L/∂Wᵢⱼ
在 PyTorch 中,linear.weight.grad 就是一个与 weight 形状相同的矩阵。
关键公式(记住 3 个就够了)
| 公式 | 说明 |
|---|---|
∂(W·x)/∂x = Wᵀ | 线性变换对输入的梯度 = 权重矩阵转置 |
∂(W·x)/∂W = xᵀ | 线性变换对权重的梯度 = 输入转置 |
∂(xᵀ·A·x)/∂x = (A + Aᵀ)·x | 二次型对向量的梯度 |
常见的线性代数概念速查
1. 特征值与特征向量 (Eigenvalue / Eigenvector)
A·v = λ·v —— v 是 A 的特征向量,λ 是对应的特征值
直觉:A 对 v 做线性变换后,v 只被缩放而方向不变
用途:PCA(主成分分析 = 对协方差矩阵做特征分解)
2. 奇异值分解 (SVD)
任何矩阵都可以分解为:A = U·Σ·Vᵀ
- U: 左奇异向量(A·Aᵀ 的特征向量)
- Σ: 奇异值(非负,按降序排列的对角矩阵)
- V: 右奇异向量(Aᵀ·A 的特征向量)
用途:降维、推荐系统、数据压缩、伪逆
3. 秩 (Rank)
矩阵中线性无关的行/列的最大数量
- 满秩矩阵 → 可逆 → 信息不损失
- 低秩矩阵 → 数据有冗余 → 可以压缩/降维
直觉:矩阵实际能「张成」的空间维度
低秩近似:用前 k 个奇异值重构矩阵 A_k = U_k·Σ_k·V_kᵀ,可以在尽量少的信息损失下压缩数据(LoRA 的直觉来源)
数值稳定性:为什么深度学习框架用浮点数而不是精确解
虽然线性代数有解析解,但在实践中我们几乎从不直接计算:
det(A)—— 容易下溢/上溢,矩阵稍大就不稳定A⁻¹—— 条件数大时误差爆炸;O(n³) 复杂度- 解析解
(XᵀX)⁻¹Xᵀy—— 当数据有多重共线性时结果不稳定
工程上的替代方案:
| 数学上的精确解 | 工程上的稳定替代 |
|---|---|
A⁻¹ | QR 分解 / SVD / 迭代求解 |
| 闭式解 (XᵀX)⁻¹Xᵀy | 梯度下降 / Adam 等迭代方法 |
| softmax 的 argmax | Gumbel-Softmax / 策略梯度 |
用矩阵视角理解深度学习的核心思想
1. 每一层都是一个矩阵 + 非线性
code1 linesh = σ(W·x + b)
线性部分 W·x:在特征空间中做旋转、缩放、投影
非线性 σ:让网络能够拟合任意复杂函数(万能逼近定理)
2. 深层网络 = 一系列矩阵的乘积
理论上,如果没有非线性:
code1 linesW₃·W₂·W₁·x = W·x
多个线性层可以合并为一个——这正是为什么必须引入 ReLU 等非线性。
3. 注意力 = 学习到的动态加权矩阵
注意力本质上是:用数据动态计算出一个权重矩阵,再乘以 Value
code1 linesoutput = AttentionMatrix × Value
其中 AttentionMatrix = softmax(Q·Kᵀ/√d) 就是由输入动态决定的权重矩阵。
推荐学习路径
code20 lines第一阶段:本科线性代数 ├── 矩阵运算、行列式、线性方程组 ├── 特征值/特征向量 └── SVD、正定矩阵 第二阶段:数值线性代数(面向工程) ├── 矩阵分解 (LU, QR, Cholesky, SVD) ├── 数值稳定性与条件数 ├── 迭代求解线性方程组 └── 稀疏矩阵 第三阶段:矩阵微积分(面向机器学习) ├── 标量/向量/矩阵的导数 ├── 链式法则 └── 计算图视角下的自动求导 第四阶段:高级主题 ├── 低秩近似与压缩感知 ├── 正定矩阵与优化 └── 核方法与核矩阵
推荐资源
- 《线性代数及其应用》(Strang):MIT 经典教材,直觉导向
- 《Matrix Cookbook》:速查手册,所有常见导数公式汇总
- 3Blue1Brown - 线性代数的本质:YouTube B 站视频,几何直觉
- fast.ai 课程 Lesson 10:从矩阵视角理解深度学习
- PyTorch Docs - torch.linalg:现代线性代数 API 参考