From f19c696a7785762a3d23524b1bd0ef548fb5c368 Mon Sep 17 00:00:00 2001 From: H0SH123 <2704182198@qq.com> Date: Sat, 27 Sep 2025 10:48:39 +0800 Subject: [PATCH] Create wangshusen_recommend_note_coldstart.mdx --- .../wangshusen_recommend_note_coldstart.mdx | 501 ++++++++++++++++++ 1 file changed, 501 insertions(+) create mode 100644 app/docs/ai/recommender-systems/wangshusen_recommend_note_coldstart.mdx diff --git a/app/docs/ai/recommender-systems/wangshusen_recommend_note_coldstart.mdx b/app/docs/ai/recommender-systems/wangshusen_recommend_note_coldstart.mdx new file mode 100644 index 0000000..44c3f58 --- /dev/null +++ b/app/docs/ai/recommender-systems/wangshusen_recommend_note_coldstart.mdx @@ -0,0 +1,501 @@ +--- +title: '王树森推荐系统学习笔记_冷启动' +description: "" +date: "2025-09-27" +tags: + - tag-one +--- + +# 王树森推荐系统学习笔记_冷启动 + +## 物品冷启动 + +### 物品冷启动:评价指标 + +**物品冷启动** + +- 小红书上用户新发布的笔记。 +- B 站上用户新上传的视频。 +- 今日头条上作者新发布的文章。 + +**新笔记冷启动** + +- 新笔记缺少与用户的交互,导致推荐的难度大、效果差。 +- 扶持新发布、低曝光的笔记,可以增强作者发布意愿。 + +**优化冷启的目标** + +1. 精准推荐:克服冷启的困难,把新笔记推荐给合适的用户,不引起用户反感。 + +2. 激励发布:流量向低曝光新笔记倾斜,激励作者发布。 + +3. 挖掘高潜:通过初期小流量的试探,找到高质量的笔记,给予流量倾斜。 + +**评价指标** + +- 作者侧指标: + - 发布渗透率、人均发布量。 + +- 用户侧指标: + - 新笔记指标:新笔记的点击率、交互率。 + - 大盘指标:消费时长、日活、月活。 + +- 内容侧指标: + - 高热笔记占比。 + +#### 作者侧指标 + +**发布渗透率(penetration rate)** + +- 发布渗透率 = 当日发布人数 / 日活人数 +- 发布一篇或以上,就算一个发布人数。 +- **例**: + - 当日发布人数 = 100 万 + - 日活人数 = 2000 万 + - 发布渗透率 = 100 / 2000 = 5% + +**人均发布量** + +- 人均发布量 = 当日发布笔记数 / 日活人数 +- **例**: + - 每日发布笔记数 = 200 万 + - 日活人数 = 2000 万 + - 人均发布量 = 200 / 2000 = 0.1 + +发布渗透率、人均发布量反映出作者的发布积极性。 + +冷启的重要优化目标是促进发布,增大内容池。 + +新笔记获得的曝光越多,首次曝光和交互出现得越早,作者发布积极性越高。 + +#### 用户侧指标 + +**新笔记的消费指标** + +- 新笔记的点击率、交互率。 + - 问题:曝光的基尼系数很大。 + - 少数头部新笔记占据了大部分的曝光。 + +- 分别考察高曝光、低曝光新笔记。 + - 高曝光:比如 >1000 次曝光。 + - 低曝光:比如 <1000 次曝光。 + +#### **内容侧指标** + +**高热笔记占比** + +- 高热笔记:前 30 天获得 1000+ 次点击。 +- 高热笔记占比越高,说明冷启阶段挖掘优质笔记的能力越强。 + +#### **总结** + +- **作者侧指标**:发布渗透率、人均发布量。 +- **用户侧指标**:新笔记消费指标、大盘消费指标。 +- **内容侧指标**:高热笔记占比。 + +**冷启动的优化点** + +- **优化全链路**(*包括召回和排序*)。 +- **流量调控**(*流量怎么在新物品、老物品中分配*)。 + + + +### 物品冷启动:简单的召回通道 + +#### 召回的依据 + +**冷启召回的困难** + +- 缺少用户交互,还没学好笔记 ID embedding,导致双塔模型效果不好。 +- 缺少用户交互,导致 ItemCF 不适用。 + +#### 双塔模型 + +**ID Embedding** + +**改进方案 1:新笔记使用 default embedding** + +- 物品塔做 ID embedding 时,让所有新笔记共享一个 ID,而不是用自己真正的 ID。 +- Default embedding:共享的 ID 对应的 embedding 向量。 +- s到下次模型训练的时候,新笔记才有自己的 ID embedding 向量。 + +**改进方案 2:利用相似笔记 embedding 向量** + +- 查找 top k 内容最相似的高曝光笔记。 +- 把 k 个高曝光笔记的 embedding 向量取平均,作为新笔记的 embedding。 + +**多个向量召回池** + +- 多个召回池,让新笔记有更多曝光机会。 + - 1 小时新笔记, + - 6 小时新笔记, + - 24 小时新笔记, + - 30 天笔记。 + +- 共享同一个双塔模型,那么多个召回池不增加训练的代价。 + +#### 类目召回 + +**基于类目的召回** + +- 系统维护类目索引: + $$\text{类目} \rightarrow \text{笔记列表(按时间倒排)}$$ + +- 用类目索引做召回: + $$\text{用户画像} \rightarrow \text{类目} \rightarrow \text{笔记列表}$$ + +- 取回笔记列表上前 k 篇笔记(即最新的 k 篇)。 + +**基于关键词的召回** + +- 系统维护关键词索引: + $$\text{关键词} \rightarrow \text{笔记列表(按时间倒排)}$$ + +- 根据用户画像上的 \text{\color{red}{关键词}} 做召回。 + +**缺点** + +- 缺点 1:只对刚刚发布的新笔记有效。 + - 取回某类目 / 关键词下最新的 k 篇笔记。 + - 发布几小时之后,就再没有机会被召回。 + +- 缺点 2:弱个性化,不够精准。 + +### 物品冷启动:聚类召回 + +#### 聚类召回 + +**基本思想** + +- 如果用户喜欢一篇笔记,那么他会喜欢内容相似的笔记。 + +- 事先训练一个神经网络,基于笔记的类别和图文内容,把笔记映射到向量。 + +- 对笔记向量做聚类,划分为 1000 个 $cluster$,记录每个 $cluster$ 的中心方向。($k$-means 聚类,用余弦相似度。) + +**聚类索引** + +- 一篇新笔记发布之后,用神经网络把它映射到一个特征向量。 + +- 从 1000 个向量(对应 1000 个 $cluster$)中找到最相似的向量,作为新笔记的 $cluster$。 + +- 索引: + + $$ + cluster \rightarrow \text{笔记ID列表(按时间倒排)} + $$ + +**线上召回** + +- 给定用户 ID,找到他的 last-$n$ 交互的笔记列表,把这些笔记作为种子笔记。 + +- 把每篇种子笔记映射到向量,寻找最相似的 $cluster$。 (知道了用户对哪些 $cluster$ 感兴趣。) + +- 从每个 $cluster$ 的笔记列表中,取回最新的 $m$ 篇笔记。 + +- 最多取回 $mn$ 篇新笔记。 + +#### 内容相似度模型 + + + +![](https://raw.githubusercontent.com/H0SH123/Books-and-Notes/main/RecommenderSystem/images/7-3-1.png) + +![](https://raw.githubusercontent.com/H0SH123/Books-and-Notes/main/RecommenderSystem/images/7-3-2.png) + +#### 训练内容相似度模型 + +![](https://raw.githubusercontent.com/H0SH123/Books-and-Notes/main/RecommenderSystem/images/7-3-3.png) + +**模型的训练** + +基本想法:鼓励 $\cos(\mathbf{a}, \mathbf{b}^+)$ 大于 $\cos(\mathbf{a}, \mathbf{b}^-)$ + +**Triplet hinge loss:** +$$ +L(\mathbf{a}, \mathbf{b}^+, \mathbf{b}^-) = \max\{0, \cos(\mathbf{a}, \mathbf{b}^-) + m - \cos(\mathbf{a}, \mathbf{b}^+)\} +$$ + + +**Triplet logistic loss:** +$$ +L(\mathbf{a}, \mathbf{b}^+, \mathbf{b}^-) = \log(1 + \exp(\cos(\mathbf{a}, \mathbf{b}^-) - \cos(\mathbf{a}, \mathbf{b}^+))) +$$ +**<种子笔记,正样本>** + +方法一:人工标注二元组的相似度 + +方法二:算法自动选正样本 + +筛选条件: + +- 只用高曝光笔记作为二元组 (因为有充足的用户交互信息)。 +- 两篇笔记有相同的二级类别,比如都是 “菜谱教程”。 + +- 用 ItemCF 的物品相似度选正样本。 + +**<种子笔记,负样本>** + +- 从全体笔记中随机选出满足条件的: + - 字数较多 *(神经网络提取的文本信息有效)*。 + - 笔记质量高,避免图文无关。 + +#### 总结 + +- **基本思想**:根据用户的点赞、收藏、转发记录,推荐内容相似的笔记。 + +- **线下训练**:多模态神经网络把图文内容映射到向量。 + +- **线上服务**: + + $$ + \text{用户喜欢的笔记} \rightarrow \text{特征向量} \rightarrow \text{最近的 Cluster} \rightarrow \text{新笔记} + $$ + +### 物品冷启动:Look-Alike 人群扩散 + +#### Look-Alike 起源于互联网广告 + +![](https://raw.githubusercontent.com/H0SH123/Books-and-Notes/main/RecommenderSystem/images/7-4-1.png) + +- 如何计算两个用户的相似度? + +- UserCF:两个用户有共同的兴趣点。 + +- Embedding:两个用户向量的 $\cos$ 较大。 + +#### Look-Alike 用于新笔记召回 + +- 点击、点赞、收藏、转发 —— 用户对笔记可能感兴趣。 + +- 把有交互的用户作为新笔记的种子用户。 + +- 用 look-alike 在相似用户中扩散。 + +![](https://raw.githubusercontent.com/H0SH123/Books-and-Notes/main/RecommenderSystem/images/7-4-2.png) + +- 近线更新特征向量。 + +- 特征向量是有交互的用户的向量的平均。 + +- 每当有用户交互该物品,更新笔记的特征向量。 + +![](https://raw.githubusercontent.com/H0SH123/Books-and-Notes/main/RecommenderSystem/images/7-4-3.png) + +利用双塔模型计算出用户的特征向量,将这个特征向量在向量数据库中做最近邻查找。这个过程就叫做 Look-Alike 召回。 + +![](https://raw.githubusercontent.com/H0SH123/Books-and-Notes/main/RecommenderSystem/images/7-4-4.png) + +如果种子用户喜欢某篇笔记,那么相似用户也可能喜欢这篇笔记,这叫做 Look-Alike 扩散召回通道。 + +### 物品冷启动:流量调控 + +**扶持新笔记的目的** + +- **目的1**:促进发布,增大内容池。 + - 新笔记获得的曝光越多,作者创作积极性越高。 + - 反映在发布渗透率、人均发布量。 + +- **目的2**:挖掘优质笔记。 + - 做探索,让每篇新笔记都能获得足够曝光。 + - 挖掘的能力反映在高热笔记占比。 + +**工业界的做法** + +- 假设推荐系统只分发年龄 <30 天的笔记。 + +- 假设采用自然分发,新笔记(年龄 <24 小时)的曝光占比为 1/30。 + +- 扶持新笔记,让新笔记的曝光占比远大于 1/30。 + +**流量调控技术的发展** + +1. 在推荐结果中强插新笔记。 +2. 对新笔记的排序分数做提权(boost)。 +3. 通过提权,对新笔记做保量。 +4. 差异化保量。 + +#### 新笔记提权(boost) + +![](https://raw.githubusercontent.com/H0SH123/Books-and-Notes/main/RecommenderSystem/images/7-5-1.png) + +**新笔记提权** + +- **目标**:让新笔记有更多机会曝光。 + - 如果做自然分发,24 小时新笔记占比为 1/30。 + - 做人为干涉,让新笔记占比大幅提升。 + +- 干涉粗排、重排环节,给新笔记提权。 + +- **优点**:容易实现,投入产出比好。 + +- **缺点**: + - 曝光量对提权系数很敏感。 + - 很难精确控制曝光量,容易过度曝光和不充分曝光。 + +#### 新笔记保量 + +- **保量**:不论笔记质量高低,都保证 24 小时获得 100 次曝光。 + +- 在原有提权系数的基础上,乘以额外的提权的系数,例如: + +![](https://raw.githubusercontent.com/H0SH123/Books-and-Notes/main/RecommenderSystem/images/7-5-2.png) + +**动态提权保量** + +用下面四个值计算提权系数 + +- 目标时间:比如 24 小时。 +- 目标曝光:比如 100 次。 +- 发布时间:比如笔记已经发布 12 小时。 +- 已有曝光:比如笔记已经获得 20 次曝光。 + +计算公式: +$$ +\text{提权系数} = f\left( \frac{\text{发布时间}}{\text{目标时间}}, \frac{\text{已有曝光}}{\text{目标曝光}} \right) = f(0.5, 0.2) +$$ +**保量的难点** + +保量成功率远低于 100% + +- 很多笔记在 24 小时达不到 100 次曝光。 +- 召回、排序存在不足。 +- 提权系数调得不好。 + +线上环境变化会导致保量失败 + +- 线上环境变化:新增召回通道、升级排序模型、改变重排打散规则…… +- 应对措施:线上环境变化后,需要调整提权系数。 + +给新笔记分数 boost 越多,对新笔记越有利? + +- 好处:分数提升越多,曝光次数越多。 +- 坏处:把笔记推荐给不太合适的受众。 + - 提权系数过高,导致预估兴趣分数偏高,会将笔记推荐给不合适的受众 + - 点击率、点赞率等指标会偏低。 + - 长期会受推荐系统打压,难以成长为热门笔记。 + +#### 差异化保量 + +- **保量**:不论新笔记质量高低,都做扶持,在前 24 小时给 100 次曝光。 + +- **差异化保量**:不同笔记有不同保量目标,普通笔记保 100 次曝光,内容优质的笔记保 100~500 次曝光。 + +**差异化保量** + +- **基础保量**:24 小时 100 次曝光。 + +- **内容质量**:用模型评价内容质量高低,给予额外保量目标,上限是加 200 次曝光。 + +- **作者质量**:根据作者历史上的笔记质量,给予额外保量目标,上限是加 200 次曝光。 + +- **一篇笔记最少有 100 次保量,最多有 500 次保量。** + +#### 总结 + +- **流量调控**:流量怎么在新老笔记之间分配。 + +- **扶持新笔记**:单独的召回通道,在排序阶段提权。 + +- **保量**:帮助新笔记在前 24 小时获得 100 次曝光。 + +- **差异化保量**:根据内容质量、作者质量,决定保量目标。 + +### 物品冷启动:AB测试 + +**新笔记冷启的 AB 测试** + +- **作者侧指标**: + - 发布渗透率、人均发布量。 + +- **用户侧指标**: + - 对新笔记的点击率、交互率。 + - 大盘指标:消费时长、日活、月活。 + +#### 用户侧实验 + +![](https://raw.githubusercontent.com/H0SH123/Books-and-Notes/main/RecommenderSystem/images/7-6-1.png) + +**用户侧实验** + +**缺点** + +- 限定:保量 100 次曝光。 +- 假设:新笔记曝光越多,用户使用 APP 时长越低。 +- 新策略:把新笔记排序时的权重增大两倍。 + +- 结果(只看消费指标) + + - AB 测试的 diff 是负数(策略组不如对照组)。 + + - 如果推全,diff 会缩小(比如 -2% ➝ -1%)。 + - 这是因为新笔记采取保量。实验组的新笔记曝光量偏多,对照组偏少。比如有90篇新笔记,每篇保量100次,一共曝光9000次。实验组曝光了6000次,对照组曝光了3000次。试验结束后,原来实验组的 50% 用户曝光了4500次,对照组的 50% 用户也曝光了4500次,因此实验计算的 diff 偏大。 + +![](https://raw.githubusercontent.com/H0SH123/Books-and-Notes/main/RecommenderSystem/images/7-6-2.png) + +#### 作者侧实验 + +**作者侧实验:方案一** + +![](https://raw.githubusercontent.com/H0SH123/Books-and-Notes/main/RecommenderSystem/images/7-6-3.png) + +**缺点:新笔记之间会抢流量** + +- 设定: + + - 新老笔记走各自队列,没有竞争。 + + - 重排:分给新笔记 1/3 流量,分给老笔记 2/3 流量。 + + +- 新策略:把新笔记的权重增大两倍。 + +- 结果(只看发布指标): + + - AB 测试的 diff 是正数(策略组优于对照组)。 + + - 如果推全,diff 会消失(比如 2% ➝ 0)。 + +**缺点:新笔记和老笔记抢流量** + +- 设定:新老笔记自由竞争。 + +- 新策略:把新笔记排序时的权重增大两倍。 + +- AB 测试时,50% 新笔记(带策略)跟 100% 老笔记抢流量。 + +- 推全后,100% 新笔记(带策略)跟 100% 老笔记抢流量。 + +- 作者侧 AB 测试结果与推全结果有些差异。 + +**作者侧实验:方案二** + +![](https://raw.githubusercontent.com/H0SH123/Books-and-Notes/main/RecommenderSystem/images/7-6-4.png) + +**方案二比方案一的优缺点** + +- 优点:新笔记的两个桶不抢流量,作者侧实验结果更可信。 + +- 相同:新笔记和老笔记抢流量,作者侧 AB 测试结果与推全结果有些差异。 + +- 缺点:新笔记池减小一半,对用户体验造成负面影响。 + +**作者侧实验:方案三** + +![](https://raw.githubusercontent.com/H0SH123/Books-and-Notes/main/RecommenderSystem/images/7-6-5.png) + +对公司业务造成影响。 + +#### 总结 + +- 冷启的 AB 测试需要观测 作者发布指标 和 用户消费指标。 + +- 各种 AB 测试的方案都有缺陷。(小红书有更好的方案,但也不完美。) + +- 设计方案的时候,问自己几个问题: + - 实验组、对照组新笔记会不会抢流量? + - 新笔记、老笔记怎么抢流量? + - 同时隔离笔记、用户,会不会让内容池变小? + - 如果对新笔记做保量,会发生什么? + +