01
60 秒回答模板
我会先从标准 ItemCF 讲起:两个物品的相似度通常来自同一批用户的共现,简化看是对所有同时交互过 i 和 j 的用户累加贡献,再除以物品流行度归一项。问题在于普通共现把“同一天连续浏览”和“半年内各买过一次”当成同等证据,也把序列里相邻消费和隔很远的消费当成同等证据。引入时间间隔时,可以在用户 u 对 i、j 的共现贡献上乘一个时间衰减函数,例如 `w_t = exp(-|t_i - t_j| / tau)` 或 `1 / log(2 + |t_i - t_j|)`,时间越近,相似证据越强;时间太远时权重趋近于很小。引入位置间隔时,可以用用户行为序列里的下标距离做衰减,例如 `w_p = 1 / (1 + |pos_i - pos_j|)`,如果要做下一跳推荐,还可以保留方向性,把 i 到 j 和 j 到 i 分开统计。完整贡献可以写成 `sim(i,j) += user_norm(u) * w_t * w_p`,最后再做物品热度归一和相似度截断。工程上要注意会话切分、时间单位、重复行为去重、活跃用户降权、热门物品惩罚和日志时序,避免未来信息泄漏。验证时离线看 Recall@K、HitRate、NDCG、覆盖率、多样性和长尾召回,线上看 CTR、CVR、留存、负反馈和召回延迟。
考点 recommender-system
难度 真实面经题
回答目标 让候选人能把 ItemCF 时序增强讲成一个可落地的召回改造:从共现公式、时间衰减、位置衰减、归一去噪、工程建表到离线和线上验证都说清楚。
02
深入解析
01 基础共现
ItemCF 的核心假设是:如果很多用户都交互过物品 i 和物品 j,那么 i 和 j 可能相似或可替代。朴素相似度会统计用户集合交集,再用物品热度做归一化,避免热门物品和所有物品都显得相似。但朴素共现只知道发生过共同交互,不知道它们在时间上是否接近、在序列里是否相邻,也不知道用户兴趣是否已经漂移。
02 时间衰减
时间间隔权重用于区分近期连续兴趣和长期松散共现。两个行为间隔越短,说明它们更可能属于同一次需求、同一兴趣周期或同一会话,贡献应更大;间隔越长,可能只是用户长期兴趣很宽,贡献应减小。衰减函数可以是指数衰减、对数衰减或按业务时间窗分桶,参数要根据商品生命周期、内容时效性和用户访问频率调节。
03 位置衰减
位置间隔权重利用用户行为序列中的相对距离。相邻浏览、连续点击、加购后购买等行为通常比相隔几十个行为的共现更能表达局部关联。可以用 `1/(1+d)`、指数衰减或窗口截断处理位置距离。如果业务目标是下一步推荐,还可以建有向 ItemCF:用户先看 i 再看 j 贡献给 `i -> j`,而不是简单合并成无向相似。
04 归一与去噪
加入时间和位置权重后,仍然要处理用户活跃度、物品热度和重复行为噪声。重度用户会产生大量物品两两组合,容易污染相似度,可按用户行为数做 `1/log(1+N_u)` 降权。热门物品要继续做流行度归一或惩罚,避免所有候选都指向头部。重复点击可以按会话内去重或保留强度但限幅,防止刷行为或异常日志放大相似度。
05 工程实现
实现时通常按用户序列扫描,在一个时间窗或位置窗内枚举物品对,累加带权共现。窗口不能无限大,否则计算量和噪声都上升。日志要按真实事件时间排序,训练样本要只使用预测时刻之前的行为,避免未来泄漏。最终相似表通常只保留每个物品 topN 相似物,召回时用用户近期行为按行为权重聚合候选,再做去重、过滤和后续排序。
06 效果验证
离线验证不能只看相似度是否变大,要看召回结果是否更接近用户后续真实行为。常用指标包括 Recall@K、HitRate@K、NDCG@K、MRR、覆盖率、长尾占比、多样性和新颖性。线上要看 CTR、CVR、留存、负反馈、冷启动用户表现和召回延迟。还应做消融实验,分别比较无衰减、仅时间衰减、仅位置衰减和二者组合,确认改进来自有效时序信息而不是偶然波动。
03
易错点
- 只说把时间和位置作为特征加进去,没有说明它们如何进入 ItemCF 相似度贡献。
- 把时间越早权重越大或把时间戳绝对值直接参与计算,混淆时间点和时间间隔。
- 忽略用户活跃度和物品热度,导致热门物品、重度用户主导相似表。
- 不做会话或窗口限制,枚举全量历史物品对,计算量大且噪声高。
- 需要下一跳推荐时仍使用无向相似度,丢掉先后顺序信息。
- 离线随机切分训练测试,造成未来行为泄漏,评估结果虚高。
04
面试官追问
时间衰减参数 tau 怎么选?
可以先按业务周期定候选范围,例如新闻内容可能按小时或天,电商耐用品可能按周或月;再用离线验证集搜索 tau,看 Recall@K、NDCG 和覆盖率的变化。上线前最好做分桶分析,确认短周期用户和长决策周期用户不会被同一个衰减参数同时伤害。
位置间隔和时间间隔会不会重复表达同一件事?
二者相关但不等价。时间近不代表序列相邻,例如用户一天内浏览很多内容;序列相邻也可能跨很长时间,例如低频用户两次访问间隔很久。时间权重表达兴趣周期,位置权重表达行为上下文距离,实际可以组合使用,并通过消融验证增量价值。
为什么要对活跃用户降权?
活跃用户交互物品多,会产生大量物品对,如果不降权,他们的广泛兴趣会让很多不相关物品产生共现。按用户行为数做对数或平方根降权,可以让每个用户对相似表的总贡献更均衡,减少重度用户噪声。
如果加入时序权重后覆盖率下降怎么办?
说明模型更偏向短期强关联,可能牺牲了长尾和探索。可以降低衰减强度、保留多路召回、对长尾物品单独放宽阈值,或在召回融合阶段设置覆盖和多样性约束。最终要看业务目标,如果 CTR 提升但长期多样性变差,也不能简单全量替换。