他边说边调出几张图表,展示离线训练特征和线上抽样请求特征的分布对比。沈酌凑近仔细看了看,确实,一些实时特征的分布在线上线下的差异比较明显,尤其是某些稀疏特征。
“你们召回模型用的什么架构?双塔?还是更复杂的序列模型?”沈酌继续问。
“是双塔结构,用户塔和物品塔分别编码,然后内积计算相关性。”林瑞回答,“用户塔输入包含用户基础属性、历史行为序列聚合特征,以及刚刚说的那些实时上下文特征;物品塔主要是物品静态属性和动态统计特征。”
沈酌若有所思。双塔结构在推荐系统召回阶段应用广泛,优势是速度快,便于做大规模向量检索。但劣势也很明显:用户和物品的特征在塔内编码后,交互方式过于简单,通常就是内积或余弦相似度,难以捕捉复杂的非线性关系,尤其是当引入大量实时、稀疏、高维的上下文特征时,模型可能无法有效学习和利用它们。
“有没有考虑过,问题可能不在于特征本身,而在于双塔结构对这类实时稀疏特征的‘表达’和‘利用’效率不够?”沈酌提出一个方向,“实时上下文特征往往非常稀疏且信号微弱,在双塔里,它们只是和其他特征一起被扔进用户塔的DNN里,期望网络能自己学到有用的组合。但DNN在处理大量稀疏特征时,容易陷入局部优化,或者某些重要但稀疏的特征信号被淹没。”
林瑞眼睛微微一亮,似乎被点醒了什么:“沈工,您的意思是……可能需要针对实时特征设计更专门的交互或融合模块?而不是简单地和历史特征混在一起喂给DNN?”
“对。”沈酌点头,他拉过旁边一把闲置的椅子坐下,示意林瑞也坐,“我们可以把问题拆开看。离线训练效果好,说明模型基本框架和大部分特征是有效的。线上效果骤降,重点怀疑新引入的、且线上线下分布差异大的实时特征。双塔结构的表达能力可能不足以处理好这些特征。”
他顿了顿,组织了一下语言,继续说:“我建议你可以从这几个方向试试:
第一,特征重要性分析与过滤。用一些方法分析一下,比如permutation importance,SHAP值,在线上低点击样本中,哪些实时特征的贡献度异常低或者干脆是负向?是不是有些特征噪声太大,反而干扰了模型?可以考虑先做一波严格的过滤,或者给实时特征加更强的正则化。
第二,改进特征交互方式。与其把所有特征一股脑儿塞进DNN,不如尝试显式地建模实时特征与核心用户画像特征、物品特征的交互。比如,可以引入一个轻量级的注意力网络,让模型自己学习在不同的上下文下,应该更关注用户历史行为中的哪些部分,或者物品属性的哪些方面。或者,对于某些关键的实时特征,比如‘当前搜索词’,可以设计特定的交叉层,让它与用户长期兴趣、物品类别等进行显式交叉,增强信号。
第三,考虑在线学习或动态适配。如果实时特征分布变化很快,静态训练好的模型可能跟不上。可以探索在召回阶段引入轻量级的在线学习机制,比如用实时反馈流对用户塔最上层的参数进行微调,或者维护一个实时特征到用户兴趣偏移的查找表,动态调整召回策略。
当然,这些改动都需要谨慎评估和AB测试。你可以先从一个最小的改动开始验证,比如先加一个简单的实时特征注意力模块,看看线上指标是否有改善。如果有效,再逐步深入。”
沈酌的声音平稳清晰,将复杂的问题拆解成具体的、可执行的步骤。他没有给出确定的答案,而是提供了几种经过深思的、有理论依据的探索方向。这比直接告诉对方“你应该怎么做”更有价值,也更能启发思考。
林瑞听得非常认真,眼睛越来越亮,之前的焦虑和迷茫被一种豁然开朗的兴奋所取代。他飞快地在自己的笔记本上记录着关键词,不住地点头:“特征过滤和注意力机制!对,这个思路很清晰!我们之前总想着把特征做得更全更细,可能反而引入了噪声,而且交互太隐式了。沈工,您说得太对了!我明天……不,我现在就按这个思路重新设计一下实验方案!”
看着他重新燃起斗志的样子,沈酌笑了笑,站起身:“思路仅供参考,具体实现还得你自己把握。不过,现在太晚了,身体要紧。问题不是一晚上就能解决的,先回去休息,养足精神,明天再战效率更高。”
林瑞这才注意到时间已经接近午夜,脸上露出不好意思的神情:“谢谢沈工!真的……太感谢您了!耽误您这么久,还给我这么宝贵的建议!” 他站起身,郑重地向沈酌鞠了一躬。
“不用客气,都是同事。”沈酌摆摆手,“赶紧收拾一下,一起下去吧。路上小心。”
两人一同关了灯,锁好门,走向电梯。深夜的公司大楼格外安静,只有他们的脚步声在走廊里回响。
回到家,别墅里留着一盏暖黄的廊灯。沈酌轻手轻脚地进门,换鞋,发现客厅的沙发边几上放着一杯温水,下面压着一张便签,是时岳凌厉的字迹:“饭在厨房温着,牛奶在微波炉,热一分钟,记得喝。我先睡了,别工作太晚。”
沈酌拿起水杯喝了一口,温水滋润了有些干涩的喉咙,也熨帖了疲惫的心。他走到厨房,果然看到保温饭盒和微波炉里温着的牛奶。饭菜是清淡可口的粤式小炒和炖汤,显然是时岳估摸着他今晚又会晚归,特意准备的。
快速吃完宵夜,洗完澡,回到卧室,时岳已经睡着了。沈酌悄悄躺到他身边,小心地没有惊动他。然而,他刚躺下,时岳的手臂就习惯性地伸过来,将他揽进怀里,迷迷糊糊地嘟囔了一句:“回来了?”
“嗯,晚安。”沈酌轻声回答,在他怀里找了个舒适的位置。”时岳的下巴蹭了蹭他的发顶,手臂收紧,很快呼吸又变得均匀绵长。