在一家热闹的自助餐厅里,有位老食客每次取餐都径直走向同一个餐台——宫保鸡丁。服务员小夏看在眼里,起初还觉得这位客人专一,可渐渐地,他注意到老食客来得越来越少了。不是菜不好吃,而是这位客人永远只吃同一道菜,口味越来越“腻”,甚至开始怀疑这家店的水平。小夏决定做点什么:他悄悄在老食客的托盘里加了一小碟酸辣藕丁,又放了一勺清蒸鲈鱼。老食客起初皱眉,尝了一口后却眼睛一亮——原来还有这么多好吃的! 这个故事,就是推荐系统里“多样性推荐”的缩影。如果推荐系统永远只推用户爱看的那一类内容,用户就会像那位老食客一样,陷入“信息茧房”——越看越窄,越看越腻,最终流失。多样性推荐要做的,就是让推荐列表在“精准命中喜好”和“适当引入新鲜”之间找到平衡,像搭餐师傅一样,既保护食客的偏好,又引导他探索更丰富的口味。
对 AI 从业者而言,掌握多样性推荐是推荐系统从“能推”走向“会推”的关键进阶——它直接影响用户长期留存与平台生态健康度,是算法工程师、推荐策略产品经理的核心竞争力之一。
可视化演示
本节配有交互动效(进入视口后自动加载,约 3KB)。
多样性概述
小夏决定帮老食客换口味后,遇到了第一个难题:老食客的托盘上到底该放几道新菜?如果全换成新菜,老食客可能一口都不吃;如果只放宫保鸡丁,又回到老样子。这个难题,正是推荐系统面临的“精度与多样性”之问——只推荐用户可能点击的物品,短期点击率很高,但长期来看,用户看到的永远是同一类内容,最终像老食客一样吃腻离开。
在推荐系统领域,这种现象被称为“信息茧房”。用户的兴趣像蚕丝一样被自己吐出的丝层层包裹,系统越“精准”,茧房越厚。多样性推荐的定义由此而来:在保证推荐列表与用户兴趣基本匹配的前提下,尽量让列表中的物品覆盖更广的类目、主题或来源,让用户有“尝到新菜”的惊喜感。它的业务价值也非常直接——提升用户长期留存,延长平台生命线。
从数学上看,多样性推荐不是一个单一指标,而是一个多目标优化问题:既要有相关度,又要有整表的多样性。我们可以把推荐列表的质量写成这样的组合目标函数:
小夏很快明白:解决问题的关键不是“要不要多样性”,而是“用多少多样性换多少精度”。接下来的每一节,都是在给这份“配餐方案”寻找更聪明的数学工具。
- 推荐列表 $S$这是我们要输出的最终物品集合,比如手机 App 首页的 10 个商品位。
- 相关度总和列表里每一个物品 $i$ 与用户兴趣的匹配得分加起来,匹配越准,这项越高。
- 整体多样性 $\text{Div}(S)$衡量整个列表有多“五花八门”,类目越分散、内容差异越大,值越高。
- 平衡系数 $\gamma$它是小夏手中的“调味勺”——多加一点,餐桌更丰富;少加一点,更对老食客的原有口味。
MMR算法
小夏的配餐方案需要一个具体的流程:老食客最爱的宫保鸡丁当然要保留,但下一道菜选什么?小夏发现,选新菜时不能只看老食客爱不爱吃,还要看它跟已经选好的菜“撞不撞味道”——如果新菜又是一道辣子鸡,跟宫保鸡丁口味太像,那等于没换。这就是 MMR(最大边际相关性,Maximal Marginal Relevance)的朴素直觉。
MMR 是一种经典的重排算法:先有一批按相关度排序的候选物品,再从中逐个挑选进入最终列表。每挑一个物品时,它给这个物品打一个“边际分”——相关度奖励减去它与已选物品的最大相似度惩罚。一个物品哪怕相关度高,如果跟已选物品太像,也会被扣分;而一个相关度稍低但跟已选物品差异大的物品,反而可能胜出。
用公式表达,MMR 在每一步选择中求解:
小夏用这个策略重新给老食客配了一周的菜:宫保鸡丁、清蒸鲈鱼、凉拌木耳……每道菜都跟已选菜有足够差异,老食客惊喜地发现,原来自己还喜欢鱼和菌类。MMR 的优点正是实现简单、效果明显,是工业界重排环节的经典选手。
- 候选余集 $R\setminus S$还没被选中的物品组成的集合,每轮从中挑一个。
- 相关度奖励项物品本身与用户兴趣的匹配程度,越高越好,这是“保留老口味”的引擎。
- 冗余惩罚项找到已选集合里和 $d_i$ 最相似的物品,用相似度 $d_i$ 与它的像似度作为惩罚,避免整桌菜全是同一口味。
- λ 的调控λ=1 时只看相关度,退化为普通排序;λ=0 时只求差异性,完全忽略兴趣;实际中 λ 通常在 0.5~0.8 之间。
DPP算法
MMR 是“一道一道菜”地局部去冗余,但小夏发现:有时候两两不撞味的菜凑在一起,整桌却显得很“怪”;而三道貌不相关的菜搭配好了,反而能成一桌好宴。局部思维不够,能不能从“整桌菜的搭配质量”这个全局角度来选菜?这就要请出 DPP(行列式点过程,Determinantal Point Process)。
DPP 是一种优雅的概率模型,它对“整桌菜的搭配”给出一个整体打分。要理解它,先想象每道菜都被表示成一个向量——向量的方向代表这道菜的“风味维度”(辣度、酸度、鲜度等),向量的长度代表这道菜本身的质量。如果把这组向量围成的“平行体”体积算出来,体积越大,说明这些向量方向越分散、彼此越不重复。DPP 正是用行列式来计算这个体积的。
DPP 的核心公式是定义在候选集合所有子集上的概率分布:
理论上 DPP 要枚举所有子集才能找到概率最大的那个,这在几百万个商品上根本算不完。但研究者发现这个目标函数符合“子模性”——新增一个物品带来的多样性增益是递减的,因此可以用贪心算法近似求解:每次加入收益最大的物品,就能接近全局最优。小夏像一个真正的宴席总厨,用 DPP 一次性把整桌菜的搭配质量拉满,让老食客每周都能吃到风格迥异却又和谐的一餐。
- 核矩阵 $L$对角线元素表示某物品自身的质量(“这道菜单独好不好吃”),非对角线元素表示两物品的相似度(“这两道菜会不会撞味”)。
- 子集矩阵 $V_S$只保留子集 $S$ 中物品对应的那几行向量,行列式就是这些向量围成的平行体体积。
- 行列式 $\det(L_S)$体积越大,说明向量越“张得开”,也就是子集内部的多样性越高。
- 归一化分母除以 $\det(L+I)$ 把概率归一化到 0~1,使得所有子集的概率加起来等于 1。
多样性指标
小夏的配餐越来越丰富,可怎么知道“丰富”到什么程度了?光凭感觉不行,得能量化。好比一家餐厅要评估自己的菜单是否多样,需要统计覆盖了几个菜系、有几道菜口味重复、隔多久才换一次新菜。推荐系统同样需要一套“多样性指标”来度量效果。
最常用的指标之一是类目覆盖度(Coverage@K):看推荐列表中的 K 个物品覆盖了多少个预设类目,比如电商平台上覆盖了电子、图书、服饰、家居几个大类。另一个常用指标是列表内距离(ILD,Intra-List Distance):两两计算物品之间的不相似度并求平均,值越大说明列表内部越不重复。
列表内距离的公式如下:
除了列表级指标,还有用户级多样性:一个用户连续 30 天看过多少个类目、跨了几个兴趣领域;时间维度多样性则关注推荐列表在两周内的类目轮换率,防止用户这周看到 5 个电子类,下周还是同样的 5 个。小夏把这几把“尺子”都备齐后,才真正看清自己的配餐方案进步了多少——覆盖度从 1 个菜系提升到 4 个菜系,ILD 从 0.1 提升到 0.6,老食客的复购率也随之回升。
- 物品对数 $K(K-1)$K 个物品两两配对共有 K×(K−1) 对,除以它是为了求平均,让不同长度的列表可比较。
- 双重求和对列表中所有物品 $i$ 和所有不同于 $i$ 的物品 $j$ 配对统计。
- 不相似度 $1-\text{Sim}(i,j)$如果两个物品非常相似(相似度接近 1),这项就接近 0;越不相似,这项越接近 1。
多目标平衡
指标到位后,小夏又发现了一个新问题:不同食客对“多样性”的需求完全不同。有些食客就是喜欢稳定的老味道,你给他换太多新菜,他反而不高兴;有些食客天生爱尝鲜,你天天端同一道菜他会立刻流失。一个固定的“配餐比例”无法满足所有人。这对应推荐系统里的核心矛盾:精度与多样性的多目标平衡。
多目标平衡的本质,是把“相关性”和“多样性”看成两个需要共同优化的目标,直接的做法是加权融合:给每个物品计算一个综合分数,相关度与多样性各占一定权重。更高级的做法是实现个性化的权重调节——不同用户使用不同的平衡系数 λ,就像小夏给保守型食客调低新菜比例、给冒险型食客调高新菜比例。
个性化的加权评分可以写成:
除了加权融合,工业界还常用排序学习(LTR)方法:把“相关度分数”和“多样性特征”一起输入一个学习排序模型,让模型自动学习二者的最优组合;或者在重排阶段引入约束式优化——在保证相关度不低于某个阈值的条件下最大化多样性。小夏最后采用“分层配餐”:把食客按“保守型”“均衡型”“冒险型”分层,每层用不同的 λ 区间,再配合排序模型微调。老食客被归为“均衡型”,每周能尝到 2~3 道新菜,满意度不降反升。
- 用户权重 λ_u每个用户有一个自己的平衡系数,由该用户的点击历史、类目多样性、活跃度等特征预测而来。
- 相关度 $\text{Rel}(i)$模型预测的用户对物品 $i$ 的点击概率或评分,这是“他爱不爱吃”的直接证据。
- 惊喜度 $\text{Nov}(i)$物品相对于用户历史兴趣的新鲜程度,比如用户从没点过的类目,或低于曝光阈值的冷门内容。
在线评估
一切方案听起来都很美,但小夏不敢直接给所有食客换菜单——万一有人就是接受不了新菜呢?他决定试验一把:把 100 位食客随机分成两桌,A 桌继续按老菜单配餐,B 桌用新方案配餐,一周后比较两桌食客的“再来率”和“加菜量”。这就是推荐系统里最经典的评估方式:在线 A/B 测试。
A/B 测试之所以必要,是因为离线指标存在盲区。离线评测里,我们只有用户过去的行为数据,只能“猜”用户会不会喜欢新推荐的内容;而在线环境里,用户面对真实推荐会做出真实反馈——点了、划走了、买了吗、下次还来吗。尤其是多样性推荐,离线 ILD 再高,也不代表用户真的愿意尝试新类目。只有在线试验才能回答“长期留存是否真的提升”。
衡量长期价值的常用计算方式是比较实验组与对照组的留存提升率:
除了留存率,还要观察用户满意度反馈:是否点击了“不感兴趣”、新类目商品的收藏率、推荐反馈问卷评分等长短期指标要联动分析——短期点击率不能唯一决策,长期留存才是多样性推荐的终极裁判。一个月后,小夏的 A/B 测试报告出来了:B 桌食客的周留存提升了 15%,人均尝试新菜品数量是 A 桌的 3 倍。他把这套方案推广到全餐厅,老食客不仅回来了,还带来了更多朋友——因为他们都知道,这家餐厅总能带来惊喜。
- 新策略留存B 桌(实验组)在试验周期内的留存率,比如 7 天后还有多少老食客回来。
- 基线留存A 桌(对照组)按老方案运营的留存率,作为比较基准。
- 提升率新策略比基线多出的留存比例,注意要除以基线值做归一化,才能在不同周期、不同客群间比较。
AI 应用场景
电商首页“猜你喜欢”信息流重排
阶段:推荐重排阶段
解决的问题:传统召回+粗排只按预估点击率排序,用户在电商首页看到的商品几乎全是同一类目——买过手机后全是手机配件,形成商品信息茧房。采用 MMR 对粗排结果进行重排,在不明显牺牲点击率的前提下,让信息流覆盖电子、服饰、家居、图书等多个类目。
具体案例:某电商平台发现“高购买用户”的 30 日复购率持续下滑,分析发现其首页推荐列表类目重复度高达 80%。引入 MMR 重排(λ=0.6)后,列表类目覆盖度从 2.1 类提升到 4.3 类,点击率保持稳定,而用户 30 日复购率回升了 9%。平台还在重排层加入了“新类目尝试”追踪,记录用户首次点击新类目的行为。
短视频 App “发现页”长期留存优化
阶段:列表生成与排序
解决的问题:短视频推荐如果只按兴趣匹配,用户会陷入“搞笑视频—鸡汤—搞笑视频”的循环,内容疲劳加剧导致卸载。用 DPP 在排序层直接建模整屏视频的整体多样性,确保每屏 8 条视频覆盖多种内容类型。
具体案例:某短视频 App 在发现页引入 DPP 重排,用视频的类别嵌入构造核矩阵,行列式打分替代纯相关度排序。试验显示:每屏覆盖内容类型从 2.8 类提升到 5.1 类,用户日均观看时长微降 2%,但 7 日留存提升 11%,30 日卸载率下降 5%。
千人千味的个性化参数调控
阶段:排序模型个性化
解决的问题:不同用户对多样性的容忍度不同,全局固定一个 λ 会造成“保守用户反感新内容”“好奇用户觉得无聊”两头不讨好。通过用户行为特征预测个性化 λ_u,让每个用户拥有专属的精度-多样性平衡点。
具体案例:某音乐平台为不同用户学习个性化 λ_u:对歌单循环型用户,λ_u 设为 0.85 偏向熟悉曲风;对电台探索型用户,λ_u 设为 0.4 大幅引入新曲风。上线后,“每日推荐”功能的用户平均收听时长提升 8%,收藏率提升 13%。
Python 演示
def mmr_rerank(candidates, lam=0.7, top_k=5): """MMR重排, 输入候选列表, 每个元素为 (id, relevance, category)""" selected = [] remaining = list(candidates) while remaining and len(selected) < top_k: best_item = None best_val = float('-inf') for item in remaining: rel = item[1] max_sim = 0.0 cat = item[2] for s in selected: sim = 1.0 if s[2] == cat else 0.15 if sim > max_sim: max_sim = sim val = lam * rel - (1 - lam) * max_sim if val > best_val: best_val = val best_item = item selected.append(best_item) remaining.remove(best_item) return selected def category_coverage_ratio(items, total_cats=4): cats = set(i[2] for i in items) return len(cats) / total_cats if __name__ == '__main__': candidates = [ ('item_01', 0.95, '电子'), ('item_02', 0.90, '电子'), ('item_03', 0.85, '图书'), ('item_04', 0.82, '服饰'), ('item_05', 0.78, '电子'), ('item_06', 0.74, '图书'), ('item_07', 0.70, '服饰'), ('item_08', 0.66, '家居'), ] for lam in [1.0, 0.6, 0.3]: ranked = mmr_rerank(candidates, lam=lam, top_k=5) cats = [x[2] for x in ranked] cov = category_coverage_ratio(cats) print('lambda=%.1f -> %s, 类目覆盖=%.2f' % (lam, [x[0] for x in ranked], cov))
val = lam * rel - (1 - lam) * max_sim这是 MMR 的核心打分式,相关度奖励减去最大相似度惩罚。sim = 1.0 if s[2] == cat else 0.15用同一类目定义相似度为 1.0,不同类目为 0.15,简化相似度计算。best_val = float('-inf')初始化负无穷,保证第一个候选一定能被选中,避免空选问题。remaining.remove(best_item)选中的物品从候选池移除,已选集合逐步增长。category_coverage_ratio(cats)用类目覆盖度作为多样性指标,评估重排效果。for lam in [1.0, 0.6, 0.3]对比三个 λ 值,观察纯相关、均衡、强多样三种模式的差异。
常见误区
误区很多初学者以为提高多样性就是把推荐列表随机打乱,偶尔把不相干的热门内容塞进去就行,反正列表“看起来丰富了”。
正解随机打乱会严重破坏相关性——老食客的托盘里如果出现三道他从不吃的生鱼片,他只会觉得餐厅不靠谱。真正的多样性是在相关度排序的基线上做“结构化去重”,MMR 用边际分保证“相关为主、多样为辅”,DPP 用行列式保证“整体搭配最优”,两者都是约束下的优化,绝非无序漫游。
为何常见:因为“多样性”这个词听起来像是随机性,而随机化确实能立刻让列表看起来不同,容易产生“有效”的错觉。
误区以为推荐系统的终极目标就是预估点击率,相关度排序越高越准,短期点击率提升就等于推荐变好了。
正解只优化相关度会加速信息茧房。点击率是“短期指标”,用户长期留存才是平台的命脉。多样性推荐牺牲一点短期点击,换取的是用户对平台“总有新鲜感”的长期信任。正如小夏不会只给老食客上宫保鸡丁——哪怕那碗鸡丁是他唯一的最爱。
为何常见:工业界很多团队考核指标就是点击率/转化率,短期数字最容易追逐,长期留存却需要耐心观察才能看清。
误区以为 MMR 的 λ 是一个全局常量,统一设置成 0.5 就完成了精度与多样性的平衡,无需再调整。
正解不同用户对多样性的容忍度差异巨大。保守型用户 λ 应接近 0.8~0.9,探索型用户 λ 可低至 0.3~0.4。固定 λ 会让一部分用户觉得“推荐太野”,另一部分觉得“推荐太窄”。正确做法是通过用户行为特征学习个性化 λ_u,或至少按行为分层设置不同的 λ。
为何常见:λ 在公式里的位置不明显,初学者容易把它当成一个“经验参数”,忽略了它其实是一个可以个性化的变量。
误区离线评测中 ILD 提升到 0.7,就认为新策略一定能提升线上留存,直接全量上线。
正解离线指标只基于历史行为,无法捕捉用户的真实反应。高 ILD 可能意味着列表确实丰富,也可能意味着推荐了大量用户根本不感兴趣的内容。只有通过 A/B 测试观察线上留存、满意度、新类目尝试率等真实反馈,才能下结论。离线指标是“体检报告”,线上 A/B 才是“真刀真枪的考试”。
为何常见:离线评测成本低、速度快、可重复,容易让人产生“数据不会骗人”的依赖感,忽略了离线数据的天然盲区。
面试题
Q1. MMR 的英文全称是?
- A.最大边际相关性← 正确答案
- B.最小边际相关性
- C.平均均值相关度
- D.最大似然排序方法
答案:A。MMR 是 Maximal Marginal Relevance(最大边际相关性)的缩写,核心思想是每次选择“相关度最高且与已选内容最不相似”的物品。选项 B “最小”与定义相反,C 和 D 是混淆项。
Q2. 多样性推荐的主要目标是什么?
- A.提高系统吞吐能力
- B.打破用户信息茧房← 正确答案
- C.降低存储硬件成本
- D.加快模型训练速度
答案:B。多样性推荐的核心目标是打破信息茧房,避免用户只看同一类内容,从而提升长期留存。吞吐量、存储成本、训练速度都是系统性能问题,与推荐内容的多样性无关。
Q3. 下列哪些属于推荐系统中的多样性指标?
- A.类目覆盖面← 正确答案
- B.列表内差异度← 正确答案
- C.用户在线时长
- D.用户跨类目广度← 正确答案
答案:ABD。类目覆盖面(类目覆盖度)和列表内差异度(ILD)是典型的列表级多样性指标,用户跨类目广度是用户级多样性指标。用户在线时长属于留存/活跃指标,不是多样性度量。
Q4. 在 MMR 公式中,参数 λ 增大意味着什么?
- A.更看重相关度← 正确答案
- B.更看重多样性
- C.更看重覆盖度
- D.更看重时间衰减
答案:A。MMR 中 λ 乘以相关度项,(1−λ) 乘以多样性惩罚项。λ 越大,相关度奖励占比越高,排序越接近纯相关排序;λ 越小,多样性惩罚影响越大。这与“λ 增大 → 更重相关度”的直觉一致。
Q5. 在 DPP 中,矩阵 V 的每一行代表什么?
- A.某个候选物品的特征向量← 正确答案
- B.某个用户的历史编号
- C.某次点击的时间戳
- D.某个模型的超参数取值
答案:A。DPP 中 V 的每一行是一个候选物品的嵌入向量,行列式 det(V_S^T V_S) 计算这些向量围成的体积。用户的编号、时间戳、超参数都不是候选物品的特征表达。
Q6. 下列哪些做法可以有效缓解信息茧房?
- A.用 MMR 对推荐列表重排← 正确答案
- B.用 DPP 建模整表多样性← 正确答案
- C.单纯增大模型学习率
- D.为用户学习个性化平衡参数← 正确答案
答案:ABD。MMR 重排通过边际相关做局部去冗余,DPP 通过行列式建模整体多样性,个性化平衡参数让不同用户拥有合适的精度-多样性配比,都能缓解茧房。增大学习率只是优化训练速度,与推荐内容多样性无关。
Q7. 当 MMR 的 λ=1 时,算法退化为?
- A.纯相关度排序← 正确答案
- B.完全随机打乱
- C.纯类目覆盖排序
- D.协同过滤原始版本
答案:A。当 λ=1 时,多样性惩罚项系数为 0,MMR 的分数只由相关度决定,等价于按相关度从高到低排序。λ=0 时才完全忽略相关度,但不是随机打乱,而是只按差异度排序。
Q8. 为什么 DPP 的行列式越大,子集多样性越高?
- A.向量围成的体积更大← 正确答案
- B.矩阵阶数必然更大
- C.特征值数值更小
- D.计算复杂度更高
答案:A。行列式在几何上等于特征向量围成的平行体体积。向量方向越分散、越不重合,张开的体积越大,行列式越大,说明子集内部的多样性越高。矩阵阶数由子集大小决定,与多样性无直接关系。
Q9. 在 DPP 的核矩阵 L 中,对角线元素通常表示什么?
- A.物品自身的质量分数← 正确答案
- B.物品之间的相似度
- C.用户对类目的偏好
- D.推荐列表的长度
答案:A。核矩阵 L 的对角线元素 L_ii 表示物品 i 自身的质量(如相关度),非对角线元素 L_ij 表示物品 i 与 j 的相似度。行列式把“自身质量”和“两两差异”统一进一个整体打分中。
Q10. 多样性推荐系统上线前,正确的验证方式有哪些?
- A.离线计算 ILD 提升幅度← 正确答案
- B.直接全量发布不做验证
- C.线上 A/B 测试观察留存← 正确答案
- D.同时监控用户满意度反馈← 正确答案
答案:ACD。离线指标(A)是必要的前置检查,但必须配合线上 A/B 测试(C)观察真实留存变化,并监控满意度反馈(D)防止多样性过载伤害体验。跳过验证直接全量发布是高风险做法,极易造成用户流失。