线性代数:用图片和位置讲明白向量和矩阵
所有 AI 的本质都是矩阵运算。这一篇不讲行列式不讲特征值,只让你"看见"向量在干什么。
如果你打开任何一篇 AI 论文,第一眼会看到这个:
四个符号,决定了今天所有 AI 模型的命运。 是输入, 是矩阵, 是偏置, 是输出。
这是线性代数最核心的应用。这一篇就讲清楚:上面这几个字母在干什么,为什么 AI 离不开它们。
向量:一组带顺序的数
最简单。向量就是一组数,写法上用方括号或一列竖列:
它有两个数:3 和 5。
但关键不是”两个数”——关键是”它代表什么”。
向量最强大的地方在于:同一个 [3, 5] 可以表示无数种东西。
在二维平面上,它是一个点
在二维平面上,它也是一个箭头
从原点 (0,0) 出发,指向 (3, 5)。点和箭头是同一个向量的两种解读。
在更多维度,它表示更复杂的事物
| 向量 | 它可以代表 |
|---|---|
| 你的身高(米)+ 体重(百斤) | |
| 一个人的身高 / 体重 / 年龄 | |
| ”苹果、香蕉、樱桃、橙子”中选择”香蕉”的 one-hot 编码 | |
| (768 个数) | 一个词的 BERT embedding |
| 一个像素的颜色 |
所有这些都是向量——同一个数学对象,不同的含义。
向量是 AI 系统里信息的统一货币。无论你的数据原本是文字、图片、声音——最终都被转换成一串数(一个向量),AI 才能处理。
点积:向量之间的”亲密度”
两个向量,可以做一个运算叫点积(dot product)。
直接对应位置相乘后求和。
这有什么用?
点积有一个神奇的性质:
两个向量越”指向同一个方向”,点积越大。
- 完全同方向 → 点积最大(正数)
- 完全垂直 → 点积 = 0
- 完全相反方向 → 点积最小(负数)
这个性质让点积成为 AI 系统里测量”相似度”的标准工具。
在 L0-11 的词汇表里我们说过 “embedding 相近意思就相近”—— 实际怎么算”相近”的?就是算点积(或者它的变种”余弦相似度”)。
让我们看一个例子。假设我们已经把”king”、“queen”、“banana”映射成了向量:
king = [0.8, 0.2, 0.9, ...] # 768 个数
queen = [0.7, 0.3, 0.85, ...]
banana = [-0.3, 0.6, -0.1, ...]
king · queen = 大正数 → 它们很相近
king · banana = 接近零 → 它们没啥关系
这就是 RAG 检索、推荐系统、搜索的核心。
矩阵:一堆向量整齐摞着
如果向量是一行(或一列)数,矩阵就是多行多列:
可以理解成两个向量摞起来: 和 。
但矩阵最强大的地方,不是”装数据”——是做变换。
矩阵乘以向量:一次”变换”
回到最开始那个公式 。
我们看一个超简单的例子:
计算规则:矩阵每一行 · 向量 → 一个数。
- 第一行 点积 =
- 第二行 点积 =
几何意义是什么?
原本向量是 ,乘完矩阵变成 ——
- x 方向被拉伸了 2 倍
- y 方向被拉伸了 3 倍
这个矩阵是个”拉伸器”。
不同的矩阵能做不同的几何变换:
| 矩阵 | 变换效果 |
|---|---|
| 整体放大 2 倍 | |
| 上下翻转 | |
| 旋转 θ 度 | |
| 错切(变成平行四边形) |
核心洞察:
矩阵不是一堆数。矩阵是一个”动作”——它对向量做某种变换。
AI 为什么离不开矩阵
回到我们最开始那个公式:
这是一个神经网络的单层。它在干什么?
- 是输入向量(比如 768 维的 BERT embedding)
- 是一个学到的矩阵(比如 768 × 256 维)
- 是偏置向量
- 是输出(256 维)
这一层在做什么? 它把 768 维的输入变换成 256 维的输出。
矩阵 里的具体数字,决定了变换的具体方式。训练神经网络,本质上就是不断调整 里的数,让网络能把输入变换成”我们想要的输出”。
一个 GPT-3 有 1750 亿个参数——它们绝大部分都是某些矩阵 里的数。
神经网络 = 一连串矩阵变换 + 一些激活函数。 你看到的所有”大模型”,本质上都是「向量 → 矩阵 → 向量 → 矩阵 → ……」的接力赛。
用 NumPy 跑一下
让我们用 Python 实际跑一下:
import numpy as np
# 向量
x = np.array([3, 5])
print(x) # [3 5]
print(x.shape) # (2,)
# 矩阵
W = np.array([[2, 0],
[0, 3]])
print(W.shape) # (2, 2)
# 矩阵乘以向量
y = W @ x # @ 是矩阵乘法运算符
print(y) # [6 15] ← 就是我们手算的结果
# 点积
v1 = np.array([3, 5])
v2 = np.array([2, 4])
print(v1 @ v2) # 26
print(np.dot(v1, v2)) # 26(另一种写法)
# 真实场景:算两个 embedding 的相似度
emb_king = np.random.randn(768)
emb_queen = np.random.randn(768)
similarity = emb_king @ emb_queen / (np.linalg.norm(emb_king) * np.linalg.norm(emb_queen))
print(f"相似度: {similarity:.3f}")
强烈建议你现在打开 Google Colab 跑一遍这段代码。手指敲过的代码,记得最牢。
真实场景:Transformer 里的 Q、K、V
我们在 L0 词汇表里说过 Q、K、V 是 Transformer 的核心。现在你可以理解它们了:
# X 是输入序列的 embedding 矩阵
# 假设句子有 10 个词,每个词 768 维
X = np.random.randn(10, 768) # (10, 768)
# Wq, Wk, Wv 是三个"学到的"矩阵
Wq = np.random.randn(768, 64) # (768, 64)
Wk = np.random.randn(768, 64)
Wv = np.random.randn(768, 64)
# 矩阵乘法 → 得到 Q, K, V
Q = X @ Wq # (10, 64)
K = X @ Wk # (10, 64)
V = X @ Wv # (10, 64)
# 注意力分数 = Q · K^T
scores = Q @ K.T # (10, 10)
每一行操作都是矩阵乘法。这就是 Transformer 的”心跳”。
一句话总结
向量是 AI 的数据,矩阵是 AI 的操作。
学好这两个,AI 论文里 80% 的公式你都能读懂。
想”看见”它
👀 打开 Embedding 空间漫游可视化 —— 看 50 个词在向量空间里的位置,玩 king − man + woman = queen 的算术。
学完线性代数,我们要解决一个问题:矩阵 里的数是从哪儿来的? 答案是”训练”。训练的本质是导数和梯度——下一篇我们讲。
下一篇:《导数与梯度:“学习”的数学定义》
读到这里说明你认真在学 🎯
订阅每周精选 —— 下一篇新文章 / 新可视化第一时间送到邮箱。
讨论区
· 用 GitHub 账号登录评论src/components/Comments.astro 顶部填入
仓库 ID 和分类 ID(见组件注释里的配置步骤)。