今天讲解的论文是KDD2020的论文《PinnerSage: Multi-Modal User Embedding Framework for Recommendations at Pinterest》,其中介绍的PinnerSAGE同样是Pinterest公司出品,是被被誉为"GCN首个商业级应用"的PinSAGE模型的姊妹篇。

对PinSAGE不熟悉的同学,可以出门左转,看我对PinSAGE模型的简单介绍。别看两个模型只差了3个字母,但是还是有巨大的区别 :

  • PinSAGE模型,尽管构建了异构图,但是只学习了图上pin节点的embedding,你可以理解为item embedding。图上的user节点没有学习embedding(其实可以学习到的,我们正在做这方面的工作)。所以,直接用PinSAGE模型学习到的pin embedding,只能完成“猜你喜欢”之类的功能,给用户推荐一条与他刚刚消费过的item类似的item。

  • PinnerSAGE模型,尽管名字里有SAGE,让人以为又是一个基于“图卷积”的模型,其实和图没有半毛钱关系。它研究的核心问题是,如何用PinSAGE已经学习好的item embedding,生成user embedding,完成user2item召回。

我有点不理解Pinterest团队的思路:

  • 明明已经构建了异构图,其实可以将user embedding和item embedding一并训练出来的。但是,PinSAGE实际上是在由user-item二部图简化得到的只有item的同构图上学习出来的,只学习到item embedding。

  • 为什么不继续再接再厉,在原来的 异构图上把user embedding也一并end-to-end学习出来?而退回到“两部走”的老路? 先生成item embedding,再想着如何用item embedding合成user embedding。(文中给出一些理由,既没有详细展开,对我也没有说服力)

  • 坦率地讲,“两部走"的老路,在推荐系统中已经实践好久了:用DeepWalk生成item embedding,喂入Faiss建立索引,再拿用户最近点击的若干item embedding作为种子在Faiss里面进行近邻搜索。这种方式有没有问题?肯定有(有哪些问题,下面详细说 )。但是这些问题,是否严重? 召回又不是只有一路,这些问题难道不能由其他召回弥补吗?

所以,我觉得这篇文章的深度不足,创新性并不怎么高,快速通读一遍,了解其中做法即可。

由Item embedding生成User embedding的传统做法

本文研究的就是“两步走”策略中的第2步,即在已经学习到了 item embedding之后,如何生成user embedding。所以,在正式了解PinnerSAGE之前,先看看我们现在是如何解决这一问题的。充分理解目前方案的痛点,才能更好了解PinnerSAGE的设计思路与意义。

拿用户最近交互过的N条item,多次检索Faiss

取出用户最近点击、消费过的N条item,每条都去Faiss做近邻搜索,将每条搜索出来的近邻都合并起来,作为召回结果返回。

这个做法非常常见,但是有如下问题:

  • 由于要查询多次Faiss,为了减少查询时间和对Faiss的压力,所以N不能太大

  • 所以这种做法,实际上只是拿用户的短期行为,去检索Faiss,召回结果也只符合用户的短期兴趣

  • 但是用户的兴趣是多方面的,召回结果太集中于用户短期兴趣,很容易产生“信息茧房”,也容易让用户“审美疲劳

拿用户长时期的历史pooling成一个user向量,去查询Faiss

由于只需要检索一次Faiss,所以这里可以用更长时间段的用户历史,其中包含的用户兴趣也更多样,不至于像上述方法那样 ,太过集中于用户的短期行为、兴趣。

但是向量的pooling本身是一个信息损失的过程,有可能pooling后的user  embedding,与参与pooling的各item embedding,差之千里。比如文中就举了一个例子,一个用户点击过一幅画、一部科幻小说,一双鞋,拿这三个item embedding平均向量去Faiss里面检索,检索到的最近向量是营养早餐粥,看着有点不太靠谱????。

能不能让以上两种方法“取长补短”?

将若干item embedding合并成user  embedding的理想方法:

  • 既能像第一种方法那样,不强制pooling成一个向量而带来信息损失,而是保留多个向量来表达用户多方面的兴趣

  • 又像第二种方法那样,减少查询Faiss的次数,减少线上耗时和对Faiss的压力

PinnerSAGE做法

PinnerSAGE的作法就是针对以上“取长补短”思路的一次实现。其思路也很简单:取用户较长时间段内交互过的item embedding,聚成若干类,再拿每类的embedding去检索Faiss,再融合结果返回。

  • 聚类,减少了查询Faiss的次数,降低耗时和对Faiss的压力

  • 聚类,允许我们考虑更长时间段(比如3个月)内的用户行为历史,包含的用户兴趣也更加丰富

  • 聚成多类,避免了pooling后"只用单一向量表示用户兴趣"而带来的信息损失

接下来的问题就是,

  • 聚成几类?

  • 如何取得每个类的embedding?

Hierarchical Clustering自动决定聚类数目

hierarchical clustering的优点就是,无需像K-means那样预先设置类别数。

  • 首先,将用户历史中每个item,单独成为一类

  • 接下来,如果两个类合并之后,导致的"类内variance"增加得最少,就将这个类合并,直到“类内variance”低于指定的阈值。

这个Ward聚类算法,属于开箱即用的成熟算法,无什么好说的,感兴趣的同学可以看论文原文了解其中的细节。

如何获得类的embedding?

类有了,怎么获得类的embedding呢?

能不能拿类中所有item embedding取平均?PinnerSAGE说不可以,那样会重新走“信息损失”的老路,几个相关性高的item embedding平均之后,可能会得到一个八杆子打不着的item embedding。

PinnerSAGE的做法是从这个类所有item中,找出一个代表,拿这个代表的embedding当作整个类的embedding。当代表的条件呢?它要与类内所有item embedding的距离总和最小

聚合后的类还是太多怎么办?

聚后的类太多,还是会增加耗时和对Faiss的压力。PinnerSAGE的作法是给每个类都打一个importance score,然后按这个分数做重要性采样,文中说每次只采样3个cluster就足够满足用户多样性的需求。

那么importance score从何而来? 就是类内所有item的时间衰减因子的总和。也就是如何某类内的item最近被经常访问,这个类的重要性就越高,线上serving时就越有可能被抽到,代表用户兴趣。

总结

就像我一开始说的那样,这篇文章在技术深度、创新性上都无法与PinSAGE相比。我还是那两个疑问:

  • 已经构建了user-item二部图,为什么不在图上直接学出user embedding和item embedding? (GraphSAGE学到的是“学出embedding”的方法,可以扩展到新user和新item)。要做user2item召回,我更看好一次性把user embedding, item embedding都学到的end-to-end方式,而不是 PinnerSAGE这种“先学习item embedding,再合成user embedding”的"两步走"方式?

  • 即便传统“两部走"的老路有问题,但是这些问题,有那么严重吗? 召回又不是只有一路,这些问题难道不能由其他召回弥补吗?

请诸位同好共同思考。

一起交流

想和你一起学习进步!『NewBeeNLP』目前已经建立了多个不同方向交流群(机器学习 / 深度学习 / 自然语言处理 / 搜索推荐 / 图网络 / 面试交流 / 等),名额有限,赶紧添加下方微信加入一起讨论交流吧!(注意一定要备注信息才能通过)

END -

深度融合 | 当推荐系统遇见知识图谱(三)

2021-06-02

100+篇论文合集:GNN在NLP中的应用

2021-05-21

三大部门七场面试,终拿字节AI NLP 算法offer

2021-05-18

图神经网络从入门到入门

2021-05-16

PinSAGE有伴了! 快速了解PinnerSAGE模型相关推荐

  1. PinnerSage模型

    Aditya Pal | Applied Science, Chantat Eksombatchai | Applied Science, Yitong Zhou | User Understandi ...

  2. AI端计算产业应用:如何快速训练高精度模型并在设备端加速计算 | 公开课报名...

    位来 发自 凹非寺 量子位 报道 | 公众号 QbitAI 近年来,端侧AI在技术和应用方面都取得了快速发展,端计算模型已应用到各行业的AI实践中.如部署在野外气象观测点用于环境监测,响应垃圾分类政策 ...

  3. 104. 软件工程的开发过程几种模型(瀑布模型、快速原型开发模型、增量模型、迭代模型、螺旋模型)

    文章目录 1.前言 2.瀑布模型--按阶段严格完成 (1)瀑布模型把整个项目过程分成了六个主要阶段: (2)举个例子来理解瀑布模型 (3)优缺点 (4)解决的重要问题 3.快速原型模型--低成本快速的 ...

  4. 两个相邻盒子的边框怎么只显示一个_一篇文章带你快速理解盒子模型「经典案例」...

    今天带大家快速理解盒子模型,直接上代码: css盒子 我的css盒子测试模型 上面代码没有任何难度,只是写了一个div标签,大家已经知道,div标签是块级元素,所以会占满一行: 但是我们也注意到了图片 ...

  5. 超硬核的 OCR 开发利器推荐:从场景案例到实操演示,快速掌握OCR模型训练

    现如今OCR能力已经在众多场景中落地应用: 像是常见的身份证.驾驶证.行驶证等卡证识别: 又如出租车发票.增值税发票.火车票等财务票据识别: 再如医疗费用结算单.病案首页.保险单等医疗票据识别: -- ...

  6. 如何基于数据快速构建用户模型(Persona)?

    用户模型(Persona)是Alan Cooper在<About Face:交互设计精髓>一书中提到的研究用户的系统化方法.它是产品经理.交互设计师了解用户目标和需求.与开发团队及相关人交 ...

  7. AI实战:上海垃圾分类系列(一)之快速搭建垃圾分类模型

    前言 AI实战:上海垃圾分类系列(一)之快速搭建垃圾分类模型 AI实战:上海垃圾分类系列(二)之快速搭建垃圾分类模型后台服务 AI实战:上海垃圾分类系列(三)之快速搭建垃圾分类智能问答机器人 有上海网 ...

  8. 怎样把三维模型生成html文件,如何快速创建3D模型 并导出USDZ文件 在自己设备上浏览...

    文中视频演示了如何快速创建3D模型,将其导出为USDZ文件,并在自己的设备上进行浏览. 视频上传者表示,他希望说明如何轻松通过USDZ文件来分享3D内容.首先,你需要用于创建3D内容,同时最好具备将3 ...

  9. MATLAB做一个简单的3d模型,简易3D建模,让你快速创建3D模型

    原标题:简易3D建模,让你快速创建3D模型 MagicaVoxel Mac版通过其显著的直观性.任何用户,乃至那些有素的编辑或其余3D建模运用程序之前没有任何经验的朋友,可以开始创建的对象吧,无需经过 ...

最新文章

  1. 基于ArcSDE的影像数据管理-疑惑篇 (转载)
  2. 基于Hadoop的数据分析平台搭建
  3. mysql数据库使用命令导入sql文件
  4. jmeter 线程执行顺序_Jmeter-线程组执行顺序控制
  5. Shiro+springboot+mybatis+EhCache(md5+salt+散列)认证与授权-03
  6. JavaScript、Ajax与jQuery的关系
  7. 利用JavaCSV API来读写csv文件
  8. 微信小程序UI组件、开发框架、实用库...
  9. DEDE无简略标题时显示完整标题
  10. ios 裁剪圆形头像_iOS开发之裁剪圆形头像
  11. Linux块层技术全面剖析-v0.1
  12. Shell Notes(2)
  13. php工具箱的mysql服务_解决php工具箱(phpStudy)Apache启动成功,MySql无法启动的问题...
  14. ibm刀片服务器 维护,IBM刀片服务器 一刀搞定企业信息化
  15. 岭回归,Lasso回归和弹性网回归理论及特点
  16. 下列计算机程序设计语言中不属于高级语言,下列计算机程序设计语言中不属于高级语言的是()?...
  17. kindle for pc版本更新后无法打开解决办法
  18. Linux | 云盘扩容后,lsblk显示已增加,df -h显示没变化
  19. 5、JVM分代模型--新生代 的垃圾回收
  20. OpenLayers基础教程——要素的编辑

热门文章

  1. 基于Memcached的Nginx服务器集群session共享
  2. 搭建Harbor docker镜像仓库
  3. tkinter Scale滑块
  4. C# ASPX页面做上传提示:超过了最大请求长度,解决方法
  5. Windows 7如何限制运行特定的应用程序(转载)
  6. Mongo db 与mysql 语法比较
  7. 发布一个jquery插件--在Web下输入密码时提示大写锁定键(2012-05-03 10:20最后修改)...
  8. v-cloak 的用法
  9. [原]正则表达式模式匹配入门
  10. svn 中 版本回退