矩阵

Matrix
数学基础#线性代数#数学基础
由数字组成的矩形阵列,是线性代数的核心概念。

// 详细解释

矩阵 (Matrix)

矩阵是由数字按行和列排列成的矩形阵列,是线性代数的核心对象之一。深度学习中的大部分计算都可以抽象为矩阵运算——从最简单的全连接层到复杂的 Transformer 注意力机制,底层都是矩阵的线性变换。

矩阵的基本概念

code5 lines
A = [ 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 lines
2 × [1 2] = [2 4] [3 4] [6 8]

3. 矩阵转置

把矩阵「翻转」,行变列、列变行:

code3 lines
A = [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 lines
A 的形状: (m, k) B 的形状: (k, n) ──────────────── A × B 的形状: (m, n)

结果矩阵 C = A × B 的每个元素:

code2 lines
cᵢⱼ = Σ (A 的第 i 行) · (B 的第 j 列) = Σ aᵢₖ × bₖⱼ

用图形记忆:

code3 lines
B 的列 ↓ A 的行 → [ □ ] × [ □ ] = [ 数 ]

矩阵乘法不满足交换律AB ≠ BA(一般情况下)

但满足结合律A(BC) = (AB)C

分块视角:把整个矩阵乘法看作一组向量的点积

5. 矩阵 × 向量

这是矩阵乘法的特殊情况,也是最常见的深度学习运算

code1 lines
y = W · x
  • x:输入向量 (n, 1)
  • W:权重矩阵 (m, n)
  • y:输出向量 (m, 1)

这就是全连接层 (Linear/Dense Layer) 在做的事!

python5 lines
import 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 lines
det([a b]) = ad - bc [c d]
  • 几何意义:线性变换对空间的缩放因子
  • det = 0 → 矩阵不可逆(存在线性相关的行/列)
  • det < 0 → 变换包含了「翻转」

矩阵在深度学习中的角色

1. 线性层 = 一次矩阵乘法 + 加偏置

code6 lines
y = 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 lines
Q = 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 lines
import 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 特征值
上三角矩阵对角线下方全 0LU/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 的直觉来源)

数值稳定性:为什么深度学习框架用浮点数而不是精确解

虽然线性代数有解析解,但在实践中我们几乎从不直接计算

  1. det(A) —— 容易下溢/上溢,矩阵稍大就不稳定
  2. A⁻¹ —— 条件数大时误差爆炸;O(n³) 复杂度
  3. 解析解 (XᵀX)⁻¹Xᵀy —— 当数据有多重共线性时结果不稳定

工程上的替代方案

数学上的精确解工程上的稳定替代
A⁻¹QR 分解 / SVD / 迭代求解
闭式解 (XᵀX)⁻¹Xᵀy梯度下降 / Adam 等迭代方法
softmax 的 argmaxGumbel-Softmax / 策略梯度

用矩阵视角理解深度学习的核心思想

1. 每一层都是一个矩阵 + 非线性

code1 lines
h = σ(W·x + b)

线性部分 W·x:在特征空间中做旋转、缩放、投影

非线性 σ:让网络能够拟合任意复杂函数(万能逼近定理)

2. 深层网络 = 一系列矩阵的乘积

理论上,如果没有非线性:

code1 lines
W₃·W₂·W₁·x = W·x

多个线性层可以合并为一个——这正是为什么必须引入 ReLU 等非线性

3. 注意力 = 学习到的动态加权矩阵

注意力本质上是:用数据动态计算出一个权重矩阵,再乘以 Value

code1 lines
output = 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 参考

相关术语:张量梯度下降PyTorch过拟合

// 关联内容

🗺️ 关联路线图

// 关联术语