跳转到内容

BPR — 用『i 比 j 更受欢迎』替代『i 是正例 j 是负例』

是什么

BPR(Bayesian Personalized Ranking)是一套专门给”只有点击日志、没有打分”的场景训练推荐模型的损失函数。日常类比:你刷短视频,划过去 = 点赞,没划到 = ?。BPR 说:那个『?』不是讨厌,只是『没看到』,所以别把它当负例——只断言『刷过的视频比没刷到的视频更值得排在前面』。

形式化一下:对每个用户 u,从日志里挑一个交互过的物品 i 和一个没交互过的物品 j,构成三元组 (u, i, j)。让模型给的分数满足:

score(u, i) > score(u, j)

把这个差值套 sigmoid 当作『i 排在 j 前面的概率』,取对数最大化即可。这个 loss 叫 BPR-Opt

为什么重要

  • 今天所有大厂的排序模型(YouTube DNN / Pinterest / 抖音 / 淘宝召回)训练阶段都在用 pairwise / listwise 损失。BPR 是这一范式在隐式反馈场景的源头
  • 修了一个根本性错误假设:在 BPR 之前,主流做法是把『没点击的物品』当成『不喜欢』(label=0),让模型回归。但用户没点不等于不喜欢,更可能是『没刷到』。这个错误假设让模型学到一堆噪声
  • 信息检索(learning-to-rank)/ 推荐 / 广告 CTR 三个领域共享同一套 pairwise 思路,都从这条线延伸
  • 现代对比学习(CLIP / SimCLR / MoCo)思想上同源:拉近正样本、推远负样本——只是把『物品』换成『图像 patch / 文本句子』

核心要点

BPR 的三个支柱:

  1. 三元组 (u, i, j):u 是用户,i 是 u 交互过的物品,j 是 u 没交互过的物品。从日志里 bootstrap 采样,海量

  2. BPR-Opt 损失:让 sigmoid(score(u,i) - score(u,j)) 接近 1。等价表达:

    loss = -ln σ(score(u,i) - score(u,j)) + λ · ||θ||²

    论文里证明这个准则等价于最大化 AUC(ROC 曲线下面积)

  3. LearnBPR 算法:每次随机抽一个三元组做 SGD,比『过完所有用户的所有 i, j 配对』快几个数量级。这个 bootstrap 技巧本身就是工程上的关键贡献

底层模型可以是任意打分函数 score(u, i):MF(矩阵分解)/ kNN / 神经网络 / GNN 都行。BPR 是『损失』不是『模型』。

实践案例

案例 1:MF + BPR 是怎么训的

矩阵分解的打分公式:score(u, i) = p_u · q_i(用户向量点乘物品向量)。

训练循环:

for epoch in range(N):
u, i, j = sample_triple() # 从点击日志随机抽
diff = p[u] @ q[i] - p[u] @ q[j]
loss = -log(sigmoid(diff)) + reg
# 反向传播只更新 p[u], q[i], q[j] 三个向量

关键观察:每次更新只动三个向量,不需要遍历整个矩阵。这就是 BPR 在工业落地能跑起来的原因。

案例 2:负采样为什么重要

最朴素的做法:j 从『u 没交互过的物品』里均匀采。但热门物品被采到的概率几乎是 1,长尾物品几乎采不到——模型只学会区分『u 点过的 vs 全网热门』,对长尾失效。

后续修正(WARP / dynamic negative sampling):先采一个 j,如果模型已经把 j 排得比 i 低很多,就再换一个采到『模型当前还分不开』的 hard negative。这条线一路演化到今天对比学习里的 hard negative mining。

案例 3:在 LightGCN 等图模型里复用

2020 年 LightGCN 论文里,损失函数仍是 BPR。区别只在 score(u, i) 是怎么算出来的——LightGCN 用图卷积聚合邻居。模型换了,损失没换。这说明 BPR 作为损失的抽象层很稳,11 年后还能直接用。

案例 4:和对比学习是同一件事

把 BPR 的三元组 (u, i, j) 换成 (anchor, positive, negative),把 score(u, x) = u · x 换成 cos(anchor, x),损失就是 InfoNCE 的简化版:

loss = -log( exp(sim(a, p)) / (exp(sim(a, p)) + exp(sim(a, n))) )

这正是 SimCLR / MoCo / CLIP 的训练目标。区别只在『一个负例 vs N 个负例』——pairwise 是 N=1 的退化情况。所以理解了 BPR,对比学习只剩一步『把分母从 2 项扩到 K+1 项』。

踩过的坑

  1. 曝光偏差:模型只见过推荐系统推荐过的物品。『没交互』里混了『没曝光给用户』和『曝光了不喜欢』。BPR 没区分这两种——后续工作用 IPS(逆倾向加权)/ counterfactual learning 修

  2. uniform 采负例学不动:抽到的 j 99% 是『模型已经能轻松分开的简单负例』,梯度几乎为 0。必须改 hard negative

  3. 长尾物品被双重伤害:热门物品大量出现在 j 位置(被推下去),同时长尾物品很少出现在 i 位置(用户根本没机会交互)。需要做 popularity debiasing

  4. 冷启动失效:新用户没历史交互,没法采 i;新物品没人交互过,永远落不到 i 位置上。BPR 必须配合内容特征(CB)才能处理冷启动

  5. 概率不可解释:sigmoid 输出的不是『u 喜欢 i 的概率』,只是『i 排在 j 前面的相对概率』。要做 CTR 预估必须额外校准

  6. 正则项必须有:BPR-Opt 里的 λ · ||θ||² 不是装饰。三元组海量但每个用户的有效信号稀疏,去掉正则模型会把热门物品的向量爆炸式拉长——分数大但泛化差。论文里给了 user / item-positive / item-negative 三套不同的 λ

适用 vs 不适用场景

适用

  • 隐式反馈数据(点击/播放/购买/收藏)的 top-K 推荐
  • 搜索结果排序(query, clicked_doc, skipped_doc)
  • 向量召回的对比学习训练(思想同源)
  • 任何『相对排序比绝对分数重要』的任务

不适用

  • explicit rating(豆瓣 1-5 星)→ 直接回归 RMSE 更准
  • CTR 预估(要把 0.07 当 7% 用)→ pointwise + 校准
  • 极小数据集(三元组爆炸 → 训练不稳)
  • 冷启动 → 必须叠加内容特征

历史小故事(可跳过)

  • 1995:Burges 提出 RankNet,用神经网络 + pairwise 损失做文档排序。pairwise 思想已成型,但只在搜索领域用
  • 2008:Koren SVD++ 在 Netflix Prize 上拿冠军,用 MF 做 explicit rating 预测。MF 范式成熟,但 loss 还是 RMSE
  • 2009:Rendle 把 pairwise 损失从搜索移植到推荐的隐式反馈,在 UAI 发了 BPR。这一步是范式融合——把信息检索界的工具搬到推荐系统
  • 2012:论文上 arXiv(编号 1205.2618),开始被工业界大量引用
  • 2010s 中后期:LambdaMART / DSSM / Pinterest / 阿里 DIN 等工业系统大规模铺开 pairwise 训练
  • 2020s:对比学习(CLIP / SimCSE)思想同源——『拉近正样本、推远负样本』就是 BPR 的 dense embedding 版

之后 15 年所有『从用户行为日志学排序』的系统都是 BPR 的徒孙。这篇论文被引用次数已经超过 8000,是推荐系统领域引用量 top 5 的论文之一。

学到什么

  1. 建模假设比模型本身重要:BPR 没换打分模型(还是 MF),只换了损失。换 loss 让 AUC 涨了 10+ 个点,比换更复杂的模型 ROI 高得多
  2. 『最弱的合理假设』就是最好的假设:『i 比 j 排序高』比『i=1, j=0』弱,但更符合数据真相,反而效果更好。每多一条假设都是一处可能错的地方,能不假设就不假设
  3. 采样策略和 loss 同等重要:BPR 给了 loss,hard negative mining 给了采样——两者缺一不可。后续十年的工作很多就是『换一种采样方式』
  4. 抽象层稳,重用 10+ 年:BPR 这层抽象在 MF / kNN / GCN 上都能直接换底,是损失函数设计的范例。一个抽象能撑 10 年是很高的标准
  5. 学习目标对齐评估指标:评估用 AUC / NDCG(排序指标),训练就该用排序损失。pointwise + AUC 评估是错位的,BPR 把这两件事对上了

延伸阅读

关联

  • salton-vsm-1975 —— 把文档表示成向量,BPR 把用户/物品也表示成向量
  • anh-moffat-2005 —— 索引压缩处理大规模物品集,BPR 的工程前提
  • simrank-2002 —— 同样是『从交互图学相似度』的思路,但不分正负
  • slim-2011 —— SLIM 也是隐式反馈推荐,但用回归而非排序
  • colbert-2020 —— ColBERT 的 late interaction 训练用的也是 pairwise 损失,BPR 思想的现代延伸

反向链接

  • anh-moffat-2005 —— Anh-Moffat 2005 — 让倒排表压到接近熵下限还能 SIMD 解码
  • colbert-2020 —— ColBERT — 让 BERT 检索既准又能扛大规模
  • netflix-bellkor-2009 —— BellKor Netflix Prize 2009 — 集成学习赢下 100 万美金的工程实录
  • neumf-2017 —— NeuMF — 用神经网络替掉推荐系统的内积
  • salton-vsm-1975 —— Salton VSM 1975 — 把文档变成向量再用余弦比相似度
  • slim-2011 —— SLIM — 让数据自己学一张稀疏的”看了又看”权重表