小明在街角开了家奶茶店。他从没让顾客填过评分问卷,也没有人能给他的奶茶打几颗星,但他有一本厚厚的记录本:谁在什么时间点过哪杯、吸管伸进去几次、最后剩了多少。靠着这本只有“喝过/没喝过”的流水账,他居然把每个熟客的口味猜得八九不离十——秘诀是从不纠结“这杯值4分还是5分”,只盯着一件事:昨天喝光的那杯,下次一定要排在那杯几乎没碰过的前面。这就是 BPR(Bayesian Personalized Ranking,贝叶斯个性化排序)的核心精神:不预测评分,直接优化排名顺序。本文就跟着小明,从隐式反馈出发,理解贝叶斯框架如何把“更喜欢谁”变成概率,一步步推导出 BPR 损失函数,再看它如何与矩阵分解联手,最终用 AUC 检验排位赛的胜率。
推荐系统是 AI 商业化落地最广的战场,BPR 是隐式反馈排序的奠基方法。掌握 BPR 的数学原理与训练范式,你就能理解从协同过滤到深度排序模型的演进逻辑,这是推荐算法岗位笔试与实战的必考技能。
可视化演示
演示BPR排序原理、矩阵分解结合BPR优化、以及AUC指标评估对比。
本节配有交互动效(进入视口后自动加载,约 3KB)。
排序原理 正样本排前 负样本排后 最大化P(正>负) 贝叶斯优化
隐式反馈的世界
小明的记录本上只有一行行流水账:“周三,小美点了杨枝甘露,剩一口;周五,小美点了柠檬茶,剩大半。”没有星级,没有评语,只有“喝了/没喝”和“喝了多少”。这种只有交互证据、没有明确评分的信号,在推荐系统里叫隐式反馈。与之相对的显式反馈,是用户在评分网站上明明白白打出的 1 到 5 星。现实世界中绝大多数产品都没有评分按钮:电商后台只有订单和浏览记录,视频平台只有播放和完播数据,音乐 App 只有跳过和切歌行为。BPR 从设计之初就是为了啃下这块“没有评分”的硬骨头。
为了把流水账变成数学,我们定义一个观测矩阵 \(Y\):用户 \(u\) 对物品 \(i\) 产生过交互就记 1,否则记 0。值得注意的是,BPR 并没有把 0 当成“用户讨厌这个物品”,而是当成“缺少证据的相对负例”。小明很清楚:小美没点过抹茶千层,不代表她讨厌抹茶,可能只是那天下雨天突然想喝热的。
正因为“1“和”0“都不是绝对的喜欢与讨厌,BPR 才选择了”对比“而非”贴标签”的方式——这为后面的逐对排序埋下了伏笔。
- 交互矩阵\(Y_{ui}\) 表示用户 \(u\) 和物品 \(i\) 之间的观测状态矩阵,行是用户、列是物品。
- 正信号\(Y_{ui} = 1\) 表示发生过点击、购买、观看等交互,BPR 把它归入正样本候选。
- 缺失即负类\(Y_{ui} = 0\) 表示未观测到交互,BPR 把它当作相对负样本,不代表绝对讨厌。
排序目标差异
小明的目标从来不是当美食评论家。他不需要精确回答“杨枝甘露值 4.7 分”,他只需要回答一个更实际的问题:明天小美进门时,推荐列表第一杯该放杨枝甘露还是柠檬茶?推荐系统的本质是给出一份 Top-N 名单,不是出一份口味评测报告。传统协同过滤(比如矩阵分解配合 RMSE 损失)追求“预测评分尽可能接近真实评分”,这在有大量显式评分的电影网站上很合理;但在只有隐式反馈的电商、短视频场景里,“预测对了 4.2 分但排错了顺序”毫无意义。
于是我们换一种眼光:不看分数准不准,只看正样本是否排在负样本前面。对每个用户 \(u\),\(I_u^{+}\) 是他交互过的物品集合,\(I \setminus I_u^{+}\) 是未交互的物品集合。我们把问题定义成:对任意正负样本对,模型输出的预测分数都要满足“正的比负的高”。这就像小明在给熟客做“隐形排位赛”:喝过的奶茶永远应该排在没碰过的奶茶前面。
“逐点”关注每个物品的绝对分数,而“逐对”只关心两个物品谁在前。就像小明不会纠结小美对杨枝甘露的满意度是 4.7 还是 4.8,他只要确定“杨枝甘露排在柠檬茶前面”就够了。
- 正样本集合\(I_u^{+}\) 是用户 \(u\) 发生交互的物品集合,代表系统认可的“好”的候选。
- 负样本空间\(I \setminus I_u^{+}\) 是用户 \(u\) 未交互的物品集合,作为排序比较中的陪跑者。
- 排序不等式模型输出的预测分数必须满足正样本高于负样本,这正是逐对排序要逼近的目标。
贝叶斯框架登场
小明当然看不穿顾客的心思——他无法直接观测“小美到底多喜欢杨枝甘露”。他只能从一次次“这杯喝光了、那杯剩大半”的对比中反推真实偏好。这种由结果反推原因的推理方式,正是贝叶斯思想的精髓。BPR 的贝叶斯框架做了两件事:第一,假设每个用户对所有物品存在一个潜在的偏好全序关系 \(\succ_u\);第二,把这个关系是否成立看成随机事件,用概率描述。
设模型参数为 \(\Theta\)(比如矩阵分解里的隐向量),我们的目标是:在已知“用户偏好排序”这一观测证据下,找到最可能产生这些证据的参数。根据贝叶斯公式,参数的后验概率正比于“数据似然”乘以“参数先验”。BPR 假设各用户的偏好相互独立、各物品对之间也相互独立,于是似然可以写成所有三元组概率的连乘——每一个“喝光 vs 剩下大半”的对比,都在为参数提供一份证据。
贝叶斯公式在这里不是用来做分类的,而是给出一个“如何衡量排序假设好坏”的标尺:能让观测到的偏好关系更可能成立的参数,就是好参数。
- 后验概率\(p(\Theta \mid \succ_u)\) 表示观察到用户 \(u\) 的排序偏好后参数 \(\Theta\) 成立的可能性,这是我们要最大化的目标。
- 似然函数\(p(\succ_u \mid \Theta)\) 表示在参数 \(\Theta\) 下用户 \(u\) 的偏好关系成立的概率,数据拟合得越好它越大。
- 先验概率\(p(\Theta)\) 是对参数最初的猜测,通常取均值为零的正态分布,起到防止过拟合的作用。
BPR损失推导
排位赛的规则终于可以写成公式了。每一轮 PK 拿出一个三元组 \((u, i, j)\):用户 \(u\)、喝过的正样本 \(i\)、没碰过的负样本 \(j\)。我们希望用户对 \(i\) 的预估喜好分 \(\hat{x}_{ui}\) 高于对 \(j\) 的 \(\hat{x}_{uj}\)。差值越大,排序越合理。把差值丢进 sigmoid 函数,就得到“正样本排在负样本前”的概率:
对所有三元组取连乘(独立性假设),再取负对数把乘法变加法、把最大化变最小化,最后加上正则项防止参数在稀疏数据上走火入魔,就得到了 BPR 的总损失:
这个损失函数就是小明的“训练大纲”:每一轮 PK 都要让赢家优势更明显,同时保持配方不跑偏。它还有个隐藏身份——它是排序指标 AUC 的平滑代理,后文会再碰到。
- 三元组集合\(D_S\) 包含所有“用户-正样本-负样本”组合,每个三元组对应一次偏好对比,是训练的基本单位。
- 分数差值\(\hat{x}_{ui}-\hat{x}_{uj}\) 衡量正样本与负样本的预估喜好差,差值越大代表排序越有把握。
- 负对数似然\(-\ln \sigma(\Delta_{uij})\) 对概率取负对数,概率越接近 1 损失越小,模型便倾向拉大正负差距。
- 正则化项\(\lambda \|\Theta\|^2\) 惩罚过大的参数,防止模型在稀疏数据上过度拟合。
矩阵分解融合
小明渐渐发现,虽然每个顾客口味不同,但好像都能用几张“隐形尺子”描述:有人嗜甜、有人爱茶底浓、有人偏爱冷饮、有人喜欢季节限定。把顾客和奶茶都放到这几把尺子上量一量,就能预判匹配度。这正是矩阵分解的想法:把用户和物品都映射到 \(K\) 个隐藏因子的向量空间,预测分数就是两个向量的内积。BPR 本身只定义了“怎么算好排序”,至于 \(\hat{x}_{ui}\) 具体怎么算,矩阵分解是它的最佳搭档。
于是 BPR 损失中的 \(\hat{x}_{ui}\) 就有了具体形态:
把小明的尺子数字化:\(U_u\) 的每一维是“顾客在甜度敏感度、茶底偏好等维度上的画像”,\(V_i\) 的每一维是“这杯奶茶在这几个维度上的属性值”。两者内积越大,说明顾客和奶茶越合拍。训练时,每轮 PK 会对三个向量同时做一次梯度更新:把用户向量往正样本方向拉近一点、往负样本方向推远一点。
小明把顾客和奶茶都“压缩”成了几根尺子上的刻度。每轮 PK 之后,尺子上的数字微调一次——这就是机器学习里的参数学习,积小胜为大胜。
- 用户隐向量\(U_u\) 是用户 \(u\) 在 \(K\) 个隐藏因子上的向量表示,相当于顾客的口味画像。
- 物品隐向量\(V_i\) 是物品 \(i\) 在同样 \(K\) 个因子上的向量表示,描述这杯奶茶的特征。
- 内积打分对应维度相乘再求和得到预测分数,两个向量方向越一致分数越高。
- 梯度更新\(1 - \sigma(\cdot)\) 是“这轮 PK 输得多惨”的权重,输得越惨,拉近推远的动作越大。
采样与训练
店里几百个顾客、几百款奶茶,如果要把所有“喝过/没喝过”的组合全部比一遍,计算量大到无法承受。而且负样本数量远多于正样本,全量遍历会让训练严重失衡。小明的做法很实在:每天随机抽一个顾客、随机抽一杯他喝过的、再随机抽一杯他没碰过的,做一轮小 PK 就调整一次判断。这就是随机梯度下降(SGD)驱动的 BPR 训练。
每次迭代,采样一个三元组 \((u, i, j)\),然后沿着损失函数的梯度方向更新参数。负样本的选取决定了排位赛的质量:纯随机采样简单高效,但更容易引入“太容易打败”的简单样本;工业界常用“热门未交互”作为负样本,因为“顾客没点那款爆款”比“没点冷门新品”蕴含更多区分信息。采样比例也讲究:通常每个正样本配 1 到 10 个负样本即可,盲目堆量反而拖慢收敛。
训练过程就是把大量三元组喂给模型,反复执行“采样 → 算梯度 → 更新”三个动作。每一轮更新虽然只调整了一点点参数,但一轮轮迭代下来,整体排序会越来越接近“喝过的都排前面”的理想状态。
训练完成后,小明只需要对每个顾客把菜单按预测分数从高到低排一遍——分数最高的几杯,就是明天的推荐名单。整个过程就像每天做几轮小 PK,日积月累,整家店的推荐品味就越发精准。
- 三元组定义\(D_S\) 中的每个元素都是训练样本,采样时从正样本空间和负样本空间各取一个物品。
- 随机采样\(j\) 从负样本空间中随机抽取,也可以在负样本上按物品热度加权,提高采样质量。
- 随机梯度更新每一步只用当前三元组的梯度更新参数,不必等全部样本算完。
评估效果对比
新配方到底行不行?小明想了一个检验办法:随机抽“一杯他喝过的”和“一杯他没碰过的”,看看喝过的那杯是否排在前面。重复很多次后统计胜率,这个胜率就是推荐系统里大名鼎鼎的 AUC(Area Under the ROC Curve)。AUC = 0.5 表示和瞎猜没区别,AUC = 1 表示完美排序。BPR 和 AUC 的关系相当亲密:BPR 损失中的 \(\ln \sigma(\hat{x}_{ui} - \hat{x}_{uj})\) 其实就是把 AUC 里“比赢了记 1 分、比输了记 0 分”的硬判决,换成了光滑可导的概率——所以训练 BPR 就像是“给 AUC 装上了可微分的引擎”。
与之对比,pointwise(逐点)损失如均方误差(MSE)或交叉熵(CE),优化的是“每个物品分数预测得准不准”,并不保证排序正确;两个物品分数都离真实值很远,但只要差值方向对,排序照样正确。listwise(列表级)方法虽然直接优化整体排序,但计算复杂度高、实现复杂。BPR 作为 pairwise 的代表,在效果与成本之间取得了很好的平衡。
评估完,小明很满意:AUC 从最初的 0.52 一路涨到 0.87,意味着“随机抽一对喝过和没喝过的奶茶,喝过的那杯排前面的概率”已经远超瞎猜。BPR 的故事也完整了:用隐式反馈做原料,用贝叶斯框架定标尺,用逐对损失做训练,用矩阵分解算分数,最后用 AUC 验收排位赛的成果。
- 用户平均\(\frac{1}{|U|} \sum_{u \in U}\) 先对每个用户分别计算再求平均,避免交互量大的用户主导指标。
- 归一化分母\(\frac{1}{|I_u^{+}| \cdot |I_u^{-}|}\) 用正负样本对总数归一化,使 AUC 取值稳定在 0 到 1。
- 双循环比较\(\sum_{i \in I_u^{+}} \sum_{j \in I_u^{-}}\) 遍历用户所有“正-负”对,逐一比较预测分数。
- 指示函数\(\mathbb{I}[\hat{x}_{ui} > \hat{x}_{uj}]\) 分数排序正确记 1 分,否则记 0 分。
AI 应用场景
电商“猜你喜欢”排序
阶段:召回与排序(个性化排序阶段)
解决的问题:淘宝、京东的推荐位有限,用户只有浏览、加购、下单等隐式行为,没有评分。传统 pointwise 模型按“购买概率”逐个打分排序,容易受热门商品干扰,出现“预测分高但排序体验差”的问题。BPR 直接构造“买过的 vs 没买过的”物品对,让推荐列表的排序贴近真实交互顺序。
具体案例:某电商用户浏览过 A 款耳机但从未点击 B 款,pointwise 模型可能因 B 款整体热门而把它排前面;BPR-MF 通过大量三元组训练,使已交互商品的预测分稳定高于未交互商品,推荐列表点击率提升约 15%,AUC 提升 3-5 个点。
短视频信息流个性化推荐
阶段:召回阶段候选排序
解决的问题:抖音、快手等平台中,点赞、完播、转发是典型的隐式反馈。用户看完 A 视频却划走 B 视频,BPR 希望 A 的排序分数高于 B。相比单纯预测“完播率”,BPR 直接优化“看完的排前面”这一排序目标,更贴合信息流产品的体验定义。
具体案例:某视频平台在召回阶段用 BPR-MF 对几百个候选视频排序,以完播和点赞作为正样本、曝光未行为作为负样本,实验组的人均播放时长提升 8%,完播率提升 5%。
广告点击率排序(pairwise CTR)
阶段:广告排序(精排阶段)
解决的问题:广告场景中正样本是“点击的广告”,负样本是“曝光但未点击的广告”。传统逻辑回归做逐点 CTR 预估,目标是让点击概率预测准;但广告主真正关心的是“高价值广告是否排在高曝光位”——这正是一个排序问题。BPR 风格的 pairwise 损失可作为辅助任务,与主 CTR 任务联合训练。
具体案例:某广告平台在精排模型中加入 pairwise 排序损失,与逐点交叉熵联合优化,线上 AUC 提升约 1.2 个百分点,广告收入提升 3%。
Python 演示
import numpy as np class BPRMF: """BPR + 矩阵分解的隐式反馈排序模型""" def __init__(self, n_users, n_items, k=8, lr=0.05, reg=0.01): self.n_users = n_users self.n_items = n_items self.k = k self.lr = lr self.reg = reg self.U = np.random.normal(0, 0.1, (n_users, k)) self.V = np.random.normal(0, 0.1, (n_items, k)) def score(self, u, i): return float(np.dot(self.U[u], self.V[i])) def update(self, u, i, j): s = 1.0 / (1.0 + np.exp(self.score(u, i) - self.score(u, j))) ui = self.U[u].copy() vi = self.V[i].copy() vj = self.V[j].copy() self.U[u] += self.lr * (s * (vi - vj) - self.reg * ui) self.V[i] += self.lr * (s * ui - self.reg * vi) self.V[j] += self.lr * (-s * ui - self.reg * vj) def train(self, pos_items, neg_items, epochs=20, neg_samples=4): for _ in range(epochs): for u, pos_list in pos_items.items(): for i in pos_list: for _ in range(neg_samples): j = np.random.choice(neg_items[u]) self.update(u, i, j) def auc(self, pos_items): total, hit = 0, 0 for u, pos_list in pos_items.items(): neg_list = [v for v in range(self.n_items) if v not in pos_list] for i in pos_list: for j in neg_list: total += 1 if self.score(u, i) > self.score(u, j): hit += 1 return hit / total if total else 0.0 if __name__ == "__main__": pos_items = {0: [0, 1], 1: [1, 2], 2: [0, 2]} n_items = 5 all_items = set(range(n_items)) neg_items = {u: list(all_items - set(items)) for u, items in pos_items.items()} model = BPRMF(n_users=3, n_items=n_items, k=4, lr=0.05, reg=0.01) model.train(pos_items, neg_items, epochs=30, neg_samples=4) print("BPR-MF AUC:", round(model.auc(pos_items), 4))
self.U = np.random.normal(0, 0.1, (n_users, k))初始化用户隐向量矩阵,小随机数保证对称破缺s = 1.0 / (1.0 + np.exp(self.score(u, i) - self.score(u, j)))计算 \(1-\sigma(\Delta)\),即这轮 PK 的“修正权重”self.U[u] += self.lr * (s * (vi - vj) - self.reg * ui)用户向量朝正样本方向拉近、朝负样本方向推远self.V[i] += self.lr * (s * ui - self.reg * vi)正样本物品向量向用户方向靠拢self.V[j] += self.lr * (-s * ui - self.reg * vj)负样本物品向量被推离用户j = np.random.choice(neg_items[u])每次从负样本空间随机抽一个未交互物品model.auc(pos_items)遍历所有正负对,统计预测分数正确的比例
常见误区
误区训练 BPR 时把用户没点过的商品全当作负样本,所以模型学到的就是“用户讨厌这些东西”,预测分很低的商品可以直接清掉。
正解BPR 里的未观测样本只是“相对负例”——它只说明“和已交互的物品相比,这个物品更可能排在后面”,并不代表用户的主观厌恶。用户没点 A,可能只是没看到、没时间、或者当天不需要。把低分物品当“厌恶物品”清掉,会牺牲长尾曝光,让推荐生态越来越窄。奶茶店里,“小美没点抹茶”绝不等于“小美讨厌抹茶”。
为何常见:训练时“正负样本”在代码里就是 0 和 1,初学者容易把 1 理解成“喜欢”、0 理解成“讨厌”,忽略了 BPR 是从“对比”中学习,而不是从“标签”中学习。
误区BPR 训练完之后,\(\hat{x}_{ui} = 4.2\) 就是用户会给物品 i 打的分数,可以直接展示给用户或做评分预测。
正解BPR 只保证排序正确,分数本身没有“评分刻度”。损失函数只用到了分数间的相对大小(差值的 sigmoid),所以所有分数同时加一个常数或整体缩放,排序结果都不变。\(\hat{x}_{ui}=4.2\) 与 \(\hat{x}_{uj}=1.3\) 的差距并不表示用户对两者的喜好差是 2.9 分。它只是“排位赛”里的比分,不是“品鉴报告”里的打分。
为何常见:BPR-MF 从形式上看和 SVD 矩阵分解很像,都用隐向量内积输出一个数,初学者容易把排序分数误当成评分预测值。
误区反正负样本“免费”,每个正样本都配上几十个负样本,模型一定学得越快越准。
正解过度采样会让正负样本严重失衡,模型把大量时间花在“没有区分度”的简单对上,还会放大采样偏差,让推荐结果偏向流行物品。工业界通常每个正样本配 1 到 10 个负样本,并且更偏好“热门但未交互”的困难负样本——就像排位赛里总挑“明显打不过的对手”练手,水平很难提升。
为何常见:pointwise 训练中负样本不足会欠拟合,“数据越多越好”的直觉被照搬到了 pairwise 场景,忽略了采样分布比采样数量更重要。
误区BPR 是矩阵分解的另一种叫法?我学的 SVD 和它是一回事吗?
正解BPR 是一种目标函数/训练准则,它定义“什么样的排序是好排序”;矩阵分解(MF)是一种评分函数,它定义“预测分数怎么算”。两者是正交的:BPR 可以配 MF,也可以配神经网络、树模型、图模型。BPR-MF 只是最经典的组合方式,远不是全部。
为何常见:论文《BPR: Bayesian Personalized Ranking from Implicit Feedback》主要以矩阵分解为演示载体,读者容易把配套模型误当成方法主体。
面试题
Q1. BPR 的全称和核心目标是什么?
- A.优化用户对物品的个性化排序← 正确答案
- B.预测用户对物品的点击概率
- C.按照全局热度进行物品排名
- D.回归预测用户的精确评分值
答案:A。BPR(Bayesian Personalized Ranking)的核心是优化个性化排序,让正样本排在负样本前面。B 是 CTR 预估的目标,C 是热度排序,D 是评分预测,三者都不是 BPR 的定位。
Q2. BPR 主要适用于哪种反馈数据?
- A.显式评分数据如五星打分
- B.隐式反馈数据如点击购买← 正确答案
- C.文本评论情感分析数据
- D.图像内容像素标注数据
答案:B。BPR 是专为隐式反馈设计的,用户只有点击、购买、观看等行为,没有明确评分。显式评分数据更适合传统的评分预测方法;文本和图像数据不是协同过滤的典型输入。
Q3. BPR 损失函数的核心思想是什么?
- A.让正样本分数尽可能等于负样本
- B.让正样本分数尽可能大于负样本← 正确答案
- C.让所有物品的预测分数都趋近零
- D.让负样本分数尽可能大过正样本
答案:B。BPR 通过 sigmoid 把“正样本分数减负样本分数”的差值转成概率,并最大化这个概率,本质就是让正样本分数尽量大过负样本。A 会导致排序无区分度,C 和 D 与目标相反。
Q4. BPR 训练中三元组 (u,i,j) 的含义是什么?
- A.用户对物品 i 和 j 都有过交互
- B.用户交互过 i 却未交互 j,希望 i 排前面← 正确答案
- C.物品 i 和 j 属于同一个商品类目
- D.用户对 i 无交互却对 j 有交互
答案:B。三元组中 u 是用户,i 是正样本(交互过),j 是负样本(未交互),训练目标是让 \(\hat{x}_{ui} > \hat{x}_{uj}\)。A 中两个都是正样本无法构成对比,C 与类目无关,D 把正负样本颠倒了。
Q5. sigmoid 函数在 BPR 中的作用是什么?
- A.把分数差值映射成 (0,1) 概率← 正确答案
- B.把预测分数归一化到 0 到 5 分
- C.对预测分数计算自然对数变换
- D.把差值变成两个物品的余弦相似
答案:A。sigmoid 把任意实数差值 \(\hat{x}_{ui}-\hat{x}_{uj}\) 压缩到 (0,1),解释为“正样本排在负样本前的概率”。B 是评分归一化,C 是对数变换,D 是相似度度量,都与 BPR 的概率化目标无关。
Q6. 与 pointwise 方法相比,BPR 的主要优势是什么?
- A.不需要用户与物品的任何交互数据
- B.直接优化排序顺序契合推荐目标← 正确答案
- C.模型训练速度永远快于逐点法
- D.彻底省去负样本的选取过程
答案:B。pointwise 优化“每个物品分数预测得准”,但推荐系统最终要的是 Top-N 顺序。BPR 直接优化正负样本的相对顺序,与推荐目标一致。A 说法错误,BPR 同样需要交互数据;C 和 D 都是不准确的绝对化表述。
Q7. 关于 BPR 的贝叶斯框架,下列说法正确的是?
- A.核心是最大化排序关系的后验概率← 正确答案
- B.假设用户的物品偏好呈全序关系← 正确答案
- C.假设用户各特征之间相互条件独立
- D.BPR 本质上就是朴素贝叶斯分类器
答案:AB。BPR 最大化排序关系 \(\succ_u\) 的后验概率,并假设每个用户对所有物品存在一个全序偏好关系,因此 A、B 正确。C 是朴素贝叶斯的独立性假设,BPR 没有对特征做独立性假设;D 混淆了贝叶斯公式的使用方式,BPR 不是分类器。
Q8. BPR 损失与 AUC 的关系是什么?
- A.BPR 损失与 AUC 数值完全等价
- B.BPR 损失是 AUC 的平滑上界函数
- C.BPR 损失是 AUC 的平滑近似代理← 正确答案
- D.BPR 损失与 AUC 没有任何数学关系
答案:C。AUC 用 0-1 指示函数统计“正样本排前面”的命中率,不可导;BPR 损失用 \(\ln\sigma(\Delta)\) 替代硬判决,是 AUC 的平滑可导近似。A 说“完全等价”错误,B 说“上界”不准确,D 显然错误。
Q9. BPR-MF 中,用户 u 对物品 i 的预测分数如何计算?
- A.用户隐向量与物品隐向量求内积← 正确答案
- B.用户隐向量与物品隐向量逐项求和
- C.物品被所有用户评分的平均分
- D.用户交互过的物品数量占总交互比
答案:A。BPR-MF 使用矩阵分解,预测分数 \(\hat{x}_{ui} = \sum_k U_{uk} V_{ik}\),即内积。逐项求和(B)没有交互融合的意义,C 是全局平均分,D 是覆盖率统计,都不是个性化打分。
Q10. 关于“未观测即负样本”的处理,下列说法正确的有?
- A.未观测物品仅作为排序中的相对负例← 正确答案
- B.未观测不代表用户内心讨厌该物品← 正确答案
- C.负样本常从用户未交互的物品中采样← 正确答案
- D.采样的负样本数量越多模型必然越准
答案:ABC。BPR 把未观测物品当作相对负例参与排序对比(A),但这不意味着用户讨厌它(B),负样本通常从未交互集合中随机或按热度采样(C)。D 错误:负样本过多会导致样本失衡和采样偏差,并非越多越好。