数学:只学用得上的那部分
目标:看得懂公式、写得出代码,不追求会证明。
这篇按「AI 实际用到的部分」重排数学。每节都给出:它解决什么问题 → 必须掌握到什么程度 → 一项可验证的小练习。
总览:优先级排序
| 分支 | 优先级 | 必须掌握 | 可以先跳过 |
|---|---|---|---|
| 线性代数 | ★★★★★ | 向量/矩阵运算、内积、矩阵乘法、秩、特征值直觉、范数 | 奇异值分解的证明、广义逆推导 |
| 微积分 | ★★★★★ | 导数、偏导、梯度、链式法则、常见函数导数 | ε-δ 极限、多重积分技巧 |
| 概率统计 | ★★★★☆ | 条件概率、贝叶斯、期望方差、常见分布、最大似然 | 测度论、特征函数 |
| 优化 | ★★★★☆ | 梯度下降、随机梯度、凸性直觉、学习率影响 | 收敛性证明 |
| 信息论 | ★★★☆☆ | 熵、交叉熵、KL 散度(会算会用) | 编码定理 |
一、线性代数:数据就是张量
你真正要建立的三件事
1. 形状(shape)是第一公民
AI 代码 90% 的报错是形状对不上。养成习惯:每写一行张量操作,先问「形状变成什么了」。
| 数据 | 形状 | 含义 |
|---|---|---|
| 一个标量 | () | 单个数字 |
| 一个向量 | (768,) | 一句话的 embedding |
| 一批向量 | (32, 768) | 32 句话 |
| 一批序列 | (32, 128, 768) | 32 句 × 128 个 token × 768 维 |
| 一批图像 | (32, 3, 224, 224) | 32 张 × RGB × 高 × 宽 |
2. 矩阵乘法 = 批量线性变换
import numpy as np
x = np.random.randn(32, 768) # 32 个样本
W = np.random.randn(768, 256) # 权重
y = x @ W # (32, 768) @ (768, 256) → (32, 256)
print(y.shape)记法:内维相同才能乘,结果是外维。 这一条能解决你 80% 的形状困惑。
3. 内积 = 相似度
两个向量的内积越大,方向越接近。这是向量检索(RAG 的召回) 的数学基础:
a = np.array([1.0, 0.0])
b = np.array([0.7, 0.7])
cos = (a @ b) / (np.linalg.norm(a) * np.linalg.norm(b))
print(f"余弦相似度 = {cos:.3f}") # 0.707为什么这很重要
你在 RAG 里做的所有「语义检索」,本质就是这篇讲的:把文本变成向量,算内积。理解了这点,向量数据库就不再是黑盒。
必须会的运算清单
| 运算 | 含义 | NumPy |
|---|---|---|
| 转置 | 行列互换 | A.T |
| 矩阵乘 | 线性变换 | A @ B |
| 内积 | 相似度 | a @ b |
| 范数 | 向量长度 | np.linalg.norm(a) |
| 逆 | 解方程用 | np.linalg.inv(A) |
| 特征值 | 变换的主方向 | np.linalg.eig(A) |
| 广播 | 不同形状的对齐运算 | 自动 |
广播规则(必记):从最右维开始逐维比较,维度相等或其中一个为 1 则可广播。
X = np.random.randn(32, 10) # (32,10)
mu = X.mean(axis=0) # (10,)
print((X - mu).shape) # (32,10):mu 被广播到每一行练习
一行代码完成:给 1000×768 的矩阵做行归一化(每行除以自己的 L2 范数)。
二、微积分:梯度指向最陡上坡
只需要一个核心直觉
梯度 = 函数上升最快的方向。要最小化损失,就往梯度反方向走。
这就是所有训练的本质。剩下的是工程细节。
必须掌握的导数
| 函数 | 导数 | 用处 |
|---|---|---|
| $x^n$ | $nx^{n-1}$ | 多项式 |
| $e^x$ | $e^x$ | softmax、概率 |
| $\ln x$ | $1/x$ | 交叉熵 |
| $\sigma(x)$ | $\sigma(x)(1-\sigma(x))$ | sigmoid 激活 |
链式法则:复合函数逐层乘导数。反向传播就是链式法则在计算图上的高效实现。
import torch
# 自动求导:你只需要写前向
x = torch.tensor(2.0, requires_grad=True)
y = (3 * x ** 2 + 2 * x + 1) # f(x) = 3x² + 2x + 1
y.backward()
print(x.grad) # 6x + 2 = 14手算验证:$f'(x)=6x+2$,代入 $x=2$ 得 14 ✓
梯度下降的三种形态
| 形态 | 每步用多少数据 | 特点 | 何时用 |
|---|---|---|---|
| 批量 GD | 全部 | 稳但慢、占内存 | 小数据集 |
| 随机 SGD | 1 条 | 快但抖 | 极少单独用 |
| 小批量 | 32–1024 条 | 兼顾稳定与速度 | 默认选择 |
学习率的影响(一定要亲手试):
| 学习率 | 现象 |
|---|---|
| 太小(1e-6) | loss 几乎不动,训练像没开始 |
| 合适(1e-3 ~ 1e-4) | loss 平滑下降 |
| 太大(1.0) | loss 震荡、变成 nan |
练习
写一个梯度下降求 $f(x)=x^4-3x^2+2$ 最小值的脚本,画出 loss 曲线,分别用 lr=0.001 / 0.1 / 1.0 对比。
三、概率统计:AI 在跟不确定性打交道
必须掌握
1. 条件概率与贝叶斯
$$P(A|B) = \frac{P(B|A)P(A)}{P(B)}$$
用处:从「已知特征,猜类别」反过来建模,朴素贝叶斯的原理,以及理解「先验 + 证据 → 后验」。
2. 期望与方差
- 期望 = 平均值,模型预测的目标
- 方差 = 波动,衡量稳定性
- 偏差-方差权衡:模型太简单(高偏差,欠拟合)vs 太复杂(高方差,过拟合)—— 这是 L2 评估 的理论根基
3. 常见分布
| 分布 | 用途 |
|---|---|
| 正态分布 | 噪声假设、参数初始化 |
| 伯努利 / 二项 | 二分类 |
| 分类分布(Categorical) | 语言模型下一个 token 的概率 |
| 泊松 | 计数型事件 |
4. 最大似然估计(MLE):为什么用交叉熵
一句话:让模型输出的概率分布尽可能接近真实分布,等价于最小化交叉熵,也等价于最大化似然。
这就解释了为什么分类任务用交叉熵而不是 MSE —— 它是从概率假设推出来的,不是拍脑袋。
信息论三件套(会算就够)
import numpy as np
def entropy(p):
p = np.asarray(p, dtype=float)
return -np.sum(p * np.log(p + 1e-12))
def cross_entropy(p, q):
p, q = np.asarray(p, float), np.asarray(q, float)
return -np.sum(p * np.log(q + 1e-12))
def kl_div(p, q):
p, q = np.asarray(p, float), np.asarray(q, float)
return np.sum(p * np.log(p / (q + 1e-12)))
p = [1.0, 0.0, 0.0] # 真实标签(one-hot)
q = [0.7, 0.2, 0.1] # 模型预测
print(f"H(p) = {entropy(p):.3f}") # 0(确定性事件无信息量)
print(f"H(p,q) = {cross_entropy(p, q):.3f}")# 0.357(与真实分布的差距)
print(f"KL = {kl_div(p, q):.3f}") # 0.357(p 与 q 的分布差异)记忆:交叉熵 = 熵 + KL 散度 = 「本来的不确定性」+「你猜错了多少」。
四、按需补充,不要提前学
| 你开始做… | 那时再补 |
|---|---|
| Transformer 与注意力 | 点积注意力、softmax 数值稳定性 |
| 概率模型 / 生成模型 | 变分推断、KL 散度深入 |
| 强化学习 | 马尔可夫决策过程、贝尔曼方程 |
| 优化调不动 | 动量、Adam 的偏差修正、二阶方法直觉 |
| 图神经网络 | 图论基础、拉普拉斯矩阵 |
学习方式建议
| 做法 | 效果 |
|---|---|
| ✅ 看 3Blue1Brown 线代/微积分系列(建立直觉) | 极好,2–3 天看完 |
| ✅ 每个概念都写 5 行 NumPy 验证 | 记忆最深 |
| ✅ 遇到论文公式,先问「这个量的形状是什么」 | 破题关键 |
| ❌ 从头做教材习题到第 8 章 | 时间黑洞 |
| ❌ 追证明 | 除非你要写论文 |