ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

使用计算图搭建灵活的推荐系统

2020-05-04 16:04:12  阅读:353  来源: 互联网

标签:灵活 Item User 计算 召回 排序 节点 搭建


在上一篇《认识推荐系统》中,粗略地讲了讲推荐系统地架构,从召回到排序再到重排序,这三个东西是非常灵活多变的。比如,召回来源的个数可以变,每个找回来源召回的 Item 数量可以变,排序算法可以变,重排序规则也可以变,反正比齐天大圣厉害,不止七十二变。

那我们程序员怎么办,每天都改代码然后上线吗?在此介绍一个解决方案,用计算图来描述你的召回、排序、重排序,做到每次仅需要改一改配置,新的流程就可以上线。

什么是计算图

计算图,它是一个图,并且是一个 DAG (有向无环图)。先说说这个有向无环图,这在离散数学里教过。这种图的边有方向,这就是有向。并且从图中任意一点开始走,都走不会原来的点,这就是无环。下面是一张从 Wiki 上借用的图。

wiki_pic1
那么在计算图中,每个节点和边都代表着什么呢?比较抽象的来说,每个节点就是一个处理流程,节点与节点之间流动的是信息。

具体来说,召回可以是其中的一个节点,比如召回热门数据,因为热门数据一般已经建好了索引存储在了类似于 Redis 的内存数据库中,所以它并不需要输入,输出则是一堆热门的 Item。不过有一些召回节点是需要输入的,比如基于 Item 的协同过滤方法,你需要将这个 User 的历史交互过的 Item 作为输入,才能获得召回的 Item。而拿取 User 的历史交互 Item 信息,这又可以是一个节点,它没有输入,输出则是 User 的历史交互 Item 信息。

排序也可以是其中的一个节点。将所有召回的 Item,经过去重和过滤后(去重和过滤也是图中的节点),输入排序的节点。根据你排序的方法不同,你可能还需要其它的输入,比如说这些召回的 Item 的信息(包括 Item 的点击数、展现数、类别等等),当前请求的 User 信息(User 喜欢点什么样 Item 的统计信息),一些历史信息等等。这些东西可以通过预计算存入内存数据库中,然后直接在定义一些节点来获取即可。而排序节点的输出就是输入的 Item,不过这些 Item 都被打上了一个分数,用以表示 User 对它们的喜好程度。

重排序和排序基本相同,不过它是一组节点。比如有的节点负责把置顶信息插入结果,有的节点给 Item 的排序分数进行加权降权再 Sort。下面就是一张实际推荐系统的计算图。

为什么要用计算图

灵活,可以随意添加删除处理过程,你只需要定义好节点即可。

方便快捷,可以通过配置来描述推荐的整体流程,降低了使用难度。

只要你的节点定义地足够 DRY,你可以适应任何变化,或者说面对变化时能更加从容。因为你只需要在代码中添加一些新的节点就可以了。

怎么实现计算图

首先,你要明确一些实体,计算图中的实体就是节点和图。

计算图要完成的工作有,读取配置,执行节点,执行图并返回结果,大概就是这三个接口;而节点则是需要指明其输入输出,也就是得有两个成员变量来表示这个,同时应该提供一个接口来执行。

下面展示一个 YAML 表示的计算图配置,就是上面流程图所展现的流程,作为实现的参考。

graph:
 hot:
 user_history:
 item_CF:
  - user_history
 deep_learning:
  - user_history
 dedupe:
  - hot
  - item_CF
  - deep_learning
 recomended_history:
 filter:
  - dedupe
  - recomended_history
 gbdt_rank:
  - filter
 rerank_top:
  - gbdt_rank
 rerank_weight:
  - rerank_top
 end:
  - rerank_weight
 
 nodes:
  hot:
   func: hot
   limit: 100
  # ...
  # ...

可以看出,配置里在 graph 中指定了图的依赖关系,然后在 nodes 里指定图中每个节点的函数以及特定的参数。这样,一张完整的计算图基本定义完成了。

结语

感谢您的阅读~

如有问题讨论,欢迎留言或者加公众号

weixin

logo

标签:灵活,Item,User,计算,召回,排序,节点,搭建
来源: https://blog.csdn.net/CodeDifferent/article/details/105900700

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有