EGES算法实在论文《Billion-scale Commodity Embedding for E-commerce Recommendation in Alibaba》,主要用于商品推荐中。这篇论文的一作是阿里巴巴团队的,实验部分说该算法应用在了淘宝中。本人最近刚入职某公司,从事推荐算法的工作,因此后续会分享一下推荐相关的算法或者心得。
一、研究动机
1. 扩展性。现有的大部分推荐系统可以运用在一百万的用户和商品中,但无法运用在拥有十亿的用户和二十亿商品的淘宝中。
2. 稀疏性。用户往往只和少量的商品交互,因此很难去训练一个精确的推荐模型。
3. 冷启动。淘宝上每小时会有百万级的新商品被上传。由于这些商品没有用户行为的信息(点击、购买等),因此很难预测用户对这些商品的喜爱程度。
作者设计了一个两阶段的推荐框架:匹配(或召回)和排序。这也是一般推荐模型的框架。作者在这篇文件主要是解决了匹配阶段的问题,通过用户行为计算商品间两两的相似性。相似性topK的商品输入到排序阶段。接下来是算法流程。
图1
二、通过用户行为构建Item图
统一将商品称为Item。用户的点击行为往往是序列化的,比如图1(a)中的用户U1,我们经常点击商品D后,再浏览之后点击A ,再点击B。因此我们将用户的历史行为数据作为一个序列数据。由于时间和空间的复杂度以及用户兴趣的变化,作者选择了一个小时内用户的行为,该行为被称为session。(疑问:作者选择了最近一小时的用户行为数据?还是选择最佳某个时间段的数据,然后按一小时划分?)
获得了用户的session数据后,我们构建有向图了(是否可以构建无向图看看结果?)。如果两个item是在序列中连续出现的,前面的item会连接到后面的item,例子见图1(b)。构建的有向图是有权的,权重等于在序列数据中出现次数。在抽取数据时,作者也过滤了一些无效或者异常的数据:停留时长小于一秒;过于活跃的用于;相同ID但不同的商品。
三、Base Graph Embedding(BSE)
构建完了加权有向图后,接下来而已使用DeepWalk产生Item的嵌入向量了。大家可以去阅读一下DeeWalk的原论文,这里大概讲一下方法。1)计算每个节点跳到每个邻居的概率,也对边归一化,然后通过随机游走产生多个节点序列;2)使用skip-gram方法最大化中心节点对文本节点(w窗后内)的相似度(参考word2vec方法):
为了计算方便,论文采用了负采样的方法:
节点j时正样本,节点t是负样本。
四、Graph Embedding with Side Information(GES)
为了解决冷启动问题,作者加入了商品的附属信息,比如商标、类别等。让W表示节点潜入矩阵,是节点自身的嵌入向量,
是第s类附属信息的嵌入向量。最终节点的向量为自身向量和所有附属信息向量的平均,所有的嵌入向量都有相同的维度。
五、Enhanced Graph Embedding with Side Information (EGES)
GES的问题是平均聚合了所有向量,忽略了不同类别的属性为节点的影响。作者提出了一种加权聚合附属属性的方法,示例图如下:
图2
SI0表示每个Item,SI1...SIn表示每个类别的附属信息。稀疏特征通常为one-hot特征,因此模型首先对每一个类别学习一个密集向量,用W表示。模型还会学习一个权重矩阵,|V|表示Item个数。每个Item都有一个不同的类别权重分布。
最终Item的嵌入向量H通过上面公式加权聚合得到。上面的归一化实际上是用了一种softmax归一化,可以保证每种类别的权重大于0。损失函数定义如下:
y是标签符号,等于1表示正样本,0表示负样本。v是中心节点,u是采样到的文本节点。H是我们需要得到的嵌入向量,Z是节点文本向量(作为副产物会被模型学习到)。
六、算法流程
在算法1中,我们会首先采样出一个节点序列(第4步采样),每个节点序列会被用于更新模型参数(第5步更新模型参数,调用算法2)。在算法2中,每个节点的左右窗口k内的节点作为正样本,先试用正样本更新参数(算法2的第14步到20步)。然后随机采样#ns个负样本去更新模型参数。更新的公式在论文中有推导。
以上是整个EGES的算法流程,关于实验部分大家可以看看论文。