阿里技术团队有一篇文章,是讲淘宝双十一背后的支持系统的:一天造出10亿个淘宝首页,阿里工程师如何实现?。我对里面提到的深度召回框架还挺感兴趣的,试图从中解析一下看看。node
阿里的这个深度召回系统来源于《DeepWalk: Online Learning of Social Representations》。咱们今天先来看看这篇文章讲了什么。算法
DeepWalk自己是一个学习网络中顶点的embedding表达的图算法。它使用语言模型的方法来学习社交网络中的顶点的隐藏表达,并得到了很好的效果。总之,DeepWalk输入是一个网络,输出是各个顶点的latent表达。网络
首先定义一些符号:是一个有向带权图,V和E分别表示顶点和边集。
是一个部分有标签的社交网络图,其中
,
是特征空间的维度。
,
是label集。在通常的分类算法中,咱们试图寻找一个map将
的特征映射到
。而在这篇文章中,咱们使用无监督方法来学习网络结构。session
咱们的目标是学习一个,d是隐向量维度而且很小。这个d维向量表明了网络结构特征。这个表达应该有以下特性:框架
随机游走是常见的采样方法,本文中将它用于序列采样。文中的随机游走过程以下:从顶点开始的一次随机游走被标记为
,那么下一步要选择的顶点
是从顶点
的邻居中随机选择的。文章用这种方法完成采样而且将采样完成的序列看成语言模型中的语料来使用。dom
通常来讲,一个语言模型的预测目标是一个单词在一段预料中出现的几率,即给定一个单词序列:,咱们须要经过最大化
来预测
。类比到咱们的问题中,则应该是最大化
。但咱们的目标是学习一个隐表达,设咱们所须要的map为
,那么咱们须要最大化
。而新的语言模型容许咱们不考虑词语之间的顺序,把这个问题变成:ide
其中是窗口大小。在这种设定下,拥有相似邻居的节点会有相近的embedding表达。学习
根据上述理论,DeepWalk的算法以下: 优化
首先, 随机初始化。从V创建一颗二叉树,这主要是为了作hierarchical softmax。以后进行
轮在V上的随机游走,每一次都须要打乱V的顶点的访问顺序。每一轮V上的随机游走由从每个顶点开始的一次长度为t的随机游走构成。在每个随机游走序列造成之后,须要使用一次Skip-Gram算法。网站
Skip-Gram是一个语言模型,该模型用于最大化一个窗口内的单词的共现几率,咱们在这里用于更新。具体来讲,做者们运用了hierarchical softmax方法来优化完成Skip-Gram过程,并用随机梯度降低方法来完成更新。关于Skip-Gram,有兴趣的读者能够看这个blogWord2Vec Tutorial - The Skip-Gram Model。
那么,仍是根据一天造出10亿个淘宝首页,阿里工程师如何实现?咱们该怎么把DeepWalk这个模型用到淘宝推荐系统中来呢?
DeepWalk是一个在网络上生成embedding的模型,咱们首先要生成一个网络。阿里使用SWING算法生成了一个商品之间的有向带权图做为网络。SWING实际上是一个在u-i二部图上,利用一种叫作SWING的三角结构生成i-i类似度的方法,若是不会用SWING的话,应该用其余的类似度模型也能够代替这个算法。 SWINGF算法生成的i-i类似度不是对称的,因此最终造成的形式是有向带权图。
固然,有向带权图还意味着咱们在random walk的时候须要根据权重对random walk进行调整。
文章说他们借鉴了Node2vec: Scalable Feature Learning for Networks的采样方法。那么,这篇文章的采样方法是什么呢? node2vec自己是一个用于学习网络中节点的特征表达的半监督学习方法。它的流程其实跟DeepWalk很像。阿里在这里主要借鉴了它的random walk的流程。
首先,咱们分别定义DFS和BFS邻居,如图所示:
BFS邻居是指和节点直接相连的邻居节点;DFS邻居指的是sequence的邻居。BFS很容易理解,为何要有DFS邻居这个定义呢?
网络中的节点有两种类似性:一种是趋同性,好比u和s1,一种是结构类似性,好比u和s6。BFS邻居有助于探索趋同性,而DFS邻居有助于探索结构类似性。在商品推荐中,啤酒和红酒能够认为是结构类似性,而啤酒和炸鸡能够认为是趋同性(我本身认为的,可能有误解)。在实践中,这两种类似性都很经常使用。Node2vec定义了同时能够运用这两种属性的random walk机制:
除了random walk以外,node2vec还使用了negative sampling方法,用来取代DeepWalk中的hierarchical softmax方法。淘宝也一样采用了这个方法。同时,他们还采用了动态采样器的优化方式。关于Negative Sampling,有兴趣的读者能够看这个博客Word2Vec Tutorial Part 2 - Negative Sampling.
在上述基础上,淘宝提出了Sequence+Side-information版本。
就个人理解,所谓sequence,即用真实的用户session数据取代random walk的数据,做为训练样本。不过在这里,淘宝这个网站的特殊性是很重要的。做为一个实时更新的购物网站,用户的浏览记录之间有很是强的相关性,可是通常的网站可能相关性没有这么强,实践中能不能这么作依然存疑。
Side Information就比较好理解了,就是至关于加入一些item自己相关而structure无关的数据,加入embedding一块儿作训练。毕竟咱们的目标是作item召回,而不是像Deep Walk那样想衡量社交网络上的相关性。
“在session内行为构建全网图后,引入相似tf-idf的转移几率链接边,克服哈利波特热点问题,且在此基础上进行几率采样,构建用户行为的"虚拟样本",以扩大后面输入到深度模型里面的宝贝覆盖量及准确度,使多阶扩展信息更加完善”这一段我其实没怎么理解,若是有理解了的读者欢迎交流。
最后一个阶段的优化实际上是针对淘宝的大规模数据集的,在通常的推荐场景下极可能不须要考虑这部分的优化,固然相对于双十一这种规模的体量,这是很是重要的一部分。
总而言之,淘宝的深度召回框架大概流程以下:
关于Skip-Gram我以为还有几个blog也写得很好,不过有些是国外博客的中文翻译: