以下文章来源于推荐道 ,作者石塔西
推荐算法说书馆
今天的文章来自作者的一次面试经历。
在一次面试中,面试官问到:怎么处理“新用户冷启动”?作者将复杂的思考过程如实回复,面试官回答:“没那么复杂,处理新用户,归根结底就一句话,尽可能多地找这个用户的数据!”。
毫无疑问,针对我们所知甚少的新用户做推荐,是一个极其困难的问题,尽一切努力收集用户信息,也绝对是top priority。但是,因为困难,从事算法的同行们就束手无策,等着产品和前端同学把新用户的数据送过来吗?
根据近年来的经验,新用户的数据是极其重要的,但是并非问题的全部。比如,新老用户在app中的行为模式有很大不同(e.g., 比如一些产品设计不允许新用户做点赞、评论等动作)。但是,在训练的时候,老用户的样本在数量级上碾压新用户的样本(本来dau就主要是由老用户贡献,再加上一个老用户能够贡献多条样本),导致模型主要拟合老用户的行为模式,忽略了新用户。在这种情况下,增加几个对新用户友好的特征(比如年龄、性别等),因为主导模型的老用户不关心(影响老用户推荐结果的主要是其过去历史,而非人口属性),加了也是白费功夫。
看似是一个样本不均衡的问题,也不是毫无办法。比如:
· 给新用户的样本加权。但是有两个问题不太好解决,一是如何设定给这些新用户的权重,二是,毕竟老用户才是给我们贡献KPI的主力,给新用户加权,等于变相削弱老用户,可能得不偿失。
· 干脆分家,就只拿新用户的数据单独训练一套模型,只服务新用户。也不是不行。但是,也有两问题不好解决,一是新用户数据量少,底层embedding和中间的dense weight可能训练不好;二来,单独训练,单独部署,有点浪费资源。
对付新用户,以上方法虽然简单,但是真的不妨一试。如果也觉得以上方法的缺点无法接受,不妨向下读,看看本文替你总结出的一些从算法层面助力新用户冷启的技巧。
正文开始之前,先提前声明几点:
· 本文中所提及的新用户是一个泛称,未必是第一次登录、毫无动作的纯新用户,也包括那些虽然距首次登录已经过去许久,但是鲜有活动的用户。其实,文中的概念算是“低活用户”,但是为了行文方便,下文中还是用“新用户”统一称呼这些用户;
· 本文中所提观点,和“收集用户信息是新用户冷启top priority”的观点并不矛盾。相反,以下算法技巧的目的,就是为了能够让模型更重视那些对新用户友好的特征,让这些特征真正发挥作用。
· 算法毕竟是实验科学,就像股票点评之后总要加上一句“不构成投资建议”一样,以下介绍的技巧未必颗颗是银弹。究竟哪个管用,就让GPU和AB平台告诉我们答案吧。
既然我们通过数据分析,先验已知新老用户的行为模式有着较大差异,我们希望把这一先验知识告诉模型,让模型对新老用户能够区别对待。至于如何注入这样的先验知识,我已经在我的另一篇文章《先入为主:将先验知识注入推荐模型》介绍过了,简述如下。
首先,我们要构造能够显著标识新用户的特征,比如:
· 一个标识当前用户是否是新用户的0/1标志位
· 用户是否登录
· 首次登录距今时间
· 交互过的item的个数
· …
· 强bias特征作为LHUC的输入,经过sigmiod激活函数后,输出是一个N维度向量,N是所有fileld的个数;
· N维向量就是各field的重要性,将其按位乘到各field的embedding上,起到增强或削弱的作用。比如:
1. 比如产品设计不允许未登录用户点赞、评论,那么新用户样本中的相关特征的重要性“应该”为0
2. 用户点击哪个站外广告被引入app,这个信息只对新用户有用(权重应该大),对老用户意义就不大了(权重应该小)
一篇是《One Model to Serve All: Star Topology Adaptive Recommender for Multi-Domain CTR Prediction》。这篇文章研究的是,如何训练并部署一个模型,就能胜任“首页推荐”、“猜你喜欢”等多个领域。
· 每个域学习各自的batch normalization
· 是要全局学习的scaling和bias
· 是某个domain "p"独有的 scaling 和 bias
· 将domani id这样的bias特征,通过一个浅层网络,加得离final logit近一些。这一点就是我们在上一章节介绍的技巧。
第三个改进,就是所谓的星型拓扑结构,也就是论文标题的来源。简单来说,就是每个domain要经过的final dense weight是domain specific part和shared part融合而成。
· 是domain 'p’的样本最终要经过的final weight;
· 是domain "p"独有的weight,只让domain "p"的样本参与迭代更新;
· W是shared weight,所有domain的数据都要参与更新;
· 是element-wise multiplication。
· domain specific weight与shared weight是并联的关系,样本信息同时经过domain specific weight和shared weight向上传递,
· 模仿早先multi-task learning中常见的share bottom结构,先有共享的底层shared weight,各个domain再在上面串联上domain specific weight。预测时,样本先经过shared weight,再经过domain specific weight向上传递,
文中并没有给出 这种融合方式,相对于我在上文提出的两种融合方式的优势,或许没啥大道理,又是实验得出的结论。我自己给出的理由只能是:
· 无论是domain specific weight与shared weight是并联还是串联,前代回代中,信息所经过的每一层,都只属于单一通道(要么是domain specific,要么是share),融合得并不彻底;
· 而 ,信息流过的每一层都是domain specific weight和shared weight融合后的,融合得更充分。
AliExpress的文章《Improving Multi-Scenario Learning to Rank in E-commerce by Exploiting Task Relationships in the Label Space》聚焦于多国家场景下的推荐。这个场景,和我们新用户的场景更加类似一些,多个国家的人口迥异,市场进入有早有晚,相对于先发国家庞大的用户基数和丰富的行为,后发国家的用户少、行为少,可以类比于“新用户冷启”的场景。
这篇文章提出的HMoE与STAR完全相反,没有所谓的shared weight。其原理假设是:
· A国家中,有些用户a的行为和B国的用户很像,所以,让B国的DNN给a打分也很靠谱,异域模型打分的借鉴意义大;反之,异域模型打分的借鉴意义小。
· 回到我们新用户的场景下,用老用户模型给新用户打分,可能对部分新用户也是大有裨益的。
具体做法上:
· 无论哪个域的样本,都要经过所有domain的DNN打分(下面公式中的S),
· 最终得分,是在各个域打分上的加权平均。权重(下面公式中的W)由一个gate netowrk根据输入样本,个性化决定。
本文来自:公众号【推荐道】
作者:石塔西
Illustrastion by Experimental from icons8
本周上新!
扫码观看!
关于我“门”
▼
点击右上角,把文章分享到朋友圈
点击“阅读原文”按钮,查看社区原文
⤵一键送你进入TechBeat快乐星球