🏠 总目录📚 本教程 附录C · 数学补课
📑 本页目录(点开跳转)

附录 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 题 = 数学部分够用了:

  1. 点积的意义是什么?为什么推荐系统到处在用它?
  2. 余弦相似度为什么要除以长度?
  3. P @ Q.T 在推荐系统里算的是什么?
  4. Loss 变成 NaN 了,最可能是什么问题?
  5. 交叉熵损失惩罚哪种预测最狠?
  6. 置信区间是 [-0.1%, +4.0%],这个实验能上线吗?
👀 答案 1. 点积衡量两个向量"对得上"的程度,越大越匹配。用户向量·物品向量 = 喜欢程度,这是矩阵分解和双塔模型的核心。 2. 去掉向量长度的影响,只看方向。否则热门物品(被很多人评分,向量长)会天然得分高。 3. 所有用户对所有物品的预测分数矩阵 —— 一次算完全部点积。 4. 学习率太大,梯度爆炸。把 lr 除以 10 试试。 5. "很自信但错了"的预测(真实是 1 但预测 0.01,或真实是 0 但预测 0.99)。 6. 不能。区间包含 0(甚至包含负值),说明可能根本没提升甚至是负向的。需要更多样本或放弃。

🛑 就这些

你已经掌握了推荐系统需要的全部数学。

如果后面遇到看不懂的公式: 1. 先找它下面的 💡人话翻译 2. 还不懂就记进「欠账本」,往下走 3. 90% 的情况下,不懂那个公式不影响你把系统做出来


👉 回到 README

打卡记录保存在你的浏览器里,首页能看到总进度