📖目录
- 1. 前言:为什么面试官总爱问稀疏矩阵?
- 2. 稀疏矩阵是啥?大白话 + 数学定义
- 2.1 日常类比:超市购物清单 vs 全品类货架
- 2.2 数学定义
- 3. 稀疏矩阵 vs 稠密矩阵:不用会怎样?
- 3.1 内存爆炸(Memory Blowup)
- 3.2 计算浪费(FLOPs Waste)
- 4. 稀疏矩阵的常见存储格式(附代码)
- 4.1 COO(Coordinate Format)—— 最直观
- 4.2 CSR(Compressed Sparse Row)—— 计算首选
- 5. 稀疏向量:存在吗?当然!
- 5.1 应用场景
- 6. 在哪些 AI 算法中用到稀疏矩阵?
- 6.1 黑科技公式:图卷积(GCN)中的稀疏加速
- 7. 架构图:稀疏矩阵在 AI Pipeline 中的位置
- 8. 不用稀疏矩阵的后果:真实案例
- 9. 经典书籍与开山之作
- 10. 往期精彩博客推荐
- 11. 结语:稀疏性是 AI 工程师的“基本素养”
1. 前言:为什么面试官总爱问稀疏矩阵?
作者:xiezhiyi007(CSDN)
适用读者:准备 AI/ML 岗位面试的中高级开发者、对高性能计算和模型优化感兴趣的工程师
关键词:稀疏矩阵、稀疏向量、自然语言处理、图神经网络、内存优化、计算加速
你有没有在 AI 面试中被突然问到:
“你能说说稀疏矩阵在 NLP 中的作用吗?”
“如果不用稀疏矩阵,会有什么问题?”
别慌——这真不是刁难你。稀疏矩阵是现代 AI 系统里最基础却最容易被忽视的“性能杠杆”。
想象一下:
- 你在淘宝搜索“无线蓝牙耳机”,系统要从千万级商品中快速找出相关结果;
- 你在用 ChatGPT 聊天,它背后可能用了上万维的词向量,但每次只激活几十个词;
- 你在刷抖音,推荐系统要处理亿级用户-视频交互图,但每个用户只看过几百个视频。
这些场景的数据,99% 以上都是0!如果你用普通二维数组(稠密矩阵)存,那等于:
花 100 元买快递盒,里面只装了一颗糖,其他全是空气。
这就是稀疏矩阵存在的意义——只存非零值,省空间、省计算、省电费。
2. 稀疏矩阵是啥?大白话 + 数学定义
2.1 日常类比:超市购物清单 vs 全品类货架
稠密矩阵= 超市把所有商品(10万种)都列在你的购物清单上,没买的标“0”,买了标数量。
- 清单长度:10万行
- 实际购买:就3样(牛奶、面包、鸡蛋)
- 浪费:99997个“0”
稀疏矩阵= 只写你买的那3样:“牛奶:1, 面包:2, 鸡蛋:1”
- 存储量:3项
- 效率:提升 3万倍!
2.2 数学定义
一个 $ m \times n $ 的矩阵 $ A $,若其非零元素个数远小于 $ m \times n $,则称为稀疏矩阵。
常用稀疏度(Sparsity)衡量:
Sparsity = Number of zero elements m × n \text{Sparsity} = \frac{\text{Number of zero elements}}{m \times n}Sparsity=m×nNumber of zero elements
当 Sparsity > 95%,通常就值得用稀疏表示。
3. 稀疏矩阵 vs 稠密矩阵:不用会怎样?
3.1 内存爆炸(Memory Blowup)
假设一个 NLP 任务:
- 词汇表大小:$ V = 100,000 $
- 文档数:$ D = 50,000 $
构建词-文档矩阵(Term-Document Matrix):
- 稠密存储:$ 100,000 \times 50,000 = 5 \times 10^9 $ 个 float32 →20 GB
- 实际非零项:平均每篇文档含 200 词 → 总非零 ≈ $ 50,000 \times 200 = 10^7 $
- 稀疏存储(COO格式):只需存 (row, col, value) 三元组 →约 120 MB
💥不用稀疏矩阵?你的笔记本直接卡死,服务器账单翻100倍。
3.2 计算浪费(FLOPs Waste)
矩阵乘法 $ Y = A \cdot X $,若 $ A $ 是稀疏的:
- 稠密计算:做 $ m \times n \times k $ 次乘加
- 稀疏计算:只对非零项做乘加 →计算量正比于非零元素数
在 GNN(图神经网络)中,邻接矩阵稀疏度常 > 99.9%,不用稀疏优化,训练根本跑不动。
4. 稀疏矩阵的常见存储格式(附代码)
4.1 COO(Coordinate Format)—— 最直观
存三个数组:rows,cols,data
# 【插入】COO 格式示例代码(带 main 函数)importnumpyasnpfromscipy.sparseimportcoo_matrixdefdemo_coo():# 原始稠密矩阵(仅用于演示,实际不会这样构造)dense=np.array([[0,0,3,0],[4,0,0,0],[0,5,0,6]])# 构建 COO 稀疏矩阵rows=[0,1,2,2]# 非零元素的行索引cols=[2,0,1,3]# 列索引data=[3,4,5,6]# 值sparse_coo=coo_matrix((data,(rows,cols)),shape=dense.shape)print("COO matrix:\n",sparse_coo.toarray())print("Non-zero count:",sparse_coo.nnz)if__name__=="__main__":demo_coo()输出:
COO matrix: [[0 0 3 0] [4 0 0 0] [0 5 0 6]] Non-zero count: 4✅ 优点:构造简单,适合动态添加
❌ 缺点:不支持快速随机访问,不适合频繁计算
4.2 CSR(Compressed Sparse Row)—— 计算首选
压缩行指针 + 列索引 + 数据
# 【插入】CSR 格式与矩阵乘法importnumpyasnpfromscipy.sparseimportcsr_matrixdefdemo_csr_multiply():# 构造稀疏矩阵 A (3x4)A_csr=csr_matrix(([3,4,5,6],([0,1,2,2],[2,0,1,3])),shape=(3,4))# 构造稠密向量 x (4x1)x=np.array([1,2,3,4])# 稀疏矩阵 × 稠密向量y=A_csr @ x# 自动调用高效稀疏乘法print("A (sparse):\n",A_csr.toarray())print("x =",x)print("y = A @ x =",y)if__name__=="__main__":demo_csr_multiply()输出:
A (sparse): [[0 0 3 0] [4 0 0 0] [0 5 0 6]] x = [1 2 3 4] y = A @ x = [ 9 4 34]🔥CSR 是工业界标准:PyTorch
torch.sparse, TensorFlowtf.sparse, Scipy 默认计算格式
5. 稀疏向量:存在吗?当然!
稀疏向量 = 只有少数维度非零的向量
5.1 应用场景
- One-hot 编码:
[0,0,1,0,0,...]—— 经典稀疏向量 - TF-IDF 向量:每篇文档只包含部分词
- Embedding Lookup:在推荐系统中,用户特征向量常是稀疏的(只激活部分ID)
# 【插入】稀疏向量示例importtorchdefdemo_sparse_vector():# 创建一个 10000 维的稀疏向量,只有第 100 和 5000 位非零indices=torch.tensor([[100],[5000]])# shape: [nnz, 1]values=torch.tensor([2.5,-1.3])# shape: [nnz]size=(10000,)sparse_vec=torch.sparse_coo_tensor(indices.t(),values,size)print("Sparse vector shape:",sparse_vec.shape)print("Non-zero indices:",indices.squeeze().tolist())print("Values:",values.tolist())# 转为稠密(仅用于验证,生产环境避免!)# dense = sparse_vec.to_dense()if__name__=="__main__":demo_sparse_vector()⚠️ 注意:PyTorch 中稀疏向量必须用
sparse_coo_tensor,且不支持所有操作(如 softmax)
6. 在哪些 AI 算法中用到稀疏矩阵?
| 算法/领域 | 稀疏结构 | 为什么稀疏? |
|---|---|---|
| NLP - TF-IDF | 词-文档矩阵 | 每篇文档只含少量词 |
| 推荐系统 | 用户-物品交互矩阵 | 用户只交互过极少数物品(<0.1%) |
| 图神经网络 | 邻接矩阵 / 拉普拉斯矩阵 | 图通常是稀疏的(社交网络平均度 << 节点数) |
| 特征工程 | One-hot / Multi-hot | 类别特征天然稀疏 |
| 大模型 MoE | 专家选择路由 | 每个 token 只激活 1~2 个专家 |
6.1 黑科技公式:图卷积(GCN)中的稀疏加速
标准 GCN 层:
H ( l + 1 ) = σ ( D ~ − 1 / 2 A ~ D ~ − 1 / 2 H ( l ) W ( l ) ) H^{(l+1)} = \sigma\left( \tilde{D}^{-1/2} \tilde{A} \tilde{D}^{-1/2} H^{(l)} W^{(l)} \right)H(l+1)=σ(D~−1/2A~D~−1/2H(l)W(l))
其中:
- $ \tilde{A} = A + I $(邻接矩阵 + 自环)
- $ \tilde{D} $ 是 $ \tilde{A} $ 的度矩阵
关键:$ \tilde{A} $ 是稀疏的!所以计算 $ \tilde{A} H $ 时,只聚合邻居节点,复杂度从 $ O(N^2) $ 降到 $ O(E) $(E 是边数)。
📌 如果不用稀疏矩阵,GCN 在百万节点图上根本无法训练。
7. 架构图:稀疏矩阵在 AI Pipeline 中的位置
💡"稀疏矩阵运算"模块是性能瓶颈,必须用稀疏优化
8. 不用稀疏矩阵的后果:真实案例
某电商公司早期推荐系统:
- 用户数:1000万
- 商品数:500万
- 交互矩阵:$ 10^7 \times 5 \times 10^6 = 5 \times 10^{13} $ 元素
- 若用 float32 存储:200 TB 内存!
改用稀疏 CSR 后:
- 非零交互:50亿(0.01% 密度)
- 存储:约60 GB
- 训练时间从“不可能”变为2 小时
9. 经典书籍与开山之作
《Numerical Recipes》(第3版)
- 第2.4章详细讲解稀疏线性代数
- 虽偏科学计算,但算法思想通用
《Deep Learning》 by Ian Goodfellow et al.
- 第12.4节讨论稀疏表示在表示学习中的作用
- 连接稀疏性与模型泛化能力
开创性论文:
- “Efficient Sparse Matrix-Vector Multiplication on CUDA” (Bell & Garland, 2009)
- 奠定 GPU 上稀疏计算的基础
- “Graph Attention Networks” (Veličković et al., 2018)
- 虽未显式提稀疏,但 GAT 依赖稀疏邻接矩阵实现可扩展性
- “Efficient Sparse Matrix-Vector Multiplication on CUDA” (Bell & Garland, 2009)
📚 推荐实践:Scipy Sparse 官方文档 + PyTorch Sparse 教程是当前最实用的学习资料。
10. 往期精彩博客推荐
如果你喜欢本文的风格和技术深度,欢迎阅读我的其他原创技术文章:
《【人工智能】人工智能发展历程全景解析:从图灵测试到大模型时代(含CNN、Q-Learning深度实践)》
从数据加载、模型搭建、训练测试到卷积特征可视化,完整 PyTorch 实战,附带可运行代码和架构图。《【人工智能】【推荐系统】互联网大厂推荐系统全解析:从算法原理到架构设计》
深入 UserCF/ItemCF、京东推荐架构、深度学习推荐模型,涵盖嵌入层原理与工业级实现。《【人工智能】【深度学习】 ⑤ 注意力机制:从原理到代码实现,看懂模型如何“聚焦”关键信息》
手写注意力权重提取 + 热力图绘制代码,直观理解“模型到底在看哪里”。
11. 结语:稀疏性是 AI 工程师的“基本素养”
稀疏矩阵不是炫技,而是大规模 AI 系统的生存底线。
下次面试官再问:
“稀疏矩阵有用吗?”
你可以微笑回答:
“不用它,我的模型连‘Hello World’都跑不起来。”
下期预告:《稀疏注意力机制:让大模型也能“只看重点”》
我们将深入 Sparse Transformer、Longformer、BigBird,揭秘如何用稀疏性突破上下文长度限制。