推荐系统 · 冷启动 fallback 权重设计
日期: 2026-07-09 | 作者: sunxin(+ Cursor AI 结对讲解) 关联路线图:
推荐系统建设路线图.md §五 Phase 3+§六 Phase 4预计触发: ADR-015(画像冷启动 fallback 权重 0.5)
TL;DR
- 冷启动是推荐系统的经典难题:新用户没有行为数据 → 无法计算画像 → 无法个性化推荐 → 用户看到的都是通用内容 → 更没兴趣互动 → 更冷(自我强化的死循环)。
- 业界通用解法有 3 类:注册引导(让用户主动选)、内容代理(用注册信息猜兴趣)、群体推荐(推大众爆款)。
- 本项目 Phase 3 落地方案:新用户前 7 天推荐结果 = 群体热榜 × 0.5 + 弱信号画像 × 0.5,7 天后过渡到 纯个人画像。
- 权重 0.5 不是拍脑袋定的:是"信号不确定性 = 50%"的直接映射 —— 有多少信心就用多大权重。这是贝叶斯思维在推荐系统的应用。
- 判断"何时脱冷启":用"行为事件数 + 类目覆盖数 + 停留时长"三维度组合,不是简单看注册天数。
目录
- 1. 场景:冷启动是推荐系统的第一难题
- 2. 三大类通用解法
- 3. 本项目 Phase 3 的具体方案
- 4. 为什么权重是 0.5 而不是 0.3 / 0.7
- 5. 判断"脱冷启"的多维度信号
- 6. 教学收获
- 7. 附录
1. 场景:冷启动是推荐系统的第一难题
1.1 一个具体的"冷启动死循环"
新用户 A 注册后打开首页:
时间轴:
T0 A 注册(还未浏览任何内容)
↓ 推荐系统没有 A 的画像 → 只能推最通用的爆款
T1 A 看到一堆"跟他不太相关"的爆款帖,随便刷了 10 秒退出
↓ 累积浏览记录:10 条爆款 · 0 点赞 · 0 评论
T2 A 一周后回来打开首页
↓ 推荐系统的画像仍然只有"看过 10 条爆款",无兴趣信号
T3 仍然推爆款 → A 觉得"这平台没啥东西" → 卸载这是新用户流失的头号原因。行业数据:新用户前 7 天流失率能高达 60-80%,其中"没找到感兴趣内容"占了 40% 以上。
1.2 冷启动的三种形态
| 形态 | 冷的是谁 | 典型场景 |
|---|---|---|
| 用户冷启动 | 新用户 | 注册后没行为数据(本笔记主场景) |
| 物品冷启动 | 新内容 | 刚发的帖子没曝光、没互动,无法进入排序 |
| 系统冷启动 | 整个系统 | 项目冷启阶段,没有任何用户行为可参考 |
本项目 Phase 3 主要解决用户冷启动;物品冷启动在 P4 通过"新帖初始分数注入"解决(每条新帖给一个 baseline 分数确保能被曝光一定次数)。
1.3 为什么这是"第一难题"
推荐系统的所有算法(协同过滤、矩阵分解、深度学习)都依赖用户行为数据。没有数据的时候,任何算法都退化到"猜"。所以冷启动不是"算法优化问题",而是"如何在没有数据时做出不太差的决策"—— 更接近产品/交互设计。
2. 三大类通用解法
2.1 解法 A:注册引导(主动询问兴趣)
用户注册后强制走"兴趣选择"页面:
"请选择你感兴趣的话题(至少 3 个)"
☑ 美食 ☐ 摄影 ☑ 旅行
☐ 健身 ☑ 育儿 ☐ 数码
☐ 时尚 ☐ 汽车 ☐ 音乐优点:
- 立刻获得强信号(用户明确说了要看什么)
- 无历史数据依赖
缺点:
- 加入注册摩擦(选择步骤增加流失)
- 用户可能填得敷衍(随便选几个)
- 用户"以为自己喜欢"和"实际会互动"不一致
业界案例:知乎、豆瓣、Instagram(follow 建议)都是这种
是否本项目采用:不采用。理由:
- 项目当前定位"轻社交生活分享",注册流程越轻越好
- Phase 3 就有更好的"隐式信号"(App 引导页停留、注册后前 3 屏内容曝光反馈)
- 未来若需要,可以放到"完善资料"步骤(非强制),效果类似
2.2 解法 B:内容代理(Content-based Proxy)
用注册时能拿到的元数据代替行为数据,猜用户可能感兴趣的类目:
| 可用元数据 | 可推理的兴趣 |
|---|---|
| 性别 = 女 + 年龄 = 25-35 | 美妆 / 母婴 / 时尚 概率↑ |
| 地区 = 上海 | 本地美食 / 展览 / 出行 概率↑ |
| 注册时间 = 春节前后 | 春节话题 / 家乡 / 回家路上 概率↑ |
| 设备 = iPhone 15 Pro | 消费能力↑ / 数码兴趣可能↑ |
优点:
- 用户无感(后台判断,无 UI 干扰)
- 立刻可用
缺点:
- 容易踩性别/年龄偏见(伦理风险)
- 精度差(只是概率,不是事实)
- 需要大量历史数据训练"元数据 → 兴趣"映射(本身也依赖冷启动前的积累)
业界案例:抖音的"注册地 + 手机型号 + 首次打开时段"是最典型的隐式画像来源
是否本项目采用:部分采用。Phase 3 会用注册地 + 首屏停留时长做浅层画像,但不做性别/年龄推理(避免伦理踩坑、当前样本量也不够训练模型)。
2.3 解法 C:群体推荐(Fallback to Popular)
没有个人画像时,就推所有人都爱看的:
if (isColdStartUser(userId)) {
return hotPostsGlobal.top20(); // 全站热榜
} else {
return personalizedFeed(userId); // 个性化
}优点:
- 最简单可靠
- 内容质量有保底(热榜本身就是"大众验证过的")
缺点:
- 无个性化 → 与冷启动的死循环几乎一样
- 头部内容霸榜,尾部内容永远没机会
业界改进:加"多样性打散",让热榜同时覆盖不同类目(不只推"最热的 20 条",而是每个大类目各推 2-3 条),提升覆盖面。
是否本项目采用:采用改进版。Phase 3 冷启用户看到的是"分类目 top-3 打散" 而不是"全站前 20",避免同质化。
2.4 业界最佳实践:三者结合 + 时间过渡
真实推荐系统几乎都是 A + B + C 混合,且随用户行为积累动态调整权重:
新用户 (Day 0):
推荐 = 群体热榜 × 70% + 元数据画像 × 20% + 用户主动选择 × 10%
Day 3(有少量行为):
推荐 = 群体热榜 × 40% + 元数据画像 × 20% + 弱行为画像 × 40%
Day 7(行为充分):
推荐 = 群体热榜 × 10% + 强行为画像 × 90%
Day 30+(成熟用户):
推荐 = 群体热榜 × 5% + 个性化画像 × 95%关键洞察:这不是"从冷到热"的开关跳变,而是"渐变的滑动条"。滑动的速度由"用户行为数据的可信度"决定。
3. 本项目 Phase 3 的具体方案
3.1 简化版:只做 A + C(隐式)
Phase 3 定位是"学习 + MVP",不追求业界最佳实践的完整度,采用简化两路混合:
if (isColdStart(user)) {
// Path 1: 全站热榜(打散多类目)× 权重 0.5
// Path 2: 用户弱信号画像 × 权重 0.5
return merge(hotPostsDiversified.top(20), weakProfileFeed.top(20));
} else {
return personalizedFeed(user);
}Path 1 · 热榜打散:
- 从
hot_posts:globalZSet 拉 top 100 - 按
postType(话题/文/图/视频) 强制打散:每类目取前 5 名,凑成 20 条 - 保证冷启用户看到的"内容多样性"最大
Path 2 · 弱信号画像:
- 数据来源:注册后前 24h 的曝光行为(浏览过什么类目、停留时长)
- 计算方式:与正式画像相同公式,但样本量少 → 权重打折
- 输出:与热榜融合后,输出 20 条推荐
3.2 冷启判定规则
isColdStart(user) = TRUE 当且仅当以下任一满足:
1. 注册后 < 7 天
2. 累计"有效行为"数 < 30("有效行为"= 点赞/评论/收藏/停留>30s 的浏览)
3. 覆盖类目数 < 3(避免"只看单一类目"的用户被误判为已成熟)为什么三个条件是 OR 关系:任一不满足都说明"画像不可信",走冷启路径更保险。
3.3 混合公式(核心)
final_score(post, coldStartUser) =
0.5 × normalize(hot_score(post))
+ 0.5 × normalize(weak_profile_score(post, user))归一化必需:热榜分数和画像分数量级差异巨大(前者可能几百几千、后者可能 0.1-1.0),必须先归一化到 [0, 1]:
normalize(x) = (x - min) / (max - min)否则 0.5 × 0.5 = 0.25 权重完全不起作用(大数字压死小数字)。
4. 为什么权重是 0.5 而不是 0.3 / 0.7
4.1 直觉起点:贝叶斯"信息量对应权重"
核心思想:给每个信号的权重 = "这个信号有多可信"。
冷启动阶段的信息可信度评估:
| 信号 | 可信度评估 | 理由 |
|---|---|---|
| 全站热榜 | 高(大众验证) | 大数据统计,噪音小 |
| 弱行为画像 | 低(样本少) | 30 条以下行为,噪音大 |
极端 A(权重 = 0.9 热榜 + 0.1 画像):
- 太保守,冷启用户看的东西跟"没有画像"几乎一样
- 用户前 7 天几乎不会看到"个性化的东西"→ 无正向反馈闭环
- 结果:脱冷启慢
极端 B(权重 = 0.1 热榜 + 0.9 画像):
- 太激进,30 条样本的画像被大幅放大
- 一次误点(不小心划过一个错误类目)就可能把画像带偏
- 结果:推荐质量崩
中间选 0.5:
- 承认"两者各半可信"
- 冷启用户既看得到"大家都说好"的内容(安全网),也开始看到"你自己看过的类目"的相似内容(探索)
- 对推荐结果的鲁棒性最强
4.2 0.5 的数学解释:最大熵原则
信息论里的"最大熵原则":在没有更多先验知识时,最不偏袒的分布是均匀分布。
- 两个信号 → 均匀 = 0.5 + 0.5
- 三个信号 → 均匀 = 1/3 + 1/3 + 1/3
- N 个信号 → 均匀 = 1/N
为什么这样最优:不做无根据的假设。你不知道"热榜和画像哪个更准",就承认二者对等,让实际数据(后续 A/B)来告诉你偏向。
4.3 什么时候该偏离 0.5
偏向热榜(如 0.7:0.3):
- 数据显示新用户前 7 天画像准确率 < 40%(比如通过后置 A/B 验证)
- 或产品定位是"帮用户发现新内容"(新内容 > 精准)
偏向画像(如 0.3:0.7):
- 前 24h 用户就产生了 100+ 条有效行为(大 V/资深内容消费者)
- 或产品定位是"帮用户找到熟悉的东西"(精准 > 探索)
本项目定位:轻社交生活分享,探索和精准都重要 → 对等 0.5。
4.4 A/B 验证建议
Phase 3 上线后跑 3 组 A/B(每组各占 10% 冷启用户流量):
| 组 | 权重 | 观测指标 |
|---|---|---|
| A(对照) | 0.5 + 0.5 | 7 日 CTR / 7 日留存 / 类目覆盖数 |
| B | 0.7 + 0.3 | 同上 |
| C | 0.3 + 0.7 | 同上 |
跑 2 周后按 3 个指标综合排名,选最佳。不要只看 CTR(会偏爱热榜);要综合"留存"(长期健康度)和"类目覆盖"(用户成长速度)。
5. 判断"脱冷启"的多维度信号
5.1 三维度组合
不能只看单一指标,会误判。真实业界最少用三个维度组合:
| 维度 | 指标 | 阈值 | 意义 |
|---|---|---|---|
| 时间 | 注册后天数 | ≥ 7 | 给"隐式信号积累" 留时间 |
| 数量 | 有效行为数 | ≥ 30 | 保证样本统计意义 |
| 覆盖 | 涉及类目数 | ≥ 3 | 避免"只看单一类目"的偏见画像 |
必须全部满足才判定为"脱冷启"(AND 关系)。任一不满足则保留冷启路径。
5.2 边界情况处理
A. 高频用户(Day 3 就产生 100+ 行为):
- 时间不满足(3 < 7),但数量、覆盖已够
- 处理:渐进过渡 —— 权重从 0.5:0.5 逐步调到 0.3:0.7 或 0.2:0.8
- 公式:
profile_weight = min(1.0, 0.5 + (days - 3) × 0.07)
B. 沉默用户(Day 14 才 5 条行为):
- 时间满足(14 ≥ 7),但数量、覆盖不够
- 处理:继续保持冷启路径,但每周把这类用户扔到"再引导"流程(邮件/推送提醒)
C. 类目"极窄"用户(只看美食,20 条全在美食):
- 数量满足,但覆盖不够(1 < 3)
- 处理:保持冷启路径的多样性打散(保证他也能被曝光其他类目,避免"信息茧房"过早锁死)
5.3 每周批量重算 vs 实时判定
推荐做法:批量 + 实时结合:
- 批量(每天凌晨 T+1 任务):把所有用户的三维度指标重算并落"用户档案表"
- 实时(每次推荐请求):从档案表读判定结果,无需实时计算
为什么不完全实时:三维度算量大(要 count 30 天行为、算类目覆盖),实时会拖慢推荐 API 响应。T+1 精度足够(用户几小时内不会突然"从冷变热")。
6. 教学收获
6.1 "没有数据"时怎么做决策 —— 推荐系统之外的通用问题
冷启动的本质是"在数据稀缺时做决策",这个问题在很多场景都出现:
| 场景 | 类比"冷启动" |
|---|---|
| 新员工绩效评估 | 没有工作数据 → 用"入职培训表现" + "同岗位平均" 混合 |
| 新药定价 | 没有市场反馈 → 用"同类药定价" + "研发成本加成" 混合 |
| 首次投资一个新股 | 没有历史仓位 → 用"行业平均仓位" + "风险偏好" 混合 |
| 新页面 SEO | 没有点击数据 → 用"关键词竞争度" + "同类页面表现" 混合 |
通用模板:(可信参考) × w1 + (弱信号猜测) × w2,w1 + w2 = 1,w1/w2 = 你对二者相对可信度的估计。
6.2 "权重不是拍脑袋"的思维训练
新手看到"0.5 + 0.5"经常问:为什么不是 0.4 + 0.6?
正确的思考流程:
- 列出所有信号来源(热榜、画像、注册数据、群体分层...)
- 评估每个信号的可信度(数据量、噪音水平、时效性)
- 可信度对应权重(贝叶斯思维)
- 无先验时用均匀分布(最大熵原则)
- 上线后用 A/B 验证并调整(数据说话)
关键:如果不能用一句话解释"这个权重为什么是这个数",说明你还没真正理解 —— 需要回到第 2 步。
6.3 冷启动方案的"演进路径"
跟 写扩散vs读扩散 的四阶段一样,冷启动方案也分阶段演进:
| 阶段 | 触发条件 | 冷启方案 |
|---|---|---|
| Phase 3(本项目当下) | 无历史数据 / 无 ML 团队 | 简单 fallback + 等距权重(0.5:0.5) |
| Phase 5+(DAU 10w+) | 有一定数据积累 | 加入元数据画像(注册地/时段/设备) |
| Phase 6(ML 阶段) | 有 ML 训练能力 | Deep Match 模型直接输入元数据,无需显式 fallback |
| 成熟阶段 | 有专业推荐团队 | 强化学习 + Bandit 算法动态探索权重 |
教训:当前阶段不追求完美方案,追求"能上线 + 能演进"的方案。0.5:0.5 就是这种方案 —— 简单、透明、未来能自然升级。
7. 附录
7.1 术语表
| 术语 | 说明 |
|---|---|
| 冷启动 | 无历史数据可用时的决策问题 |
| Fallback | 主路径不可用时的兜底方案 |
| 群体推荐 | 无个性化数据时推大众热门 |
| 弱信号 | 数据量少但仍有一定参考价值的信号 |
| 归一化 | 把不同量级的分数缩放到统一区间(如 0-1) |
| 最大熵原则 | 无先验时选最不偏袒的分布(均匀分布) |
7.2 延伸阅读
- 项亮《推荐系统实践》第 5 章 "利用上下文信息" —— 冷启动章节最经典中文教材
- 《Recommender Systems Handbook》Chapter 10 "Cold-Start Recommendation" —— 学术界最全综述
- Netflix Tech Blog《Personalization at Netflix》—— 冷启动的工业实践
- Spotify Engineering《For Your Ears Only: Personalizing Spotify Home》—— 描述"探索 vs 精准" 的权衡框架
7.3 关联决策
- ADR-015(起草中):本项目 P3 采用 "群体热榜 × 0.5 + 弱画像 × 0.5" 冷启方案 + 三维度脱冷启判定
- 未来 ADR-025(预留):Phase 5+ 引入元数据画像时沉淀