本文将介绍图机器学习在蚂蚁推荐系统中的应用。在蚂蚁的实际业务中,有大量的额外信息,比如知识图谱、其他业务的用户行为等,这些信息通常对推荐业务很有帮助,我们利用图算法连接这些信息和推荐系统,来增强用户兴趣的表达。全文主要围绕以下几方面内容展开:
- 背景
- 基于图谱的推荐
- 基于社交和文本的推荐
- 基于跨域的推荐
01 背景
支付宝除了最主要的支付功能外还有大量的推荐场景,包括腰封推荐、基金推荐和消费券推荐等等。支付宝域内的推荐相比于其他推荐最大的区别是用户的行为稀疏,活跃度较低,很多用户打开支付宝只是为了支付,不会关注其他东西。所以推荐网络中UI边的记录是非常少的,我们的关注点也是低活目标的推荐。比如为了提升DAU,可能只会给低活用户在腰封投放内容,正常用户是看不到的;基金推荐板块我们更关注的是那些没有理财或理财持仓金额较低的用户,引导他们买一些基金进行交易;消费券的推荐也是为了促进低活用户的线下消费。
低活用户历史行为序列信息很少,一些直接根据UI历史行为序列来推荐的方法可能不太适用于我们的场景。因此我们引入了下面三个场景信息来增强支付宝域内的UI关系信息:
- 社交网络的UU关系
- II图谱关系
- 其他场景的UI关系
通过社交网络的UU关系可以获取低活用户好友的点击偏好,根据同质性就可以推断出该用户的点击偏好,物品与物品之间的图谱关系可以发现、扩展用户对相似物品的喜好信息,最后跨域场景下的用户行为对当前场景的推荐任务也有很大帮助。
02基于图谱的推荐
很多推荐场景中用户的行为是稀疏的,尤其是在对新用户进行刻画时,可利用的行为信息很少,所以通常要引入很多辅助信息,比如attribute、contexts、images等等,我们这里引入的是knowledge graph—知识图谱。
1. 现存挑战
知识图谱是一个大而全的历史专家知识,有助于我们的算法推荐,但是还存在两个问题:
一是图谱本身可能并不是为了这个业务而设计的,所以里面包含很多无用信息,训练过程也非常耗时。一个常用的解决办法是只保留图谱中能关联上我们商品的边,把其他边都删掉,但这又可能会造成一些信息损失,因为其他边也是有用的。
二是图谱用做辅助信息时,没办法将用户的偏好聚合到图谱内部的边上。如上图所示,用户1喜欢电影1和电影2的原因可能是因为它们有同一个主演,而用户2喜欢电影2和电影3的原因是它们的类型相同。如果只用普通的图模型的UI、II关系来建模,只能得到用户和电影的相关性,而没办法将用户的这些潜在意图聚合到图谱中。
所以我们后面主要解决图谱蒸馏和图谱精炼这两个问题。
2. 现有方法
① 基于Embedding的模型
基于Embedding的方法先通过图谱表征学习的方法把图谱中的节点转化为一个Embedding,然后将Embedding直接接入到UI模型中。这类方法提前学习了图谱中的相关性,并把其转为一个Embedding,所以很难再衡量用户与知识边的相似性,没有解决图谱蒸馏和图谱精炼的问题。
② 基于Path的模型
基于Path的方法根据图谱中的知识边把图谱分解为多条meta-path,但是构建meta-path 的过程需要很多专家知识,同时也没有体现出用户对知识边的偏好。
③ 基于GCN的模型
基于GCN 的方法通过UI和II关系建模,一般通过attention的方法根据不同类型的边取不同的权重,但边的权重只和边两端的节点表征相关,与目标节点的表征无关。
3. 解决方案
我们提出的模型主要分为4个部分,首先通过图谱表征学习得到图谱表征,利用知识依赖传播来学习、聚合得到不同边的重要性,然后通过一个蒸馏模块对图谱中的边采样、去噪,再加入条件注意力做图谱精炼,最后做一个双塔模型得到结果。
下面介绍每一部分的具体细节:
① 图谱表征学习层
我们这里使用的是传统的TransH图谱表征模型,因为我们的图谱中有很多many-to-one和one-to-many的边。通过TransH把每一个节点都映射到边对应的空间中,在这个空间上衡量两个边的相似性。
② 图谱表征学习层
学习完图谱边的表征后,在邻居内聚合图谱边的表征,再通过求不同的边空间的cos距离作为点的加权聚合图谱点的表征。因为图谱中的边的噪声很大,所以我们会做一个额外的采样,根据我们学到的权重在目标子图上进行采样,目标子图就是用户和商品的二阶子图合在一起,经过采样得到更小的子图。
③ 图谱表征学习层
得到子图之后,我们做一个条件注意力,在给定用户和商品的情况下衡量边的重要性。边的重要性可以分为两部分,一部分是这个边本身很重要,另一部分是用户很关注这个边。边本身的重要性已经在上一步中的知识依赖注意力中学习了,不用再做额外训练,用户对边的重要性是通过将所有目标集合的表征和边两端点的表征拼接做一个注意力得到条件注意力,再根据条件注意力做点的聚合。
④ 双塔模型
最后做一个双塔模型衡量pairwise loss,用类Adam方法同时优化图谱表征学习loss和推荐系统的目标loss,我们的算法复杂度与点和边的数量呈线性关系。
4. 实验结果
① 实验数据集和基准模型选择
我们选取了一些推荐系统加知识图谱的数据集和我们业务的基金推荐数据集,baseline主要有基于正则的CKE方法,基于矩阵分解的NMF方法,基于Path的异构图的方法RippleNet和基于GCN的KGAT。
②注意力可视化
左边的Knowledge attention中,每条边上的数值只和两端节点相关,在右上角的U532和i1678上的值很小,后面就不容易采样到这条边。右边的两个图用户都是U0,但商品不一样,整个图的权重就完全不同。在预测U0-i2466以及U0-i780的相关性时,两个图最右一条路的权重就完全不同,并且U0-i2466的最右一条路径的权重更大一些,因为在预测U0-i2466的相关性时最右边的一条路要更重要一些。
③模型评价
我们在Top-K推荐和CTR点击任务上衡量了模型效果,相比于baseline模型都有很大提升,在线上做基金推荐A/B testing实验也带来效果的提升。最后我们做了消融实验,结果显示去掉条件注意力或知识注意力模型效果都会下降,证明了我们所做改进的有效性。
03基于社交和文本的推荐
我们这里的基于社交和文本的推荐不是一个传统意义上的推荐场景,主要是为了帮助运营理解用户意图,给用户创造一些新内容、新广告来引导用户增长。比如腰封推荐的封面如何设计,运营只有在充分理解用户意图后才能设计出符合用户心理预期的内容。
1. 现存挑战
一个自然的方法就是使用Topic Model来衡量用户到意图,意图到商品的分布,把用户当做一个文档,商品当做一个单词分解出用户意图。但实际上用户的点击是稀疏的,尤其是我们的目标客户是低活用户时,并且商品的点击服从长尾分布,也很难获取用户的兴趣和意图。
2. 解决方案
首先我们将UU关系和UI关系都加入到GNN中来学习,衡量用户的点击行为,然后我们对学习到的用户—意图先验分布做一个近似,传统的Topic Model的先验分布是一个狄利克雷分布,我们这里用的是一个Logistic Normal的分布,它和狄利克雷分布长得很像,可以通过一些重参数化的工作使得这个分布的学习是可导的。
学习完用户与用户之间的关系后,下一步学习语料间的关系。上图中有一个小程序,里面有一段文本描述,利用skip-gram模型计算item与正、负样本的相似度,得到单词的相似度,并通过一个DNN将单词的相似度映射为用户意图表征,最后通过KL散度约束分布调整为我们想要的形式。
3. 实验结果
我们的数据集是用户的连续7天的点击数据,其中包括大约50万用户,9206件商品和2亿用户历史点击行为,社交网络中包括700万条边,每个用户平均有14-15个邻居节点。
我们分别做了离线和在线实验测试,离线实验衡量了不同数量Topic下的用户间的相似性和语义间的相似性。在线实验通过我们的模型预测出的用户意图反馈给运营,运营根据用户意图设计描述文本和展示页面做线上推荐。整体模型的实验链路可能比较长,因为运营中间会产出一些素材,线上A/B实验的目标分为两部分,一部分是运营根据我们的模型反馈设计素材,一部分是利用历史专家经验做产出。实验结果显示我们的模型在离线、在线实验中都相较于之前有了很大提升。
04基于跨域的推荐
我们的推荐目标是低活用户,他们可能没有标签,没有特征,甚至从来没有使用过支付宝。上图中我们首先分析了用户之间的相似性,其中与蓝色代表陌生人的行为相似性,红色代表与朋友的行为相似性,结果显示关系更接近的朋友行为重叠度更高,所以我们可以使用用户的好友行为信息作为用户信息的一个补充。然后我们分析了活跃用户和不活跃用户的好友数量,发现活跃用户的好友数量是远多于不活跃用户的,所以我们想能不能把活跃用户的点击信息迁移到其不活跃的好友信息上来辅助推荐。
所以我们模型的一个核心思想就是对齐活跃用户和不活跃用户的特征空间,因为不活跃用户在很多特征上都是缺失的,所以他和活跃用户的特征空间本质上是不一样的。这里我们使用GNN学习用户的表征,将用户的表征映射到一个共同空间。如上图所示,CD-GNN的结构上层是我们想预测的一个活跃用户,下层是我们想预测的一个不活跃用户,他们经过两个GNN的学习再通过一个领域不变层映射到一个共享的表征上,最后对活跃用户和非活跃用户都做一个label的预测。
具体来说,图模型包括Social网络和User-Page网络,对两个网络做不同的聚合,通过Domain Invariant Layer将活跃用户和非活跃用户映射到同一空间,最终的loss=Source loss+Target loss-Domain invariant loss。线上的A/B实验效果显示我们的模型相较于GCN在CTR上提升很大,在行为稀疏的情况下我们的模型仍然能取得一个好的效果。
上面是我们团队近期发表的一些成果,我讲的主要是上面3篇的工作。
05互动问答
Q1:CD-GNN层的参数是不是共享的?
A1:不是共享的,因为活跃用户的一些特征,比如ID特征是远多于不活跃用户的,两者的特征分布并不一致,所以这里我们没有做共享 。
Q2:跨域推荐的问题中不活跃用户的Target Label数量很少,导致模型对不活跃用户的Target Embedding学习很差,这类问题应该怎么考虑?
A2:可以用一些pre-trained方法来提前增加一些表征信息,或者把缺失的特征通过一些方法补充上。可以边做图模型边做特征的补充,把邻居的特征也补充过来,而不是只简单把邻居特征聚合,其中再添加类似于特征重构的loss可能会帮助解决这个问题。
Q3:第一个基于图谱的方法是在精排场景落地的?里面的GNN一般做到几阶?
A3:我们的基金推荐板块给用户曝光的只有5个基金,不像其他场景下推荐出一个列表,底下可能有几百条信息,用户可以一眼看到这5个基金,重排的影响不是很大。我们模型的结果直接接到线上,是一个精排模型。一般就做到两阶GNN,三阶在一些任务上的提升不是很大,并且线上的时延太长了。