新学期,班里转来一个叫小光的同学。班主任想给他安排一个合适的同桌、推荐几个有趣社团,但眼前只有一张转学登记表,上面写着:喜欢机器人、看过几本科幻书、性格比较安静。除此之外,没有任何“他喜欢什么社团”的行为记录。这就像推荐系统里的冷启动:新用户、新物品刚进入系统,没有积累任何点击、收藏、购买数据。怎么在茫茫“社团名单”里先捞出几个靠谱的候选,而不是大海捞针?故事里,班主任自然有候补方案:翻档案、找同类、问旧老师、看全校热门。把这四条线索合并起来,就能很快形成一份“初选名单”——这就是冷启动召回的精髓。
掌握冷启动召回方法,你就能在用户和物品都是“空白卷”时搭起第一座推荐桥梁,这是推荐系统团队交给新人的第一项硬仗。
可视化演示
展示FCFS、SSTF、SCAN三种磁盘调度算法的磁头移动轨迹,对比不同策略下的寻道距离与效率。点击算法按钮切换模式。
本节配有交互动效(进入视口后自动加载,约 3KB)。
SCAN 电梯调度算法 磁头沿一个方向持续移动,服务沿途所有请求 到达方向末端后反向,继续服务剩余请求 总寻道距离 = Σ|cyl-cyl| SCAN兼顾公平性与效率,寻道性能稳定。
1. 冷启动挑战
小光刚转学,班主任手上最缺的就是“这个孩子在学校的互动记录”:他和谁一起玩过、参加过哪些活动,统统是空白。这不是说老师对学生一无所知,而是系统性的行为日志为零。推荐系统也有同样的处境:一提到“推荐”,大家本能想到协同过滤这类依赖历史行为的算法,但冷启动恰恰把这条最快的路堵死了。
推荐系统流水线通常分为召回、精排、重排三环。召回的职责,是从百万级物品中快速捞出几百个候选,再交给精排细细打分。冷启动发生时,新用户没有行为、新物品没有曝光,协同过滤这一类“看历史行为找相似”的方法直接失效。问题最先在召回环节暴露:如果候选在召回阶段就被漏掉,后面的精排再强也无济于事。
冷启动又分用户冷启动、物品冷启动和混合冷启动。无论哪种,目标都是在缺乏交互数据时仍产出候选。最简单的随机兜底命中率极低,物品池越大,随机拿到好候选的概率就越低。
所以班主任不会用抽签的方式给小光选社团。全校一百个社团里只有一个最合适,抽中概率只有百分之一。想提高命中率,必须先有“线索召回”,这就是下面各条通道登场的理由。
- 分子目标物品数:随机抽取时,只有抽到那个真正合适的物品才算命中,目标计为 1。
- 分母物品池大小:$|I|$ 表示全部候选物品的数量,分母越大,随机命中越困难。
- 概率表达式命中概率是目标数量与池子大小之比,这就是冷启动下“瞎猜”的真实成功率。
2. 内容特征召回
班主任翻开转学登记表,看到小光写的是“喜欢机器人、沉迷科幻书”。于是他在社团目录里找同样带“机器人”“科幻”标签的社团:机器人社、天文社、科幻小说社。整个过程完全不依赖小光在新学校的活动记录,只靠他身上自带的属性。
内容特征召回正是这个逻辑:把用户和物品都用属性特征表示,再计算彼此相似度。用户侧特征来自注册资料、主动选择的兴趣、设备信息;物品侧特征来自类目、标签、文本摘要、封面视觉特征。两边都不用依赖历史交互,天然适合冷启动。
实际操作中,特征通常被表示成向量,每个维度对应一个属性,数值代表权重。计算相似度最常用的是余弦相似度,它只关方向不关大小,对高维稀疏向量也稳定。
小光的“机器人 + 科幻”向量,与机器人社的“机器人 + 制作 + 竞赛”向量夹角很小,相似度得分高,于是机器人社率先进入初选名单。内容特征召回就是班主任那张转学登记表。
- 分子重叠特征加权求和:把用户向量与物品向量对应维度相乘再累加,体现两边的共同特征有多少。
- 分母模长相乘做归一化:两个向量各自求模再相乘,把量纲差异抹平,避免“特征写得多就得分高”。
- 相似度整体分子除以分母,得到范围在 -1 到 1 之间的余弦相似度,冷启动召回取其正值部分排序。
3. 画像匹配召回
班主任除了看登记表,心里还有一本“典型学生图谱”:理科成绩好的男生大多喜欢机器人,性格安静的学生可能偏好阅读和写作。他把小光的画像和各种社团画像做比对,看看重合度。
画像匹配召回可以理解为内容特征召回的规则化版本,最大的优点是可解释。先把用户归入标签体系,比如年龄、性别、城市、显式兴趣;再把物品归入运营维护的标签体系,比如领域、风格、适合人群。然后计算两套标签集合的重合程度。
在工程实现里,画像匹配常以规则或轻量打分形式出现,速度快、逻辑透明,适合作为冷启动的第一层粗筛。标签交叠越多,匹配分越高。
小光身上挂着“男生、安静、科幻迷”三个标签,机器人社挂着“动手、科技、竞赛”三个标签,虽然不完全重合,但“科技”这一项权重极高,画像匹配分照样把它推上榜。画像匹配就是班主任心里那本“典型学生图谱”。
- 标签交集先找用户标签集合与物品标签集合的交集,得到共同认可的那些标签。
- 单个标签权重每个共有标签 $t$ 对应一个权重 $w_t$,核心标签权重高,边缘标签权重低。
- 权重求和把交集内所有标签的权重累加,就是该用户对该物品的画像匹配分。
4. 跨域迁移
班主任没有就此打住。他给小光以前的班主任打了个电话,问小光在旧学校参加过什么社团;又翻了翻家长朋友圈,发现小光的表哥也在机器人社。这些信息都不是新学校系统里的行为数据,却能帮老师做判断。
跨域迁移正是利用辅助域的信息补足目标域缺失的交互。辅助域可以是社交关系、另一个App的使用行为、关注的好友列表。核心思想是:本域没有行为记录没关系,从别的域把“相似经验”搬过来。
实现上常见两种路径:一是通过共享用户做关联,比如同一个用户在A域有大量行为,可迁移到B域;二是通过社交图谱,把好友的偏好作为目标用户的估计。社交关注关系下的物品曝光,就是短视频冷启动中最常借的力。
小光在旧学校参加过机器人竞赛,表哥又恰好是机器人社成员,这两个外部信号叠加,老师对“小光适合机器人社”的信心大大提升。跨域迁移就是班主任打给旧学校的那个电话。
- 关联用户集合从辅助域 A 中找出与用户 u 有关联关系(如好友、同群)的用户集合。
- 源域反馈值$y_{v,i}^{A}$ 表示用户 v 在辅助域 A 中对物品 i 的真实交互反馈。
- 加权求和按亲密度 $w_{u,v}$ 加权累加所有关联用户的反�馈,得到目标域 B 的冷启动预估值。
5. 热度兜底
万一档案信息有限、画像不怎么匹配、旧学校又联系不上呢?班主任还有最后一张牌:先推荐全校公认最火爆的几个社团。机器人社有三十个社员,天文社活动最多,这些热门选择至少不会让小光觉得学校生活乏味。
热度兜底是冷启动召回的保底通道。它不需要任何个性化信号,只依赖物品的全局热度,就能给新用户一个基础体验。新物品发布初期没有行为数据,也可以复制同类新品的启动热度,或者直接用时间衰减热度。
热度分计算公式里藏着一个关键设计:越久远的行为贡献越小,防止老物品永远霸占榜单,给新内容留出冷热均衡的空间。
热度不是个性化,但它是冷启动的“安全垫”。就像班主任先把最热门的社团推荐给小光,保证他不会对着空名单发愣。热度兜底让新用户和新物品永远有基础候选,不因数据稀疏而被遗忘。
- 单次行为发生时间物品 i 最近发生过的第 j 次行为时间记为 $t_j$,越近的行为越新鲜。
- 指数时间衰减$e^{-\lambda(t - t_j)}$ 让时间久远的行为权重按指数缩小,λ 控制缩小的速度。
- 累加全部行为把 $n_i$ 次行为逐一衰减后求和,就是这个物品此刻的热度分。
6. 多路融合评估
四条线索摆在班主任桌上:转学档案、典型画像、旧校反馈、全校热门。他绝不会只信其中一条,而是把四份信息合并成一张初选名单:先互相印证,再删掉重复项,最后把各方面都沾边的社团排在前面。
真实系统中也是这样。冷启动召回几乎不会只跑单通道,而是内容召回、画像召回、迁移召回、热门召回同时运行,最后做融合。每条通道返回的分数尺度不同,有的接近 1,有的可能是几十,直接相加没有意义,必须先做归一化。
归一化后还要对重复物品合并证据:一个物品同时被内容通道和画像通道命中,说明它有多个角度的竞争力。最后按加权得分截断,取 TopK 进入精排。线上同时监控召回率、候选覆盖率等指标,确保冷启动通道真的在生效。
小光的初选名单不是老师拍脑袋定的,而是“档案匹配 + 画像相似 + 旧校口碑 + 全校热门”四条证据加权后的结果:既尊重个性化线索,又保留了热门兜底。这就是冷启动召回从“无中生有”到“有中生优”的完整路径。
- 单路归一化得分$\mathrm{norm}_r(u,i)$ 是第 r 条召回通道给出的标准化得分,取值范围被压到可比尺度。
- 通道权重$w_r$ 表示第 r 条通道的权重,可通过离线实验或线上搜索确定,热门兜底通常权重最小。
- 加权汇总把 R 条通道的归一化得分按权重求和,得到最终冷启动召回分,据此排序截断取 TopK。
AI 应用场景
电商平台新人首购推荐
阶段:召回
解决的问题:新注册用户没有购买记录,传统协同过滤无法建模。AI 利用注册时选的兴趣标签做画像匹配召回,同时用商品类目、品牌、价格带等属性做内容召回,再用热销榜兜底,保证新用户首屏有东西可看。
具体案例:某跨境电商 App 新用户注册后,系统立刻读取其选择的“运动健身”标签,从商品池召回跑鞋、瑜伽垫、蛋白粉三类候选;同屏再混入全站热销的轻小件商品,点击率比纯随机推荐提升 3 倍。
短视频新视频冷启动分发
阶段:召回
解决的问题:每天新增海量视频没有任何播放数据,如果只靠热度兜底,长尾视频永无出头之日。AI 用视频标题、封面、字幕抽内容特征向量,再用内容特征召回匹配用户;同时利用发布者的粉丝关系做跨域迁移,粉丝在相似作者视频上的互动可为新视频提供初始打分。
具体案例:某短视频平台上线新视频的前 30 分钟,系统用“内容特征召回”把它推给 500 个与视频标签相似的兴趣用户,再用发布者粉丝做迁移召回作为补充,冷启动视频的完播率显著高于随机探索。
音乐 App 新歌首发引流
阶段:召回
解决的问题:新歌没有播放、收藏数据,无法判断应该推给谁。AI 提取歌手、曲风、时长、歌词主题等特征,用内容召回找到品味相似的老歌歌迷;对新用户则用热度歌单兜底,保证每个进入 App 的人都有即时可听的候选。
具体案例:音乐平台发布一首新歌,系统把它的特征向量与用户历史收藏歌曲做余弦相似度召回,优先推给收藏过同歌手或同曲风的用户,同时在新用户首页插入“本周热歌榜”作为兜底,新歌首日播放量大幅提升。
Python 演示
import mathimport time class ColdStartRecaller: def __init__(self, item_feats, item_tags, user_profile, hot_visits): self.item_feats = item_feats self.item_tags = item_tags self.user_profile = user_profile self.hot_visits = hot_visits @staticmethod def cosine(a, b): dot = sum(a[k] * b.get(k, 0) for k in a) na = math.sqrt(sum(v * v for v in a.values())) nb = math.sqrt(sum(v * v for v in b.values())) if na * nb == 0: return 0.0 return dot / (na * nb) def content_score(self, item_id): user_vec = self.user_profile["feat"] item_vec = self.item_feats[item_id] return self.cosine(user_vec, item_vec) def profile_score(self, item_id): user_tags = set(self.user_profile["tags"]) item_tags = set(self.item_tags[item_id]) overlap = user_tags & item_tags return float(len(overlap)) def hot_score(self, item_id, lam=0.1, now=None): now = now if now is not None else time.time() visits = self.hot_visits[item_id] score = 0.0 for t in visits: score += math.exp(-lam * (now - t)) return score def recall(self, item_ids, top_k=3, now=None): scores = {} for item_id in item_ids: scores[item_id] = ( self.content_score(item_id) * 0.4 + self.profile_score(item_id) * 0.3 + self.hot_score(item_id, now=now) * 0.3 ) ranked = sorted(scores.items(), key=lambda kv: kv[1], reverse=True) return [item_id for item_id, _ in ranked[:top_k]] def main(): item_feats = { "A": {"tech": 0.8, "fun": 0.2}, "B": {"tech": 0.3, "fun": 0.9}, "C": {"tech": 0.6, "fun": 0.4}, } item_tags = { "A": {"ai", "news"}, "B": {"gossip", "fun"}, "C": {"ai", "tutorial"}, } user_profile = {"feat": {"tech": 0.7, "fun": 0.4}, "tags": {"ai"}} hot_visits = { "A": [1000.0, 1005.0], "B": [900.0], "C": [800.0, 810.0, 812.0], } recaller = ColdStartRecaller(item_feats, item_tags, user_profile, hot_visits) result = recaller.recall(list(item_feats.keys()), top_k=2, now=1005.0) print("cold start recall:", result) if __name__ == "__main__": main()
user_vec = self.user_profile["feat"]从用户画像中取出特征向量,模拟没有历史行为时仅用自带属性。return self.cosine(user_vec, item_vec)内容特征通道,用余弦相似度给用户和物品的属性向量匹配打分。overlap = user_tags & item_tags画像匹配通道,找用户标签与物品标签的交集,交集越多分越高。score += math.exp(-lam * (now - t))热度兜底通道,时间越久远的行为权重衰减越多。scores[item_id] = (self.content_score(item_id) * 0.4 + ...)多路加权融合,把三条通道得分按经验权重相加。ranked = sorted(... key=lambda kv: kv[1], reverse=True)对融合得分从高到低排序,选出排名最靠前的候选。print("cold start recall:", result)输出最终候选列表,验证冷启动链路在代码层面已打通。
常见误区
误区冷启动就是系统里一点数据都没有,必须要等用户积累一段时间的点击和购买记录,才能开始做推荐。新用户就得忍受几周“随便推”的体验。
正解冷启动缺的只是“本域交互数据”,而非全部信息。用户有注册资料、设备信息、社交关系,物品有类目、标签、文本、视觉特征。就像新同学的转学登记表虽然没有新学校的行为记录,但“喜欢机器人”这个自带属性已经足够启动推荐。内容特征和画像匹配可以立刻开工,热度兜底保证下限。
为何常见:因为很多人把“推荐”等同于“协同过滤”,而协同过滤的输入确实是行为日志,于是误以为没有行为日志就没有推荐素材。
误区内容特征召回就是把物品描述存进数据库,用户来查询时做关键词匹配,搜到“机器人”就返回所有含“机器人”的文章。
正解内容特征召回的本质是“属性 → 特征向量 → 相似度计算”。它会把结构化属性映射成稠密或稀疏向量,再算余弦相似度。关键词搜索是精确匹配,内容召回是向量空间的软匹配,能处理同义词、概念相近甚至无法直接命中的内容。
为何常见:因为“内容”两个字让人联想到文本检索,初学者容易把召回和搜索混为一谈,忽略了中间的向量化步骤。
误区跨域迁移很省事,把用户在另一个平台的点击记录打包复制到当前平台,直接当本域行为用就行。
正解迁移需要解决用户对齐、特征映射、领域差异三个问题。同一用户在两个域的表达方式不同,直接复制会产生负迁移。就像小光在旧学校的“武术队经历”,搬到新学校未必等同于“体育特长加分项”,需要判断哪些经验可以迁移、哪些需要重新校准。
为何常见:因为“迁移”这个词听起来像“搬运”,让人忽略了迁移学习里“选择哪些知识、如何适应新分布”的核心难度。
误区冷启动场景下多建几条召回通道,把内容、画像、跨域、热度全堆上去,召回结果越多越保险,后面的精排会负责筛选。
正解通道越多,重复候选越多,噪声也越多。各通道分数尺度不同,不归一化直接融合会把精排模型带偏;不做去重合并,同一物品会以多份不同特征进入精排,造成系统资源浪费。融合时需要归一化、合并证据、截断控制,质量比数量重要。
为何常见:因为从直觉上看“更多输入=更多信息”,但忽略了多路融合带来的尺度不一致和冗余冲突,而这些恰恰是工业级系统的必修课。
面试题
Q1. 冷启动场景下,用户没有历史交互数据,以下哪种方法最适合作为召回初选?
- A.基于协同过滤召回
- B.基于内容特征召回← 正确答案
- C.基于矩阵分解召回
- D.基于物品邻域召回
答案:B。协同过滤、矩阵分解、物品邻域都依赖历史交互数据,没有行为时无法计算相似关系。内容特征召回只依赖用户和物品的自带属性,像班主任翻转学登记表一样,冷启动一开始就能用。
Q2. 余弦相似度在内容特征召回中的作用是什么?
- A.衡量两个特征向量的相似程度← 正确答案
- B.计算物品被点击的概率
- C.把高维特征压缩到低维
- D.对热门物品做降权处理
答案:A。余弦相似度计算两个向量的夹角余弦值,只关心方向是否一致,是内容特征召回里最常用的相似度度量。计算点击概率是精排模型的活,降维是矩阵分解的活,降权是热门惩罚的活。
Q3. 跨域迁移召回的核心思路是什么?
- A.直接复制源域的全部数据到目标域
- B.利用用户在辅助域的交互补充目标域← 正确答案
- C.用物品的封面图片替代特征向量
- D.将热门物品强制排到最前面
答案:B。跨域迁移的本质是把辅助域(社交、其他 App 行为)的信号,通过共享用户或社交关系迁移到目标域。直接复制数据会造成负迁移,用封面图片替代特征向量属于内容特征,热门兜底则是热度通道。
Q4. 以下哪些方法能有效缓解新用户冷启动?
- A.注册时收集用户兴趣标签← 正确答案
- B.借用社交好友的偏好做迁移← 正确答案
- C.等待用户积累一个月数据
- D.用人口统计学信息构建画像← 正确答案
答案:ABD。兴趣标签可用于画像匹配,社交好友偏好可用于跨域迁移,年龄性别等人口统计数据可快速构建初始用户画像,三者都能在无行为时立即可用。等待积累数据等于放弃冷启动,不是解法。
Q5. 关于热度兜底召回,下列说法正确的有?
- A.适合新物品上线无任何行为时兜底← 正确答案
- B.对所有用户生成完全相同的个性化结果
- C.头部热门集中会导致供给单一化← 正确答案
- D.结合探索机制可让长尾内容获得曝光← 正确答案
答案:ACD。热度兜底确实适合新物品无行为时的保底,但它产生的是非个性化结果,不是“个性化结果”,因此 B 错误。热门长期集中会造成供给单一,需要加入探索机制给长尾内容曝光机会,A、C、D 正确。
Q6. 多路召回融合时需要注意哪些要点?
- A.各路得分需要归一化到可比尺度← 正确答案
- B.直接拼接候选不作去重
- C.对重复物品合并不同通道证据← 正确答案
- D.统一截断并控制召回数量← 正确答案
答案:ACD。不同通道的分数尺度可能差几十倍,必须归一化;重复候选要去重并合并证据;还要统一截断避免过多噪声进入精排。直接拼接不作去重会让同一物品重复占位,是错误做法。
Q7. 推荐系统中召回阶段的核心目标是什么?
- A.对头部物品做精排
- B.从全量物品中筛选小规模候选← 正确答案
- C.建立完整的用户画像
- D.训练一个点击率预估模型
答案:B。召回的目标是从百万级物品池中快速捞出几百个候选,为精排减负。精排和点击率预估是后续阶段的事,用户画像是召回的手段而非目标。
Q8. 一件新物品上线且没有任何点击记录,做内容特征召回的第一步是什么?
- A.统计物品的历史点击率
- B.提取物品属性并构建特征向量← 正确答案
- C.等待其他用户先点击
- D.把物品直接加入候选黑名单
答案:B。新物品没有点击率可统计,等待点击等于放弃冷启动。正确做法是先提取类目、标签、文本、视觉等属性,构建特征向量,再与用户属性向量计算相似度。
Q9. 为缓解冷启动,在热度兜底之外引入随机探索机制,最主要的原因是什么?
- A.探索越多推荐越精准
- B.热度兜底只服务新用户
- C.探索给长尾新物品曝光机会← 正确答案
- D.探索一定导致用户留存下降
答案:C。探索机制让系统主动尝试未被验证过的物品,给长尾和新物品曝光机会,从而获得新行为数据。探索过多会损害短期精准度,但不是“越多越准”;热度兜底服务所有用户而非仅新用户。
Q10. 热度计算公式中参数 λ 的作用是什么?
- A.控制热度随时间衰减的速度← 正确答案
- B.表示物品的候选数量
- C.调节用户画像的维度数
- D.决定余弦相似度的阈值
答案:A。在指数衰减公式中,λ 越大,历史行为权重下降越快,热度越偏好近期表现;λ 越小,历史积累越持久。它不涉及候选数量、画像维度或相似度阈值,是纯时间衰减控制参数。