推荐系统做了几年,从最早的规则匹配到后来的深度模型,最深的体会是:个性化算法本身不是最难的,难的是搞清楚每个算法在什么场景下真正有效,以及用一套靠谱的评估体系去判断它到底有没有变好。这个领域信息量很大,网上资料也杂,很多新人一上来就扎进模型结构里,结果离线指标涨了,线上业务数据却没动静,甚至下滑。这篇内容我会围绕个性化算法的选型思路和效果评估体系展开,把我在实际项目中踩过的坑、验证过的方法、以及沉淀下来的判断标准一次性讲清楚。
我会分成几个部分来聊:先讲清楚推荐系统整体设计和算法选型的底层逻辑,再聚焦协同过滤、矩阵分解、深度模型这几条主流路线的适用场景与实现细节,然后花大篇幅拆解离线评估和线上评估的指标体系,最后用真实案例复盘几个典型的“模型效果好但业务没增长”的问题,给出可直接落地的排查方法。
1. 推荐系统的整体设计思路与算法选型逻辑
1.1 先别急着上模型,把推荐目标和业务场景对齐
很多团队做推荐系统,第一步就去选模型、调参、跑离线实验,这其实顺序反了。推荐系统的核心不是模型,而是“在正确的时间、正确的位置,把用户当下最需要的内容推到他面前”。这个“最需要”的定义,不同业务完全不一样。
举个例子。同样是信息流推荐,短视频场景更看重用户停留时长和完播率,图文资讯场景则更看重阅读深度和分享率,电商场景看的是点击到支付的全链路转化。如果在短视频场景里套用电商那套以GMV为目标的排序逻辑,短期的点击率和转化率可能不错,但用户很快会疲劳,留存和时长都会掉下来。所以我做项目的第一步永远是拉着产品和运营一起把推荐目标量化,比如“在保证次留不低于某基线的前提下,把人均观看时长提升5%”。
目标定清楚之后,再来看数据基础。推荐系统依赖的数据主要分三类:用户画像数据(年龄、性别、地域、兴趣标签等)、物品内容数据(类目、标签、文本、图片等)、用户行为数据(曝光、点击、收藏、下单、时长等)。其中行为数据是最核心的,尤其是“正反馈行为和负反馈行为要分开定义”。很多团队把点击当作正反馈,但在视频场景里,点击之后2秒就关闭的视频,本质上是负反馈;在电商场景里,点击了但很快返回搜索页的商品,也可能意味着“不感兴趣”。如果这些信号不处理干净,后面所有算法和评估都会失真。
有些内容创作者会问:为什么我辛辛苦苦做的内容,系统就是不推荐?这背后往往是推荐目标与内容价值的错位。如果你的内容完播率、互动率都不差,但系统依然不给量,原因大概率不是你被限流,而是你的内容标签与推荐系统分配流量时锁定的用户群体没有形成正向匹配。反过来看,这也是推荐算法冷启动阶段常见的“探索不足”问题,后面我会专门讲。
1.2 主流个性化算法路线对比:从规则到深度模型
算法选型不是越新越好,而是越合适越好。我习惯先把候选方案分成几个层级,再根据团队技术储备和业务阶段来做取舍。
规则与统计方法是最基础的,比如“看过A商品的用户,把同类目下销量最高的商品推给他”,本质上就是TopN统计加简单关联。这类方法在数据很少、推荐场景比较单一的时候完全够用,冷启动也能顶一阵子。优点是实现快、解释性强,缺点是几乎谈不上个性化,精度上限很低。
协同过滤是真正意义上的个性化算法起点,核心思路是“物以类聚、人以群分”。它只依赖用户与物品之间的交互行为矩阵,不需要内容特征,也不用用户画像,这在早期很讨巧。主要分UserCF(找相似用户,把相似用户喜欢的物品推给你)和ItemCF(找相似物品,把你喜欢物品的相似物品推给你)。在实际项目里,ItemCF的稳定性通常好于UserCF,因为物品之间的关系变化比用户兴趣变化慢,计算成本也可控。关于这两个算法我在第2部分会详细展开。
矩阵分解是协同过滤的进阶形态,代表作是SVD和ALS。核心思路是把用户-物品交互矩阵分解成两个低维稠密矩阵,一个代表用户隐因子,一个代表物品隐因子,然后通过向量内积来预测兴趣。相比KNN式的协同过滤,矩阵分解解决了两个问题:一是泛化能力强,不会只依赖局部邻居;二是可以做隐特征的自动学习,不需要人工设计特征。很多工业级系统至今仍用ALS作为baseline模型。
树模型与LR是特征工程时代的王者。在深度模型还没全面普及之前,GBDT+LR的组合几乎是工业界的标配,我也用这套方案支撑过千万级用户的内容推荐。它的逻辑很清楚:GBDT负责自动挖掘高阶非线性特征组合,输出离散化的特征向量,拼上原始特征后丢给LR做排序。优势是可解释性强、训练成本低、对特征加工的要求没那么苛刻。
深度模型是目前的主流,代表结构包括Wide & Deep、DeepFM、DIN等。它最大的变化是把用户行为序列、物品内容(文本、图像)等非结构化数据直接引入模型,通过学习得到更高阶的表达。效果上限高,但工程复杂度也最高,需要维护特征管道、模型训练和线上推理的一致性,否则极容易翻车。
我给团队的建议是,按项目阶段来选择,不要一上来就上深度模型。刚起步、数据量在百万量级时,一个调好的ItemCF或者ALS往往就能跑出不错的效果;数据到了千万量级且特征工程已经做得比较充分时,再考虑GBDT+LR过渡;当你有专门的数据工程师和算法工程师维护特征管道和推理服务时,再上DeepFM或DIN这类深度排序模型。
1.3 混合推荐:企业级场景的常规解法
单一算法都有明显短板,所以工业界几乎不会只跑一个模型,而是用混合推荐策略。我常用的混合方式有三种:加权式、级联式和分流式。
加权式最简单,就是把多个算法的推荐结果按不同权重合并,比如50%来自ItemCF,30%来自矩阵分解,20%来自热门兜底。权重可以根据线上效果动态调节。级联式则是把推荐过程拆成多级漏斗:先由召回层从全量物品里捞出几百个候选,再由粗排层过滤到几十个,最后精排层输出最终的几十条结果。这个架构在大型系统里非常常用,每层用不同复杂度的模型,把计算成本和效果做到平衡。分流式则是让不同模型分桶使用,比如10%流量跑新模型做在线对比,90%跑老模型保证稳定。
混合推荐的工程意义不单单是效果好,更关键的是风险可控。新模型上线时,不会因为某些边界case把整个推荐系统带崩,可以把影响范围控制在一个桶里。
2. 核心细节解析与实操要点
2.1 ItemCF与Item推荐的实现细节与适用边界
ItemCF是实践中性价比最高、也最容易被理解的一个算法。它的实现流程可以概括为三步。
第一步构建共现矩阵。用户对物品产生过行为(点击、收藏、下单、观看等),就认为两者之间存在关联。统计物品两两之间共同出现的次数,系数越高代表相关性越强。这里有一个关键细节:要不要惩罚热门物品?如果不做处理,热门物品会和几乎所有物品产生共现,导致推荐结果趋同于热门榜,个性化基本失效。标准的做法是引入惩罚系数,类似TF-IDF的思想,比如:
w(i,j) = 共现次数 / sqrt(物品i的流行度 * 物品j的流行度)这样热门物品和别的物品的相关性会被拉低,反而尾部物品之间的强关联更容易浮出水面。
第二步构建用户的候选召回集。对于用户最近交互过的每一个物品,找出它的TopK相似物品,汇总后按关联分数排序,过滤掉用户已经看过的物品,再补充一些探索性候选(比如和当前浏览物品同二级类目的热门内容),就完成了召回。
第三步是排序打散。召回阶段拿到的分数本质是“物品之间的相似度”,而不是“用户对物品的兴趣分”。所以通常要再叠加一个个性化的预测分,比如用矩阵分解或者一个浅层模型来打底,同时还需要做业务规则约束,比如同作者的视频连续出现不超过2条、同分类的内容占比不超过40%,这些约束如果不做,推荐体验会很生硬。
ItemCF的适用场景是有明确行为历史、且物品数量相对稳定的内容社区。如果物品更新速度极快(比如热点资讯,每分钟都有新内容),ItemCF就会面临严重的新品冷启动问题,因为全新物品没有任何行为共现数据,很难被召回。
2.2 UserCF与群体兴趣捕捉的取舍
UserCF的思路和ItemCF相反,先找与当前用户兴趣最相似的K个用户,再把这些人最近喜欢的、当前用户没见过的物品推荐给他。它的优势在于能捕捉群体性的、突发的兴趣迁移——比如某个话题突然火了,同一兴趣圈层里很多人快速跟进,UserCF能比较快地传播这种热度。
但UserCF的问题也很明显。一是用户数量通常远大于物品数量,而且用户兴趣变化快,每天都要重新计算用户相似度矩阵,计算成本很高。二是相似用户的定义有时候很脆弱,一个只看过几篇内容的用户,很难跟别人找到足够的行为交集,推荐精度会非常差。三是用户相似性容易产生“回声室效应”,让用户困在自己熟悉的圈层里,不利于内容多样性和探索。
在实际项目里,我的经验是:UserCF更适合用户数不多、物品数很大、物品更新快、用户兴趣相对集中的场景,比如学术论文推荐、招聘职位推荐这类本来就有强领域属性的场景。而内容资讯、短视频、电商这类用户兴趣泛化、物品数量庞大的场景,ItemCF和矩阵分解明显更合适。
2.3 矩阵分解与隐因子模型实现时的几个关键点
矩阵分解用隐因子刻画用户和物品,看起来很简单,实操时几个细节会拉开差距。
第一个细节是隐因子数量K的设定。K太小,表达能力不足,模型容易欠拟合;K太大,训练慢,容易过拟合。一般从20到100之间调,视频场景通常用50左右,电商这类类目更多的场景可以适当加大。我习惯用小规模数据先预打分,观察评估指标随K变化的趋势,K对离线指标的提升一旦趋缓,基本就到头了。
第二个细节是负样本的采样方式。很多人只拿用户有行为的物品当正样本,忽略负样本,或者只拿曝光未点击当负样本,这是有偏差的。曝光未点击不等于不感兴趣,可能只是位置太靠后没被看到。实践中我倾向于随机负采样加曝光未点击加权混合,负样本数量控制在正样本的1到3倍,比例太大会让模型学到的全是“不感兴趣”的倾向,召回率开始下降。
第三个细节是训练目标的局限性。标准SVD优化的是预测分与真实评分的误差,但推荐系统里我们没有显式评分,只能用0/1行为替代。这会带来一个后果:模型学会了“区分用户有没有点击”,但没学会“区分用户更喜欢哪个”,这也就是为什么排序阶段往往还需要单独训练一个学习排序模型,而不是直接把召回模型的分拿来排队。
另外一个每个人都会遇到的点:训练数据的时间切分。评估时如果随机切分训练集和测试集,会导致严重的时序穿越——模型看到了未来数据,离线指标虚高,上线直接现原形。我处理这种问题的方法是按时间切分,用前两周行为做训练,后一周行为做测试,这样才能模拟真实的线上预测环境。这一点在项目早期就需要固化到评估流程里,否则每一次离线评估都可能在自欺欺人。
2.4 冷启动场景的处理方法
冷启动是个永恒的话题,也是推荐系统落地时最头疼的问题之一。主要分三类:新用户冷启动、新物品冷启动、系统冷启动。
新用户冷启动,一般先用非个性化手段兜底。比如按注册时选择的兴趣标签做内容分发,按地域和活跃时段的热门内容做加权,用“热门且新颖”的集合代替纯热门榜。用户一旦产生几个行为,就切换到轻量级的个性化召回,比如用一个简单的聚类模型给用户打上兴趣分组,在组内做ItemCF。
新物品冷启动,我通常走这样一条路:先用物品的内容特征(文本分类、标签、封面图embedding等)计算它和已有物品的相似度,把它挂到最相似的若干个物品下面参与推荐,这一步不需要任何行为数据;然后在推荐池里给新物品分配一小部分固定探索流量,观察它的点击率和完播率,表现好的逐渐加大曝光,表现差的沉底。这套“内容相似匹配+探索流量”的组合是我实际项目中验证下来最稳健的方案。
系统冷启动是数据最少的情况,没有用户行为也没有物品数据。这时候先做数据积累,用人工编辑的种子策略保证基础体验,同时埋点收集高质量行为数据。我印象很深的一个项目,系统上线前一个月,运营团队完全是靠人工配置的“热门+编辑精选”在支撑,数据积累到一定规模后再逐步切到算法。
冷启动问题的本质是“探索与利用的平衡”。探索太少,推荐结果收敛太快,用户看到的内容越来越单一;探索太多,推荐精度崩盘。业界常见的做法是给探索流量设置一个保底下限,比如5%到10%的曝光永远来自探索队列,这个比例需要根据业务容忍度来调整。
3. 效果评估:从离线指标到线上实验的完整体系
3.1 离线评估指标详解(准确率、召回率、F1、NDCG)
离线评估是模型迭代的主战场。评估之前要先把测试集标定清楚:推荐模型的测试集应该是一个时间窗口内用户真实看到过的物品集合加上真实点击过的物品集合,而不是简单随机抽样。否则评估出来的指标,和线上的真实表现容易出现系统性偏差。
基础指标中,准确率和召回率覆盖的是“推荐列表里有没有用户喜欢的物品”。
准确率(Precision)计算的是推荐列表里用户真正感兴趣的物品所占的比例。注意这里“真正感兴趣”的定义必须明确:是点击了就算,还是看了超过一定时长才算?我通常会用多个行为层级来定义,比如“点击”是一个弱正反馈,“完整播放”或“加入收藏”是强正反馈,然后分别计算P@K。
召回率(Recall)计算的是用户所有感兴趣的物品中,被推荐系统成功覆盖的比例。在召回阶段,我们希望召回率高,把潜在感兴趣的内容都先捞进来;在排序阶段,我们更关注准确率,因为列表只有几十个位置。
F1是准确率和召回率的调和平均,适合需要一个单一指标来对比模型的阶段。但F1掩盖了一个信息:排在列表头部的准确性比尾部重要得多。这时候NDCG比F1更有参考价值。
NDCG(归一化折损累计增益)的核心思想是:位置越靠前的物品得分越高,位置因子按对数折损。同样命中一个物品,它在第2位和第20位带来的增益差距是显著的。NDCG特别适合衡量排序质量,也是我做排序模型时最看重的离线指标之一。
AUC则用于衡量模型的二分类排序能力:模型给正样本打分高于负样本的概率。AUC的优点是直观、不依赖具体阈值,但它只看相对顺序,不关心用户最关心的头部排序,所以AUC涨了,头部排序不一定变好。
我个人的习惯是主指标用NDCG和强正反馈的Recall,辅指标用Precision和AUC。只盯一个指标很容易被带偏。曾经有一次我迭代了一个模型,AUC明显上涨,但NDCG基本没动,上线后业务指标果然也没变化——因为AUC提升主要来自中长尾排序的改善,而用户能看到的只有头部那十几条结果。
3.2 覆盖率、多样性与新颖性:容易被忽略的体验指标
如果只看准确率,推荐算法会走火入魔。系统会越来越倾向于推用户最喜欢的那几类内容,马太效应加剧。衡量推荐生态健康的指标主要有三个。
覆盖率统计推荐系统推荐出去的物品数占全量物品数的比例。比如内容库里有一万篇内容,系统只推过其中五百篇,覆盖率就是5%。覆盖率太低,意味着大量内容根本得不到曝光,创作者的积极性会被严重打击,平台生态恶化。我见过一个短视频平台,头部20%的内容拿了80%的曝光,尾部创作者基本失去信心,后来下决心调整了排序模型,强制拉高覆盖率,才把生态扭转回来。这里也顺便回答那些困惑“为什么我做了优质内容但没播放”的创作者:在新内容冷启动阶段,算法给到的探索流量有限,真正的瓶颈是点击率数据不足导致探索流量减少。
多样性计算推荐列表中不同类目、不同作者、不同主题的覆盖程度。一个用户连续看了十条相似内容,短期完播率可能很高,但第二天打开App会觉得“怎么全是这个东西”,使用时长反而下降。多样性是防疲劳的第一道防线。
新颖性衡量推荐结果中用户此前没有见过(或很少接触)的物品占比。过于追求新颖度会牺牲准确率,因为不了解用户,猜测很容易出错。我的做法是设定一个新颖度的容忍上限,比如推荐列表中最多30%来自用户完全没有历史交互的领域,其余70%围绕用户熟悉的兴趣做扩展。
这些体验类指标不属于单一用户视角,而是平台视角。做算法评估时,一定要把平台整体指标纳入考核,否则优化了一个用户群体的体验,牺牲了平台的内容生态平衡。
3.3 离线评估的完整流程与常见陷阱
一套标准的离线评估流程,我通常这样走。
数据准备阶段,把原始行为日志清洗成标准格式,用户ID、物品ID、行为类型、行为时间、行为场景都要有。行为时间这个字段特别容易丢,但如果没有它,后面时间切分根本无法进行。行为类型则要区分浏览、点击、收藏、下单、支付等不同信号。
样本构造阶段,正样本是用户有正向行为的物品,负样本要分层抽样。这里最容易出现的坑是正负样本分布不均衡时,直接训练出来的模型会倾向于把所有物品都预测为负样本,因为负样本占比太高。解决办法控制采样比例,同时可以在损失函数里调整正负样本的权重。
训练与验证阶段,强烈建议做时间序列交叉验证:用T1到T5的数据训练,T6验证,滑动滚动。同时必须做重复实验,固定随机种子、多次跑取均值,避免因为初始化不同导致指标波动影响判断。
评估输出阶段,除了报出一堆指标数值外,我还会强制要求对bad case做人工抽样。随机选50到100条推荐结果,肉眼判断推荐结果到底合不合理。这个步骤看起来原始,但非常有效,很多数据问题都是靠人工抽查看出来的,机器指标很难暴露这类问题。
另有一个常被忽略的陷阱:离线评估的高指标不等于线上收益。因为离线数据本身存在偏差,比如只记录了曝光和点击,没有记录曝光位置的影响;用户对位置靠前的物品有点击惯性,离线模型学的其实就是曝光位置带来的偏置。如果不做位置消偏,离线指标会被虚高误判。在排序模型里,我通常会加入曝光位置特征作为bias项,线上预测时把位置特征置零,才能还原物品的真实吸引力。这个“位置消偏”的细节,几乎是所有推荐项目第一次上线必然踩中的坑。
3.4 线上评估与A/B测试的落地方法
离线评估再完善,最终的判断还是要看线上实验。A/B测试是业界公认的金标准,做推荐实验的人应该把它的方法论刻在骨子里。
A/B测试的底层逻辑是:同一时间、同一场景下,只改动一个变量,把用户随机分组,给不同组展示不同策略,然后比较业务指标。推荐系统里变量常常不是单一的,比如新模型同时改了召回和排序,这时候拆开实验更利于定位上/下线的归因。
流量分配方式,我常用两种:用户维度分桶和请求维度分桶。用户维度分桶适合需要积累长期效果的实验,比如“推荐是否影响次留”这类需要跨天观察的指标;请求维度分桶则适合低延迟场景,但要求用户不感知实验分组。无论哪种方式,一致性哈希必须做好,否则同一个用户在不同请求中时而被分到实验组、时而被分到对照组,数据会彻底失效。
实验周期不能拍脑袋,要基于核心指标的最小样本量来估算。有一个可用经验公式:
样本量 = (Z_alpha + Z_beta)^2 * (p1*(1-p1) + p2*(1-p2)) / (p1 - p2)^2其中p1、p2是对照组和实验组的预估转化率。假设对照组点击率是5%,实验组希望相对提升10%(达到5.5%),显著性水平0.05、统计功效0.8时,大致需要几万到十几万的样本量。这个公式的价值在于,它让你在实验第三天就能大致判断出结果是否可信,而不是等到一周结束才发现样本量根本不够。
线上实验不仅要看主指标,更要看护栏指标(guardrail metrics)。所谓护栏指标,就是“不能变差”的指标,比如用户体验投诉率、刷新率、内容举报率。曾经有个模型把推荐点击率拉高了8%,很漂亮,但它推荐的内容低俗,举报率翻了倍。如果只盯点击率,后果不堪设想。所以每次实验的评估报告里,主指标、护栏指标、体验指标必须同时出现。
另一件非常重要的事:时刻警惕辛普森悖论。整体数据看起来实验有效果,但拆开看不同用户群时,效果可能完全相反。比如实验组在冷启动用户里表现很差,在活跃用户里表现很好,整体均值被活跃用户拉起来了。这时候不能只看整体,要按用户分层看效果,才能做出正确的决策。
还有一个行业里久经验证的规律:线上指标存在明显的周期效应。周末和工作日的内容消费行为差异非常大,新产品上线的前几天用户新鲜感也会带来虚高。所以实验评估不能只看结束当天的数据,要看完整周期的趋势线。我会特别留意实验开始后的24小时内不要做任何判断,哪怕数据表现再好,等到至少积累一个完整业务周期后再下结论。
4. 常见问题与排查技巧实录
4.1 离线指标涨了,线上业务没涨,问题出在哪里
这是推荐系统项目中最常见、也最让人头疼的问题。结合经验,排查看下列四点。
特征一致性。最常见的离线训练和线上推理特征不一致,比如离线用了全局统计特征(全量内容的平均点击率),线上却因为缓存原因只用了部分数据的统计值,特征分布就崩了。排查方法是对比离线特征采样和线上实时特征输出的分布,写成监控任务,每天检查异常特征,比在模型里加更多复杂结构更有用。这类问题我遇到过很多次,最后定位无一不是出在管道层,模型结构背了锅。
样本穿越。训练数据里用了未来信息,比如用T+1时间点的点击行为作为T时刻的特征,离线肯定效果爆棚,上线后性能正常。时间切分是每一轮迭代的必做项。
目标不一致。离线优化的目标是点击率、完播率这些代理目标,线上实际业务考核的可能是次留或GMV。代理目标提升不代表业务目标提升,需要做目标拆解分析与中间链路指标对齐。曾经我做短视频推荐,离线完播率一直涨,但次留却没有变化,后来发现模型只学会了推荐更短的视频(因为时长短更容易看完),用户自然流失了。换句话说,目标定义不完整,模型就会找到目标的漏洞。
数据管道问题。这是隐蔽性最高的一类问题。由于数据流延迟,线上经常拿不到用户最近几分钟的行为,导致模型的实时信号一直缺失,推荐效果自然打折。需要为关键实时特征单独做延迟监控,同时加一个“推荐结果新鲜度”的在线分布监控,一旦发现结果分布连续多天没有变化,基本可以判断数据管道卡住了。在很多项目里,先解决问题数据,效果往往比换一个更大模型更明显。
4.2 数据稀疏导致的推荐质量下降
当用户行为数据非常少的时候,协同过滤和矩阵分解都会失效。矩阵分解尤其明显,因为学过少的样本会严重过拟合,把大多数用户映射到同一个向量上。
处理稀疏问题,我的优先级排序是这样的:
第一,降维打击。用物品内容特征替代行为特征,比如从文本里抽TF-IDF向量、训练word2vec或直接上预训练文本embedding。这在冷启动场景下比行为协同好用得多,没有结构化的数据,就先从内容走进来。
第二,走召回宽路。把召回源扩大到多个渠道,包括热门池、兴趣标签池、地域池、协同池,每个池取TopN合并,保证覆盖面,再靠排序模型综合打分。
第三,把明细行为泛化到类目偏好。用户对某篇文章的点击可能是一次噪声,但如果他在“科技类”下有多个点击行为,他对科技这个类目的偏好就比较可信。可以在向量空间中把用户映射到类目偏好向量,做类目层面的协同过滤,再在类目内部找物品。这比直接做物品级推荐在稀疏场景下更稳,代价是推荐结果偏粗。
第四,提高采样效率。稀疏数据下负样本采样策略比模型本身影响更大。合理控制正负比例,充分利用强正反馈(收藏、关注、完播)来区分用户真实偏好,比单纯堆模型效果更直接。
4.3 热门物品主导推荐结果,长尾内容出不来
热门物品本身没有错,但推荐结果被热门物品彻底主导,系统就失去了个性化。我常用的两个思路。
一是用个性化得分重新排序。矩阵分解出来的用户向量和物品向量内积,对热门物品和用户个人偏好的匹配度有一个综合判断,天然能压制只看热度的排序方式,前提是模型是训练良好的。如果把热门物品的排序分和用户个性匹配分做一个加权融合,把权重调向后者,可以明显改善长尾曝光,前提是护航指标不崩。
二是对推荐列表做“新意打散”。同一个作者的视频最多出现一次,同一个二级类目的内容连续出现不超过两条,同一个话题标签在一屏内不超过三条。打散逻辑放在模型排序之后、曝光之前,是工业界的常规操作。做完这一步,长尾内容仍没有增长,就要排查是不是候选池构建阶段就把它过滤掉了,源头不解决,后续策略都白搭。
我在实际项目里发现,长尾推荐本质上是个“信任”问题——系统不确定也没把握用户会不会喜欢冷门内容,所以不敢给量。要突破这个局面,就得靠探索与利用机制,一个固定配额的探索流量池不仅不会伤害主指标,它提供的用户反馈信号,反而可以帮助推荐系统更快识别用户的隐藏兴趣,实现真正的一跳。这个思路后来被我用在不止一个项目里,效果都比较立竿见影。
4.4 多目标与多场景推荐如何统一评估
现在很多平台不只有一个推荐场景,首页信息流、相关推荐、猜你喜欢、搜索页,各自有各自的目标。统一评估的必要性在于:同一个模型可能在一个场景表现优异,在另一个场景却因为目标冲突导致整体效果下降。
我采用的办法是把目标分层拆解,先明确各场景的“北极星指标”。
首页信息流承担用户留存和时长,相关推荐承担关联点击,搜索页承担搜索转化率。三个场景的目标不同,但共享同一套用户行为数据和物品特征。技术上可以用多任务学习框架共享底层参数,每个场景有自己的塔头输出,再通过门控系数调节各目标的权重。评估时,每个场景单独看自己的主指标,同时汇总看“跨场景转化贡献”。
有些团队试图用同一个模型服务所有场景,这是省了工程力气但牺牲了效果。我建议至少把召回和粗排做成共享候选池,精排模型还是分场景单独训练。否则你优化的永远是“平均用户”的体验,而每个场景用户的使用心智其实是完全不同的。
4.5 推荐迭代专题:如何用线上反馈持续优化
推荐系统没有一次性的终局,上线只是迭代的开始。长期保持效果的关键,是把“线上反馈”转化成“优化方向”。
第一件事是建立完整的埋点体系。曝光、点击、停留时长、完播、收藏、分享、取关、不喜欢,每个行为都要有明确的埋点定义和上报链路。没有准确的行为数据,算法就是盲人摸象。
第二件事是做bad case反馈闭环。比如每天抽取100条用户曝光但未点击、深度未达标的推荐结果,让人工标记“推荐不合理”的原因,归因到类目偏差、内容低质、重复推荐还是时效性问题。这个闭环持续跑一个月,积累的标记数据就是优化模型和策略的最有说服力的物料。
第三件事是周期性的模型重训和评估。推荐模型需要持续在新鲜数据上做训练,否则用户兴趣漂移后模型会逐渐失灵。重训频率取决于数据更新速度,短视频可以做到小时级,电商类做到日级或周级基本够用。同时保留好基线版本的评估记录,方便下个迭代做对比。每一次调参、改特征、换结构,都值得记录下来,形成团队的经验库。不见得每一步都是正向收益,但看得多了,你会很清楚问题大概率出在什么地方。
有一次我把排序模型从LR换成DeepFM,离线指标全面优于基线,但线上指标却是持平的。排查了将近两周,最后定位到问题在于排序模型的特征管道里缺少了用户行为的实时统计特征,DeepFM虽然是深度模型,但它缺少近实时信号时能力受限极大。换回LR加实时统计特征后,效果反而超过了DeepFM。自那以后我定了一条规矩:新模型上线前,必须先在离线完成特征重要性和特征新鲜度的全面审计。
5. 做推荐系统的三个敬畏
如果要在最后分享一点最深的体会,我想说:做推荐系统,要对技术有敬畏心,也要对用户有敬畏心。
算法的改进空间永远存在,但一切的前提,是数据和归因都是干净的。一个扎实的ItemCF配合一套科学严谨的评估体系,效果通常好过一个胡乱调参的深度模型。很多项目最终效果不佳,不在模型不够新,而在工程基础和数据质量不够稳。花时间把评估做扎实、把数据管道做稳、把业务目标想清楚,这些看起来“不够性感”的环节,恰恰是决定项目成败的关键。
另一个更重要的感受是,推荐系统优化到后期,拼的不只是技术,更是对“人”的理解。用户点击某个内容,背后可能有好奇、有共鸣、有放松、有学习,同一个行为背后是完全不同的动机。只有当算法能尊重这种多样性,而不是粗暴地迎合平均偏好时,推荐系统才真正称得上“个性化”。这也是我做了这么多年推荐后,依然觉得这个领域值得继续深挖的原因。