新学期第一天,班里转来一位叫小林的插班生。班主任老周手里只有一张半空白的档案表:名字、年级齐整,但“过往成绩、兴趣经历、获奖记录”全是空白。想推荐他进篮球社?不知道他球技如何。想安排数学兴趣小组?不知道他底子怎样。老周犯了难——这正是推荐系统最头疼的“冷启动”时刻:面对一个没有任何历史记录的新用户(或一件刚上线的新商品),怎么做出靠谱推荐? 好在老周经验丰富。他有三个办法:第一,看小林自己勾选的“兴趣爱好表”,用标签做匹配——这是基于内容(CB)的思路;第二,琢磨小林在原来学校沉淀的学习方法,把“怎么快速适应新环境”的本事迁移过来——这是迁移学习(MAML/FOML)的思路;第三,平时就故意藏起一些同学的资料来练手,练到信息不全也能判断——这是DropoutNet的思路。三条路,共同构成了冷启动推荐的三大策略。
掌握冷启动三大策略,你就能在推荐系统面试中精准拆解“新用户/新物品怎么推”的难题,并在真实业务中按特征条件、数据储备灵活选型,显著优化上线初期的推荐效果。
可视化演示
展示基于内容的CB方法、MAML迁移学习快速适配、DropoutNet缺失特征容错三大冷启动策略,支持模式切换。
本节配有交互动效(进入视口后自动加载,约 3KB)。
基于内容的CB方法 无需标签:直接使用物品内容特征匹配 适合新物品冷启动场景 score = sim(user, item_content) 内容匹配推荐。
冷启动问题
班主任老周翻开小林档案,发现“过往成绩”一栏是空的。不是档案丢了,而是小林刚转学,新学校还没有关于他的任何学习记录。这就好比推荐系统里的新用户:没有点击、没有收藏、没有购买,一切交互历史都是零。更麻烦的是,新上架的商品也一样——没有用户碰过它,协同过滤算法就找不到“和谁相似”的依据。
冷启动(Cold Start)在推荐系统里指缺少历史行为数据时的推荐问题,通常分成三类:用户冷启动(新注册用户无行为)、物品冷启动(新品无交互)、系统冷启动(整个平台数据积累不足)。传统协同过滤依赖“用户-物品交互矩阵”,而冷启动恰恰意味着这个矩阵的行或列几乎全空。
设用户数 u、物品数 i,交互矩阵 R 只有极少数被观测:
老周盯着空白档案,心里清楚:等档案自然填满要一学期,班级活动等不起。必须主动出击——这正是三大策略登场的理由。
- 矩阵 R$R_{u \times i}$ 表示 u 个用户对 i 个物品的交互矩阵,元素 $r_{ui}$ 为评分或点击标记。
- 已知与未知少数数字(如 5、1)代表已有交互,大量"?"代表从未发生或未被观测的交互。
- 稀疏度观测交互数占矩阵总数的比例通常不足 10%,冷启动场景下新用户对应整行都是"?"。
基于内容CB
老周把抽屉里的“兴趣爱好表”发给小林。小林三分钟填完:篮球、数学建模、悬疑小说。老周立刻有了主意——学校篮球社、数学社、读书社,这些社团本身也贴着同样标签,直接把小林推进对应社团就行。不需要他过去任何比赛成绩。
基于内容推荐(Content-Based Recommendation)正是这个思路:用物品自身的特征(标签、类目、文本关键词)来刻画物品,再用用户标注或用户历史偏好构建画像,最后算画像与候选物品特征的相似度。对冷启动而言,新物品只要一上架就有完整特征,就能立刻进入召回候选池。
CB 最常用的相似度是余弦相似度。设用户画像向量 p、物品特征向量 q:
篮球社的关键词是“篮球”,小林画像里“篮球”权重最高——余弦相似度一算,二者方向高度一致。老周在推荐理由栏写:该生兴趣匹配度 0.87,建议入社。
- p_{u,j}用户 u 在第 j 个特征(例如“篮球”)上的偏好强度,来自用户标注或行为加权。
- q_{i,j}物品 i 在第 j 个特征上的权重,如“篮球”标签在物品描述中的 TF-IDF 值。
- 分子两个向量逐维相乘累加,捕捉“共同强调”的特征。
- 分母两向量模长之积,消除向量长度差异带来的偏差,让相似度只看方向、不看长短。
特征稀疏处理
小林填兴趣表时,“校外获奖经历”空着。老周不紧张:空栏目不影响判断,因为关键信息(篮球、数学建模)已经足够。真正需要警惕的是反过来——有些栏目人人都会填,比如“热爱学习”,填了等于没填。
推荐系统里的特征也是这样。标签集合通常很大,但单个物品只拥有极少几个标签;而且泛化词(如“电影”“音乐”)出现在海量物品中,对区分毫无帮助。CB 中经常用 TF-IDF 给标签重新加权,而不是直接用标签频次。
TF-IDF 公式:
老周在班级档案整理会上说:以后画像建模,凡是“热爱学习”这种人人必填的栏目自动降权,“篮球”“建模”这种稀缺标签加权——特征稀疏不可怕,权重设计对了,稀疏本身就能变成信号。
- tf_{t,i}标签 t 在物品 i 的描述文本中出现的次数,代表标签对物品的直接重要度。
- df_t包含标签 t 的物品总数。df 越小,说明标签越稀缺。
- log(N/df_t)逆文档频率。N 是物品总数;若 df 很小,则 IDF 很大,赋予该标签更高的区分度。
- 乘积TF 与 IDF 相乘,既保留局部重要性,又抑制全局泛滥词,得到最终权重。
迁移学习原理
小林转学后第一堂数学课,老周发现他笔记做得又快又好:先抄定理、再记例题、最后用红笔标出易错点。这套方法不是新学校教的,而是他在原来的学校养成的。知识可能有差异,但“整理错题、归纳题型”的能力是通用的。
迁移学习(Transfer Learning)就是要把在源任务上学到的知识——模型参数、表征、学习方法——迁移到目标任务上。对冷启动而言,典型场景是:老用户或老频道积累了丰富的推荐模型,新频道(或新用户群)数据极少,直接用老模型不贴合,从头训练又没数据,于是迁移老模型的经验成为解药。
更进一步,元学习(Meta-Learning)不满足于迁移“某个具体模型”,而是希望学到“如何快速适应新任务”。它的目标是寻找一组元参数 θ,使得在新任务分布上的期望损失最小:
就像小林从旧学校带来的不是某道题的答案,而是一套学习习惯——迁移学习带给新系统的是“快速适应”的本事,而不是某个领域的具体参数。
- 任务分布 p(T)一批结构相似但数据分布不同的任务,例如不同城市频道的推荐排序任务。
- 期望 E对任务分布上的所有任务求平均损失,保证平均效果而非单点最优。
- L_T(f_θ)模型在某个具体任务上的损失,是评价元参数适应能力的标尺。
MAML算法
为什么小林能第一节数学课就跟上进度?因为他长期训练的是“进入状态”的能力:拿到新题目,先审题、定位知识点、套用方法。MAML(Model-Agnostic Meta-Learning)把这种能力参数化:学一组初始参数,让模型面对任何新任务都能通过极少量梯度更新快速适配。
MAML 分内外两层循环。内层循环:对元参数 θ,在某个具体任务 T_i 的支撑集上做一步(或几步)梯度下降,得到任务专属参数 θ'_i,这模拟“新任务上快速学习”。外层循环:利用所有任务上适应后的表现,反向更新元参数 θ,使得“适应后”的损失尽可能小。
两个更新公式如下:
老周把 MAML 比作“练偏科”:内层模拟考试适应,外层根据考试成绩调整学习习惯。转学生带来的不是某科满分,而是“什么都学得会”的学习系统。
- 内层快速适应在任务 T_i 上,用学习率 α 从 θ 出发走一步梯度,得到 θ'_i——就像学霸拿到新题先快速做一遍。
- 外层元更新计算所有任务适应后总损失对 θ 的梯度,用 β 更新 θ,让下一轮适应更快。
- 二阶路径注意到 $\nabla_{\theta}\mathcal{L}(\theta'_i)$ 中 θ'_i 本身依赖 θ,由链式法则会展开出 $\partial\theta'_i/\partial\theta = I - \alpha \partial^2\mathcal{L}/\partial\theta^2$——这就是 MAML 梯度里隐藏的二阶导数来源。
FOML简化
MAML 的二阶导数让很多同学头皮发麻:明明只是想要一套“快速适应”的初始参数,却要算一堆复杂的海森矩阵。老周劝大家别慌,考试时间有限,抄笔记只抓重点也行——这就是 FOML 的思路。
FOML(First-Order MAML,一阶MAML)观察到:在外层元更新时,把 $\partial\theta'_i/\partial\theta$ 近似为单位阵 I,忽略二阶路径的影响,只使用适应后参数的梯度作为元梯度的近似。大量实验证明,在许多冷启动和小样本任务上,一阶近似效果与完整 MAML 几乎一样,而计算开销和显存需求大幅下降。
FOML 的元梯度近似为:
老周给小林的学习建议:别纠结每个公式的二阶展开,先抓住“在新任务上快速适应”这条主线。FOML 就像用关键词记笔记——少记点细节,多抓点主干,考试照样上分。
- 近似条件假设 $\partial\theta'_i / \partial\theta \approx I$,即任务参数随元参数的“扰动”近似直接传导。
- 梯度作用于何处梯度在 θ'_i 处求值,决定了更新的方向和幅度,被当作近似作用于 θ 的元梯度。
- 计算收益省去二阶导数后,每次更新的计算量从 O(d²) 降为 O(d),在模型参数量大时训练速度和显存都有显著优势。
DropoutNet
老周后来发现,班里每个同学的档案都有不同程度的空缺。与其等着档案补齐才敢推荐,他干脆想了个狠招:平时训练时故意把一部分同学的某几项资料藏起来,让分配社团时“手忙脚乱”的模型练出本事——信息不全时也要能判断。
DropoutNet 正是这个思路。普通推荐模型(例如双塔、深度协同过滤)要求输入特征完整,一旦新物品缺颜色、缺类目、缺品牌,模型就会“哑火”。DropoutNet 的做法是:训练时随机把用户或物品特征向量的部分维度置零(或替换为可学习缺失向量),迫使网络见过“缺失输入”;推理时,即使新物品的特征真的缺失,网络仍然能输出合理的嵌入和预测。
用数学描述:设用户特征 p_u、物品特征 q_i,m 是取值 0/1 的掩码向量,DropoutNet 的前向为:
训练损失为:
老周后来对实习生说:别怕数据缺胳膊少腿,你平时就让它“缺着练”,关键时刻它才不慌。DropoutNet 练出的模型,就是那个见过各种“半张表”的老班主任。
- p_u、q_i用户和物品的稠密特征向量,来自 ID 嵌入与内容特征的拼接。
- 掩码向量 m随机生成,元素为 0 表示该特征被丢弃;训练中每个批次 mask 都不同。
- ⊙ 逐元素乘将 mask 应用到特征上,模拟真实冷启动的缺失输入。
- MSE 损失预测与真实评分的平方误差。$|\mathcal{D}|$ 是交互总数,平均损失衡量模型在“缺了特征”的条件下对真实评分的拟合能力。
策略选型总结
老周的抽屉里有三样法宝:兴趣爱好表(CB)、学习方法迁移(MAML/FOML)、盲测训练计划(DropoutNet)。但用哪一样,得看情形。
没有一种策略能包打天下。把三种策略的使用条件列在一起,就能看出它们各自的主场:
| 策略 | 适用条件 | 实战定位 |
| --- | --- | --- |
| 基于内容 CB | 物品有丰富标签/图文特征 | 新品上线当天即可召回 |
| 迁移学习 MAML/FOML | 存在相似源领域与足够任务 | 新频道/新用户群快速适配 |
| DropoutNet | 特征缺失普遍、输入不完整 | 缺失鲁棒的向量召回底座 |
组合策略往往效果更佳。用 CB 解决“没行为”的冷启动,用迁移学习解决“没数据”的冷启动,用 DropoutNet 解决“特征不全”的冷启动,三者叠加即可覆盖大部分业务场景:
老周把三样法宝全放在抽屉里,而不是只挑一件。转学生的档案再空,也逃不出这三张牌的排列组合——这正是冷启动工程的日常。
- 条件一(CB)当新物品上架即有完整标签、用户可主动提供偏好时,特征匹配成本最低、见效最快。
- 条件二(迁移)当已有成熟领域数据和多个相似任务时,元学习产出的适应能力最强。
- 条件三(DropoutNet)当业务特征稀疏且缺失频繁时,缺失鲁棒模型优先。
AI 应用场景
视频平台新品冷启动召回
阶段:召回阶段
解决的问题:新视频上传后没有播放历史,协同过滤找不到相似物品,无法进入任何用户的召回候选。传统做法只能等自然积累播放量,冷启动期曝光极低。CB 方法提取视频标题、标签、封面多模态特征,与用户历史偏好画像做余弦匹配,新视频上线当天即可进入相关用户的信息流。
具体案例:某短视频平台作者上传“如何做手冲咖啡”视频,系统自动抽取“咖啡、手冲、生活技巧”标签,匹配到近一周关注过咖啡器具的用户,零播放历史下首小时获得 2 万次曝光。
新闻App新频道偏好迁移
阶段:排序/建模阶段
解决的问题:新上线城市频道没有行为日志,直接训练排序模型效果差,纯规则兜底又浪费流量。迁移学习与 MAML 将多个成熟城市频道的排序任务视为元训练任务,学一组“快速适应新城市”的元初始化参数;新频道只需几千条日志即可内层几步梯度完成适配。
具体案例:某资讯 App 新开“成都频道”,利用在北京、上海、广州频道上学到的元参数 + 极小样本微调,冷启动期点击率相比随机初始化模型提升 18%。
电商新品特征缺失向量召回
阶段:向量检索/召回阶段
解决的问题:新品常缺品牌、缺类目、缺图片标签,传统双塔模型输入不完整直接“哑火”。DropoutNet 在训练时随机丢弃特征维度,使模型见过各种缺失输入;推理时即使新品只有名称文本,也能产出稳定的 embedding 进入向量召回。
具体案例:某跨境电商大量手工制品上传时未填品牌字段,启用 DropoutNet 后新品 24 小时内进入 ANN 向量检索候选池,冷启动期曝光量翻倍。
Python 演示
import numpy as np def make_data(n_user=50, n_item=20, n_feat=8, seed=42): """生成用户特征、物品特征和稀疏的交互评分""" rng = np.random.default_rng(seed) U = rng.normal(size=(n_user, n_feat)) V = rng.normal(size=(n_item, n_feat)) u_ids, v_ids = np.where(rng.rand(n_user, n_item) < 0.15) scores = np.sum(U[u_ids] * V[v_ids], axis=1) scores += rng.normal(0, 0.1, size=len(u_ids)) return u_ids, v_ids, scores, U, V, rng def train(dropout_rate=0.3, epochs=20, lr=0.05, seed=42): """带输入特征Dropout的双线性模型训练""" u_ids, v_ids, scores, U, V, rng = make_data(seed=seed) n_feat = U.shape[1] W = rng.normal(scale=0.1, size=(n_feat, n_feat)) bias = 0.0 for epoch in range(epochs): total_loss = 0.0 for p in range(len(u_ids)): u, v, target = u_ids[p], v_ids[p], scores[p] fu = U[u].copy() fv = V[v].copy() if dropout_rate > 0: fu = fu * (rng.rand(n_feat) > dropout_rate) fv = fv * (rng.rand(n_feat) > dropout_rate) pred = fu.dot(W).dot(fv) + bias diff = pred - target total_loss += diff * diff W -= lr * diff * np.outer(fu, fv) bias -= lr * diff if epoch % 10 == 0: msg = "epoch " + str(epoch) + " loss " + format(total_loss / len(u_ids), ".4f") print(msg) return W, bias def evaluate(W, bias, dropout_rate=0.3, seed=7): """在特征随机缺失的测试交互上评估模型""" u_ids, v_ids, scores, U, V, rng = make_data(seed=seed) total_loss = 0.0 count = 0 for p in range(len(u_ids)): u, v, target = u_ids[p], v_ids[p], scores[p] fu = U[u] * (rng.rand(U.shape[1]) > dropout_rate) fv = V[v] * (rng.rand(V.shape[1]) > dropout_rate) pred = fu.dot(W).dot(fv) + bias total_loss += (pred - target) ** 2 count += 1 return total_loss / count if __name__ == "__main__": print("training baseline (no dropout):") W0, b0 = train(dropout_rate=0.0) print("training with dropout:") W1, b1 = train(dropout_rate=0.3) print("test loss under missing features:") print("baseline model:", round(evaluate(W0, b0, 0.3), 4)) print("dropout model :", round(evaluate(W1, b1, 0.3), 4))
u_ids, v_ids = np.where(rng.rand(n_user, n_item) < 0.15)构造冷启动的核心:只有 15% 的用户-物品交互被观测。fu = fu * (rng.rand(n_feat) > dropout_rate)训练时随机将部分特征维度置零,这是 DropoutNet 的“故意藏资料”。pred = fu.dot(W).dot(fv) + bias双线性评分函数,模拟深度推荐模型中的特征交互。W -= lr * diff * np.outer(fu, fv)梯度更新:只有未被 mask 的特征维度会产生有效梯度。evaluate(W0, b0, 0.3)测试时同样施加 30% 的特征缺失,对比两个模型在“冷启动缺失”下的泛化能力。
常见误区
误区以为基于内容推荐只对“新物品”有效,因为算法是从物品特征出发的,对“新用户”无能为力。
正解CB 对用户冷启动同样适用,只要用户能提供少量兴趣标签,或通过注册时的必填信息构建初始画像,就能立刻参与相似度匹配。关键的瓶颈是获取初始偏好的渠道设计,而不是 CB 方法本身不能做。
为何常见:容易把“CB 需要用户画像”等同于“需要用户历史行为”,忽略了初始画像可以由用户主动标注获取。
误区以为 MAML 的训练流程和“在大数据上预训练,再到小数据上微调”是一回事。
正解预训练+微调优化的是单个目标任务的损失;MAML 优化的是“快速适应多项任务”的元目标——内层模拟适应、外层更新初始参数。元参数的价值不在于在哪个任务上表现好,而在于任何新任务只要几步梯度就能上手。
为何常见:两者表面相似(都用已有模型初始化新任务),但目标函数和训练流程完全不同,容易混淆。
误区以为 DropoutNet 的作用是做特征补全,即把缺失的字段(比如颜色)预测出来再喂给模型。
正解DropoutNet 不补特征值,它训练时直接把部分特征丢掉,让模型在“缺失条件”下照样输出稳定表示。推理时即使特征真的缺失,模型前向路径完全通畅,不需要先做插补。
为何常见:人们习惯“缺失→填充”的数据处理套路,而 DropoutNet 换了一个思路:让模型去适应缺失,而不是让数据去适应模型。
误区以为三大策略是互斥方案,选了 CB 就不能用 DropoutNet。
正解实际工程中按层次组合:召回层用 CB 做新品兜底,排序层用元学习得到快速适应的排序模型,底层特征层用 DropoutNet 做缺失鲁棒,形成完整冷启动方案。
为何常见:教科书式分类让人以为策略之间是并列的,忽略了它们作用的环节不同,可以叠加。
面试题
Q1. 冷启动问题的本质是什么?
- A.新用户或新物品缺乏交互历史← 正确答案
- B.推荐系统服务器响应延迟过慢
- C.用户填写的资料完全错误
- D.训练数据集规模过于庞大
答案:A。冷启动指新用户或新物品没有历史交互数据,导致协同过滤等依赖行为的算法失效。B 是性能问题,C 是数据质量问题,D 是规模问题,都不属于冷启动的本质。
Q2. 基于内容(CB)推荐的核心依据是?
- A.物品特征与用户偏好画像匹配← 正确答案
- B.用户与用户之间的相似程度
- C.物品在平台中的销量排行
- D.随机抽取物品进行试探推荐
答案:A。CB 的核心是用物品自身特征(标签、类目、文本)和用户画像做匹配,就像班主任拿小林的兴趣表去核对社团标签。B 是协同过滤,C 是热门推荐,D 是随机探索。
Q3. 余弦相似度在CB中的主要作用是什么?
- A.衡量用户画像与商品向量的方向接近度← 正确答案
- B.把高维稀疏特征压缩成稠密向量
- C.将用户按活跃度划分成多个群组
- D.计算两个用户共同购买物品的次数
答案:A。余弦相似度计算两个向量的夹角余弦,值越接近 1 表示方向越一致,这正是“兴趣标签是否同向”的度量。B 是降维/嵌入学习,C 是用户分群,D 是商品共现统计。
Q4. 关于MAML的内层循环,下列说法正确的是?
- A.在具体任务上执行一步或几步梯度下降← 正确答案
- B.需要在该任务的支撑集上计算损失← 正确答案
- C.适应后的参数会用于外层元更新← 正确答案
- D.内层一定会运行上百轮的完整训练
答案:ABC。MAML 内层就是在单个任务的支撑集上走少量梯度步,得到的任务参数 θ'_i 参与外层元更新的损失计算。D 错在“MAML 内层通常只有几步,且'一定'的说法过于绝对”。
Q5. FOML相比完整MAML,主要简化了哪部分?
- A.省略适应参数对初始参数的二阶梯度路径← 正确答案
- B.使用更大的学习率来更新模型的参数
- C.放弃梯度随机搜索来寻找最优元参数
- D.增加更多任务来拟合模型的泛化能力
答案:A。FOML 将 ∂θ'_i/∂θ 近似为单位阵,直接使用适应后参数的梯度做元更新,省去了二阶导数计算。B/C/D 都没有触及 FOML 的本质——它没有改变学习率、搜索方式或任务数量。
Q6. DropoutNet应对冷启动的核心思路是?
- A.训练时故意让输入特征出现部分缺失← 正确答案
- B.将所有缺失特征统一替换为零向量
- C.删除特征不全用户的所有相关记录
- D.只使用热门物品的数据完成模型训练
答案:A。DropoutNet 训练时随机 mask 掉部分特征,让模型见过“缺失输入”这个分布,推理时才能从容应对真实缺失。B 是普通填零/插补思路,且“统一替换”过于僵硬;C 是丢弃数据;D 只学热门物品反而加剧冷启动。
Q7. 冷启动策略组合应用时,下列做法合理的是?
- A.用CB标签匹配解决新物品无交互← 正确答案
- B.用元学习实现跨领域偏好快速迁移← 正确答案
- C.用DropoutNet应对特征缺失场景← 正确答案
- D.只依赖随机推荐等待数据积累
答案:ABC。三大策略分别解决“无行为、无数据、特征不全”三类冷启动问题,组合可以覆盖更多场景。D 完全依赖随机推荐会浪费流量且收敛极慢,不属于合理策略组合。
Q8. TF-IDF中的逆文档频率(IDF)主要作用是?
- A.压低泛化词的权重,突出少而精的标签← 正确答案
- B.把所有标签的权重统一调整为等值
- C.提高高频词的权重以匹配用户兴趣
- D.使用评分数据反向修正标签的权重
答案:A。IDF 用 log(N/df) 让出现物品数越少的标签权重越大,从而抑制“人人都会填”的泛化词。B 说反了方向,C 与 IDF 逻辑相反,D 是监督式特征学习而非 TF-IDF。
Q9. 关于元学习的任务分布与训练,下列正确的是?
- A.每个任务都包含支撑集与查询集← 正确答案
- B.任务分布越接近业务目标效果越好← 正确答案
- C.元训练阶段需要模拟多次适应过程← 正确答案
- D.任务数量越多效果必定会线性提升
答案:ABC。元学习的标准范式是支撑集上适应、查询集上评估;任务分布与真实场景越接近,迁移效果越好;元训练正是反复模拟“适应新任务”来优化元参数。D 的“必定线性提升”过于绝对,任务质量比数量更重要。
Q10. MAML外层元梯度与普通梯度的关键区别是?
- A.包含适应后参数对初始参数的二阶导数信息← 正确答案
- B.完全消除了训练过程中的随机噪声干扰
- C.使用文本描述作为梯度的额外辅助输入
- D.对所有任务梯度直接相加后即完成更新
答案:A。外层梯度 ∇θL(θ'_i) 通过链式法则展开时,θ'_i 对 θ 的依赖会产生二阶导数 ∂²L/∂θ²,这是 MAML 区别于普通梯度的核心。B 与梯度结构无关,C 是跨模态想法,D 只是“MAML 多个任务累加”的表层描述,未触及二阶本质。