Swing模型推荐系统中的图结构协同过滤算法什么是Swing模型Swing模型是一种改进的协同过滤算法由阿里巴巴提出专门用于推荐系统的召回阶段。它通过分析用户-物品二部图中的Swing结构来计算物品之间的相似度能够有效缓解传统协同过滤中热门物品过度推荐的问题更好地发现长尾物品的真实关联。Swing的核心思想传统协同过滤的问题传统的Item-based协同过滤通过统计共现来计算物品相似度如果物品A和物品B被很多相同用户购买/点击 → 认为A和B相似问题有一类剁手党用户什么都买他们会让很多本来毫不相干的物品产生共现。比如一个剁手党既买了登山杖又买了口红难道能说明登山杖和口红相关吗显然不能。Swing的解决方案Swing的核心洞察是要判断两个物品是否真的相关就看同时买了这两样东西的用户彼此之间还有多少共同点。如果他们除了这两样东西之外几乎没有其他交集那这两样东西的关联就非常可信。打个比方如果两个八竿子打不着的人唯独都买了登山杖和登山靴这说明这两样东西确实是配套的——它们把不同的人吸引到了一起。反过来如果是两个什么都买的剁手党同时买了这两样那参考价值就很低因为他们本来就买了一大堆相同的东西多买这两样并不能说明什么。Swing算法原理二部图中的Swing结构用户-物品交互可以表示为一个二部图。所谓Swing结构指的是两个用户和两个物品形成的秋千形状用户 u ────┐ ┌──── 用户 v │ │ 物品 i ── 物品 j当用户uuu和用户vvv都同时交互过物品iii和物品jjj时就形成一个 Swing 结构就像一个秋千两个用户是秋千的两端两个物品是横梁。相似度计算公式sim(i,j)∑u∈Ui∩Uj∑v∈Ui∩Uj, v≠u1α∣Iu∩Iv∣ sim(i, j) \sum_{u \in U_i \cap U_j} \sum_{v \in U_i \cap U_j,\, v \neq u} \frac{1}{\alpha |I_u \cap I_v|}sim(i,j)u∈Ui​∩Uj​∑​v∈Ui​∩Uj​,vu∑​α∣Iu​∩Iv​∣1​其中UiU_iUi​交互过物品iii的用户集合UjU_jUj​交互过物品jjj的用户集合IuI_uIu​用户uuu交互过的物品集合IvI_vIv​用户vvv交互过的物品集合α\alphaα平滑参数通常取 1 到 10这个公式在做什么它遍历同时买了物品iii和jjj的所有用户对(u,v)(u, v)(u,v)对每一对用户计算一个权重1α∣Iu∩Iv∣ \frac{1}{\alpha |I_u \cap I_v|}α∣Iu​∩Iv​∣1​关键在分母里的∣Iu∩Iv∣|I_u \cap I_v|∣Iu​∩Iv​∣也就是这对用户之间的共同物品数量共同物品越少→ 分母越小 → 权重越大这对用户是被iii、jjj特意撮合到一起的信号很强共同物品越多→ 分母越大 → 权重越小这对用户本来就很像共同买iii、jjj说明不了什么一个具体例子场景户外用品店的商品推荐假设同时买了登山杖和登山靴的用户有四位他们各自的购物清单如下取平滑参数α1\alpha 1α1用户购物清单小A登山爱好者登山杖、登山靴、冲锋衣小B登山爱好者登山杖、登山靴、帐篷小C剁手党登山杖、登山靴、iPhone、口红、零食、洗发水、手机壳小D剁手党登山杖、登山靴、iPhone、口红、零食、洗发水、数据线现在我们计算sim(登山杖,登山靴)sim(\text{登山杖}, \text{登山靴})sim(登山杖,登山靴)需要遍历这四位用户两两组合的 6 个用户对先看普通用户对比如 (小A, 小B)。他们的共同物品只有{\{{登山杖, 登山靴}\}}共 2 件1120.33 \frac{1}{1 2} 0.33121​0.33同样地(小A, 小C)、(小A, 小D)、(小B, 小C)、(小B, 小D) 这几对用户的共同物品也都只有登山杖和登山靴这 2 件所以权重都是0.330.330.33。再看两个剁手党的组合(小C, 小D)。他们的共同物品有{\{{登山杖, 登山靴, iPhone, 口红, 零食, 洗发水}\}}共 6 件1160.14 \frac{1}{1 6} 0.14161​0.14注意这里的关键差异剁手党这一对的权重只有0.140.140.14明显低于其他用户对的0.330.330.33。原因就是他们俩买了一大堆相同的东西本来就很像所以他们共同买了登山杖和登山靴这件事的含金量被打了折扣。把 6 个用户对加起来sim(登山杖,登山靴)0.33×5⏟5个普通用户对0.14⏟剁手党对1.79 sim(\text{登山杖}, \text{登山靴}) \underbrace{0.33 \times 5}_{\text{5个普通用户对}} \underbrace{0.14}_{\text{剁手党对}} 1.79sim(登山杖,登山靴)5个普通用户对0.33×5​​剁手党对0.14​​1.79对比识别假关联现在换一对商品登山杖和iPhone。假设只有两位剁手党小C、小D同时买了这两样普通登山爱好者不会买iPhone来配登山杖。同时买了登山杖和iPhone的用户对只有 (小C, 小D) 这一对他们的共同物品是 6 件sim(登山杖,iPhone)1160.14 sim(\text{登山杖}, \text{iPhone}) \frac{1}{1 6} 0.14sim(登山杖,iPhone)161​0.14对比结果一目了然物品对Swing相似度登山杖 ↔ 登山靴1.79登山杖 ↔ iPhone0.14登山杖和登山靴的相似度远高于登山杖和 iPhone因为前者是被很多专一的用户对撮合起来的而后者只靠两个什么都买的剁手党支撑。如果用传统协同过滤仅凭共现次数很可能会误以为买登山杖的人也买 iPhone从而做出莫名其妙的推荐。Swing 通过对用户对的共同物品数量做惩罚成功过滤掉了这种假关联。通俗总结Swing到底在算什么用一句大白话概括 Swing 的思路两样东西是不是真的相关不看有多少人同时买了它们而看同时买了它们的人彼此有多不一样。越是不一样的人却都选了这两样说明这两样越是天生一对。分母里的α∣Iu∩Iv∣\alpha |I_u \cap I_v|α∣Iu​∩Iv​∣就是在给太像的用户对降权越是行为泛滥的剁手党组合贡献越小越是各有各活法却唯独在这两样东西上达成一致的用户贡献越大。Swing的进阶加入用户权重在实际应用中Swing 还会对活跃度过高的用户做额外惩罚公式扩展为sim(i,j)∑u∈Ui∩Uj∑v∈Ui∩Uj, v≠uwu⋅wv⋅1α∣Iu∩Iv∣ sim(i, j) \sum_{u \in U_i \cap U_j} \sum_{v \in U_i \cap U_j,\, v \neq u} w_u \cdot w_v \cdot \frac{1}{\alpha |I_u \cap I_v|}sim(i,j)u∈Ui​∩Uj​∑​v∈Ui​∩Uj​,vu∑​wu​⋅wv​⋅α∣Iu​∩Iv​∣1​其中用户权重通常定义为wu1∣Iu∣ w_u \frac{1}{\sqrt{|I_u|}}wu​∣Iu​∣​1​即一个用户买过的东西越多权重越低。这进一步压低了剁手党对相似度计算的影响。Swing vs 传统协同过滤维度传统Item-CFSwing计算依据简单共现统计用户对的共同物品数加权热门物品容易被过度推荐权重被抑制假关联容易被剁手党误导能有效过滤长尾物品难以被发现更容易被推荐多样性较差较好计算复杂度低较高Swing的应用场景猜你喜欢首页推荐用户没有明确意图Swing 能推荐可能感兴趣但没见过的长尾物品避免总是推荐爆款。长尾商品推广通过小众用户群体发现长尾商品之间的真实关联。内容社区推荐知乎、B站等平台用它发掘小众但高质量的垂直内容缓解信息茧房。Swing在推荐系统中的位置Swing 主要用于召回阶段作为多路召回策略之一推荐系统流程 1. 召回阶段从百万级物品中召回千级候选 ├─ DSSM向量召回深度学习 ├─ ETrec召回传统协同过滤 ├─ Swing召回 ← 发现长尾关联、过滤假关联 └─ 热门召回兜底 2. 排序阶段对千级候选精排 └─ 深度排序模型 3. 重排阶段最终展示调整 └─ 多样性、运营规则Swing的实现要点计算复杂度由于需要遍历用户对Swing 的计算复杂度较高约为O(∣U∣2×∣I∣) O(|U|^2 \times |I|)O(∣U∣2×∣I∣)其中∣U∣|U|∣U∣是用户数∣I∣|I|∣I∣是物品数。优化方法包括只保留 Top-K 相似物品、过滤低频用户和物品、并行计算、采样近似等。参数调优平滑参数α\alphaα控制惩罚强度α\alphaα越大惩罚越弱通常取 1 到 10。行为时间窗口通常取 15 到 30 天。Top-K每个物品保留的相似物品数通常取 100 到 500。工程配置示例{recall_type:swing,day_interval:15,alpha:5,top_n:500}Swing的局限性计算资源消耗大需遍历大量用户对建议用分布式计算如 MaxCompute。冷启动问题新物品、新用户缺乏交互数据需结合热门召回、内容召回等策略。实时性较差通常离线批量计算需定期更新。总结Swing模型通过一个巧妙的分母α∣Iu∩Iv∣\alpha |I_u \cap I_v|α∣Iu​∩Iv​∣让共同点更少的用户对在物品相似度计算中占更大权重从而缓解热门物品过度推荐过滤剁手党造成的假关联发现长尾物品的真实关联提升推荐多样性它的核心思想值得反复回味判断两样东西是否相关关键不在于多少人同时选了它们而在于这些人彼此有多不同。越是不同的人不约而同地选择了同样的两样东西这两样东西的关联就越真实、越强。后记2026年7月18日于上海在claude opus 4.8辅助下完成。