Graph Embedding 及其在知乎的实践

Graph Embedding 及其在知乎的实践

9 月 6 - 7 日,在由 CSDN 主办的 2019 中国 AI 开发者大会(AI ProCon 2019)的 机器学习专场中,知乎算法团队负责人孙付伟在机器学习专场中分享了《Graph Embedding 及其在知乎的实践》。

Graph Embedding 技术是一种将图的拓扑结构进行向量表示的方法,从而获取到网络关系信息,应用于推荐等多种场景。在本报告中,孙付伟重点讲了 Graph Embedding 技术,以及在知乎的具体实践,包括知乎用户 Embedding 的实践和在在知乎收藏夹数据中的应用。未来,知乎还计划用 Graph Embedding 进行会员购买预测,以及个性化推送的召回。

以下为演讲内容实录:

很高兴能够参加这次AI开发者大会。我今天分享的是 Graph Embedding 及其在知乎的一些实践。什么是 Graph Embedding 呢?这些年来深度学习发展速度非常快,但是一直遇到一个问题,我们现实的世界当中很多是以图存在的,比如社交关系,比如搜索行为、购买行为,它形成的都是一种图的表示关系。但是传统的 Embedding,包括在自然当中图关系的挖掘,其实做的远远不够。从 2014 年开始,已经有一些业内学者在这方面做一些深入研究,研究Embedding 是否可以做图的表征,接下来我会简单做个介绍。之后我会分享一下 Graph Embedding 在知乎的两个应用,一个是用户 Embedding 的表示,一个是知乎收藏夹数据的Embedding 挖掘。最后是对今天分享的总结,以及我们未来的具体工作规划。首先讲一下知乎的业务背景。知乎现在已经是一个综合性的问答社区,截止到去年 11 月份,我们的用户数超过 2.2 亿,累计超过 3000 万的问题提出,并由此带来 1.3 亿的优质回答。除此之外,我们还有大量的文章,盐选专栏、电子书等等其他多种产品形态。在这样一个大的问答社区当中,本质上来说,其实一个问答社区是一种连接关系,万物都是一个连接关系。




在问答社区里面包含了三大块:一块是人和人之间的连接,一块是人与内容之间的连接。比如说在知乎的搜索和推荐当中,就存在着大量的连接关系,我们会根据用户的关注页关系来推荐内容。还有一块是内容自身的连接,在知乎有一个特殊的功能“收藏夹”,并且这个收藏夹是公开的,大概有几千万个,意味着其他用户是可以看到别人的收藏。这就会形成内容和内容之间的连接。在知乎这样一个万物都是连接的问答社区当中,如何有效表征这种连接关系,是我们这几年一直在思考一个点。


上图我们以站内一些数据做了一个连接关系的展现,其实一种大的连接点,会形成千千万万的连接。用户关系挖掘会有助于我们社群关系的连接提升,也有助于用户群体的发现。

既然是图关系,我们为什么要用到 Graph Embedding 呢?在面对图结构的时候,我们传统的序列 Embedding 经常不知道该怎么去处理。图这种连接关系是没有序列的表示,怎么去做这件事?为了解决这样一个问题,从 2014 年一直到现在,Graph Embedding 变成了业内一个全新的研究方向。我先介绍一些经典的技术和方法。首先我们看第一个,2014 年 Deep Walk 提出可以算作 Graph Embedding 迈出来的第一步工作。这篇文章的思想相对来说还是比较简单的,它是借助了 Word2Vec 之前的序列表示,随机游走方式,将图以序列方式表征。举一个例子,这个图更容易跟我们现实当中结合起来,最左侧是用户购买,或者贡献购买之间的关系。根据贡献购买之间的关系之后,走一步 random walk 生成,形成商品关系之间的序列,形成序列之后,就可以借助于 Graph Embedding 思想进行表示。可以说,它已经打开了 Graph Embedding 这扇门,让大家了解其实图也是一个我们需要去深入连接的点。


2014 年 Deep Walk 打开这扇门之后,2015 年微软发表了 LINE 这篇文章,这篇文章有两个核心的概念需要说明一下,它明确定义了图当中的相似度如何表征,这里表征用了两个概念,一个是1阶相似度,节点和节点之间存在直接的连接,叫1阶相似度。比如右侧的 6 和 7 ,7 和8,这种连接关系都是 1 阶连接,当它存在边,它的边就是它的相似度,如果不存在边,它的 1 阶相似度就是 0。2 阶相似度主要说的是它们的两个节点之间并不存在直接连接关系,但是它的邻居是大量重合的,主要衡量的是两个节点的网络结构相似度的程度是多少。

比方说在这个图里面,5 和 6,1 阶相似度是 0,2 阶相似度可以是另外一种值。通过这种方式我们就可以把图的这种关系用这样的定义来刻画出来,我们在现实当中经常需要去挖掘的是,除了它的 1 阶关系,还要用到它的 2 阶关系,从而能够应用到把这个 Embedding 学出来它们的网络结构的表征,从而应用于推荐这些场景。讲完概念之后我们再来看 1 阶相似度和 2 阶相似度如何定义问题的。




我们先说一个机器学习的问题,里面有一个叫预测概率、经验概率、和优化目标。在优化目标上,核心点主要预测的是交叉商的优化目标,这部分只是表征了一个正样本,我们其实还存在负样本,对负样本采用负采样的方式,把优化目标作为一个改造,形成这样一个表征,这是 1阶相似度。2 阶相似度,优化目标和上面是类似的。这是基于上面这种关系我们把它的优化目标做一个简单说明,这篇文章里面做了三点优化技巧。首先,1 阶和2 阶可以分开训练的,因为每个都有自己的优化目标,这篇文章里面特殊的技巧,分开训练,在一些应用场景里面把它concat 到一起做预测。其次是 wij,权重范围相当大,所以我们在去做预测推广的时候它的学习率是很难控制的,这里采用了一个技术方案,边采样,EdgeSample,从而降低这个问题。对于冷启动的事,当一个节点边较少的时候,怎么去处理,在现实当中冷启动经常会遇到这样的问题,这篇文章已经开始考虑了节点冷启动问题,它用的一个手段是,往外扩充,用它的 2阶邻居,它的 3 阶点来去处理它们 2 阶相似度,放在 2 阶相似度上来表明。这个是 2015 年的一篇文章。2016 年有两篇文章,一篇文章在 Deep Walk 的扩展,我们可以想一下 random walk 整个流程,类似于深度优先搜索的挖掘路径,这篇文章和 Deep Walk 唯一差别是,它既考虑了 DFS,又考虑了 BFS,可以把结构信息学得更全面一些。分为同质性和结构性,它们形成的序列越接近,Embedding 表征越相似,比如说 U 和 S1、S2 这些,表征越接近越好。结构性,两个结构越接近,学出来的 Embedding 表征越相似。如果我要更倾向于 BFS,U 和 S6更接近一些。如果是 DFS,相近的这些 Embedding 表征更相似。所以,这篇文章是做了结构性和同质性的某种中和,但是怎么来调节它们俩之间的权重,怎么来控制,其实用了一个跳转概率,来控制 BFS 和 DFS 的倾向性。


以下图为例,当一个T节点进入到下一个节点V的时候,到 V 这个节点之后,下一步应该朝哪个节点走呢?这里定义两个参数,分别是 p 和 q,通过这两个参数来控制我到底 v 朝 X2、X3随机走,还是返回。在 v 到 t 的跳转概率反而越来越小,越大就偏重于 DFS,如果 t 越小就偏重于 BFS。这篇文章把 p 和 q 做了一系列参数实验。整个效果看一看是不是我刚才说的内容。

当它越靠近 DFS 的时候,它们学出来的是这种促的信息,学 Embedding 表征越来越相近。如果是靠近 BFS,节点连接的关系信息学的会更相近一些。


这是 2016 年的第一篇文章,在 Deep Walk 基础上做了进一步演进,主要是解决结构性的问题。第二篇文章,SDNE 这篇文章,这两篇文章都发表在 KDD 2016 年的两篇文章,上面那篇文章是在 Deep Walk 基础上做扩展,这篇文章是在 LINE 基础上做扩张。图的网络结构信息分成 local 和 global 的,local 是 LINE 里面 1 阶关系,直接相连关系,global 说的是邻居之间跟它的连接关系,这是它的一个对应。

这篇文章又用了另外一种思路,非监督的 autoencoder 方式,来得到 Embedding 表示,我们先来看右侧这个图,global Embedding 的图的结构。它的 Embedding 表示什么呢?和我相连的那些节点权重就是这里面的表征,xi 是这样表征,autoencoder 之后会形成新的表征,我们去衡量它原始的表征和新的表征之间的相似度,就是我们优化的一个点。xi用邻居的信息来表征它自身特征的,其实是 global 的概念。(原文当中的图是错的,这个地方是 local,这个是global,其实我们反过来看,应该是画错了,这个词画错了。)


这个是针对i这个节点,针对j这个节点也一样,也会学出来这个表征,最终i这个节点的表示是中间这一层,我们是要去度量中间这两个节点的相似度,来去表征。它的优化函数,加了一个因子。这篇文章可以说是用了我们 N 的更复杂的 autoencoder 的思想,在 LINE 的基础上做了扩展。这篇文章其实也有应用,在阿里,凑单系统里面,这是他们开放的一个博客里面有所提到,凑单系统里面做这件事,怎么做呢?拿到用户同时购买的内容序列,形成这样一个图的表示。在这个图的表示里面去用加权的 walk 做采样,为什么做采样?这个表征是说它与它相连的那些节点之间的权重,当我这个数据量规模,像淘宝这样一个大的数据规模里边,连接关系是特别特别多的。先对样本做采样,采样的方式是对热门数据做加权,它想表征出来让热门数据推荐的更充分一些,然后做了这样一个加权,这个里面用的结构其实就是 SDNE。不过它在SDNE 里边加了这样一个全连接,能跟它的现有系统做一个比较,这是它的一个变化。它在双11 预热期间,在点击和多样性这两个指标上,据它的公开表述说,它的点击提升了 13%,它做成实时化之后,在这个基础上又提升了 4%。它们内部多样性指标直接翻了接近 1 倍。



这是 2016 年的第二篇文章。在2018年阿里又写了一篇文章,主要用在解决我们在图里面表征冷启动的一些问题,有些节点它的信息较少,我们怎么去处理。EGES 是在 2018 年 KDD 上发表的,核心点主要是在 Deep Walk 基础之上加入了对冷启动商品的处理,加入的方式叫 side information,两个商品之间尽管没有共现的关系,尽管共现关系特别少,但是还有其他额外的知识信息,知识图的信息是可以用起来的。比如说属于同一个店铺,属于同一个品类,属于同一类价格区间等等,大概十几类 side information,把这个信息变成了它在图当中利用特殊的相似度链接,把它拼接起来,形成一个新的更完备的图。后面的工作就比较简单了,形成这个链接之后,不同的连接关系,通过 side information 信息学的某种表征,把向上连接作为不同权重来去学习它。


这篇文章思路是比较简单的,但是它具有很强的实操性,在业内已经有几个公司都在用这篇思路来做 Embedding 召回,一会儿我们可以去看在知乎上的效果。上面简单说了一下 Graph Embedding 这些年主要的技术点,当然,还有最新的我还没有讲到。我下面主要讲一讲 Graph Embedding 在知乎的两个实践,现在 Graph Embedding 在知乎应该有三四个分别的应用,我先拿这两个,因为这两个和上面的文章是一一对应的。

第一个,关于用户 Embedding 表示,这个是我们在 2017 年的时候做的一个尝试,我们在知乎大概有几千万的存在大量链接关系的用户,为了强化他们在社区上的互相影响,并且让他们形成一种社区的概念,做用户的推荐,或者说用户群体的挖掘,变成我们不得不考虑的一件事。当时考虑一个点,用 Graph Embedding 思路,我们去学一下 Embedding,看看它的效果。这里面的思想其实比较简单,就是纯的 Deep Walk,通过筛选,大概筛选出 2400 万用户群体,根据它的关系挖掘,形成这样的关系链路,形成关系序列,最后就是用 Deep Walk 思想做了预测。


上图是我们跑完之后的效果图,做机器学习和深度学习的会比较了解这些同学。

上面的思想比较简单,2017 年做的,今年上半年我们又做了第二件事,EGES,阿里2018年的那篇文章,知乎有几千万收藏夹的数据,这是两个例子,深度学习,用户自己编辑的收藏夹,我们可以看到相关文章,常用的,什么是梯度下降法,机器学习最好的课程是什么等等,一系列文章,形成了收藏夹。这些是成长相关的文章,比如自律,提升自我竞争力等等。当然,这些数据全是用户自己对外公开的数据,因为收藏夹数据要么是自己看的收藏夹,要么是公开的收藏夹,我们用的数据都是公开的,用户愿意分享的收藏夹数据。这个收藏夹数据包含了大量有价值的内容,2018 年的时候,我们大量都在用一些协同过滤思想来做这件事,挖掘它们之间的关系。当时遇到两个问题没太好解决。第一个问题,长尾的内容不太好表示。第二个问题,默认了用户的这个序列,在我们协同过滤里边浏览的序列,但是在实际当中,它这个先后是没有任何关系的。所以,在矩阵协同分解的时候,我们认为它无法表达更强的传播能力,让它学的多样性不够,总体效果也可能会有些损失,等一会儿我们来看看是不是这样。其实思想还是借助于业内他们的思路,他们是基于共同购买,我们是基于收藏夹的内容,做一些筛选,构建 Graph,节点为内容,而没有把收藏夹变成其中一个节点,这个其实是有一个考虑的。大家可以想想为什么,我们的内容可能和收藏夹是不成比例的,在我们收藏的内容,如果把它变成一个节点,它可能学出来的会有些问题,当然,这是我们睬的一些坑,后面挖掘出来的东西。如果它贡献了,我们就认为它存在一条边。在收藏夹数据里边,我们跟淘宝可能不太一样的地方是,我们更期望的是推荐出来它的真正 Embedding 相似,而不是推荐一些热门的。所以,在这里我们会对热门内容降采样,并且考虑做序列挖掘的时候,考虑了 BFS 挖掘信息。我们还引入了自身的 side information 信息,例如 topic,两篇文章同一作者等等这样的信息,加入到我们的 Embedding 学习当中。这是我们做的几个概念。训练集,110 万节点,构建 3 亿条边,Random walk 和 EGES 差不多,每个节点会进行 10 次 walk,最终效果是下面这个结果。本来还有它作为 Embedding 召回在线上应用的东西,但是那些东西不太适合在这个场景去说,所以我就没有把那些东西添上。我们先以一个事例说明效果。同样是两个回答,这两个回答都是说为什么白居易写了《琵琶行》却不娶琵琶女,我们可以看用协同过滤推出来的效果,右侧是我们基于 EGES 推出来的。基本上是偏重于诗词,还有一些是雅称,还有一些是关于鲁迅文学相关的,大概是这样一个推荐的效果,这是在召回上。我们现在这个东西会用在好几个推荐场景,比方说个性化推送,比方说做内容回答的推荐等等等等,还有问题的推荐。这是两个在知乎的具体实践。



最后做一个简单总结,我们认为 Graph Embedding 在这些年已经成为推荐系统、计算广告等领域一种新的流行做法,并且 Graph 这种图的表征还在如火如荼的开展当中。我们认为它的影响会持续放大。我们现在跟着业内最前沿的脚步往前走,看看如何达到更好地把最新的技术前沿应用到知乎具体的算法场景当中。其次,关于未来规划,我们在这里面会涉及到两点,一是会员购买预测,知乎现在的会员业务中涉及到像淘宝一样购买场景,但是这里面存在一个问题,它的数据更稀疏,如何在稀疏的数据当中学出来 Embedding 表示,是我们要考虑的一个点。第二个是个性化推送的召回,目前已经上线。二是更多的技术尝试,我们在用户画像当中只用到了 Embedding 挖掘,但用户的持续兴趣、关注兴趣、浏览文章等等,有大量信息是可以去用的,但是这个信息我们现在还没有做进一步的尝试,这将是我们下一步要尝试的点。第二点,根据SDNE那篇文章,我们认为它那个表征会更自然一些,现在想法是会把 side information 信息与 SDNE 结合,看看会不会有别样的效果提升。

发布于 2019-09-18

文章被以下专栏收录