想象一下:你搬到了一座全新的城市,手机里打开美食推荐 App,想找一家靠谱的川菜馆。但这个 App 对你一无所知——不知道你口味偏辣还是偏甜,也不知道你的消费水平。与此同时,城市里刚开张了几家新餐厅,它们一道菜都没卖出去,系统也不知道该怎么把它们推荐给合适的人。这就是推荐系统的“冷启动”困境:没有历史数据,却有推荐需求。面对新来的用户(用户冷启动)和新上架的物品(物品冷启动),聪明的平台不会坐以待毙。它会像一位贴心的本地向导——先问几个问题(收集画像),再参考你的老朋友的口味(迁移学习),又安排你去几家新店试吃(探索),还会偶尔抄起菜单看一眼食材(内容特征)。本篇就用“新城市找美食”这个场景,带你完整看懂冷启动策略从原理到落地的全过程。

岗位关联

冷启动是推荐系统从 0 到 1 的起点。掌握它,你就能独立设计新用户、新内容从无数据到精准推荐的完整方案,这是资深推荐工程师的必修课。

目录
  1. 可视化演示
  2. 冷启动全景
  3. 用户冷启动策略
  4. 探索与利用的平衡
  5. 冷启动策略工具箱
  6. AI 应用场景
  7. Python 演示
  8. 常见误区
  9. 面试题

可视化演示

动态展示用户与物品冷启动场景、内容特征召回、探索利用平衡与冷启动评估实践。

本节配有交互动效(进入视口后自动加载,约 3KB)。

冷启动全景

想象你作为产品经理,接手了一款全新的美食推荐 App。当第一位用户注册时,系统面对他如同面对一张白纸——没有点过菜,没有收藏过店铺,没有任何可以推理的线索。与此同时,平台上有上千家新餐厅刚完成入驻,它们也像刚搬进新城市的厨子,知道自己是家川菜馆,但城市里的人并不知道它的手艺好坏。这就是冷启动的两副面孔:用户冷启动与物品冷启动。

所谓冷启动,本质是数据稀疏下的推荐问题。推荐系统赖以生存的“协同过滤”逻辑——“和你口味相似的人喜欢什么,你就可能喜欢什么”——在新用户新物品面前突然失效,因为这些判断需要历史交互数据。在推荐系统的完整链路中,冷启动策略是入口处的守门员。它的成熟度直接决定了新用户留存率与新内容分发效率——如果新用户头三次打开 App 都看到不感兴趣的推荐,他会直接卸载,平台也就失去了数据回流的机会。

从推荐系统架构视角看,冷启动不是单个算法,而是一整套策略的组合:用户侧需要快速建画像,物品侧需要快速估算质量,平台侧还需要在“让用户满意”和“S收集数据”之间走钢丝。这些策略不是互相排斥的,而是像做菜时的多种调味品,按场景比例调配。理解了全景,你就会明白:冷启动的终极目标不是“立刻做出精准推荐”,而是用尽量少的交互代价,换取尽量快的个性化收敛。

回到新城市的比喻:一位好向导不会在第一天就带你吃遍全城,而是先问你口味偏好、参考你朋友的建议、挑几家口碑好的老店打底、再冒险试一试两家新店,然后不断根据你的反馈修正后续推荐。冷启动策略,就是这一套“向导方法论”的工程化实现。

用户冷启动策略

新用户注册 App 时,你作为向导会做什么?先问一句“您平时口味偏辣还是偏清淡?”——这就是注册画像采集。美食 App 的注册页会让用户勾选菜系偏好、价格带、忌口等标签,每个勾选都是一次显式反馈,成本高但信息密度大。更聪明的做法是第三方授权导入:用户用微信或手机号一键登录时,App 在授权范围内读取公开信息(如城市、年龄、性别),再将所在城市的热门口味分布作为先验知识——比如在成都就默认偏辣,在广州默认偏清淡。这就是人口统计学冷启动:用群体的平均偏好,充当个体的初始偏好。

人口统计学的逻辑可以这样理解:向导虽然不认识你,但看到你从四川来,至少能推断你大概率能吃辣。技术实现上,这通常表现为一个轻量的用户画像向量,例如把用户的年龄、城市、性别映射为维度特征,再与物品的内容特征做匹配。但这里有个重要的细节:群体先验只能作为冷启动的“起跑线”,不能作为“终点线”。系统必须设计小额试探反馈机制——在新用户的前几次推荐中有意混入不同类型的内容,根据点击、停留、收藏等隐式信号快速更新画像。这就像向导故意推荐两三家不同风格的店,观察你哪一口吃得多。

用户冷启动的本质难题,是如何用极少的成本交换尽量准确的信息。注册表单太长会劝退用户,太短又收集不到足够信号。工程上常用的策略是渐进式画像:首轮只问 3-5 个关键问题,之后每次互动都在后台悄悄补全画像维度。就像一场轻松的聊天,而不是一次户籍调查。

\text{Score}_{new} = \alpha \cdot \text{sim}(f_{new}, f_{old}) \cdot \bar{r}_{old} + (1 - \alpha) \cdot \text{base}_{new}

1. 相似度桥接:\(\text{sim}(f_{new}, f_{old})\) 是新物品与某个老物品在内容特征向量上的余弦相似度,取值 0 到 1,越高代表越像。2. 质量迁移:\(\bar{r}_{old}\) 是老物品在平台上的平均评分,用"相似的旧物品的均分"来预估新物品的潜在质量。3. 基础分兜底:\(\text{base}_{new}\) 是新物品的基础分,通常来自运营人工打分或类目均值(如新店默认 3.5 分)。4. 权重混合:\(\alpha\) 是平衡系数,当相似度计算置信度高时(能找到很好的相似老物品),\(\alpha\) 调大;否则调小,让基础分占主导。这个公式对实际工程的指导意义在于:不要直接预测新物品的质量,而是借用相似老物品的质量做加权迁移。就像你从没吃过一家新川菜馆,但如果它隔壁就是连续三年必吃榜的川菜大师傅开的,你的预判就有了锚点。当新物品逐渐积累了真实交互数据,公式中"相似度桥接"的权重会随时间衰减,让真实反馈逐步取代先验推断。
text21 行
\hat{p}_{u,c} = \frac{n_{c} \cdot \bar{p}_{c} + \sum_{i \in I_u} w_i \cdot r_{u,i}}{n_{c} + \sum_{i \in I_u} w_i}$$ #### 逐字解析 1. **用户初始口味估计**:\(\hat{p}_{u,c}\) 表示用户 \(u\) 对品类 \(c\) 的预估偏好强度,是我们要求解的未知数。2. **群体先验均分**:\(n_c\) 是该品类的先验样本数(如"同龄同城用户中尝试过川菜的人数"),\(\bar{p}_c\) 是该群体对该品类的平均评分。3. **个体交互累加**:\(I_u\) 是用户 \(u\) 已经交互过的物品集合,\(r_{u,i}\) 是第 \(i\) 个物品的反馈评分,\(w_i\) 是这条反馈的权重(点击记 1,收藏记 2,下单记 3)。4. **平滑过渡**:分子是"先验知识 + 个体证据"的加权和,分母是总权重。当用户几乎没有行为时,整个分数约等于群体均值 \(\bar{p}_c\);行为越多,个体证据占比越大,画像就越"个性化"。 这个公式好比向导的记分本:刚认识你时,记分本上填的是"和你相似的人的均值";随着你真实反馈增多,你自己的分数逐渐把"别人的均值"挤出去。在深度学习时代,这套思想被吸收进双塔模型——用户塔的初始化向量就是由人口统计学特征(城市、年龄、性别)的 Embedding 拼接而成。但无论模型多复杂,底层的先验融合逻辑与这个公式一脉相承。 ### 物品冷启动策略 新餐厅入驻平台后,一道菜都没卖出去,怎么知道它的质量好坏?向导会怎么做——亲自去看看菜单、看看环境、看看食材。这就是**内容特征提取**的本质:不依赖行为数据,直接从物品自身属性中挖掘可推荐的理由。对于菜品,特征是菜系、辣度、食材、价格带;对于新闻,特征是频道、关键词、情感倾向;对于商品,特征是类目、品牌、材质。 有了特征,下一步是**相似物品映射**:把新物品的特征向量和老物品的特征向量做相似度计算,找到"已知质量的老物品"作为桥梁。比如新川菜馆"辣子鸡非常地道"这个特征与老店"老妈兔头"高度相似,而后者在平台上收获了 4.8 星好评,系统就可以推断新店大概率也受欢迎。这背后是**基于内容的推荐**(Content-based Recommendation)在冷启动阶段的经典应用。值得强调的是,这个策略对用户冷启动同样有效——当我们用人口统计学画像获得新用户的初始兴趣向量后,同样用内容相似度做匹配,这就是"冷热统一建模"的雏形。 **时效性加权**是物品冷启动特有的考量。新闻资讯类场景里,新物品本身就有流量红利,系统会故意给新内容加权——这符合平台生态利益,因为内容生产者需要看到"新内容也有曝光机会"的激励。但在电商或 OTA(在线旅游)场景,用户体验优先,新物品的加权要更保守。 **人工运营兜底**也是实战中不可缺失的一环。当算法置信度不够时,编辑部人工配置"新店尝鲜"专题页,用运营手段弥补算法不足。这在我们比喻里就是向导的秘籍——城市里的资深吃货圈子里口口相传的秘密名单。

探索与利用的平衡

冷启动的深水区在于:推荐系统面临一个永恒的跷跷板。利用是指推荐那些系统已经确信用户会喜欢的内容——对老用户而言,就是继续推他常点的川菜;探索是指推荐那些不确定但可能有惊喜的内容——比如试探性地推一家新开的云南菜。如果只顾利用,用户画像会越来越窄,形成“信息茧房”(Filter Bubble),新内容永远得不到曝光;如果只顾探索,用户会频繁踩雷,留存率直线下降。这就是经典的探索与利用困境(Explore-Exploit Dilemma)。

回到新城市的比喻:向导不可能第一天就带你在全城随机乱逛(纯探索),也不可能永远只去你第一顿觉得好吃的店(纯利用)。最优策略是带着“这个店有点可疑但可能很好吃”的判断去尝试——尝试后立刻更新判断。工程上,UCB 算法(Upper Confidence Bound,置信区间上界)是解决这个问题的经典方案:对每个候选物品,不仅看它的历史平均得分,还要看它的不确定性——尝试次数越少的物品,不确定性越大,其“上置信界”就越高,于是系统愿意给它更多曝光机会。

如果你需要偶尔的随机性来打破僵局,汤普森采样提供了另一种思路:给每个物品假设一个 Beta 分布来建模其“好评率”,每次推荐时从这个分布里抽取一个样本,按样本值排序。这个随机性让它天然具备探索能力,且实现比 UCB 更简单。还有工程上常用的概率稀释策略:以概率 \( \epsilon \) 随机推荐非个性化的热门内容或探索内容,剩余 \( 1 - \epsilon \) 的概率走个性化推荐主链路——这是最简单粗暴但极其有效的“人工噪声注入”。

\text{lift} = \frac{\text{Metric}_{treatment} - \text{Metric}_{control}}{\text{Metric}_{control}}

1. 实验组指标:\(\text{Metric}_{treatment}\) 是新策略(实验组)在该指标上的观测值,比如新用户 7 日留存率 32%。2. 对照组指标:\(\text{Metric}_{control}\) 是旧策略(对照组)的观测值,比如 28%。3. 相对提升:两者之差除以对照组数值,得到相对提升率。0.32 与 0.28 的差距得到 \(\text{lift} = 14.3\%\)。4. 显著性校验:计算出 lift 值后还要做 t 检验或贝叶斯检验,确认 14.3% 的提升是策略带来的而非随机波动——这需要足够的样本量和合理的实验周期。> 上线冷启动策略后,A/B 实验的 lift 值是衡量策略贡献的标尺。记住:没有显著性检验的 lift 只是数字,不是结论。
text45 行
\text{UCB}(i) = \bar{x}_i + \sqrt{\frac{2 \ln t}{n_i}}$$ #### 逐字解析 1. **历史平均得分**:\(\bar{x}_i\) 是物品 \(i\) 目前积累的所有反馈的平均分值,代表"已知的确定性收益"。2. **当前的探索红利**:\(n_i\) 是物品 \(i\) 被推荐的次数,\(\ln t\) 是当前总轮次的对数——被推荐次数越少,这部分的平方根值越大,给物品的加成越高。3. **不确定性溢价**:整体根号项衡量的是"我们对物品 \(i\) 的了解有多不够"。了解越少,该项越大;随着 \(n_i\) 增加,该项收敛到接近 0。4. **综合排序**:UCB 得分 = 已知均值 + 不确定性溢价,系统每次推荐 UCB 值最高的物品——既保证利用老店的好评分,又保证新店有机会获得曝光。 UCB 的直觉画面是:向导心中的每张店铺卡片上,写着一个"均分"和一个"置信区间"。老店如评分 4.7 ± 0.1,新店如评分 3.5 ± 1.5。虽然新店均分低,但它的上限 5.0 比老店的上限 4.8 还高,于是向导决定带你去试一次。如果新店果然好吃,它的均分上升、区间变窄,成为常驻推荐;如果踩雷了,它的均分下跌、区间依然宽,逐渐被系统遗忘。这正是冷启动阶段"用少量代价换长期收益"的精髓。 ### 迁移学习策略 在新城市找美食,最省力的方法是什么?问一句"您以前在哪个城市生活?"如果他回答"长沙",向导心里立刻有了一张口味地图——湘菜的辣度和川菜接近,长沙人大概率能接受成都的辣子鸡。这就是**迁移学习**的精髓:把他域学到的知识,迁移到当前数据稀疏的目标域。 在推荐系统冷启动中,迁移学习有典型的两种形态。第一种是**跨域迁移**:把用户在"音乐 App"上的偏好迁移到"短视频 App"上——两个 App 同属一个公司,用户在音乐上展现的对节奏、风格的偏好,可以用来初始化视频推荐中的兴趣向量。第二种是**相似域预训练**:先用数据丰富的领域(如头部用户的行为日志)训练一个大规模模型,再用数据稀疏的冷启动场景做**微调(Fine-tuning)**。这就像米其林大厨先在有充足食材的中央厨房打磨厨艺,再空降到路边摊——厨房变了,但刀工和火候的底层能力迁移过来了。 **相似域预训练**的工程实现已经相当成熟:用全网用户行为预训练一个向量表征模型,冷启动用户只需少量特征即可获得初始 Embedding。比如你打开一个新视频 App,它不认识你,但它读取了你手机上的地理位置和大致年龄段,找到一个和你有相似属性的已知用户的平均偏好作为初始向量——这就是"相似用户的平均 Embedding 初始化"。 但迁移学习不是万能药,它有重要的**隐私安全边界**。跨域迁移必须严格遵守最小化数据采集原则——App 可以知道你所在的城市(因为可以获取地理位置),但不能越过授权读取你的通讯录或聊天记录用于推荐画像。GDPR 与《个人信息保护法》对跨域数据迁移的合规要求非常严格,业界经常用"联邦学习"在不出域的前提下共享模型参数,而不是共享原始数据。 从推荐架构视角看,迁移学习是冷启动策略中最"重"的方案。它需要公司有多业务线的数据和实力,需要数据中台做特征对齐,也需要算法团队有预训练-微调的完整 MLOps 能力。因此,中小团队通常先采用"画像 + 内容匹配"的轻量方案,在数据积累到一定规模后再引入迁移学习。这也是一种系统工程层面的务实取舍。 ### 内容特征召回 当用户画像还模糊、但系统必须立刻给出第一屏推荐时,最可靠的手段是回到**内容本身的特征**。这就像向导在你还说不出偏好时,先推荐几道"大众接受度高"的菜——番茄炒蛋、酸辣土豆丝,不会惊艳但几乎没人会讨厌。这就是**内容特征召回**:在召回阶段,不完全依赖个性化信号,而是基于内容属性做广泛的候选池筛选。 **特征工程要点**决定了内容召回的质量。对于物品,基础特征包括品类(菜系)、价格带、产地、成分(食材)、内容标签(如"低脂"、"网红打卡");对于用户,则是画像画像中的显式标签与隐式推断。关键原则是"**类别型特征要离散化,文本类特征要向量化**"——菜品描述文本经过预训练语言模型转成向量后,就可以和用户兴趣向量做点积计算相似度。这也让**内容相似度**的计算从"标签完全一致"演进为"语义空间相近"。 **混合召回架构**是工业界的标准答案:多路召回并行——协同过滤一路、内容特征一路、热点榜单一路、搜索日志一路——各路结果取并集后统一进入排序模型。冷启动策略重点作用在"内容特征召回"这一路:当新用户没有行为数据时,协同过滤路几乎失效,但内容特征路依然健壮。同时新增的**冷热统一建模**思想让我们意识到:冷启动和热推荐不是两套系统,而是同一模型在不同数据密度下的表现。业界前沿做法是把"物品被曝光次数"直接作为特征喂给模型,让模型自己学会"数据少时多依赖内容特征,数据多时多依赖行为特征"。 内容特征召回的实际画面是怎样的?你是个新用户,系统不知道你爱吃什么,但它把你所在城市的热门标签("川菜"、"网红"、"人均 50-80")与候选餐厅的菜品特征("水煮鱼"、"辣子鸡")做余弦相似度计算,筛选出 Top 50 作为候选池。这个候选池虽然个性化不足,但至少保证了"看起来像你会接受的东西"。之后经过排序模型时,再根据你的即时反馈动态调整权重——如果前两条点击都是川菜,排序模型就把川菜馆的权重拉高。 **召回**追求"一个都不能少"的全,**排序**追求"百里挑一"的准。冷启动阶段的成败往往在召回阶段就已注定:如果候选池里根本没有用户可能喜欢的内容,再精妙的排序模型也无能为力。 ### 冷启动评估与上线 任何策略都需要度量衡,冷启动也不例外。在**离线评估**阶段,我们需要挑选能反映冷启动质量的指标。传统推荐系统的离线指标(如 AUC、Recall@K)在冷启动场景下会失真——因为新物品曝光少,统计量不足,任何指标都带着巨大的方差。一个额外的考验是,单纯用"全量用户平均准确率"会掩盖冷启动问题——大数据量的老用户可以轻松拉高平均值,让新用户群体的糟糕体验被淹没在均值的"温水"里。 因此业界在实践中会将指标**分层拆分**:单独统计"新用户次日留存率"、"新用户人均点击次数"、"新物品曝光占比"与"新物品 7 日转化率"。这些指标才是冷启动策略是否有效的真实标尺。离线评估只能作为方向盘,真正的验收必须依赖**在线 A/B 实验**:将新用户流量按随机分组,对照组用旧的冷启动策略,实验组用新策略,对比两组用户在关键指标上的差异。A/B 实验中最容易犯的错误是"**样本污染**"——实验组用户会和对照组用户产生社交互动,或者同一个用户在 web 端进对照组、App 端进实验组,导致两组不再独立。因此业内强烈约定:**同一用户的实验分组必须全域一致**——这一点在大型互联网公司的实践中被反复验证。 **灰度发布**是上线策略中重要但容易被忽略的环节:新策略先开放 5% 流量,观察 3-7 天;确认无明显负向后再逐步扩到 10%、30%、100%。灰度期间要严格关注**护栏指标**——不仅看冷启动指标是否变好,还要看 CTR、转化率、投诉量等全局指标是否下滑。若全局指标下滑,说明策略在局部有效但整体有代价,需要回滚重新设计。 **数据回流迭代**是整个闭环的收尾与重启:新策略上线后产生的行为数据,经过清洗与特征加工后回流到训练数据中,成为下一个版本模型的养料。冷启动策略从来不是一次性工作,而是一个持续的螺旋上升过程。像向导的经验不断积累,每一段新探索都会让后续的推荐更加精准。这个闭环的核心公式是:**策略 → 实验 → 数据 → 模型 → 更好的策略**。

冷启动策略工具箱

当我们把前面的策略放在一起审视,冷启动不再是一个算法,而是一个分层组合的工程方案。一个完整的冷启动策略工具箱,包含如下层次:用户画像层(注册信息、人口统计学、第三方授权)、内容特征层(标签体系、语义向量、相似度映射)、算法策略层(UCB、汤普森采样、迁移学习预热)以及人工运营层(专题运营、编辑推荐、品类冷启)。策略组合运用的核心原则是:不同数据密度阶段使用不同策略——数据为零时用画像与内容特征,数据稀疏时用探索与利用(EE),数据渐丰时切换到协同过滤和深度学习排序。

场景差异配置在实战中尤为关键。电商场景的新用户,更多依赖“价格带 + 品类偏好”的画像;资讯场景的新用户,更多依赖“内容标签 + 热度”的兜底;而 O2O 场景的新用户(如外卖),地理位置成为最强先验——“离我近”甚至比“口味匹配”更重要。同一个平台内的不同内容形态,也要差异化配置:视频的新作品依赖标题和封面特征,商品的新 SKU 依赖类目与品牌映射,社区的新帖子依赖话题标签与作者历史质量。

演进路线图是一条从朴素的启发式策略到系统性学习的路线:初期用规则与人工运营(最朴素),中期用 UCB 与内容特征召回(高效),后期用迁移学习与深度模型(高级)。中小企业不需要一步到位,而大厂则会投入资源建设预训练底座和实时画像系统。在这个演进过程中,必须始终记得企业需要打造的系统工程闭环:数据采集 → 特征平台 → 模型训练 → 在线推理 → A/B 实验 → 数据回流。每个环节的缺位,都会让再优秀的算法策略成为无源之水。

在推荐系统的实际生产环境中,冷启动策略的工程化落地比算法本身的精巧程度更决定成败。一个可以稳定每天处理千万级新物品入库、百万级新用户注册的策略体系,比一个只在论文数据集上表现优异的 SOTA 模型更有价值。这就像米其林餐厅的后厨:菜谱再精致,也需要稳定的供应链、标准的切配流程和训练的厨师团队才能端上桌。冷启动,从来不只是模型问题,更是一个系统问题。

---

AI 应用场景

场景一:新用户注册后的即时推荐

阶段:召回与粗排

解决的问题:一个新用户完成注册后,系统零数据,无法用协同过滤计算相似用户。传统做法是推全站热门榜单,但用户可能对热门内容完全不感兴趣,导致新用户 3 日留存率很低。AI 冷启动方案通过注册画像(性别、城市、年龄段、感兴趣品类勾选)构建初始用户向量,再与内容特征向量做内积召回——每个用户看到的初始推荐都是基于自身画像定制的,而不是千篇一律的热门榜。

具体案例:一家电商平台在用户注册页嵌入轻量问卷(5 个选择题,选品类偏好、价格带、风格倾向),后端把这些标签映射为特征向量,与商品的内容向量做点积召回 Top 100。上线后新用户首单转化率提升了 21%。后续用户每产生一次点击,实时画像服务更新特征增量,用户的下一次刷新即可感知到个性化。如果用户始终没有点击任何内容,系统在第三次刷新时自动切换到 UCB 探索模式,展示 2 个非偏好类目的“惊喜商品”。

场景二:新商品上架后的冷启动流量分配

阶段:流量调控与探索利用

解决的问题:新商品上架后 0 曝光,它的内容特征和已有爆款的相似度可以用来预估初始转化潜力。传统做法是给每个新商品等量曝光——但这样既浪费优质商品的流量窗口,又给劣质商品积累了负面影响。AI 方案用“相似物品映射 + UCB 探索”:先计算新商品与老商品的相似度,用相似老商品的转化率作为先验;再用 UCB 决定曝光配额,表现好的新商品流量迅速爬坡,表现差的自动缩量。

具体案例:某跨境电商平台对每天入库的 50 万新 SKU 执行“冷启动流量池”:每个商品初始获得 200 次曝光,系统按点击率和加购率的 UCB 值动态调整后续流量。一周后,优质新商品的曝光量自然增长了 15 倍,劣质商品的曝光量自动衰减到原有水平。平台新品的整体 7 日转化率提升了 12%,而运营团队的人力投入下降了 80%——不需要再逐个人工筛选潜力款。

场景三:跨域冷启动——新业务线借力成熟业务线

阶段:模型的预训练与微调

解决的问题:公司内部新业务线(如从电商扩展到短视频)冷启动时,完全没有人-物交互数据。传统做法是从零开始收集数据、训练模型,爬坡期以月计。AI 方案采用迁移学习:复用电商业务线的用户 Embedding 预训练底座,在新业务线用少量用户行为做微调,最终实现“新用户进入短视频业务时,系统已经能猜出他大概喜欢什么内容”。

具体案例:某互联网大厂短视频业务启动时,将用户在电商业务中沉淀的类目偏好、价格敏感度、活跃时段等信息通过用户统一 ID 映射到视频内容特征空间,初始化视频推荐中用户的兴趣 Embedding。新用户在短视频 App 首页首刷的保留时长比随机推荐的对照组提升了 33%。同时,数据合规团队全程参与,确保跨域特征迁移仅使用用户授权的数据。

Python 演示

python73 行
import mathfrom collections import defaultdict  def content_similarity(vec_a, vec_b):    """计算两个特征向量(dict 形式)的余弦相似度。"""    common = set(vec_a.keys()) & set(vec_b.keys())    dot = sum(vec_a[k] * vec_b[k] for k in common)    norm_a = math.sqrt(sum(v * v for v in vec_a.values()))    norm_b = math.sqrt(sum(v * v for v in vec_b.values()))    if norm_a == 0 or norm_b == 0:        return 0.0    return dot / (norm_a * norm_b)  def estimate_user_preference(user_actions, prior_mean, prior_count):    """基于先验均值与历史行为,平滑估计用户对物品的偏好分。"""    evidence_sum = sum(action["rating"] for action in user_actions)    evidence_count = len(user_actions)    numerator = prior_count * prior_mean + evidence_sum    denominator = prior_count + evidence_count    return numerator / denominator  class UCBRecommender:    """基于 UCB 的探索利用推荐器。"""     def __init__(self, items):        self.items = items        self.try_count = defaultdict(int)        self.score_sum = defaultdict(float)     def recommend(self, top_k=3):        total_tries = sum(self.try_count.values()) + 1        ucb_scores = []        for item_id in self.items:            n = self.try_count[item_id]            if n == 0:                mean = self.items[item_id]["prior"]                bonus = 1.0            else:                mean = self.score_sum[item_id] / n                bonus = math.sqrt((2 * math.log(total_tries)) / n)            ucb_scores.append((mean + bonus, item_id))        ucb_scores.sort(reverse=True)        return [item_id for _, item_id in ucb_scores[:top_k]]     def record_feedback(self, item_id, rating):        self.try_count[item_id] += 1        self.score_sum[item_id] += rating  if __name__ == "__main__":    items_pool = {        "spicy_hotpot": {"prior": 3.5, "cat": "spicy", "price": 80},        "sweet_dessert": {"prior": 4.5, "cat": "sweet", "price": 30},        "sichuan_fish": {"prior": 3.0, "cat": "spicy", "price": 70},        "guangdong_soup": {"prior": 4.2, "cat": "sweet", "price": 60},    }    rec = UCBRecommender(items_pool)    user_actions = [        {"itemId": "spicy_hotpot", "rating": 5},        {"itemId": "sichuan_fish", "rating": 4},    ]    prior_mean = 3.8    prior_count = 10    pref = estimate_user_preference(user_actions, prior_mean, prior_count)    print("平滑后用户偏好分:", round(pref, 2))     print("第一轮推荐:", rec.recommend(top_k=2))    rec.record_feedback("spicy_hotpot", 5)    rec.record_feedback("sweet_dessert", 2)    print("记录反馈后推荐:", rec.recommend(top_k=2))
目的:演示冷启动场景下“先验偏好估计 + UCB 探索”的最小闭环,理解后即可对接真实数据源扩展为生产级策略。
  1. estimate_user_preference()融合群体先验与个体行为,数据少时先验主导,数据多时行为主导。
  2. UCBRecommender.recommend()从未尝试过的物品默认给 1.0 的探索加成,保证新店有曝光机会。
  3. bonus = math.sqrt((2 * math.log(total_tries)) / n)UCB 不确定性溢价,尝试次数越多加成分越小。
  4. self.try_count` 与 `self.score_sum分别用 _count 和 _sum 后缀,记录每个物品的被试次数与累计得分。
  5. items_pool用字典模拟物品池,每个物品带有先验均分与内容属性,对应冷启动中的“新店”。
  6. prior_count = 10先验的“等效样本量”,就像向导之前见过 10 个类似用户。

常见误区

误区新物品的冷启动推荐,就是把物品打上标签,然后找标签完全相同的用户推荐。比如打了“川菜”标签的餐厅,就推荐给所有打过“川菜”标签的用户。

正解仅靠精确标签匹配太脆弱——用户标签和物品标签常常是两种粒度(用户写“爱吃辣”,物品写“水煮鱼”),完全匹配几乎不可能。生产级做法是把内容和用户都映射到同一个向量空间:用预训练模型把“辣”和“水煮鱼”映射到语义相近的向量位置,通过余弦相似度找“语义上的邻居”。核心思想是“近似即相关”,而非“相同才相关”。

为何常见:初学者容易把推荐系统理解为“打标签匹配”的规则系统,因为规则易于理解和调试。但真实场景中标签稀疏、粒度不统一、同义词众多,规则匹配的覆盖率极低,向量化表征才是深度学习时代的标准解法。

误区既然冷启动是数据不足,那就尽可能多地收集用户信息——注册页塞 20 个问题,每个维度都要求用户填写,让画像一步到位。

正解用户体验和画像完备度之间存在尖锐矛盾。每多一个问题,注册转化率就会下降 5%~20%。更聪明的做法是“渐进式画像”:首轮只收集 3-5 个最关键的特征,其余信息在后续行为中隐式推断。用多臂老虎机的视角看,注册表单是“探索成本”,而后台行为采集是“免费探索”——系统应该优先使用免费信号。

为何常见:人们容易认为“信息越多越好”是显然的,却忽略了信息获取本身有成本——这里的成本计量就是用户的耐心与信任。交互式推荐中“故意选错”也是一条宝贵信号,但前提是你得给用户犯错的机会。

误区UCB 算法算出的分数不就是“分数 = 平均分 + 一个数”吗?那多做几次之后,不确定性趋于零,UCB 不就退化成按平均分排序了吗?那冷启动阶段结束后,还需要 UCB 吗?

正解UCB 的探索红利没有消失,而是动态压缩了。冷启动阶段的“不确定性项”较大,系统愿意尝试新物品;随着系统成熟,探索项收敛,利用占比提升。但内容生态永远有新物品流入,每个新物品的 \(n_i\) 从零开始,不确定性项重新变大,于是 UCB 自动为它们腾出流量。它是一个“永不停机的正反馈机制”,不是只在冷启动初期有意义。

为何常见:从公式表面看,当 \(n_i\) 很大时不确定性项趋近零,容易得出“UCB 最终退化为贪心”的结论。但这个结论隐含假设是物品集合固定不变,实际场景中新物品持续涌入,UCB 会反复进入探索状态。这也是“探索与利用”是动态平衡而非一次性选择的原因。

误区迁移学习嘛,把他在电商业务上积累的用户数据,直接复制到新业务线的数据库里,模型训练时一起喂进去就完事了。

正解跨域数据的特征空间不同、分布不同、语义也不同,直接拼接会导致“维度灾难”和“负迁移”(源域知识反而损害目标域性能)。正确的做法是:在源域预训练一个通用的特征提取器(Embedding 层或 Transformer),然后在目标域上微调——只调整最后几层适配层。数据合规和权限管控,也需要有明确的制度保证。迁移的主力是“模型参数”而非“原始数据”。

为何常见:对“迁移”这个词的字面理解误导了大家。迁移学习迁移的是知识表征(如特征抽取能力、语义空间映射),而不是数据集本身。这是初学者最容易混淆的层面。

面试题

Q1. 推荐系统冷启动问题的本质是什么?

单选题 · easy

  • A.服务器响应速度过慢
  • B.缺乏足够历史交互数据← 正确答案
  • C.推荐算法代码存在 Bug
  • D.用户不愿意点击推荐位

答案:B。冷启动的本质是“没有历史交互数据时的推荐难题”,因此正确选项是 B。A 是系统性能问题,C 是工程质量问题,D 是用户体验问题,都不涉及数据稀疏这一根本矛盾。

Q2. 用户冷启动时,以下哪项属于“第三方授权导入”?

单选题 · easy

  • A.注册表单勾选口味偏好
  • B.通过微信登录获取城市年龄← 正确答案
  • C.推荐两款不同风格的商品
  • D.收集用户点击行为日志

答案:B。第三方授权导入指通过微信、微博等授权登录获取用户公开画像,对应 B。A 是注册画像采集,C 是探索策略,D 是行为反馈收集。

Q3. 对内容特征召回的理解,下列说法正确的是:

单选题 · easy

  • A.只能用于物品冷启动场景
  • B.依赖用户的历史交互数据
  • C.依据物品自身属性建立推荐连接← 正确答案
  • D.通过随机探索寻找兴趣点

答案:C。内容特征召回的本质是基于物品自身属性(菜系、标签、语义向量)做匹配,不依赖交互数据,因此选 C。它同时适用于用户与物品冷启动,A 错;它不依赖交互数据,B 错;随机探索是 EE 策略,D 错。

Q4. UCB 公式中不确定性项的作用方向是:

单选题 · mid

  • A.惩罚被推荐次数多的物品
  • B.提高被推荐次数少的上限← 正确答案
  • C.让所有物品得分趋向一致
  • D.消除探索带来的随机性

答案:B。UCB 的 \(\sqrt{2\ln t/n_i}\) 项会随 \(n_i\) 减小而增大,给“尝试少的不确定性物品”加较高的探索红利,从而提高其排序候选位置,对应 B。A 说反了,C 和 D 都与公式行为相反。

Q5. 内容相似度计算最常用哪种度量方式?

单选题 · mid

  • A.欧氏距离直接比较向量差
  • B.余弦相似度← 正确答案
  • C.曼哈顿距离
  • D.编辑距离

答案:B。推荐系统的内容特征向量通常用余弦相似度衡量方向一致性,它对向量的缩放不敏感,适合稀疏高维特征。欧氏距离对向量长度敏感,适用于连续密集向量;编辑距离主要用于文本字符级别;曼哈顿距离在推荐中少用。

Q6. 冷启动策略的离线评估最适合采用:

单选题 · mid

  • A.全量用户 AUC 指标
  • B.全局点击率 CTR
  • C.新用户维度分层指标← 正确答案
  • D.模型训练损失函数值

答案:C。冷启动策略的评估应聚焦“新用户/新物品”群体的表现,使用分层指标(如新用户次日留存、新物品曝光占比),C 正确。全量用户的 AUC 和 CTR 会被老用户数据稀释,掩盖冷启动问题;损失函数是训练指标而非业务评估指标。

Q7. 下列哪些策略可以用于用户冷启动?

多选题 · mid

  • A.注册画像采集← 正确答案
  • B.相似用户迁移← 正确答案
  • C.概率稀释策略← 正确答案
  • D.内容冷却降权

答案:ABC。A(画像采集)、B(人口统计学迁移)、C(随机试探探索)都是用户冷启动常用策略。D 的“内容冷却降权”是针对物品冷启动中旧内容降权的策略,与用户冷启动无关。

Q8. 物品冷启动采用“相似物品映射”策略时,有效做法包括:

多选题 · hard

  • A.选择特征最相似的老物品作桥梁← 正确答案
  • B.将相似老物品均分作为先验← 正确答案
  • C.忽略新物品自身的差异
  • D.用相似度加权迁移质量分← 正确答案

答案:ABD。相似物品映射需要计算内容特征相似度(A),用相似老物品的均分或加权分做先验(B、D),并保持对新物品特征的敏感(C 错)。加权迁移比简单均分更合理,因为它考虑了不同相似度的贡献差异。

Q9. 灰度发布期间最需要关注的指标是:

单选题 · hard

  • A.实验组的点击率提升幅度
  • B.新策略的离线 AUC 数值
  • C.全量用户的整体体验护栏指标← 正确答案
  • D.服务器 CPU 占用率

答案:C。灰度期不仅要看实验组指标是否变好,更要盯住全局护栏指标(CTR、转化率、投诉量)。如果策略在局部有效但让整体体验下降,需要回滚。A 只是部分视角,B 是离线指标,D 是性能指标。

Q10. 关于迁移学习在冷启动中的应用,下列说法正确的有:

多选题 · extreme

  • A.可直接将源域用户数据复制到目标域训练
  • B.模型微调时可冻结底层特征层← 正确答案
  • C.跨域迁移必须考虑数据合规边界← 正确答案
  • D.预训练模型对任何目标域都优于从头训练

答案:BC。迁移学习迁移的是模型参数(B),而非原始数据复制(A 错),且受合规约束(C 对)。预训练并非万能——域间差异过大时可能产生负迁移,D 的说法过于绝对。