- 引言
- Part 1: 线性代数(Linear Algebra) — AI 的骨架
- Part 2: 微积分(Calculus) — 学习的引擎
- Part 3: 概率与统计 — AI 的语言
- Part 4: 信息论 — LLM 的数学基础
- 数学 → AI 映射总结
- 学习路线图
- 推荐资源
- 相关系列与推荐阅读
- 测验

引言
"学习 AI 要把数学学到什么程度?"
答案: 线性代数 + 微积分 + 概率/统计 + 优化, 这四项就能读懂 90% 的论文。
这篇文章不是数学教科书, 而是用代码和直觉解释 AI 中为什么要用到这些数学。从零搭建 nanoGPT 时, 训练图像生成模型(DDPM)时 — 这些数学会在哪里出现, 本文会逐一对应说明。
Part 1: 线性代数(Linear Algebra) — AI 的骨架
为什么需要它?
神经网络的所有运算都是矩阵乘法。
import numpy as np
# 单个神经元 = 向量内积
weights = np.array([0.5, -0.3, 0.8]) # 权重
inputs = np.array([1.0, 2.0, 3.0]) # 输入
bias = 0.1
output = np.dot(weights, inputs) + bias
# 0.5*1.0 + (-0.3)*2.0 + 0.8*3.0 + 0.1 = 2.5
# 整个层 = 矩阵乘法
W = np.random.randn(4, 3) # 3 → 4 个神经元
x = np.random.randn(3) # 输入向量
h = W @ x # 矩阵-向量乘 = 层输出
向量(Vector) — 数据的表示
# 用向量表示单词(Word Embedding)
king = np.array([0.8, 0.2, 0.9, -0.5])
queen = np.array([0.7, 0.8, 0.85, -0.4])
man = np.array([0.9, 0.1, 0.5, -0.6])
woman = np.array([0.8, 0.7, 0.45, -0.5])
# king - man + woman ≈ queen(著名的关系!)
result = king - man + woman
print(f"king - man + woman = {result}")
print(f"queen = {queen}")
# 几乎相同!
# 余弦相似度 — 两个向量有多相似
def cosine_similarity(a, b):
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
print(cosine_similarity(result, queen)) # ~0.95(非常相似!)
矩阵乘法(Matrix Multiplication) — 神经网络的核心
# Transformer 的 Self-Attention 也是矩阵乘法!
# Q, K, V = 输入乘以权重矩阵所得
batch_size, seq_len, d_model = 2, 10, 64
X = np.random.randn(batch_size, seq_len, d_model)
W_Q = np.random.randn(d_model, d_model)
W_K = np.random.randn(d_model, d_model)
W_V = np.random.randn(d_model, d_model)
Q = X @ W_Q # Query: (2, 10, 64)
K = X @ W_K # Key: (2, 10, 64)
V = X @ W_V # Value: (2, 10, 64)
# Attention Score = Q × K^T / √d
scores = Q @ K.transpose(0, 2, 1) / np.sqrt(d_model)
# scores shape: (2, 10, 10) — 每个 token 对其他 token 的 attention
特征值分解(Eigenvalue Decomposition) — PCA、SVD
# PCA: 找出数据的主要方向
from sklearn.decomposition import PCA
# 100 维数据 → 降到 2 维
data = np.random.randn(1000, 100)
pca = PCA(n_components=2)
reduced = pca.fit_transform(data)
# 内部实际发生的事:
# 1. 计算协方差矩阵: C = X^T X / n
# 2. 特征值分解: C = V Λ V^T
# 3. 选出最大特征值对应的特征向量
# → 数据方差最大的方向!
# SVD(奇异值分解) — 用于 LLM 压缩!
# LoRA 正是如此: 把一个大矩阵分解成两个小矩阵
W = np.random.randn(768, 768) # GPT-2 的 attention weight
# SVD: W = U × Σ × V^T
U, S, Vt = np.linalg.svd(W)
# 只保留前 r 个即可近似(LoRA 的原理!)
r = 16 # rank
W_approx = U[:, :r] @ np.diag(S[:r]) @ Vt[:r, :]
# 原始: 768×768 = 589,824 个参数
# LoRA: 768×16 + 16×768 = 24,576 个参数(仅 4%!)
error = np.linalg.norm(W - W_approx) / np.linalg.norm(W)
print(f"Rank-{r} 近似误差: {error:.4f}")
Part 2: 微积分(Calculus) — 学习的引擎
为什么需要它?
神经网络学习 = 最小化损失函数 = 通过求导得到梯度来更新参数。
偏导数(Partial Derivative)
# f(x, y) = x² + 2xy + y²
# ∂f/∂x = 2x + 2y(把 y 当作常数)
# ∂f/∂y = 2x + 2y(把 x 当作常数)
def f(x, y):
return x**2 + 2*x*y + y**2
def df_dx(x, y):
return 2*x + 2*y # x 方向的梯度
def df_dy(x, y):
return 2*x + 2*y # y 方向的梯度
# 梯度向量(Gradient)
gradient = np.array([df_dx(3, 2), df_dy(3, 2)])
print(f"∇f(3,2) = {gradient}") # [10, 10]
# → 沿这个方向的反方向走, 函数值就会减小!
链式法则(Chain Rule) — 反向传播的数学基础!
# y = f(g(x)) → dy/dx = df/dg × dg/dx
# 在神经网络中:
# Loss = CrossEntropy(softmax(Wx + b), target)
# dLoss/dW = dLoss/dsoftmax × dsoftmax/d(Wx+b) × d(Wx+b)/dW
# PyTorch 会自动完成这一切!
import torch
x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)
W = torch.randn(2, 3, requires_grad=True)
b = torch.randn(2, requires_grad=True)
# Forward
h = W @ x + b
loss = h.sum()
# Backward(链式法则自动应用!)
loss.backward()
print(f"dLoss/dW = {W.grad}") # 自动微分!
print(f"dLoss/db = {b.grad}")
print(f"dLoss/dx = {x.grad}")
梯度下降法(Gradient Descent) — 蒙眼下山的登山者
# 损失函数: L(w) = (w - 3)²
# 最小值: w = 3
def loss(w):
return (w - 3) ** 2
def grad(w):
return 2 * (w - 3)
# 梯度下降法
w = 10.0 # 起点(离得很远)
lr = 0.1 # 学习率
for step in range(20):
g = grad(w)
w = w - lr * g # 沿梯度的反方向移动!
if step % 5 == 0:
print(f"Step {step}: w={w:.4f}, loss={loss(w):.4f}")
# Step 0: w=8.6000, loss=31.3600
# Step 5: w=3.2150, loss=0.0462
# Step 10: w=3.0070, loss=0.0000
# Step 15: w=3.0002, loss=0.0000
# → w 收敛到 3!
学习率的重要性
lr 过大时:
w: 10 → -4 → 18 → -22 → 发散!
lr 过小时:
w: 10 → 9.86 → 9.72 → ... → 100 万步之后 → 3.001
合适的 lr:
w: 10 → 8.6 → 7.48 → ... → 20 步之后 → 3.0002
实战优化器: Adam
# Adam = Momentum + RMSprop(现代深度学习标准)
class Adam:
def __init__(self, params, lr=0.001, beta1=0.9, beta2=0.999, eps=1e-8):
self.lr = lr
self.beta1 = beta1 # 动量(惯性)
self.beta2 = beta2 # 梯度平方的移动平均
self.eps = eps
self.m = {id(p): 0 for p in params} # 一阶矩
self.v = {id(p): 0 for p in params} # 二阶矩
self.t = 0
def step(self, params, grads):
self.t += 1
for p, g in zip(params, grads):
pid = id(p)
# 动量: 记住之前梯度的方向
self.m[pid] = self.beta1 * self.m[pid] + (1 - self.beta1) * g
# 自适应学习率: 根据梯度大小调整
self.v[pid] = self.beta2 * self.v[pid] + (1 - self.beta2) * g**2
# 偏差修正
m_hat = self.m[pid] / (1 - self.beta1**self.t)
v_hat = self.v[pid] / (1 - self.beta2**self.t)
# 更新
p -= self.lr * m_hat / (np.sqrt(v_hat) + self.eps)
Part 3: 概率与统计 — AI 的语言
为什么需要它?
AI 模型的输出几乎总是概率分布。
# GPT 的输出 = 下一个 token 的概率分布
logits = np.array([2.0, 1.0, 0.1, -1.0, 3.0]) # 模型输出(原始值)
vocab = ["the", "cat", "sat", "on", "mat"]
# Softmax: logits → 概率
def softmax(x):
exp_x = np.exp(x - np.max(x)) # 数值稳定性
return exp_x / exp_x.sum()
probs = softmax(logits)
for word, p in zip(vocab, probs):
print(f" {word}: {p:.4f}")
# the: 0.2312, cat: 0.0851, sat: 0.0346, on: 0.0115, mat: 0.6276
# → "mat" 的概率最高!
贝叶斯定理(Bayes' Theorem)
# P(A|B) = P(B|A) × P(A) / P(B)
# "在看到数据的情况下, 模型正确的概率"
# 例: 垃圾邮件过滤器
# P(垃圾邮件|"免费") = P("免费"|垃圾邮件) × P(垃圾邮件) / P("免费")
p_free_given_spam = 0.8 # 垃圾邮件中出现"免费"的概率
p_spam = 0.3 # 全部邮件中垃圾邮件所占比例
p_free = 0.35 # 全部邮件中出现"免费"的概率
p_spam_given_free = (p_free_given_spam * p_spam) / p_free
print(f"P(垃圾邮件|'免费') = {p_spam_given_free:.2f}") # 0.69(69%!)
概率分布
# 高斯(正态)分布 — Diffusion Model 的核心!
def gaussian(x, mu=0, sigma=1):
return (1 / (sigma * np.sqrt(2 * np.pi))) * np.exp(-0.5 * ((x - mu) / sigma) ** 2)
# DDPM(图像生成):
# Forward: 干净图像 → 加入高斯噪声(逐渐破坏)
# Reverse: 噪声 → 去除噪声(神经网络学习这一过程) → 干净图像!
# 加噪过程
def add_noise(image, t, noise_schedule):
"""x_t = √(α_bar_t) × x_0 + √(1 - α_bar_t) × ε"""
alpha_bar = noise_schedule[t]
noise = np.random.randn(*image.shape) # 高斯噪声
noisy = np.sqrt(alpha_bar) * image + np.sqrt(1 - alpha_bar) * noise
return noisy, noise
交叉熵(Cross-Entropy) — 损失函数之王
# 衡量模型的预测与正确答案之间的差异
def cross_entropy(predictions, targets):
"""H(p, q) = -Σ p(x) log q(x)"""
return -np.sum(targets * np.log(predictions + 1e-9))
# 正确答案: "cat"(独热编码)
target = np.array([0, 1, 0, 0, 0]) # [the, cat, sat, on, mat]
# 好的预测
good_pred = np.array([0.05, 0.85, 0.03, 0.02, 0.05])
print(f"Good: {cross_entropy(good_pred, target):.4f}") # 0.1625(低)
# 差的预测
bad_pred = np.array([0.3, 0.1, 0.2, 0.2, 0.2])
print(f"Bad: {cross_entropy(bad_pred, target):.4f}") # 2.3026(高)
Part 4: 信息论 — LLM 的数学基础
熵(Entropy) — 不确定性的度量
def entropy(probs):
"""H(X) = -Σ p(x) log₂ p(x)"""
return -np.sum(probs * np.log2(probs + 1e-9))
# 均匀硬币: H = 1 bit(最大不确定性)
fair_coin = np.array([0.5, 0.5])
print(f"均匀硬币: {entropy(fair_coin):.2f} bits") # 1.00
# 有偏硬币: H 小于 1 bit(可预测)
biased_coin = np.array([0.9, 0.1])
print(f"有偏硬币: {entropy(biased_coin):.2f} bits") # 0.47
# GPT 输出的熵越低 → 说明模型越确信
# 提高 Temperature → 熵增加 → 输出更多样化
KL Divergence — 两个分布的差异
def kl_divergence(p, q):
"""D_KL(P || Q) = Σ p(x) log(p(x) / q(x))"""
return np.sum(p * np.log(p / (q + 1e-9) + 1e-9))
# 在 VAE(Variational Autoencoder)中:
# 最小化 KL(q(z|x) || p(z))
# = 让编码器的输出分布趋近于标准正态分布!
# 在 RLHF 中:
# 把 KL(π_new || π_ref) 作为惩罚项加入
# = 让新模型不要偏离原模型太远!
数学 → AI 映射总结
| 数学概念 | 在 AI 中的角色 | 出现的位置 |
|---|---|---|
| 矩阵乘法 | 层运算 | 所有神经网络 |
| 余弦相似度 | 嵌入比较 | 搜索、RAG |
| SVD | 模型压缩 | LoRA、量化 |
| 偏导数 | 梯度计算 | 反向传播 |
| 链式法则 | 自动微分 | PyTorch autograd |
| 梯度下降法 | 参数优化 | Adam、SGD |
| Softmax | 概率分布转换 | 分类、Attention |
| 交叉熵 | 损失函数 | LLM、分类器 |
| 高斯分布 | 噪声建模 | DDPM、VAE |
| 贝叶斯定理 | 后验概率推断 | 贝叶斯 ML |
| KL Divergence | 分布差异度量 | VAE、RLHF |
| 熵 | 不确定性度量 | Temperature、信息量 |
学习路线图
[第 1 周] 线性代数基础
→ 向量、矩阵乘法、转置、逆矩阵
→ 用 numpy 亲手实现
[第 2 周] 微积分 + 优化
→ 偏导数、链式法则、梯度下降法
→ 理解 PyTorch autograd
[第 3 周] 概率 + 统计
→ 条件概率、贝叶斯、分布
→ 实现 softmax、cross-entropy
[第 4 周] 信息论 + 实战
→ 熵、KL-divergence
→ 在 nanoGPT/DDPM 代码中找出这些数学
推荐资源
- 3Blue1Brown(YouTube) — 线性代数/微积分的直观可视化
- Mathematics for Machine Learning(免费教材) — 连接数学与 ML
- Andrej Karpathy 的 micrograd — 从零实现反向传播
- Stanford CS229 — 概率/统计 + ML 数学
- Ian Goodfellow 的 Deep Learning Book — 第 2~4 章(免费在线)
测验 — AI 数学(点击查看!)
Q1. 矩阵乘法在神经网络中起什么作用? ||把输入向量乘以权重矩阵, 计算出下一层的输出。一次矩阵乘法 = 一层的线性变换||
Q2. 为什么 LoRA 和 SVD 有关? ||SVD 把一个大矩阵分解成若干个小矩阵的乘积。LoRA 用两个低秩矩阵(A、B)的乘积来近似权重矩阵的变化量(ΔW), 大幅减少参数||
Q3. 反向传播(Backpropagation)的数学基础是什么? ||链式法则(Chain Rule)。把复合函数的导数分解成各阶段导数的乘积, 梯度从 Loss 反向传播到每个参数||
Q4. Softmax 函数的作用以及数值稳定性技巧是什么? ||把实数向量(logits)转换成概率分布(和为 1, 全部为正)。技巧: 从输入中减去最大值 — 防止 exp 溢出||
Q5. 为什么交叉熵适合作损失函数? ||正确答案的预测概率越接近 1, loss 就越趋近于 0;越接近 0, loss 就越趋近于 ∞。对错误预测给予强烈惩罚, 使训练更高效||
Q6. 为什么 Diffusion Model 中会用到高斯分布? ||在 Forward process 中, 会向图像逐步加入高斯噪声。高斯分布数学上易于处理(有闭式解), 并且根据中心极限定理是一种自然的噪声模型||
Q7. Temperature 升高时, GPT 输出的熵会怎样? ||增加。把 logits 除以 T 会让 softmax 分布变得更平坦(更接近均匀分布), 不确定性增加 → 生成更多样化的输出||
Q8. RLHF 中 KL Divergence 惩罚项的目的是什么? ||约束强化学习更新后的模型(π_new)不要偏离原模型(π_ref)太远。防止 reward hacking, 并保留原有能力||
相关系列与推荐阅读
- 从零打造属于自己的 GPT — nanoGPT — 这些数学实际被用到的地方
- GPT 系列论文完全解析 — 从 GPT-1 到 GPT-4
- torchvision 完全指南 — CNN/ViT(线性代数实战)
- torchaudio 完全指南 — 傅里叶变换实战
- 安全完全指南 — 加密(数学在安全领域的应用)
参考资料
- 3Blue1Brown — Essence of Linear Algebra — 线性代数直觉(必看!)
- 3Blue1Brown — Neural Networks — 神经网络可视化
- StatQuest — Machine Learning — 通俗易懂的统计/ML 讲解
- Mathematics for Machine Learning (book) — 免费教材
测验
Q1: 《AI 数学完全指南 — 从线性代数到信息论》这篇文章主要涵盖哪些内容?
用代码和直觉梳理 AI/深度学习所需的数学: 线性代数(矩阵、特征值)、微积分(偏导数、反向传播)、概率/统计(贝叶斯、分布)、优化(梯度下降法)、信息论(熵、KL 散度)。
Q2: Part 1: 线性代数(Linear Algebra) — AI 的骨架是什么?
为什么需要它? 神经网络的所有运算都是矩阵乘法。 向量(Vector) —
数据的表示 矩阵乘法(Matrix Multiplication) — 神经网络的核心
特征值分解(Eigenvalue Decomposition) — PCA、SVD
Q3: 请说明 Part 2: 微积分(Calculus) — 学习的引擎的核心概念。
为什么需要它? 神经网络学习 = 最小化损失函数 = 通过求导得到梯度来更新参数 偏导数(Partial Derivative) 链式法则(Chain Rule) — 反向传播的数学基础! 梯度下降法(Gradient Descent) — 蒙眼下山的登山者 学习率的重要性 实战优化器: Adam
Q4: Part 3: 概率与统计 — AI 的语言的主要内容是什么?
为什么需要它? AI 模型的输出几乎总是概率分布。 贝叶斯定理(Bayes' Theorem) 概率分布
交叉熵(Cross-Entropy) — 损失函数之王
Q5: Part 4: 信息论 — LLM 的数学基础是如何运作的?
熵(Entropy) — 不确定性的度量 KL Divergence — 两个分布的差异
현재 단락 (1/201)
"学习 AI 要把数学学到什么程度?"