Always keep a beginner's mind, don't forget |

园龄:粉丝:关注:

推荐系统(一)

2024.12.9号面试了百度用户增长部门中台一面,了解到部门主要做一些推送工作,涉及到推荐系统的召回和排序等工作,故了解学习了推荐系统的大致知识,待后续更新

ps:明天三面,希望能过,想要一个大厂offer结束折磨的秋招了TAT

推荐系统的链路

 

  • 召回:快速从海量数据取回几千个用户可能感兴趣的物品,每条召回通道取回几十到几百篇

  • 排序

    • 粗排:用小规模的模型的神经网络给召回的物品打分,然后做截断,选出分数最高的几百个物品。

    • 精排:用大规模神经网络给粗排选中的几百个物品打分,可以做截断,也可以不做截断。

    • 重排:对精排结果做多样性抽样,得到几十个物品,然后用规则调整物品的排序。

 

召回

用很多条召回通道,快速从几十亿篇笔记中取回几千篇笔记

召回通道:协同过滤,双塔模型,关注的作者等等,通过多个召回通道各取到几百篇笔记,在系统中对召回得到的笔记做融合和过滤,包括去重、过滤掉不喜欢的作者、不喜欢的话题等等

 

排序

用机器学习模型预估用户对笔记的兴趣,保留最高的笔记,为了节省计算量:用粗排和精排

粗排用较小的神经网络,做大概的打分后筛选出一部分笔记交给精排

精排用较大的神经网络,用的特征更大,做更可靠的打分

重排:考虑多样性,从几百篇获取几十篇,同时用规则打散比较相似的笔记

 

召回详解

  • 基于物品的协同过滤(itemCF),原理是:如果用户喜欢物品1,物品1和物品2相似,那么用户很可能喜欢物品2,基于物品的相似性做推荐

  • 基于用户的协同过滤(userCF),原理是:如果用户A喜欢物品1,用户A和用户B相似,那么用户B很可能喜欢物品1,基于用户的相似性做推荐

    • 线上做召回:给定用户ID,通过“用户-用户”索引,找到topk相似用户,对于这些相似用户找到这些用户最近感兴趣的n个物品,这样就得到了召回的nk个相似物品,再打分,取分数最高的100个,作为召回结果

  • 双塔模型,双塔模型有两个塔:用户塔、物品塔。两个塔各输出一个向量,作为用户、物品的表征。两个向量的內积或余弦相似度作为对兴趣的预估。

    常用的离散特征编码:

    • one-hot编码(有几类数据就有几维编码)

    • embedding编码(适用于类别数量很大的时候,常用的有用户ID embedding,物品ID embedding)

    向量召回通道之一:矩阵补充,本质上是对用户ID和物品ID做embedding,这个模型的输入是用户ID和物品ID,用两个embedding向量的内积预估用户对物品的兴趣,但它存在诸多缺点,所以才会有双塔模型的出现,缺点如下:

    • 数据量要求大

    • 计算复杂度高

    • 对观测数据的噪声敏感

    • 矩阵补充模型比较弱,没有使用到除了ID以外的其他物品或用户属性,双塔模型属于是一种对矩阵补充的升级

    • 双塔模型的结构:

      • 用embedding层将用户ID、用户离散特征(感兴趣的话题等等)变成向量,用归一化、分桶等处理用户连续特征(年龄,活跃程度),由此得到很多向量,输入到神经网络当中,得到一个结果,即该用户的表征;

      • 物品的处理与用户的处理类似

      • 这也就是双塔名字的由来,一个塔是用户塔,一个是物品塔

    • 双塔模型的训练:pointwise;pairwise;listwise

    • 双塔模型的线上召回过程

      • 离线存储:把(物品特征向量b,物品ID)保存到向量数据库,向量数据库建立索引,以此加速最近邻查找

      • 线上召回:

        • 当用户发起请求的时候,给定用户ID和特征,在神经网络线上计算特征向量

        • 然后以a作为query,到物品向量数据库中做检索,查找k近邻的k个数据,作为这个召回的结果

      • 之所以将离线算物品的向量,是因为每做一次召回,就需要用到几亿物品向量,线上算物品向量的代价太大;而对于用户来说,他的兴趣动态变化,所以采取线上计算的方式以达到更好的推荐效果

    • 双塔模型的模型更新

      • 全量更新:在今天凌晨,在昨天全天的数据基础上做模型训练,训练完成后发布新的用户塔神经网络和物品向量,供线上召回使用,对系统要求不高,对时延要求也不高

      • 增量更新:做在线学习 更新模型参数,以应对用户兴趣随时产生变化的情况,需要实时收集线上数据,做流式处理,然后对模型做online learning,增量更新ID embedding参数(不更新神经网络其他部分的参数),每隔几十分钟就发布用户ID embedding,供用户塔在线上计算用户向量

      • 实际系统:

        • 全量更新 与 增量更新相结合,一方面全量更新的模型更准确,而增量更新能更快的捕捉到用户新增的兴趣点,具体过程如下:

        • 2号凌晨用1号的全量模型数据,做全量更新,随后持续不断做online learning,每隔几十分钟发布一次增量更新模型,直到3号凌晨,用2号的全量数据做全量更新,并把2号的增量更新内容扔掉,重新开始做3号当天的增量更新

  • 其他召回通道

    • 地理位置召回:考虑到用户可能对附近发生的事感兴趣,使用GeoHash对经纬度编码,索引为: GeoHash—>优质笔记列表(按时间倒排)

    • 同城召回:类似于地理位置召回

    • 作者召回:关注作者召回;索引为 用户—>关注的作者 + 作者—>作者的作品

    • 缓存召回:存储精排打分高,而且未曝光的笔记

本文作者:pinoky

本文链接:https://www.cnblogs.com/pinoky/p/18600661

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   pinoky  阅读(20)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起