3、 SASRec
顺序动态是许多现代推荐系统的一个关键特征,这些系统试图根据用户最近执行的行动来捕捉他们活动的 "背景"。为了捕捉这种模式,有两种主要的方法:马尔科夫链(Markov Chains,MCs)和循环神经网络(RNNs)。马尔科夫链假定可以根据用户的最后(或最后几个)行动来预测他们的下一个行动,而RNN原则上允许发现更长期的语义。一般来说,基于马尔可夫链的方法在极其稀疏的数据集中表现最好,在这种情况下,模型的简洁性至关重要;而RNN在密集的数据集中表现更好,在这种情况下,更高的模型复杂性是可以承受的。本文的目标是平衡这两个目标,提出了一个基于自注意力的顺序模型(self-attention based sequential model,SASRec),它允许我们捕捉长期语义,使用注意力机制,根据相对较少的行动进行预测。在每个时间步长,SASRec试图从用户的行动历史中识别哪些项目是 "相关的",并利用它们来预测下一个项目。
图5. SASRec的训练过程的简化图。在每个时间步长中,模型考虑所有以前的项目,并使用注意力来 "关注 "与下一个行动相关的项目
在顺序推荐的设定中,给定一个用户的行动序列Su = ((S_1)u, (S_2)u, ..., (S_|Su|)u),预测下一个项目。在训练过程中,在时间步长t,模型根据之前的t个项目来预测下一个项目。将训练序列((S_1)u, (S_2)u, ..., (S_|Su|-1)u)转化为固定长度的序列s = (s_1, s_2, ..., s_n),其中,n代表模型可以处理的最大长度。如果序列的长度大于n,我们就考虑最近的n个动作。如果序列长度小于n,我们在左边重复添加一个 "padding "项,直到长度为n。创建一个项嵌入矩阵M∈R|l|xd,其中,d是潜在维度,并检索输入嵌入矩阵E∈Rnxd,E_i=M_si。一个恒定的零向量0被用来作为填充项的嵌入。由于自注意力模型不包括任何循环或卷积模块,它不知道以前的项目的位置。因此,我们在输入嵌入中注入一个可学习的位置嵌入P∈Rnxd。
缩放的点积注意力定义为:
在机器翻译等NLP任务中,注意力机制通常使用K=V(例如使用RNN编码器-解码器进行翻译:编码器的隐藏状态是键和值,解码器的隐藏状态是查询)。在该方法中,自注意力操作将嵌入的E_b作为输入,通过线性投影将其转换为三个矩阵,并将其送入注意力层:
由于序列的性质,模型在预测(t+1)项时应该只考虑前t项。然而,自注意力层(S_t)的第t个输出包含后续项目的嵌入,这使得该模型不适用。因此,通过禁止Qi和Kj(j>i)之间的所有链接来修改注意力。尽管自注意力能够以适应性的权重聚合所有以前的项目嵌入,但最终它仍然是一个线性模型。为了赋予该模型以非线性,并考虑不同潜在维度之间的相互作用,对所有的S_i都采用了一个点式两层前馈网络(共享参数):
在第一个自注意力区块之后,F_i基本上聚合了所有以前的项目嵌入(即E_bj, j≤i)。然而,通过另一个基于F的自注意力块来学习更复杂的项目转换可能是有用的。具体来说,将自注意力区块(即一个自注意力层和一个前馈网络)进行堆叠,第b(b>1)个区块定义为
然而,当网络加深时,有几个问题会变得更加严重。1)模型容量的增加导致过度拟合;2)训练过程变得不稳定(由于梯度消失等原因);3)具有更多参数的模型往往需要更多的训练时间。因此,引入以下处理:
现有的顺序推荐方法表明,最后访问的项目对预测下一个项目起着关键作用。然而,在经过几个自注意力块之后,最后访问的项目的嵌入已经与之前的所有项目纠缠在一起;添加残差连接将最后访问过的项目的嵌入传播到最后一层,会使得该模型更容易利用低层的信息。
层归一化是用来归一化各特征的输入(即零均值和单位方差),这有利于稳定和加速神经网络训练。与批量归一化不同,层归一化中使用的统计数据与同一批次中的其他样本无关。具体来说,假设输入是一个包含样本所有特征的向量x,该操作被定义为:
为了缓解深度神经网络中的过拟合问题,"Dropout "正则化技术已被证明在各种神经网络架构中是有效的。Dropout的概念很简单:在训练期间以概率p随机 "turn off "神经元,并在测试时使用所有神经元。我们还在嵌入的E^上应用了一个Dropout层。
在自适应地、分层次地提取先前消费的项目信息的b个自注意力块之后,根据(F_t)b预测下一个项目(给定前t个项目)。具体来说,采用一个MF层来预测项目i的相关性。
为了减少模型的大小和缓解过度拟合,本文考虑另一种方案,它只使用一个单一的项目嵌入M:
使用同质物品嵌入的一个潜在问题是,它们的内部产品不能代表不对称的物品转换(例如,物品i经常在j之后购买,但反之则不然),我们的模型没有这个问题,因为它学习了一个非线性变换。
为了提供个性化的推荐,现有的方法通常采取两种方法之一:1)学习一个代表用户偏好的显式用户嵌入。2)考虑用户以前的行为,并从访问过的项目的嵌入中诱导出一个隐含的用户嵌入:
其中,U为用户嵌入。
当前 SOTA!平台收录 SASRec 共 4 个模型实现资源。
项目 | SOTA!平台项目详情页 |
SASRec |
前往 SOTA!模型平台获取实现资源:https://sota.jiqizhixin.com/project/sasrec |
4、 PinSAGE
Pinterest 推出的基于 GCN ( GraphSAGE)的召回算法 PinSAGE,被称为"GCN 在工业级推荐系统上的首次成功运用"。PinSAGE 主要思想是通过 GraphSAGE 得到 pin(Pinterest 中的书签,可以理解为普通推荐系统中的 item)的向量表示,然后基于 pin embedding 做 item2item 的召回。PinSAGE 底层算法就是 GraphSAGE,只不过为了将其落地于一个 web-scale 的工业级推荐系统,PinSAGE 做了一系列的改进。
图6. depth-2卷积的模型结构概览。上左图:一个小的输入图例。上右图:2层神经网络,计算出节点A的嵌入(h_A)2的2层神经网络,该网络使用前一层的表示法计算节点A的嵌入。底部:计算输入图的每个节点嵌入的神经网络。虽然各节点的神经网络不同,但它们都有一组相同的参数。具有相同阴影模式的方框共享参数;γ表示重要性集合函数;薄矩形方框表示密集连接的多层神经网络
PinSAGE的关键计算工作原理是局部图卷积的概念。为了生成一个节点(即一个项目)的嵌入,应用了多个卷积模块,这些模块从节点的局部图邻域聚集特征信息(例如,视觉、文本特征)(如图6所示)。每个模块都会学习如何从一个小的图形邻域聚集信息,通过堆叠多个这样的模块,PinSAGE可以获得关于局部网络拓扑结构的信息。重要的是,这些局部卷积模块的参数是在所有节点上共享的,这使得该方法的参数复杂性与输入图的大小无关。
Pinterest是一个内容发现应用程序,用户与pins互动,pins是在线内容的视觉书签(例如,他们想做的菜谱,他们想购买的衣服等等)。用户将这些pins整理成板块,其中,包含用户认为在主题上相关的pins集合。总的来说,Pinterest图包含20亿个pins,10亿个boards,以及超过180亿条边(即pins与相应board的会员关系)。我们的任务是生成高质量的pins嵌入或表示,以用于推荐。为了学习这些嵌入,将Pinterest环境建模为一个由两个互不相干的集合(I(包含pins)和C(包含boards)中的节点组成的二方图。除了图结构之外,还假设pins/项目 u∈I与实值属性x_u∈Rd相关。一般来说,这些属性可以指定项目的元数据或内容信息,在Pinterest的案例中,我们认为pins与丰富的文本和图像特征都有关联。目标是利用这些输入属性以及bipartite graph 的结构来生成高质量的嵌入。然后,利用这些嵌入通过最近邻查找来生成推荐系统的候选人,或者作为机器学习系统中的特征来对候选人进行排名。
前向传播算法。我们考虑的任务是为一个节点u生成一个嵌入z_u,这取决于节点的输入特征和这个节点周围的图结构。PinSage算法的核心是一个本地化的卷积操作,在这里我们学习如何从u的邻域聚合信息(图6)。整个过程详见算法1。其基本思想是,我们通过密集神经网络转换u的邻域表示z_v ,∀v∈N (u),然后在生成的向量集上应用聚合器/池化函数(line 1)。这个聚合步骤提供了一个u的本地邻域N(u)的向量表示n_u。然后,将聚合的邻域向量n_u与u的当前表示h_u连接起来,并将连接的向量通过另一个密集的神经网络层进行转换(Line 2)。作者观察到在使用串联操作时有明显的性能提升。此外,第3行的归一化处理能够使得训练更加稳定,对归一化嵌入进行近似近邻搜索的效率更高。该算法的输出是一个u的向量表示,它包含了关于自身和局部图邻域的信息。
基于重要性的邻域。PinSAGE的一个重要创新是如何定义节点邻域N(u),也就是说,如何选择算法1中的邻域集合来进行卷积。以前的GCN方法只是检查k-hop图的邻域,而在PinSage中,定义了基于重要性的邻域,其中一个节点u的邻域被定义为对节点u影响最大的T个节点。具体来说,模拟从节点u开始的随机行走,并计算随机行走所访问的节点的L1归一化访问计数。然后,将u的邻域定义为相对于节点u具有最高归一化访问计数的前T个节点。
这种基于重要性的邻域定义有两方面的优势。首先,选择固定数量的节点进行聚合,使我们能够在训练期间控制算法的内存占用。其次,它允许算法1在汇总局部向量表示时考虑到邻居的重要性。特别是,将算法1中的γ作为加权平均数来实现,其权重根据L1归一化访问计数来定义。作者把这种新的方法称为重要性集合。
堆叠卷积。每次应用卷积操作(算法1)都会得到一个新的节点表示,我们可以将多个这样的卷积堆叠在一起,以便获得关于节点u的局部图结构的更多信息。特别是引入多层卷积,其中,第k层的卷积输入取决于第k-1层输出的表示(图6),初始(即 "第0层")表示等于输入节点特征。算法1中的模型参数(Q、q、W和w)是各节点共享的,但各层之间有所不同。算法2详细说明了堆叠卷积如何为mini-batch的节点集M生成嵌入。首先计算每个节点的邻域,然后应用K卷积迭代来生成目标节点的K层表示。最后卷积层的输出再通过一个全连接的神经网络来生成最终的输出嵌入z_u,∀u∈M。
随后学习的模型的全套参数:每个卷积层的权重和偏置参数(Q(k),q(k),W(k),w(k), ∀k∈{1,...,K})以及最后密集神经网络层的参数G1,G2和g。算法1中第1行的输出维度(即Q的列空间维度)在所有层都被设定为m。为了简单起见,将所有卷积层的输出维度(即算法1第3行的输出)设置为相等,用d表示这个尺寸参数。模型的最终输出维度(应用算法2第18行后)也设置为d。
以有监督的方式训练PinSage,使用的损失函数为 max-margin ranking loss。假设我们可以获得一组有标签的物品对L,其中,集合中的物品对(q,i)∈L,被假设为是相关的,即我们假设如果(q,i)∈L,那么物品i是查询物品q的一个好的推荐候选者。训练阶段的目标是优化PinSage的参数,使标签集合中的物品对(q,i)∈L的输出嵌入接近。
为了训练模型的参数,我们使用一个基于最大边际的损失函数( max-margin-based loss function)。其基本思想是,我们要使正例的内积最大化,即查询项和相应的相关项的嵌入。同时,我们要确保负样本的内积—即查询项的嵌入与不相关项的内积—比正样本的内积小一些,且有一定的预设幅度。因此,单对节点嵌入(zq, zi):(q,i)∈L的损失函数为:
当前 SOTA!平台收录 PinSage 共 3 个模型实现资源。
项目 | SOTA!平台项目详情页 |
PinSage | 前往 SOTA!模型平台获取实现资源:https://sota.jiqizhixin.com/project/pinsage |