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 的三个支柱:
-
三元组
(u, i, j):u 是用户,i 是 u 交互过的物品,j 是 u 没交互过的物品。从日志里 bootstrap 采样,海量 -
BPR-Opt 损失:让
sigmoid(score(u,i) - score(u,j))接近 1。等价表达:loss = -ln σ(score(u,i) - score(u,j)) + λ · ||θ||²论文里证明这个准则等价于最大化 AUC(ROC 曲线下面积)
-
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 项』。
踩过的坑
-
曝光偏差:模型只见过推荐系统推荐过的物品。『没交互』里混了『没曝光给用户』和『曝光了不喜欢』。BPR 没区分这两种——后续工作用 IPS(逆倾向加权)/ counterfactual learning 修
-
uniform 采负例学不动:抽到的 j 99% 是『模型已经能轻松分开的简单负例』,梯度几乎为 0。必须改 hard negative
-
长尾物品被双重伤害:热门物品大量出现在 j 位置(被推下去),同时长尾物品很少出现在 i 位置(用户根本没机会交互)。需要做 popularity debiasing
-
冷启动失效:新用户没历史交互,没法采 i;新物品没人交互过,永远落不到 i 位置上。BPR 必须配合内容特征(CB)才能处理冷启动
-
概率不可解释:sigmoid 输出的不是『u 喜欢 i 的概率』,只是『i 排在 j 前面的相对概率』。要做 CTR 预估必须额外校准
-
正则项必须有: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 的论文之一。
学到什么
- 建模假设比模型本身重要:BPR 没换打分模型(还是 MF),只换了损失。换 loss 让 AUC 涨了 10+ 个点,比换更复杂的模型 ROI 高得多
- 『最弱的合理假设』就是最好的假设:『i 比 j 排序高』比『i=1, j=0』弱,但更符合数据真相,反而效果更好。每多一条假设都是一处可能错的地方,能不假设就不假设
- 采样策略和 loss 同等重要:BPR 给了 loss,hard negative mining 给了采样——两者缺一不可。后续十年的工作很多就是『换一种采样方式』
- 抽象层稳,重用 10+ 年:BPR 这层抽象在 MF / kNN / GCN 上都能直接换底,是损失函数设计的范例。一个抽象能撑 10 年是很高的标准
- 学习目标对齐评估指标:评估用 AUC / NDCG(排序指标),训练就该用排序损失。pointwise + AUC 评估是错位的,BPR 把这两件事对上了
延伸阅读
- 论文:arxiv.org/abs/1205.2618(11 页,公式不密,可读)
- 工业实践:Pinterest BPR-MF 召回
- 后续扩展:VBPR(加视觉特征)/ LightGCN(用图卷积当 score)
- salton-vsm-1975 —— 信息检索向量空间模型,BPR 在 IR 侧的祖先
- okapi-bm25-1994 —— BM25 也是『从隐式信号里学相关性』,但用统计而非学习
关联
- 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 — 让数据自己学一张稀疏的”看了又看”权重表