想象一家神秘的私房菜馆,老板想给每位食客推荐合口味的菜。最笨的办法是问朋友:“你朋友爱吃什么,你大概也爱吃什么。”可朋友也有盲区——一道刚推出的新菜,谁都没尝过,问谁都没答案。老板换了个思路:不给食客贴标签,也不给菜分菜系,而是给每个人一份看不见的“口味密码”,给每道菜一份看不见的“风味密码”。两份密码逐格相乘再相加,得分越高,说明这道菜越可能让这位食客满意。这套“密码匹配”的思想,就是 LFM 隐语义模型。它把推荐问题变成学习问题:从海量“谁吃了什么、打了几分”的交互记录里,自动反推出双方的密码表——也就是隐向量。密码表怎么初始化、怎么定长短、怎么防止密码飘得太极端、怎么一遍遍微调,正是本文要讲的核心。全文会从 UserCF 的瓶颈讲起,依次拆解打分方程、隐因子维度、负样本采样、正则化与梯度下降,最后对比选型思路和工程落地要点。

岗位关联

掌握 LFM 是从“按规则统计相似度”跃升到“学习隐表示”的分水岭,是理解矩阵分解、双塔召回、深度学习推荐架构的必经之路,也是推荐系统岗位面试的高频核心考点。

目录
  1. 可视化演示
  2. UserCF 之困:为什么需要隐向量
  3. 打分方程:两份密码怎么对碰
  4. 维度选择:密码本几页最合适
  5. 负样本采样:没吃过不等于不爱吃
  6. 损失与正则:纠错与约束的平衡
  7. 梯度下降:一次试吃一次微调
  8. 算法对比:抄作业还是密码匹配
  9. 工程实践:让密码本上线
  10. AI 应用场景
  11. Python 演示
  12. 常见误区
  13. 面试题

可视化演示

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

隐向量内积预测 用户p_u和物品q_i隐向量 内积越大偏好越高 偏好 = p_u · q_i = Σp_k·q_k 用向量内积预测用户兴趣

UserCF 之困:为什么需要隐向量

小镇饭馆的老板想推荐菜,最稳妥的招数是问“你朋友最近爱吃什么”——口味相近的人,喜好往往相通,这正是 UserCF 的智慧。可当饭馆升级成连锁大酒楼,每天新增上百道创新菜,朋友自己都还没尝过,这招就失灵了;更麻烦的是,菜单三天两头换,连“哪道菜跟哪道菜相似”这份底账都来不及记。

UserCF 和 ItemCF 的致命短板在于:它们需要在离线阶段维护用户-用户或物品-物品的相似度矩阵。物品一旦新增或更新,矩阵就要重算。新闻资讯、短视频这类场景,物品量动辄千万、更新以秒计,相似度矩阵根本追不上内容变化的速度。

LFM 换了一条路:不比较相似度,而是把用户和物品分别表示成 K 维隐向量——用户向量 $\mathbf{p}_u$ 记录他在 K 个“说不清的维度”上的偏好强度,物品向量 $\mathbf{q}_i$ 记录物品在这 K 个维度上的属性强度。把整个评分矩阵拆成两个低秩矩阵的乘积,就是矩阵分解。训练完成后,任何用户-物品对的偏好都可由两个向量直接算出,新增物品只需学一个向量,不必重算全局相似度。

所以大酒楼的老板最终放弃了“问朋友”,改成给每位食客一份口味密码、每道菜一份风味密码。新菜上桌,当场补一份密码即可;食客进门,直接拿两份密码对一对就知道合不合口。

打分方程:两份密码怎么对碰

口味密码表怎么用?假设密码表只有甜、辣、鲜三个维度。你的偏好是甜 0.9、辣 0.2、鲜 0.6;一道凉皮的属性是甜 0.1、辣 0.8、鲜 0.5。把对应维度相乘再求和:$0.9 \times 0.1 + 0.2 \times 0.8 + 0.6 \times 0.5 = 0.55$。这个分数就是你对凉皮的预测偏好。

在数学上,用户的 K 维隐向量记为 $\mathbf{p}_u$,物品的 K 维隐向量记为 $\mathbf{q}_i$,两者的内积就是预测评分。内积大,说明用户的偏好方向与物品的属性方向高度重合;内积小甚至为负,则说明两者不太合拍。

一条菜谱和一张食客档案逐个位点对碰,乘积越大说明这个位点越合拍;把 K 个位点的“火花”汇总,就是这顿饭的匹配总分。训练的本质,就是不断调整这两份密码,让算出的分数与食客真实的满意程度越来越一致。

r^ui=pu⊤qi=∑k=1Kpuk×qik\hat{r}_{ui} = \mathbf{p}_u^{\top} \mathbf{q}_i = \displaystyle\sum_{k=1}^{K} p_{uk} \times q_{ik}
用户密码与物品密码在 K 个位点上逐一相乘再求和,得到的就是“匹配度”分数,越高代表越可能喜欢。
  1. 隐因子位点 k每个维度 k 称为一个隐因子,它没有显式名字,是模型自动学出来的“口味位点”,可能对应一种口味、一种风格、一种说不清的调性。
    k=1,2,…,Kk = 1, 2, \dots, K
  2. 用户偏好分量 $p_{uk}$用户 u 在第 k 个隐因子上的强度,正值表示偏好,负值表示排斥。
    puk∈Rp_{uk} \in \mathbb{R}
  3. 物品属性分量 $q_{ik}$物品 i 在第 k 个隐因子上的含量,表达这道菜在这个位点上的“浓度”。
    qik∈Rq_{ik} \in \mathbb{R}
  4. K 项求和把每个位点的乘积加总,体现“多个维度上的整体合拍程度”。
    r^ui=∑k=1Kpuk×qik\hat{r}_{ui} = \sum_{k=1}^{K} p_{uk} \times q_{ik}

维度选择:密码本几页最合适

密码表该设几个位点?只设“甜、辣”两个维度太粗——麻、香、脆都没法表达;设 50 个维度又太细——很多位点只是噪声,反而把刻板印象记死。K 是 LFM 最重要的超参数,它决定了模型的表达能力。

K 太小,隐向量装不下用户和物品的丰富特征,表现为欠拟合:训练集和验证集上的误差都偏高。K 太大,向量有足够自由度去记住训练数据里的特殊样本和偶然噪声,表现为过拟合:训练误差一路走低,验证误差却反弹。只有 K 落在合适区间,模型才能抓住“普遍的味型规律”而不是“个别人的怪癖”。

实践中 K 通常取 10 到 50。选择方法多用交叉验证:把交互数据分成训练集和验证集,观察不同 K 下验证集误差的变化,取误差最低点附近的值。对数据量大的平台,K 可以适度调大;对数据稀疏的小场景,K 要保守一些,否则很容易被少数样本带偏。

位点太少看不清口味,位点太多记住的是碎碎念。选一个刚好能表达主要味型又不纠结细节的维度数,才能让密码表既通用又精准。这也是“奥卡姆剃刀”在推荐系统里的体现——不过度复杂,够用就好。

负样本采样:没吃过不等于不爱吃

食客没点过一道菜,就一定讨厌它吗?很可能只是这道菜没被端上过桌,或者那天恰好饱了。如果直接把“没点过”当成“不喜欢”,会让密码表产生严重偏差。推荐系统里有个专门的说法叫“曝光偏差”:只有被展示过的物品,我们才能从用户的反应里读到真实态度。

LFM 的训练数据需要同时有正样本(用户交互过且反馈为正)和负样本(用户反馈为负)。但“未交互”是大量灰色地带,不能全部当作负样本,必须采样。基础做法是从用户没有行为的物品中随机抽取一部分作为负样本;更精细的做法是考虑流行度:如果某道热门菜被展示给了用户、用户却没点,那比随机一道冷门菜更能说明不喜欢,应优先采为负样本。

采样时还要控制负正样本比例,常见 1:1 到 3:1;对行为很少的用户,要适当降低采样压力甚至减少采样量,避免把“没机会尝”误判为“不喜欢”;对行为很多的用户,可适当增加负样本,让模型见过更多“明确拒绝”的案例。样本构造的质量,往往比模型公式本身更影响最终效果。

负采样就像餐厅在对食客下结论前,先确认“这道菜确实上过桌、他看到了却没点”,才敢写进密码表。没上过桌的菜,保持沉默。多一份谨慎,少一份对食客口味的误读。

损失与正则:纠错与约束的平衡

密码表训练的本质是“纠错”。每次预测和真实反馈之间出现偏差,都该把这笔账分摊到用户向量和物品向量头上。但纠错不能没有约束——如果为了迎合某个样本把“爱吃甜”改成“嗜糖如命”,下次遇到别的菜就全乱套了。这就是损失函数与正则化要联手解决的问题。

LFM 最常用的损失由两部分组成:平方误差项衡量预测与真实反馈的差距,L2 正则项惩罚过大的向量分量。两者按 $\lambda$ 系数加权,形成“既要预测准,又要向量稳”的双重目标。

$\lambda$ 就像餐厅的菜谱规范手册——不能为了讨好某一位客人把菜做成极端口味,所有密码都要保持在合理的区间内。适度的正则化让密码表在见过更多食客后依然保持普适性,而不是变成某个人的专属菜单。

L=∑(u,i)∈Train(rui−pu⊤qi)2+λ(∑u∥pu∥2+∑i∥qi∥2)\mathcal{L} = \sum_{(u,i) \in \text{Train}} \left( r_{ui} - \mathbf{p}_u^{\top} \mathbf{q}_i \right)^{2} + \lambda \left( \sum_{u} \left\| \mathbf{p}_u \right\|^{2} + \sum_{i} \left\| \mathbf{q}_i \right\|^{2} \right)
误差项负责让预测值靠近真实值,正则项负责不让任何一份密码走向极端,$\lambda$ 是两者之间的天平砝码。
  1. 平方误差项真实评分 $r_{ui}$ 与预测内积之差的平方,偏差越大惩罚越重。
    (rui−pu⊤qi)2\left( r_{ui} - \mathbf{p}_u^{\top} \mathbf{q}_i \right)^{2}
  2. 全样本求和把所有训练样本的误差累加,得到整个模型的“总欠账”。
    ∑(u,i)∈Train(⋅)\sum_{(u,i) \in \text{Train}} \left( \cdot \right)
  3. L2 正则项对用户向量和物品向量的分量平方求和,向量越长,惩罚越大。
    λ(∑u∥pu∥2+∑i∥qi∥2)\lambda \left( \sum_{u} \left\| \mathbf{p}_u \right\|^{2} + \sum_{i} \left\| \mathbf{q}_i \right\|^{2} \right)
  4. 正则系数 $\lambda$控制“约束强度”,$\lambda$ 大则向量被压得更小、更保守,$\lambda$ 小则模型更自由、更容易过拟合。
    λ>0\lambda > 0

梯度下降:一次试吃一次微调

密码表的修正不能等集齐所有客人的反馈再动手——那样太慢。更聪明的办法是:来一位客人试一道菜,当场根据这次满意程度微调双方的密码。这就是随机梯度下降(SGD)的哲学:用单个样本的误差驱动参数更新。

每次取一个训练样本 $(u, i, r)$,计算预测误差 $e_{ui} = r_{ui} - \hat{r}_{ui}$,这个误差就是“这次合不合口”的信号。然后分别对用户向量和物品向量求梯度,沿着误差减小的方向迈一小步。更新规则如下。

物品向量的更新完全对称,同一个误差信号也会回传给物品:

每一次试吃就是一次微调:发现偏甜就降一点甜位,偏淡就补一点鲜味。道理朴素,但百万次微调下来,密码表就越来越贴合真实世界里的口味规律。这就是梯度下降的魔力——用最简单的小步修正,收敛出复杂的隐式偏好。

pu←pu+η(2euiqi−2λpu)\mathbf{p}_u \leftarrow \mathbf{p}_u + \eta \left( 2 e_{ui} \mathbf{q}_i - 2 \lambda \mathbf{p}_u \right)
用户密码顺着“物品密码的方向”调整:若预测偏高就减弱重合位点,偏低就增强重合位点,同时被正则项温和地拉回原点。
  1. 对称的梯度误差对 $\mathbf{q}_i$ 的梯度是 $2 e_{ui} \mathbf{p}_u$,方向与用户向量一致。
    2euipu2 e_{ui} \mathbf{p}_u
  2. 正则约束同样用 $-2\lambda\mathbf{q}_i$ 防止物品密码膨胀。
    −2λqi- 2 \lambda \mathbf{q}_i
  3. 同步更新一次试吃同时微调食客档案与菜品档案,两份密码协同进化。
    pu,qi 同步更新\mathbf{p}_u, \mathbf{q}_i \text{ 同步更新}

算法对比:抄作业还是密码匹配

抄作业(UserCF)和密码匹配(LFM)哪个更好?没有绝对答案,全看场景。UserCF 的核心假设是“相似的人喜好相似”,它维护的是用户间的关系;LFM 的核心假设是“用户偏好与物品属性可以向量化”,它学习的是隐空间里的匹配关系。

UserCF 的优势在于实时性和可解释性:用户产生新行为后,可以立即根据相似用户的偏好刷新推荐,而且能给出“和你口味相近的人还喜欢……”这类社交向解释。但它的硬伤是物品更新快时相似度矩阵来不及维护。LFM 的优势在于表达能力更强、离线评测精度通常更高,能捕捉到 UserCF 难以表达的隐性关联,但它需要离线训练,新物品、新用户出现后无法立即生效,解释性也弱。

选型建议很清晰:社交属性强、用户稀疏的小社区,UserCF 更自然;物品海量更新快的资讯、短视频、电商大平台,LFM 家族(矩阵分解、FM、双塔)更占优势。真实工业系统里两者并非互斥——常用 LFM 做召回层,从千万物品里筛出几百个候选,再用重模型精排,UserCF 的信号则作为特征或解释依据融入其中。

抄作业适合小圈子,密码匹配适合大饭馆。规模上来以后,精准餐厅靠的不是挨个问朋友,而是用一份份经过千锤百炼的密码本,在毫秒级的时间内完成“端到桌”的匹配。

工程实践:让密码本上线

密码本写完只是第一步,真正上线要解决“怎么印刷、怎么分发、新客人怎么办”等一系列问题。LFM 的工程链路可以拆成四段:离线训练、结果入库、在线服务、增量更新。

离线训练阶段,先做数据清洗和样本构造(正样本取真实交互,负样本按采样策略生成),然后训练得到用户隐向量矩阵和物品隐向量矩阵。结果入库阶段,把两个矩阵写入向量数据库或内存索引,供线上服务读取。在线服务阶段,收到用户请求后读取该用户的隐向量,与全部物品向量做内积计算,取 Top-K 作为召回结果交给下游排序。增量更新阶段,按天或按周重训模型,用新增交互数据修正向量,让密码本跟上口味变化。

冷启动是工程上绕不开的坑:新用户没有历史行为,可以用默认向量或基于注册画像的向量初始化;新物品没有交互记录,可以用标题、图片、类目等内容的向量作为初值。效果评估上,离线看 HR、Recall、NDCG 等召回指标,在线做 A/B 实验关注 CTR、转化率、人均时长等业务指标,两边结合才能判断模型真实收益。

密码本要定期校订,新菜要补录入,新客人要建初始档案。一个能落地的推荐系统,拼的不只是模型公式本身,更是整套“档案管理”功夫——数据、训练、服务、监控缺一不可。

AI 应用场景

电商平台的高潜商品召回

阶段:召回阶段

解决的问题:电商平台商品动辄千万级,UserCF 的相似度矩阵难以随上新实时更新;传统热门推荐又忽略个性化。LFM 用隐向量把“用户-商品”交互压缩成低维匹配关系,离线训练后可在毫秒级完成全量商品的内积打分,筛出用户可能感兴趣的高潜商品。

具体案例:某服饰电商平台每天上新 20 万款商品,工程团队用过去 90 天的点击、加购、购买记录训练 LFM,隐因子数取 32。每晚增量训练一次,把用户向量和商品向量写入向量库;线上请求时对用户向量做内积 Top-200 召回,再交给精排模型。上线后召回商品的点击率较热门召回提升 23%。

短视频资讯流的兴趣预筛

阶段:召回与粗排阶段

解决的问题:短视频场景物品更新极快,用户兴趣也随热点漂移。LFM 把每个用户和每支视频映射到同一隐空间,内积反映兴趣匹配度,适合在第一轮粗筛中快速过滤掉绝大多数不相关内容。

具体案例:某资讯 App 的推荐链路中,LFM 作为召回通道之一,输入用户对视频的完播、点赞、负反馈等信号做样本加权训练。系统每 6 小时增量更新一次用户向量,保证兴趣不落后于热点;视频侧用内容标签初始化新视频向量,解决冷启动。该通道贡献了整体曝光中 35% 的召回来源。

长视频平台的付费倾向预测

阶段:兴趣建模与用户分群

解决的问题:长视频平台关心用户是否愿意为某部剧付费。LFM 学到的隐向量既是打分工具,也是兴趣画像:对隐向量做聚类,可以分出“悬疑推理控”“甜宠剧爱好者”等可解释群体,为运营投放和版权采买提供依据。

具体案例:某视频平台用 LFM 对用户-剧集观看时长建模,隐向量维数取 20,训练后对每个用户输出 20 维兴趣向量。运营团队对这些向量做 K-Means 聚类,产出 8 个兴趣族群,定向推送对应品类的会员试看活动,付费转化率较无差别推送提升 41%。

Python 演示

python68 行
# LFM 隐语义模型演示:用内积学习用户对物品的偏好import random  def build_samples(ratings, user_items, n_neg=2, seed=42):    # 正样本来自评分,负样本从用户未交互物品中采样    rng = random.Random(seed)    samples = []    n_items = len(ratings[0])    for u, items in user_items.items():        for i, r in items:            samples.append((u, i, r))        interacted = {x[0] for x in items}        candidates = [i for i in range(n_items) if i not in interacted]        for i in rng.sample(candidates, min(n_neg, len(candidates))):            samples.append((u, i, 0))    return samples  class LFM:    def __init__(self, n_users, n_items, k=3, lr=0.02, reg=0.02, epochs=15):        # k 是隐因子个数,即口味密码的位点数        self.k = k        self.lr = lr        self.reg = reg        self.epochs = epochs        self.p_vec = [[0.1 * random.uniform(-1, 1) for _ in range(k)]                      for _ in range(n_users)]        self.q_mat = [[0.1 * random.uniform(-1, 1) for _ in range(k)]                      for _ in range(n_items)]     def predict(self, u, i):        # 内积:两份密码逐位相乘再求和        return sum(self.p_vec[u][t] * self.q_mat[i][t]                   for t in range(self.k))     def fit(self, samples):        for epoch in range(self.epochs):            total = 0.0            for u, i, r in samples:                err = r - self.predict(u, i)                p_u, q_i = self.p_vec[u], self.q_mat[i]                for t in range(self.k):                    old_p = p_u[t]                    p_u[t] += self.lr * (2 * err * q_i[t]                                         - 2 * self.reg * p_u[t])                    q_i[t] += self.lr * (2 * err * old_p                                         - 2 * self.reg * q_i[t])                total += err * err            if epoch % 5 == 0:                print("epoch {} loss {:.4f}".format(epoch, total / len(samples)))  if __name__ == "__main__":    # 评分矩阵:0 表示未交互,不作为正样本    ratings = [        [5, 3, 0, 1],        [4, 0, 0, 1],        [1, 1, 0, 5],        [1, 0, 0, 4],    ]    user_items = {u: [(i, r) for i, r in enumerate(row) if r > 0]                  for u, row in enumerate(ratings)}    samples = build_samples(ratings, user_items, n_neg=2)    model = LFM(n_users=4, n_items=4, k=2, lr=0.02)    model.fit(samples)    print("pred u0-i2 {:.2f}".format(model.predict(0, 2)))    print("pred u2-i3 {:.2f}".format(model.predict(2, 3)))
目的:用纯 Python 实现 LFM 的负采样、随机梯度下降训练与内积预测,演示隐向量从随机初始化到拟合真实评分的过程。
  1. rng.sample(candidates, min(n_neg, len(candidates)))从用户未交互的物品中随机抽取负样本,避免把全部未交互当不喜欢
  2. self.p_vec = [[0.1 * random.uniform(-1, 1) ...]]用户隐向量随机初始化,小数值防止初始内积过大
  3. err = r - self.predict(u, i)计算预测误差,作为梯度下降的驱动信号
  4. p_u[t] += self.lr * (...)更新用户向量第 t 个隐因子,误差大的维度修正幅度也大
  5. q_i[t] += self.lr * (...)同步更新物品向量,注意用 old_p 保证同步更新语义
  6. total += err * err累计平方误差,观察损失随训练轮次下降

常见误区

误区用户没点过的菜直接标成不喜欢,负样本越多越好。训练时把全量未交互物品都当负样本,模型表现却一塌糊涂。

正解没吃过不等于不爱吃,可能是没被曝光、下架了或者时机不对。全量当负样本会把大量“未曝光”误判为“不喜欢”,让口味密码严重失真。实践要采样:从用户无行为的物品里抽一部分,热门且无行为的物品优先——曝光过却没点,更能说明不喜欢;同时控制负正样本比例,通常 1:1 到 3:1。

为何常见:监督学习天然需要正负两类样本,新手最容易想到的负样本来源就是“剩下的全是负例”,忽略了推荐场景里曝光偏差这一关键事实。

误区隐因子就是越细越好,K 设到几百个,密码本记住所有细节,推荐肯定更准。

正解K 过大会让向量有足够的自由度去记住训练数据里的偶然噪声,在验证集上表现为过拟合;K 过小则表达力不足,欠拟合。常用 K 在 10 到 50 之间,实际应通过验证集误差曲线来选择,而不是一味求大。

为何常见:直觉上“维度越多信息越多”,忽略了模型容量要和数据量匹配,数据里的偶然噪声也会被当成规律学进去。

误区LFM 精度更高,学了它之后 UserCF 和 ItemCF 就没用了。

正解几类算法各有适用场景。UserCF 强调社交一致性,可解释性强、更新实时;ItemCF 在物品相对稳定的电商场景简单有效;LFM 适合物品海量、更新快的资讯视频场景,但需要离线训练,实时性弱,还要处理冷启动。真实系统经常用 LFM 做召回,再用其他模型精排。

为何常见:看完对比文章容易产生“新算法碾压旧算法”的错觉,忽略了工程里场景、时延、可解释性等多维权衡。

误区LFM 模型训练完部署上线就完事了,反正用户兴趣和物品池不会大变。

正解用户兴趣会漂移,物品池也在变化,长期不更新的隐向量会逐渐失去准确性。工程上需要按天或按周增量训练重训,新物品用内容特征初始化向量,新用户用默认向量或画像冷启动,并且持续用离线指标和在线 A/B 实验监控模型效果。

为何常见:课程和 demo 往往只展示“训练-预测”两步,掩盖了生产系统里“监控-更新-再训练”的循环常态。

面试题

Q1. LFM 预测用户对物品偏好分数,核心计算方式是什么?

单选题 · easy

  • A.余弦相似度
  • B.向量内积← 正确答案
  • C.欧氏距离
  • D.皮尔逊系数

答案:B。LFM 把用户和物品映射为隐向量,预测分数就是两个向量的内积,逐维相乘再求和。余弦相似度和皮尔逊系数都涉及归一化或去均值,并不是 LFM 的计分方式。

Q2. LFM 中的“隐因子”本质是什么?

单选题 · easy

  • A.显式类别标签
  • B.低维向量抽象← 正确答案
  • C.物品分类体系
  • D.用户注册画像

答案:B。隐因子是模型从数据里自动学出的低维抽象表示,没有显式名字,可能对应某种说不清的“口味位点”。它不是人工设定的类别标签,也不等于用户注册画像。

Q3. LFM 训练时负样本通常从哪里采样?

单选题 · mid

  • A.用户所有未交互物品
  • B.无行为物品中采样← 正确答案
  • C.随机生成的虚假数据
  • D.评分最高的物品集合

答案:B。负样本从用户没有行为的物品中按策略采样,热门且无行为的物品优先,而不是全量使用或随机造假数据。直接把全部未交互物品当负样本会引入曝光偏差。

Q4. 损失函数中加入 L2 正则项的主要作用是什么?

单选题 · mid

  • A.加快训练收敛
  • B.防止模型过拟合← 正确答案
  • C.增加隐因子数量
  • D.消除全部预测误差

答案:B。L2 正则惩罚过大的向量分量,把密码向量的“极端值”拉回原点附近的合理区间,从而防止模型过度拟合训练数据中的偶然噪声。它不会加快收敛,也不会增加维度或消除误差。

Q5. 相对 UserCF,LFM 的主要局限是什么?

单选题 · hard

  • A.精度相对偏低
  • B.训练耗时难实时← 正确答案
  • C.无法个性化推荐
  • D.依赖相似度计算

答案:B。LFM 需要离线训练整组隐向量,新物品新用户出现后无法立即纳入推荐,实时性弱于 UserCF。它本身精度高、可个性化,核心思想也不是靠相似度,而是向量匹配。

Q6. 隐因子数 K 取值过大会出现什么问题?

单选题 · mid

  • A.计算速度变快
  • B.容易导致过拟合← 正确答案
  • C.对模型无影响
  • D.精度必然提升

答案:B。K 过大会给向量太多自由度,模型会记住训练数据里的噪声细节,在验证集上表现为过拟合。计算量通常也变大,精度不一定提升,反而可能下降。

Q7. 新闻推荐场景中,LFM 相对 UserCF 更占优势的主要原因是什么?

单选题 · easy

  • A.用户活跃度低
  • B.物品更新太快← 正确答案
  • C.训练数据太少
  • D.评分数据丰富

答案:B。新闻资讯类物品更新极快,UserCF 依赖的相似度矩阵来不及重算,而 LFM 训练预测不依赖全局相似度,新物品只需学一个向量即可参与推荐。

Q8. 下列哪些是 LFM 训练中的常见超参数?

多选题 · mid

  • A.学习率大小← 正确答案
  • B.正则化系数← 正确答案
  • C.隐因子个数 K← 正确答案
  • D.近邻个数 N

答案:ABC。学习率 $\eta$ 控制梯度下降步幅,正则系数 $\lambda$ 控制向量约束强度,K 决定隐向量维度,三者都是 LFM 的核心超参数。近邻个数 N 是 UserCF/ItemCF 的概念。

Q9. 关于 LFM 负样本采样,下列说法正确的有哪些?

多选题 · hard

  • A.负样本采样数量越多越好
  • B.热门且未行为的物品优先← 正确答案
  • C.只采样评分最低的物品
  • D.负正样本保持合理比例← 正确答案

答案:BD。负样本并非越多越好,过多的负样本会掩盖真实偏好信号。热门且用户未行为的物品更可能代表真实不喜欢,应优先采样;负正样本比例通常控制在 1:1 到 3:1。

Q10. 关于 LFM 的随机梯度下降训练过程,下列说法正确的有哪些?

多选题 · hard

  • A.用 SGD 逐个样本更新← 正确答案
  • B.每次迭代需计算全量梯度
  • C.预测误差驱动向量修正← 正确答案
  • D.参数只更新用户向量

答案:AC。LFM 采用随机梯度下降,每取一个样本就计算误差并同步修正用户向量和物品向量。全量梯度是批梯度下降的特征;“只更新用户向量”也不对,两个向量是协同更新的。