📑 本页目录(点开跳转)
附录 C · 数学补课
⏱ 45 分钟够了 | 🎯 只补真正必需的那一点点
🎯 一句话
推荐系统需要的数学,比你以为的少得多。 这一页涵盖了全部必需内容。看完你就够用了,不用去学微积分课程。
🚫 先说你「不需要」学的
打勾 = 可以彻底不管:
- ✅ 微积分的积分、极限、级数
- ✅ 矩阵求导的完整推导
- ✅ 凸优化理论、拉格朗日对偶
- ✅ 测度论、泛函分析
- ✅ 手推反向传播(框架帮你做)
如果有人告诉你「学推荐要先学完高数线代概率论」,那是劝退,不是建议。
1️⃣ 向量:一串数字
v = [0.2, -0.5, 0.8, 0.1]
就这样。推荐系统里,每个用户、每个物品、每个特征都是一个向量。
你只需要三个操作
① 点积(内积)—— 最重要的一个
a = [1, 2, 3]
b = [4, 5, 6]
a · b = 1×4 + 2×5 + 3×6 = 32
💡 意义:点积越大 = 两个向量越"对得上" = 越匹配。 这就是矩阵分解、双塔模型算「用户喜不喜欢物品」的方式。
np.dot(a, b) # 或 a @ b
② 长度(模)
|a| = √(1² + 2² + 3²) = √14 ≈ 3.74
np.linalg.norm(a)
③ 余弦相似度 —— 去掉长度影响的点积
cos(a, b) = (a · b) / (|a| × |b|)
💡 为什么需要它:点积会被向量长度影响。 一个被 1000 人评分的电影,向量天然更"长",点积天然更大 —— 但这不代表它更相关。 除以长度就只看方向(口味方向),不看大小(有多热门)。
完全同向 → 1.0 垂直(无关)→ 0.0 反向 → -1.0
def cosine(a, b):
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b) + 1e-8)
🔧 工程技巧:如果先把所有向量做 L2 归一化(除以自己的长度), 那么点积 == 余弦相似度。所以 Faiss 里用
IndexFlatIP+normalize_L2就等于余弦检索。
2️⃣ 矩阵:一堆向量堆起来
物品1 物品2 物品3
用户1 [ 5 3 0 ]
用户2 [ 0 4 2 ] ← 这就是交互矩阵
用户3 [ 1 0 5 ]
你只需要一个操作:矩阵乘法
(m×k) 矩阵 × (k×n) 矩阵 = (m×n) 矩阵
P Q R̂
P: 用户矩阵 (100万用户 × 32维)
Q: 物品矩阵 (32维 × 100万物品)
R̂: 预测的评分矩阵 (100万 × 100万)
💡 人话:R̂[i][j] = P 的第 i 行 · Q 的第 j 列 —— 就是点积。
矩阵乘法 = 一次性算完所有的点积。
scores = P @ Q.T # 一行代码算出所有用户对所有物品的预测分
这就是矩阵分解的全部数学。 真的。
3️⃣ 概率:三个概念
① 条件概率
P(点击 | 用户是程序员, 物品是键盘) = 0.15
💡 「在...条件下,...的概率」。推荐系统预测的就是这个东西:P(点击 | 用户特征, 物品特征, 上下文)。
② 期望
期望收益 = Σ (每种情况的概率 × 那种情况的收益)
💡 多目标融合、bandit 算法都在算这个。
③ 分布(只要认识三个)
| 分布 | 用在哪 |
|---|---|
| 伯努利分布 | 点击/不点击(0 或 1) |
| Beta 分布 | Thompson Sampling 里表示「CTR 的不确定性」 |
| 正态分布 | A/B 实验的统计检验 |
Beta 分布的直觉(第 13 节用得到):
Beta(α, β) 里:α ≈ 成功次数,β ≈ 失败次数
Beta(1, 1) → 完全不知道,0~1 均匀分布
Beta(2, 8) → 试了 10 次成功 2 次,但样本少,分布还很宽
Beta(200, 800) → 试了 1000 次,分布很窄,确信 CTR ≈ 20%
4️⃣ 微积分:只需要理解「梯度下降」
不需要会求导。需要理解一个比喻:
你在山上,蒙着眼,要走到山谷最低点。
怎么办?
用脚感受哪个方向是下坡(这叫"梯度")
朝那个方向迈一小步(步长 = "学习率")
重复
这就是梯度下降。模型训练就是在做这件事。
参数更新公式: 新参数 = 旧参数 - 学习率 × 梯度
↑ ↑
步子大小 下坡方向
你需要知道的三件事:
| 现象 | 原因 | 怎么调 |
|---|---|---|
| Loss 不降 | 学习率太小,步子迈得太小 | 调大 lr |
| Loss 上下乱跳/变 NaN | 学习率太大,步子迈过头 | 调小 lr(除以 10) |
| Loss 降了但验证集变差 | 过拟合,死记硬背 | 加正则化 / 减小模型 / 早停 |
求导交给框架:
loss.backward() # PyTorch 自动算出所有梯度
optimizer.step() # 自动更新所有参数
5️⃣ 损失函数:三个就够
① MSE(均方误差)—— 预测数值时用
$$\text{MSE} = \frac{1}{n}\sum (y - \hat{y})^2$$ 💡 「预测值和真实值差多少的平方」。用于评分预测。
② 交叉熵(LogLoss)—— 预测概率时用 ⭐
$$\text{LogLoss} = -\frac{1}{n}\sum \left[ y\log(\hat{p}) + (1-y)\log(1-\hat{p}) \right]$$
💡 人话翻译:
真实是「点击」(y=1),模型说 0.9 → 惩罚小;模型说 0.1 → 惩罚极大。 它狠狠惩罚"很自信但错了"的预测。 这正是我们想要的。
这是 CTR 预估的标准损失函数。
③ BPR Loss —— 学排序时用
$$-\ln \sigma(\hat{r}_{ui} - \hat{r}_{uj})$$ 💡 「让正样本的分比负样本高」。差得越多,损失越小。
6️⃣ Sigmoid 和 Softmax
Sigmoid:把任意数字压到 0~1
$$\sigma(x) = \frac{1}{1 + e^{-x}}$$
σ(-5) ≈ 0.007 σ(0) = 0.5 σ(5) ≈ 0.993
1 ┤ ╭────────
0.5 ┤ ╭──╯
0 ┤────╯
└──────────────►
💡 用途:模型输出的分数是任意实数,用 Sigmoid 变成「概率」。
Softmax:把一组数字变成一组概率(和为 1)
$$\text{softmax}(x_i) = \frac{e^{x_i}}{\sum_j e^{x_j}}$$
[2.0, 1.0, 0.1] → [0.66, 0.24, 0.10] 和 = 1.0
💡 用途:多分类。召回的 in-batch 负采样就是 softmax 分类。
温度系数 τ:softmax(x / τ)
τ 大 → 分布变平(各选项概率接近)→ 更"随机"
τ 小 → 分布变尖(最大的那个接近 1)→ 更"确定"
7️⃣ 正则化:防止死记硬背
总损失 = 预测误差 + λ × 参数的大小
↑
这一项让参数不要太大
| 类型 | 公式 | 效果 |
|---|---|---|
| L2 正则(权重衰减) | λ·Σw² | 让参数都变小但不为 0,平滑 ⭐ 最常用 |
| L1 正则 | λ·Σ|w| | 让一部分参数变成 0,产生稀疏性 |
| Dropout | 训练时随机丢弃神经元 | 防止过度依赖某几个特征 |
💡 直觉:一个参数特别大 = 模型特别依赖某个特征 = 换个数据就崩。 让参数都小一点,模型就更"稳重"。
λ 怎么调:
λ 太小 → 过拟合(训练好,测试差)
λ 太大 → 欠拟合(都不好)
常用范围:1e-6 到 1e-2,用验证集调
8️⃣ A/B 实验要用的统计(第 12 节)
只需理解三个概念
① p 值
「假设两组其实没差别,我观察到这么大差异(或更大)的概率是多少?」
p < 0.05 → 「这么巧的事不太可能,应该是真有差别」→ 判定显著
② 置信区间
「真实提升有 95% 的可能落在 [+0.5%, +2.3%] 这个范围里」
⭐ 比 p 值有用得多:如果区间是 [-0.1%, +4.0%],虽然可能涨 4%,但也可能是跌的。
③ 统计功效 (Power)
「如果真有效果,我能检测出来的概率」。通常要求 0.8。
用它反推需要多少样本(第 12 节有代码)。
一个常见误解
❌ "p = 0.03 说明有 97% 的概率新策略更好"
✅ "p = 0.03 说明:如果两组真没差别,出现这么大差异的概率只有 3%"
这两句不一样。别在面试里说错。
✅ 自测:够用了吗
能答出这 6 题 = 数学部分够用了:
- 点积的意义是什么?为什么推荐系统到处在用它?
- 余弦相似度为什么要除以长度?
P @ Q.T在推荐系统里算的是什么?- Loss 变成 NaN 了,最可能是什么问题?
- 交叉熵损失惩罚哪种预测最狠?
- 置信区间是 [-0.1%, +4.0%],这个实验能上线吗?
👀 答案
1. 点积衡量两个向量"对得上"的程度,越大越匹配。用户向量·物品向量 = 喜欢程度,这是矩阵分解和双塔模型的核心。 2. 去掉向量长度的影响,只看方向。否则热门物品(被很多人评分,向量长)会天然得分高。 3. 所有用户对所有物品的预测分数矩阵 —— 一次算完全部点积。 4. 学习率太大,梯度爆炸。把 lr 除以 10 试试。 5. "很自信但错了"的预测(真实是 1 但预测 0.01,或真实是 0 但预测 0.99)。 6. 不能。区间包含 0(甚至包含负值),说明可能根本没提升甚至是负向的。需要更多样本或放弃。🛑 就这些
你已经掌握了推荐系统需要的全部数学。
如果后面遇到看不懂的公式: 1. 先找它下面的 💡人话翻译 2. 还不懂就记进「欠账本」,往下走 3. 90% 的情况下,不懂那个公式不影响你把系统做出来