返回介绍

数学基础

统计学习

深度学习

工具

Scala

十七、NGCF [2019]

发布于 2023-07-17 23:38:24 字数 39435 浏览 0 评论 0 收藏 0

  1. 个性化推荐无处不在,已广泛应用于电商、广告、社交媒体等众多在线服务。个性化推荐的核心是根据购买和点击等历史交互historical interaction 来估计用户接受某个 item 的可能性。

    协同过滤collaborative filtering: CF 通过假设行为相似的用户对 item 表现出相似的偏好来解决这个问题。为了实现这个假设,一个常见的范式paradigm 是参数化parameterize 用户和 item 以重建历史交互,并根据参数parameter 来预估用户偏好。

    一般而言,可学习的 CF 模型有两个关键组件key component

    • embedding:将用户和 item 转换为向量化的 representation
    • 交互建模:基于 embedding 重建历史交互。

    例如:

    • 矩阵分解 matrix factorization: MF 直接将 user id / item id 映射到 embedding 向量,并使用内积对 user-item 交互进行建模。
    • 协同深度学习collaborative deep learning 通过整合从 item 的丰富的辅助信息side information 中学到的 deep representation来扩展 MF embedding function
    • 神经协同过滤模型neural collaborative filtering model 用非线性神经网络代替 MF的内积交互函数。
    • translation-based CF model 使用欧氏距离作为交互函数。

    尽管这些方法很有效,但是我们认为它们不足以为 CF 产生令人满意的 embedding。关键原因是embedding 函数缺乏关键协同信号collaborative signal 的显式编码,这种编码隐藏在user-item 交互中从而揭示用户(或 item)之间的行为相似性。更具体而言,大多数现有方法仅使用描述性特征(例如 ID 和属性)来构建 embedding 函数,而没有考虑 user-item 交互。因此,由此产生的 embedding 可能不足以捕获协同过滤效果effectuser-item 交互仅用于定义模型训练的目标函数。因此,当 embedding 不足以捕获 CF 时,这些方法必须依靠交互函数来弥补次优 suboptimalembedding 的不足。

    虽然将 user-item 交互集成到 embedding 函数中在直观上很有用,但是要做好并非易事。特别是在实际应用中,user-item交互的规模很容易达到数百万甚至更大,这使得提取所需要的的协同信号变得困难。在论文 《Neural Graph Collaborative Filtering》 中,作者通过利用来自 user-item 交互的高阶连通性high-order connectivity来应对这一挑战,这是一种在交互图结构interaction graph structure 中编码协同信号的自然方式。

    下图说明了高阶连通性的概念。待推荐的用户是 $ u_1 $ ,在user-item 交互图的左子图中用双圆圈来标记。右子图显示了从 $ u_1 $ 扩展的树结构。高阶连通性表示从任何节点到达 $ u_1 $ 的、路径长度 $ l \gt 1 $ 的路径。这种高阶连通性通常包含丰富的语义,而这些语义携带了协同信号。例如:

    • 路径 $ u_1\leftarrow i_2 \leftarrow u_2 $ 表示 $ u_1 $ 和 $ u_2 $ 之间的行为相似度,因为这两个用户都和item $ i_2 $ 进行了交互。
    • 更长的路径 $ u_1\leftarrow i_2\leftarrow u_2\leftarrow i_4 $ 表明 $ u_1 $ 很可能接受 $ i_4 $ ,因为 $ u_1 $ 相似的用户 $ u_2 $ 之前已经消费过item $ i_4 $ 。
    • 此外,从 $ l=3 $ 的整体视角来看,item $ i_4 $ 比 item $ i_5 $ 更可能引起 $ u_1 $ 的兴趣,因为有两条路径连接 $$ ,而只有一条路径连接 $$ 。

    论文提出对 embedding 函数中的高阶连通性信息进行建模。论文没有将交互图扩展为实现起来很复杂的树,而是设计了一种神经网络方法在图上递归地传播 embedding 。这是受到图神经网络最近发展的启发,可以将其视为在 embedding 空间中构建信息流information flow 。具体而言,作者设计了一个 embedding propagation layer ,它通过聚合交互的item (或者user)的 embedding 来改进refine 用户(或者 item)的 embedding 。通过堆叠多个 embedding propagation layer ,模型可以显式强制 embedding 来捕获高阶连通性中的协同信号。以上图为例,堆叠两层可以捕获 $ u_1\leftarrow i_2\leftarrow u_2 $ 的行为相似性,堆叠三层可以捕获 $ u_1\leftarrow i_2\leftarrow u_2\leftarrow i_4 $ 的潜在推荐。信息流的强度(层之间的可训练权重来估计的)决定了 $ i_4 $ 和 $ i_5 $ 的推荐优先级。

    论文在三个公共benchmark 上进行了广泛的实验,验证了神经图协同过滤 Neural Graph Collaborative Filtering: NGCF 方法的合理性和有效性。

    最后值得一提的是,尽管在最近的一种名叫 HOP-Rec 的方法中已经考虑了高阶连通性信息,但是它仅用于丰富训练数据。具体而言,HOPRec 的预测模型仍然是 MF,而且它是通过优化用高阶连通性增强的损失函数来训练的。和 HOP-Rec 不同,NGCF 贡献了一种新技术将高阶连通性集成到预测模型中,从经验上讲,它比 HOP-Rec 更好地嵌入 CF

    总而言之,论文的主要贡献:

    • 论文强调在基于模型的 CF 方法的 embedding 函数中利用协同信号的重要性。
    • 论文提出了 NGCF,这是一种基于图神经网络的新推荐框架,它通过执行 embedding 传播,以高阶连通性的形式对协同信号进行显式编码。
    • 论文对三个百万规模的数据集进行实证研究。大量结果证明了 NGCFstate-of-the-art 性能,以及通过神经embedding 传播来提高 embedding 质量方面的有效性。
  2. 论文回顾了现有的 model-based CFgraph-based CF、基于图神经网络的方法的现有工作,这些方法和本文的工作最为相关。这里,论文强调这些方法和 NGCF 的不同之处。

    • Model-Based CF 方法:现代推荐系统通过向量化表示vectorized representation 来参数化 parameterize 用户和 item ,并基于模型参数重建 user-item 交互数据。例如,MF 将每个 user IDitem ID 投影为 embedding 向量,并在它们之间进行内积以预测交互。为了增强 embedding 函数,已经付出了很多努力来融合诸如 item content、社交关系、item 关系、用户评论、外部知识图谱等辅助信息side information

      虽然内积可以迫使观察到的、交互的 user embeddingitem embedding 彼此接近,但是其线性不足以揭示用户和 item 之间复杂的非线性关系。为此,最近的努力侧重于利用深度学习技术来增强交互函数,从而捕获用户和 item 之间的非线性特征交互。例如,神经协同模型(如 NeuMF)采用非线性神经网络作为交互函数。同时,基于翻译的 CF 模型,例如 LRML 用欧氏距离来建模交互强度 interaction strength

      尽管取得了巨大的成功,但我们认为 embedding 函数的设计不足以为协同过滤产生最佳的 embedding ,因为协同过滤信号只能被隐式 implicitly 地捕获。总结这些方法,embedding 函数将描述性特征descriptive feature(如 ID 特征和属性特征)转换为向量,而交互函数作为向量上的相似性度量。理想情况下,当 user-item 交互被完美重建时,行为相似性的传递特性transitivity property 可以被捕获。然而,前面示例(高阶连通性概念的示例)中显示的这种传递效应transitivity effect 并没有被显式地编码,因此无法保证间接连接的用户和 itemembedding 空间中也是接近的。如果没有对协同信号进行显式编码,就很难获得满足所有特性的 embedding

      即,传统的方法仅优化了 user-item 的一阶邻近性,并没有优化高阶邻近性。另外这种邻近性并不是在模型结构中显式编码的,而是通过目标函数来优化的。

    • Graph-Based CF 方法:另一个研究方向利用 user-item interaction graph 来推断用户偏好。

      早期的努力,如 ItemRankBiRank 采用标签传播的思想来捕获协同效应CF effect 。为了给一个用户在所有item 上打分,这些方法将用户历史交互的item打上label ,然后在图上传播标签。由于推荐分是基于历史互动item 和目标 item 之间的结构可达性structural reachness(可以视为一种相似性)而获得的,因此这些方法本质上属于基于邻域neighbor-based 的方法。然而,这些方法在概念上不如基于模型的协同过滤方法,因为它们缺乏模型参数来优化推荐目标函数(既没有模型参数、又没有目标函数、更没有优化过程)。

      最近提出的 HOP-Rec 方法通过将基于图的方法和基于 embedding 的方法相结合来缓解这个问题(缺乏模型参数来优化推荐目标函数的问题)。该方法首先执行随机游走以丰富用户和 multi-hop 连接的 item 之间的交互。然后它基于丰富的user-item 交互数据(通过高阶连通性增强的正样本)训练具有 BPR 目标函数的 MF 从而构建推荐模型。HOP-Rec 优于 MF 的性能证明,结合连通性信息有利于在捕获CF 效应时获得更好的 embedding 。然而,我们认为 HOP-Rec 没有充分探索高阶连通性,它仅仅用于丰富训练数据,而不是直接有助于模型的 embedding 函数(因为推断时不会用到正样本增强技术,而是用到 embedding 函数)。此外,HOP-Rec 的性能在很大程度上取决于随机游走,这需要仔细地调优,例如设置合适的衰减因子。

    • 图卷积网络Graph Convolutional Network:通过在 user-item 交互图上设计专门的图卷积运算,我们使 NGCF 有效地利用高阶连通性中的 CF 信号。这里我们讨论现有的、也采用图卷积运算的方法。

      • GC-MCuser-item 交互图上应用了图卷积网络graph convolution network: GCN,但是它仅使用一个卷积层来利用 user-item 之间的直接连接。因此,它无法揭示高阶连通性中的协同信号。
      • PinSage 是一个工业解决方案,它在 item-item 图中采用了多个图卷积层从而进行 Pinterest 图像推荐。因此,CF 效应是在 item 关系的层面上捕获的,而不是在集体collective 的用户行为的层面上。
      • Spectral CF 提出了一种谱卷积操作来发现谱域中用户和 item 之间的所有可能的连接。通过图邻接矩阵的特征分解,可以发现 user-item pair 对之间的连接。然而,特征分解导致了很高的计算复杂度,非常耗时并且难以支持大规模的推荐场景。

17.1 模型

  1. NGCF 模型的架构如下图所示(给出了用户 $ u_1 $ 和 item $ i_4 $ 之间的affinity score ),其中包含三个组件components

    • 一个 embedding 层:提供 user embeddingitem embedding
    • 多个 embedding 传播层:通过注入高阶连通性关系来refine embedding
    • 一个prediction 层: 聚合来自不同传播层的 refined embedding 并输出 user-item 的相似性得分 affinity score

17.1.1 Embedding Layer

  1. 遵循主流推荐模型,我们用 embedding 向量 $ \mathbf{\vec e}_u\in \mathbb R^d $ 来描述用户 $ u $ ,用embedding 向量 $ \mathbf{\vec e}_i\in \mathbb R^d $ 来描述 item $ i $ ,其中 $ d $ 为 embedding 维度。这可以看做是将参数矩阵 parameter matrix 构建为 embedding look-up table

    $ \mathbf E = \left[\underbrace{\mathbf{\vec e}_{u_1},\cdots,\mathbf{\vec e}_{u_N}}_\text{user embeddings},\underbrace{\mathbf{\vec e}_{i_1},\cdots,\mathbf{\vec e}_{i_M}}_\text{item embeddings}\right] $

    其中 $ N $ 为用户数量, $ M $ 为 item 数量。

    值得注意的是,这个 embedding table 作为 user embeddingitem embedding 的初始状态(refine 之前的状态),并以端到端的方式进行优化。

  2. 在传统的推荐模型如 MF 和神经协同过滤中,这些 ID embedding 直接输入一个交互层interaction layer 来实现分数预估。

    相比之下,在我们的 NGCF 框架中,我们通过在 user-item 交互图上传播 embeddingrefine embedding。这导致了对推荐更有效的 embedding ,因为 embeddingrefinement 步骤显式地将协同信号注入到 embedding 中。

17.1.2 Embedding Propagation

  1. 接下来我们基于 GNN 的消息传递框架,沿着图结构捕获协同信号并优化 user embeddingitem embedding。我们首先说明单层embedding 传播层Embedding Propagation Layer 的设计,然后将其推广到多个连续传播层。

  2. 一阶传播 First-order Propagation:直观地,交互的item 提供了关于用户偏好的直接证据。类似地,消耗一个item 的用户可以被视为item 的特征,并用于度量两个item 的协同相似性collaborative similarity 。我们在此基础上在连接connected 的用户和 item 之间执行 embedding 传播,用两个主要操作来形式化formulating 流程:消息构建message construction 和消息聚合message aggregation

    • 消息构建:对一个连接的 user-item pair 对 $ (u,i) $ ,我们定义从 $ i $ 到 $ u $ 的消息为:

      $ \mathbf{\vec m}_{u\leftarrow i} = f\left(\mathbf{\vec e}_i,\mathbf{\vec e}_u,p_{u,i}\right) $

      其中:

      • $ \mathbf{\vec m}_{u\leftarrow i} $ 为message embedding
      • $ f(\cdot) $ 为message encoding 函数,函数的输入为 item embedding $ \mathbf{\vec e}_i $ 、user embedding $ \mathbf{\vec e}_u $ 、系数 $ p_{u,i} $ 。
      • 系数 $ p_{u,i} $ 控制了edge $ (u,i) $ 上传播的衰减系数 decay factor

      在本文中,我们定义 $ f(\cdot) $ 为:

      $ \mathbf{\vec m}_{u\leftarrow i} = \frac{1}{\sqrt{|\mathcal N_u|\times |\mathcal N_i|}}\left(\mathbf W_1\mathbf{\vec e}_i+\mathbf W_2\left(\mathbf{\vec e}_i\odot\mathbf{\vec e}_u\right)\right) $

      其中:

      • $ \mathbf W_1,\mathbf W_2\in \mathbb R^{d^\prime \times d} $ 为可训练的权重参数从而为传播提取有用的信息, $ d^\prime $ 为变换后的维度。
      • $ \odot $ 为逐元素乘积。
    • $ |\mathcal N_u| $ 为用户 $ u $ 的邻域大小(即直接连接的 item 数量), $ |\mathcal N_i| $ 为 item $ i $ 的邻域大小(即直接连接的用户数量)。

    与仅考虑 $ \mathbf{\vec e}_i $ 贡献的传统图卷积网络graph convolution network 不同,这里我们额外将 $ \mathbf{\vec e}_i $ 和 $ \mathbf{\vec e}_u $ 之间的交互通过 $ \mathbf{\vec e}_i\odot\mathbf{\vec e}_u $ 编码到被传递的消息中。这使得消息依赖于 $ \mathbf{\vec e}_i $ 和 $ \mathbf{\vec e}_u $ 之间的相似度 affinity ,例如从相似的item 传递更多消息。这不仅提高了模型的表示能力representation ability ,还提高了推荐性能。

    遵循图卷积网络,我们将 $ p_{u,i} $ 设置为图拉普拉斯范数 graph Laplacian norm $ 1/{\sqrt{|\mathcal N_u|\times |\mathcal N_i|}} $ ,其中 $ \mathcal N_u $ 为用户 $ u $ 的一阶邻居集合、 $ \mathcal N_i $ 为 item $ i $ 的一阶邻居集合。

    • representation learning 的角度来看, $ p_{u,i} $ 反映了历史互动 item 对用户偏好的贡献程度。

    • 从消息传递的角度来看,考虑到被传播的消息应该随着路径长度path length 衰减, $ p_{u,i} $ 可以解释为折扣系数 discount factor

    • 消息聚合:在这一阶段,我们聚合从用户 $ u $ 的邻居传播的消息来 refine 用户 $ u $ 的representation 。具体而言,我们定义聚合函数为:

      $ \mathbf{\vec e}_u^{(1)} = \text{LeakyReLU}\left(\mathbf{\vec m}_{u\leftarrow u}+\sum_{i\in \mathcal N_u}\mathbf{\vec m}_{u\leftarrow i}\right) $

      其中:

      • $ \mathbf{\vec e}_u^{(1)} $ 表示在第一个 embedding 传播层之后获得的用户 $ u $ 的 representation

      • LeakyReLU 激活函数允许消息对正positive 信号和小负 negative 信号进行编码。

      • 除了从邻域 $ \mathcal N_u $ 传播的消息之外,我们还考虑了 $ u $ 的自连接 self-connection

        $ \mathbf{\vec m}_{u\leftarrow u} = \mathbf W_1 \mathbf{\vec e}_u $

        这个自连接保留了 $ u $ 的原始特征信息。

        注意:这里的 $ \mathbf W_1 $ 和 $ \mathbf{\vec m}_{u\leftarrow i} $ 定义中的共享。即对于 $ \mathbf{\vec e}_u $ 和 $ \mathbf{\vec e}_i $ 我们都用 $ \mathbf W_1 $ 来映射、对于交叉特征 $ \mathbf{\vec e}_i\odot\mathbf{\vec e}_u $ 我们用 $ \mathbf W_2 $ 来映射。也可以使用独立的映射矩阵来分别映射 $ \mathbf{\vec e}_u $ 和 $ \mathbf{\vec e}_i $ 。

    类似地,我们可以通过与item 连接的用户传播的消息来获得 item $ i $ 的representation $ \mathbf{\vec e}_i^{(1)} $ 。

    总而言之,embedding 传播层的优势在于显式利用一阶连通性信息来关联user representationitem representation

    在广告和推荐场景中,item $ i $ 的直接邻域(和 item $ i $ 有互动的用户集合)可能高达百万甚至千万级别,而用户 $ u $ 的直接邻域(用户 $ u $ 互动的历史 item 集合)通常都比较小。如何处理这种非对称的、庞大的邻域是一个难点。

  3. 高阶传播 High-order Propagation:基于一阶连通性first-order connectivity 建模来增强representation ,我们可以堆叠更多 embedding 传播层来探索高阶连通性high-order connectivity 信息。这种高阶连通性对于编码协同信号以估计用户和 item 之间的相关性分数relevance score 至关重要。通过堆叠 $ L $ 个 embedding 传播层,用户(或者 item)能够接收来自 L-hop 邻居传播的消息。

    在第 $ l $ 步中( $ 1\le l\le L $ ),用户 $ u $ 的 representation 被递归地表示为:

    $ \mathbf{\vec e}_u^{(l)} = \text{LeakyReLU}\left(\mathbf{\vec m}_{u\leftarrow u}^{(l)}+\sum_{i\in \mathcal N_u}\mathbf{\vec m}_{u\leftarrow i}^{(l)}\right) $

    其中被传播的消息定义为:

    $ \mathbf{\vec m}_{u\leftarrow i}^{(l)} = p_{u,i}\left(\mathbf W_1^{(l)}\mathbf{\vec e}_i^{(l-1)} + \mathbf W_2^{(l)}\left(\mathbf{\vec e}_i^{(l-1)}\odot \mathbf{\vec e}_u^{(l-1)}\right)\right)\\ \mathbf{\vec m}_{u\leftarrow u}^{(l)} = \mathbf W_1^{(l)} \mathbf{\vec e}_u^{(l-1)} $

    其中:

    • $ \mathbf W_1^{(l)},\mathbf W_2^{(l)}\in \mathbb R^{d_1\times d_{l-1}} $ 为可训练的参数矩阵, $ d_l $ 为变换后的维度。

      注意:这里对于 $ \mathbf{\vec e}_u $ 和 $ \mathbf{\vec e}_i $ 我们都用 $ \mathbf W_1 $ 来映射、对于交叉特征 $ \mathbf{\vec e}_i\odot\mathbf{\vec e}_u $ 我们用 $ \mathbf W_2 $ 来映射。也可以使用独立的映射矩阵来分别映射 $ \mathbf{\vec e}_u $ 和 $ \mathbf{\vec e}_i $ 。

    • $ \mathbf{\vec e}_i^{(l-1)} $ 为前一层的 item representation,它记住了 (l-1) - hop 邻域的消息。

    • $ \mathbf{\vec e}_u^{(l-1)} $ 为前一层的 user representation,它也也记住了 (l-1) - hop 邻域的消息。

    类似地,我们也可以得到item $ i $ 在第 $ l $ 层的 representation

    如下图所示为针对用户 $ u_1 $ 的三阶embedding 传播,像 $ u_1\leftarrow i_2\leftarrow u_2\leftarrow i_4 $ 这样的协同信号可以在 embedding 传播过程中捕获。即,来自 $ i_4 $ 的消息被显式编码在 $ \mathbf{\vec e}_{u_1}^{(3)} $ 中(由红线标识)。因此,堆叠多个 embedding 传播层无缝地将协同信号注入到 representation learning 过程。

  4. 矩阵形式的传播规则Propagation Rule in Matrix Form :为了提供embedding 传播的整体视图holistic view,并便于batch 实现,我们提供了 layer-wise 传播规则的矩阵形式:

    $ \mathbf E^{(l)} = \text{LeakyReLU}\left((\mathbf L + \mathbf I)\mathbf E^{(l-1)}\mathbf W_1^{(l)} + \mathbf L \mathbf E^{(l-1)}\odot \mathbf E^{(l-1)}\mathbf W_2^{(l)}\right) $

    其中:

    • $ \mathbf E^{(l)}\in \mathbb R^{(N+M)\times d_l} $ 为第 $ l $ 层 embedding 传播层得到的用户 representationitem representation 。 $ \mathbf E^{(0)} = \mathbf E $ 为初始的representation ,即 $ \mathbf{\vec e}_u^{(0)} = \mathbf{\vec e}_u,\mathbf{\vec e}_i^{(0)} = \mathbf{\vec e}_i $ 。

    • $ \mathbf I $ 为单位矩阵, $ \mathbf L $ 为 user-item graph 的拉普拉斯矩阵:

      $ \mathbf L = \mathbf D^{-1/2}\mathbf A \mathbf D^{-1/2},\quad \mathbf A = \begin{bmatrix}\mathbf 0 & \mathbf R\\ \mathbf R^\top & \mathbf 0\end{bmatrix} $

      其中 $ \mathbf R\in \mathbb R^{N\times M} $ 为 user-item 交互矩阵, $ \mathbf 0 $ 为全零矩阵; $ \mathbf A $ 为邻接矩阵, $ \mathbf D $ 为对角的 degree matrix ( $ D_t = |\mathcal N_t| $ )。

      因此 $ \mathbf L $ 的非对角线元素为:

      $ L_{u,i} = \frac{1}{\sqrt{|\mathcal N_u|\times |\mathcal N_i|}} $

      它就是 $ p_{u,i} $ 。

    通过实现矩阵形式的传播规则,我们可以用一种相当有效的方式同时更新所有用户和所有 itemrepresentation。这种方式允许我们抛弃节点采样过程(这个节点采样过程通常用于图卷积网络,使得图卷积网络可以应用于大规模的graph)。

    对于工业场景海量用户(如十亿级)和海量 item (如亿级),那么矩阵形式是不可行的,因为现有的计算资源无法处理如此规模的矩阵。

17.1.3 Model Prediction

  1. 经过 $ L $ 层传播,我们得到了用户 $ u $ 的多个 representation ,即 $ \left\{\mathbf{\vec e}_u^{(1)},\cdots,\mathbf{\vec e}_u^{(L)}\right\} $ 。由于在不同层中获得的 representation 强调通过不同连通性传递的消息,因此它们在反映用户偏好方面有不同的贡献。因此,我们将这些 representation 拼接起来,构成用户 $ u $ 的最终 representation

    对于item $ i $ ,我们也进行同样的操作,即将不同层学到的 item representaiton $ \left\{\mathbf{\vec e}_i^{(1)},\cdots,\mathbf{\vec e}_i^{(L)}\right\} $ 拼接起来得到item $ i $ 的最终 representation 。最终我们得到 user representationitem representation 为:

    $ \mathbf{\vec e}_u^* = \mathbf{\vec e}_u^{(0)}\|\cdots\|\mathbf{\vec e}_u^{(L)},\quad \mathbf{\vec e}_i^* = \mathbf{\vec e}_i^{(0)}\|\cdots\|\mathbf{\vec e}_i^{(L)} $

    其中 || 表示向量拼接。

    通过这种方式,我们不仅用 embedding 传播层丰富了initial embeddings (即 embedding 层得到的初始 embedding ),还允许通过调整 $ L $ 来控制传播范围。

    注意,除了拼接之外,还可以应用其它聚合方式,如加权平均、最大池化、LSTM 等,这意味着在组合不同阶次的连通性时有不同的假设。使用拼接聚合的优势在于它的简单性,因为它不需要学习额外的参数,并且它已经在最近的图神经网络中证明非常有效。

  2. 最后,我们使用内积来估计用户 $ u $ 对目标 item $ i $ 的偏好:

    $ \hat y_{\text{NGCF}}(u,i) = \mathbf{\vec e}_u^*\cdot \mathbf{\vec e}_i^* $

    在这项工作中,我们强调embedding 函数的学习,因此仅使用内积这种简单的交互函数。其它更复杂的选择,如基于神经网络的交互函数,留待未来的研究工作。

17.1.4 Optimization

  1. 为了学习模型参数,我们优化了在推荐系统中广泛应用的 pairwise BPR loss 。该损失函数考虑了观察到的和未观察到的 user-item 交互之间的相对顺序。

    具体而言,BPR 假设观察到的 user-item 交互更能够反映用户的偏好,因此应该比未观察到的交互分配更高的预测值。因此目标函数为:

    $ \text{Loss} = \sum_{(u,i,j)\in \mathcal O} -\ln \sigma\left(\hat y_{u,i} - \hat y_{u,j}\right) + \lambda \|\Theta\|_2^2 $

    其中:

    • $ \mathcal O = \left\{(u,i,j)\mid (u,i)\in \mathcal R^+,(u,j)\in \mathcal R^-\right\} $ 表示 pairwise 训练数据。 $ \mathcal R^+ $ 为观察到的交互的集合, $ \mathcal R^- $ 为未观察到的交互的集合。
    • $ \sigma(\cdot) $ 为 sigmoid 函数。
    • $ \Theta=\left\{\mathbf E,\left\{\mathbf W_1^{(l)},\mathbf W_2^{(l)}\right\}_{l=1}^L\right\} $ 为所有的训练参数集合, $ \lambda $ 为 L2 正则化系数。

    我们使用 mini-batchAdam 优化算法来优化预估模型。具体而言,对于一个 batch 的随机采样的三元组 $ (u,i,j)\in \mathcal O $ ,我们在 L 步传播之后建立它们的 representation $ \left\{\mathbf{\vec e} ^{(1)},\cdots,\mathbf{\vec e} ^{(L)}\right\} $ ,然后利用损失函数的梯度来更新模型参数。

  2. 模型大小Model Size:值得指出的是,尽管 NGCF 在每个传播层 $ l $ 获得了一个 embedding 矩阵 $ \mathbf E^{(l)} $ ,但是它只引入了很少的参数:两个规模为 $ d_l\times d_{l-1} $ 的权重矩阵。具体而言,这些 embedding 矩阵来自于 embedding look-up table $ \mathbf E^{(0)} $ ,并基于 user-item 图结构和权重矩阵转换而来。

    因此,和最简单的、基于 embedding 的推荐模型 MF 相比,我们的 NGCF 只是多了 $ 2Ld_ld_{l-1} $ 个参数。考虑到 $ L $ 通常是小于 5 的数,并且 $ d_l $ 通常设置为 embedding size(远小于用户数量和 item 数量),因此这个额外的参数规模几乎可以忽略不计。

    例如,在我们实验的 Gowalla 数据集(20k 用户和 40k item )上,当 embedding size = 64并且我们使用3 个尺寸为 64 x 64 的传播层时,MF450 万参数,而我们的 NGCF 仅使用了 2.4 万额外的参数。

    总之,NGCF 使用很少的额外参数来实现高阶连通性建模。

  3. Message and Node Dropout:虽然深度学习模型具有很强的表示能力,但通常会出现过拟合现象。Dropout 是防止神经网络过拟合的有效解决方案。遵从图卷积网络的前期工作,我们提出在 NGCF 中采用两种 dropout 技术:message dropoutnode dropout

    • message dropout:随机丢弃传出的消息outgoing message。具体而言,我们以概率 $ p_1 $ 丢弃 $ \mathbf{\vec m}_{u\leftarrow i}^{(l)},\mathbf{\vec m}_{u\leftarrow u}^{(l)},\mathbf{\vec m}_{i\leftarrow u}^{(l)},\mathbf{\vec m}_{i\leftarrow i}^{(l)} $ 。因此在第 $ l $ 个传播层中,只有部分消息可用于 refine representation
    • node dropout:随机阻塞一个节点并丢弃该节点传出的所有消息。对于第 $ l $ 个传播层,我们随机丢弃 $ (M+N)p_2 $ 个节点,其中 $ p_2 $ 为 dropout ratio

    注意,dropout 仅用于训练并且必须在测试期间禁用。

    message dropout 使得 representaion 对于 user-item 之间单个连接具有更强的鲁棒性,而node dropout 则侧重于减少特定用户或特定 item 的影响。我们在实验中研究 message dropoutnode dropout 对于 NGCF 的影响。

17.1.5 讨论

  1. 这里我们首先展示 NGCF 如何推广 SVD++,然后我们分析 NGCF 的时间复杂度。

  2. NGCFSVD++SVD++ 可以看做是没有高阶传播层的 NGCF 的特例。

    具体而言,我们将 $ L $ 设置为 1。在传播层中,我们禁用了转换矩阵和非线性激活函数。然后, $ \mathbf{\vec e}_u^{(1)} $ 和 $ \mathbf{\vec e}_i^{(1)} $ 分别被视为用户 $ u $ 和 item $ i $ 的最终 representation 。我们把这个简化模型称作 NGCF-SVD,它可以表述为:

    $ \hat y_{\text{NGCF-SVD}} = \left(\mathbf{\vec e}_u + \sum_{i^\prime \in \mathcal N_u}p_{u,i^\prime}\mathbf{\vec e}_{i^\prime}\right)^\top \left(\mathbf{\vec e}_i + \sum_{u^\prime \in \mathcal N_i}p_{i,u^\prime}\mathbf{\vec e}_{u^\prime}\right) $

    显然,通过分别设置 $ p_{u,i^\prime} = 1/\sqrt{|\mathcal N_u|} $ 以及 $ p_{i,u^\prime}=0 $ ,我们可以准确地恢复 SVD++ 模型。

    此外,另一个广泛使用的 item-based CF 模型 FISM 也可以被视为 NGCF 的特例,其中上式中 $ p_{i,u^\prime} = 0 $ 。

  3. 时间复杂度:我们可以看到,逐层layer-wise 传播规则是主要的操作。

    • 对于第 $ l $ 个传播层,矩阵乘法的计算复杂度为 $ O\left(|\mathcal R^+|d_ld_{l-1}\right) $ ,其中 $ |\mathcal R^+| $ 为拉普拉斯矩阵中的非零项数量, $ d_l $ 为当前层的维度, $ d_{l-1} $ 为前一层的维度。
    • 对于预测层只涉及内积,它的时间复杂度为 $ O\left(\sum_{l=1}^L |\mathcal R^+|d_l\right) $ 。

    因此,NGCF 的整体复杂度为 $ O\left(\sum_{l=1}^L |\mathcal R^+|d_ld_{l-1}+\sum_{l=1}^L |\mathcal R^+|d_l\right) $ 。根据经验,在相同的实验设置下,MFNGCFGowalla 数据集上的训练成本分别为 20 秒左右和 80 秒左右,在推断期间MFNGCF 的时间成本分别为 80 秒和 260 秒。

17.2 实验

  1. 我们在真实世界的三个数据集上进行实验,从而评估我们提出的方法,尤其是 embedding 传播层。我们旨在回答以下研究问题:

    • RQ1:和 state-of-the-artCF 方法相比,NGCF 的表现如何?
    • RQ2:不同的超参数setting (如,层的深度、embedding 传播层、layer-aggregation 机制、message dropoutnode dropout )如何影响 NGCF
    • RQ3:如何从高阶连通性中受益?
  2. 数据集:我们选择三个 benchmark 数据集GowallaYelp2018Amazon-book。这些数据集可公开访问,并且在领域、规模、稀疏性等方面各不相同。

    • Gowalla 数据集:这是从 Gowalla 获得的 check-in 数据集,用户通过 checking-in 来共享他们的位置location 。为了确保数据集的质量,我们使用 10-core setting,即保留至少有十次交互的用户和 item
    • Yelp2018:来自2018 年的 Yelp 挑战赛的数据集,其中餐馆、酒吧等当地企业被视为 item 。为了确保数据质量,我们也使用 10-core setting
    • Amazon-bookAmazon-review 是一个广泛使用的产品推荐数据集,这里我们从中选择了 Amazon-book 。同样地,我们使用 10-core setting 来确保每个用户和每个 item 至少有十次交互。

    对于每个数据集,我们随机选择每个用户 80% 的历史交互构成训练集,其余的 20% 历史交互作为测试集。在训练集中,我们随机选择 10% 的交互作为验证集来调整超参数。

    对于每个观察到的 user-item 交互,我们将其视为一个正样本,然后进行负采样策略:将用户和历史没有互动的负item 构建 pair 对。

    这些数据集的统计信息如下表所示。

  3. 评估指标:对于测试集中的每个用户,我们将用户未交互的所有 item 视为负item。然后每个方法输出用户对所有 item (除了训练集中的正item )的偏好分。为了评估 top-K 推荐和偏好排序preference ranking,我们采用了两种广泛使用的评估指标:recall@Kndcg@K ,默认情况下 K=20 。我们报告测试集中所有用户的平均指标。

  4. baseline 方法:为了证明有效性,我们将 NGCF 方法和以下方法进行比较:

    • MF:这是通过贝叶斯个性化排名Bayesian personalized ranking: BPR 损失函数优化的矩阵分解方法,它仅利用 user-item 直接交互作为交互函数的目标值target value
    • NeuMF:这是state-of-the-art 的神经网络协同过滤模型。该方法拼接 user embeddingitem embedding ,然后使用多个隐层从而捕获用户和 item 的非线性特征交互。具体而言,我们采用两层的普通架构,其中每个隐层的维度保持不变。
    • CMN:这是state-of-the-artmemory-based 模型,其中user representation 通过memory layer 有意地组合相邻用户的 memory slot 。注意,一阶连接用于查找和相同item 交互的相似用户。
    • HOP-Rec:这是一个state-of-the-artgraph-based 模型。该方法利用从随机游走得到的高阶邻居来丰富 user-item 交互数据。
    • PinSage:该方法在 item-item graph 上应用 GraphSAGE。在这里,我们将该方法应用于 user-item 交互图。具体而言,我们采用了两层图卷积层,并且隐层维度设为 embedding size
    • GC-MC:该模型采用 GCN encoder 来生成 user representationsitem representation ,其中仅考虑一阶邻居。具体而言,我们使用一层图卷积层,并且隐层维度设为 embedding size

    我们也尝试了 Spectral CF,但是发现特征分解导致很高的时间成本和资源成本,尤其是当用户数量和 item 数量很大时。因此,尽管该方法在小数据集上取得了不错的性能,但是我们没有选择和它进行比较。

    为了公平地比较,所有方法都优化了 BPR loss

  5. 参数配置:我们在 Tensorflow 中实现了我们的 NGCF 模型。

    • 所有模型的 embedding size 固定为 64

    • 对于 HOP-Rec,我们选择随机游走 step 的调优集合为 {1,2,3},学习率的调优集合为 {0.025, 0.020, 0.015, 0.010}

    • 我们使用 Adam 优化器优化除了 HOP-Rec 之外的所有模型,其中 batch size 固定为 1024

    • 在超参数方面,我们对超参数应用网格搜索:学习率搜索范围 {0.0001, 0.0005, 0.001, 0.005}L2 正则化系数搜索范围 $ \{10^{-5},10^{-4},\cdots,10^1,10^2\} $ 、dropout ratio 搜索范围 {0.0, 0.1, ... , 0.8}

      此外,我们对 GC-MCNGCF 应用node dropout 技术,其中 dropout ratio 搜索范围为 {0.0, 0.1, ... , 0.8}

    • 我们使用 Xavier 初始化器来初始化模型参数。

    • 我们执行早停策略:如果在连续 50epoch 中,验证集的 recall@20 指标没有提升,则提前停止训练。

    • 为了建模三阶连通性,我们将 NGCF L 的深度设置为 3 。在没有特殊说明的情况下,我们给出了三层embedding 传播层的结果,node dropout ratio = 0.0message dropout ratio = 0.1

17.2.1 RQ1 性能比较

  1. 我们从比较所有方法的性能开始,然后探索高阶连通性建模如何提升稀疏环境下的性能。

  2. 下表报告了所有方法性能比较的结果。可以看到:

    • MF 在三个数据集上的表现不佳。这表明内积不足以捕获用户和 item 之间的复杂关系,从而限制了模型性能。

    • NeuMF 在所有情况下始终优于 MF,证明了user embeddingitem embedding 之间非线性特征交互的重要性。

      然而,MFNeuMF 都没有显式地对 embedding 学习过程中的连通性进行建模,这很容易导致次优suboptimalrepresentation

    • MFNeuMF 相比,GC-MC 的性能验证了融合一阶邻居可以改善 representation learning

      然而,在 Gowalla 中, GC-MCndcg@20 指标行不如 NeuMF。原因可能是 GC-MC 未能充分探索用户和 item 之间的非线性特征交互。

    • 大多数情况下,CMN 通常比 GC-MC 得到更好的性能。这种改进可能归因于神经注意力机制neural attention mechanism ,它可以指定每个相邻用户的注意力权重,而不是 GC-MC 中使用的相同权重、或者启发式权重。

    • PinSageGowallaAmazon-Book 中的表现略逊于 CMN,但是在 Yelp2018 中的表现要好得多。同时 HOP-Rec 在大多数情况下总体上取得了显著的提升。

      这是讲得通的,因为 PinSageembedding 函数中引入了高阶连通性, HOP-Rec 利用高阶邻居来丰富训练数据,而 CMN 只考虑相似的用户。因此,这表明了对高阶连通性或高阶邻居建模的积极影响。

    • NGCF 始终在所有数据集上产生最佳性能。具体而言,NGCFGowalla、Yelp2018、Amazon-Book 数据集中在 recall@20 方面比最强baseline 分别提高了 11.68%、11.97%、9.61%

      • 通过堆叠多个 embedding 传播层,NGCF 能够显式探索高阶连通性,而 CMNGC-MC 仅利用一阶邻居来指导 representation learning 。这验证了在 embedding 函数中捕获协同信号的重要性。

      • 此外,和 PinSage 相比,NGCF 考虑多粒度表示multi-grained representation 来推断用户偏好,而 PinSage 仅使用最后一层的输出。这表明不同的传播层在 representation 中编码不同的信息。

      • 并且,对 HOP-Rec 的改进表明 embedding 函数中的显式编码 CF 可以获得更好的representation

        HOP-Rec 效果也不错,而且计算复杂度不高、简单易于实现。

    我们进行 one-samplet-testp-value < 0.05 表明 NGCF 对最强baseline(下划线标明)的改进在统计上是显著的。

  3. 稀疏性问题通常限制了推荐系统的表达能力,因为不活跃用户的少量交互不足以生成高质量的 representation 。我们考察利用连通性信息connectivity information 是否有助于缓解稀疏性问题。为此,我们对不同稀疏性水平的用户组user group 进行了实验。

    具体而言,基于每个用户的交互次数,我们将测试集分为四组,每组的用户具有相同的交互次数。以 Gowalla 数据集为例,每个用户的交互次数分别小于 24、50、117、1014

    下图展示了 Gowalla、Yelp 2018、Amazon-Book 数据集的不同用户组中关于 ndcg@20 的结果。背景的直方图表示每个分组中的用户量,曲线表示 ndcg@20 指标。我们在 recall@20 方面看到了类似的性能趋势,但是由于空间限制而省略了该部分。

    可以看到:

    • NGCFHOP-Rec 始终优于所有用户组的所有其它 baseline 。这表明利用高阶连通性可以极大地促进非活跃用户的 representation learning,因为可以有效地捕获协同信号。因此,解决推荐系统中的稀疏性问题可能是有希望的,我们将其留待未来的工作中。
    • 联合分析图 (a),(b),(c) ,我们观察到前两组取得的提升(例如,在 Gowalla 数据集中NGCF对于 < 24< 50 的最佳 baseline 上分别提高了 8.49%7.79%)比其它组更为显著(例如,在 Gowalla 数据集中NGCF对于 < 1014 的最佳 baseline 提高了 1.29% )。这验证了 embedding 传播有利于相对不活跃的用户。

17.2.2 RQ2 NGCF 研究

  1. 由于 embedding 传播层在 NGCF 中起着举足轻重的作用,因此我们研究了它对于性能的影响。

    • 我们首先探索层数的影响,然后我们研究拉普拉斯矩阵(即用户 $ u $ 和 item $ i $ 之间的折扣因子 $ p_{u,i} $ ) 如何影响性能。
    • 此外,我们分析了关键因素的影响,例如 node dropoutmessage dropout
    • 最后,我们还研究了 NGCF 的训练过程。
  2. 层数的影响:为了研究 NGCF 是否可以从多个 embedding 传播层中受益,我们改变了模型深度。具体而言,我们探索了层数为 {1,2,3,4} 。下表给出了实验结果,其中 NGCF-3 表示具有三层 embedding 传播层的模型,其它符号类似。联合下表和上表(所有方法性能比较结果表)可以看到:

    • 增加 NGCF 的深度可以大大提升推荐效果。显然,NGCF-2NGCF-3 在所有方面都比 NGCF-1 实现了一致的提升,因为 NGCF-1 仅考虑了一阶邻居。

      我们将所有提升归因于 CF 效应的有效建模:协同用户相似性collaborative user similarity 和协同信号collaborative signal 分别由二阶连通性和三阶连通性承载carried

    • 当在 NGCF-3 之后进一步堆叠传播层时,我们发现 NGCF-4Yelp 2018 数据集上过拟合。这可能是因为太深的架构会给 representation learning 带来噪音。

      而其它两个数据集上的边际提升证明了三层传播层足以捕获 CF 信号。

    • 当传播层数变化时,NGCF 在三个数据集上始终优于其它方法。这再次验证了 NGCF 的有效性,从而表明显式建模高阶连通性可以极大地促进推荐任务。

  3. embedding 传播层的效果和 Layer-Aggregation 机制:为了研究 embedding 传播层(即图卷积层)如何影响性能,我们考虑了使用使用不同layerNGCF-1 变体。

    具体而言,我们从消息传递函数中删除了节点及其邻居之间的representation 交互,并将其设置为 PinSageGC-MCrepresentation 交互,分别称为 $ \text{NGCF-1}_{\text{PinSage}} $ 和 $ \text{NGCF}-1_{\text{GC-MC}} $ 。

    • 对于 $ \text{NGCF-1}_{\text{PinSage}} $ :

      $ \mathbf{\vec m}_{u\leftarrow i}^{(l)} = \mathbf W_1^{(l)} \mathbf{\vec e}_i^{(l-1)},\quad \mathbf{\vec m}_{u\leftarrow u}^{(l)} = \mathbf W_2^{(l)}\mathbf{\vec e}_u^{(l-1)}\\ \mathbf{\vec e}_u^{(l)} = \sigma\left(\mathbf{\vec m}_{u\leftarrow u}^{(l)}+\sum_{i\in \mathcal N_u}\mathbf{\vec m}_{u\leftarrow i}^{(l)}\right) $

      其中 $ \sigma(\cdot) $ 为非线性激活函数。

      $ \mathbf{\vec m}_{u\leftarrow i}^{(l)} $ 缺少 $ \mathbf{\vec e}_u^{(l-1)} $ 和 $ \mathbf{\vec e}_i^{(l-1)} $ 的交互,也缺少图拉普拉斯范数。

    • 对于 $ \text{NGCF}-1_{\text{GC-MC}} $ :

      $ \mathbf{\vec m}_{u\leftarrow i}^{(l)} = p_{u,i} \left(\mathbf W^{(l)} \mathbf{\vec e}_i^{(0)}\right)\\ \mathbf{\vec e}_u^* = \sigma\left(\mathbf W \sigma\left(\sum_{l=1}^K\sum_{i\in \mathcal N_u,l}\mathbf{\vec m}_{u\leftarrow i}^{(l)}\right)\right) $

      其中: $ \mathcal N_{u,l} $ 为节点 $ u $ 的第 $ l $ 阶邻域(每个节点和 $ u $ 的路径距离为 $ l $ ); $ \sigma(\cdot) $ 为非线性激活函数。

    此外,基于 NGCF-SVD ,我们得到 NGCF 的关于SVD++ 的变体,称作 $ \text{NGCF-1}_{\text{SVD++}} $ 。

    我们在下表中显示了实验结果,并且可以发现:

    • NGCF-1 始终优于所有变体。我们将改进归因于 representation 交互(即 $ \mathbf{\vec e}_u\odot \mathbf{\vec e}_i $ ),这使得消息的传播依赖于 $ \mathbf{\vec e}_i $ 和 $ \mathbf{\vec e}_u $ 之间的 affinity 以及注意力机制等等函数。

      同时,所有变体仅考虑线性变换。因此,这验证了我们 embedding 传播函数的合理性和有效性。

    • 在大多数情况下, $ \text{NGCF-1}_{\text{SVD++}} $ 的性能不如 $ \text{NGCF-1}_{\text{PinSage}} $ 和 $ \text{NGCF-1}_{\text{GC-MC}} $ 。这表明节点本身传递的消息( $ \text{NGCF-1}_{\text{SVD++}} $ 没有item 到用户的消息传递、只有用户到 item 的消息传递)和非线性变换的重要性。

    • 联合下表和上表(所有方法性能比较结果表)可以看到:当将所有层的输出拼接在一起时, $ \text{NGCF-1}_{\text{PinSage}} $ 和 $ \text{NGCF-1}_{\text{GC-MC}} $ 分别比 PinSageGC-MC 获得更好的性能。这表明 layer-aggregation 机制的重要性。

  4. dropout 效果:遵从 GC-MC 的工作,我们采用了 node dropoutmessage dropout 技术来防止 NGCF 过拟合。下图给出了 message dropout rate $ p_1 $ 和 node dropout rate $ p_2 $ 在不同数据集上对评估指标的影响。

    在两种 dropout 策略之间,node dropout 提供了更好的性能。以 Gowalla 为例,设置 $ p_2=0.2 $ 将导致最好的 recall@200.1514),这优于 message dropout 得到最好的 recall@200.1506) 。

    一个可能的原因是:丢弃来自特定用户和特定 item 的所有 outgoing message 使得 representation 不仅可以抵抗特定边的影响,还可以抵抗节点的影响。因此,node dropoutmessage dropout 更有效,这和 GC-MC 工作的发现相一致。

    我们认为这是一个有趣的发现,这意味着 node dropout 可以成为解决图神经网络过拟合的有效策略。

  5. Epoch 对测试性能影响:下图给出了 MFNGCF 在每个 epoch 的测试性能(recall@20)。由于空间限制,我们省略了 ndcg@20 指标,因为该指标的性能趋势和 recall@20 是类似的。

    可以看到:NGCF 在三个数据集上表现出比 MF 更快的收敛速度。

    这是合理的,因为在 mini-batch 中优化交互 pair 对时,涉及间接相连的用户和 item 。这样的观察证明了 NGCF 具有更好的模型容量,以及在 embedding 空间中执行 embedding 传播的有效性。

17.2.3 RQ3 高阶连通性的效果

  1. 这里我们试图了解 embedding 传播层如何促进 embedding 空间中的 representation learning 。为此,我们从 Gowalla 数据集中随机选择了 6 个用户及其相关的 item。我们观察他们的 representation 如何受到 NGCF 深度的影响。

    下图 (a)(b) 分别显示了来自 MF(即 NGCF-0)和 NGCF-3representation 的可视化(通过 t-SNE)。每个星星代表Gowalla 数据集中的一个用户,和星星相同颜色的点代表相关的 item

    注意,这些 item 来自测试集,并且这些 item 和用户构成的 pair 对不会出现在训练过程中。

    可以看到:

    • 用户和 item 的连通性很好地反映在 embedding 空间中,即它们嵌入到空间中相近的位置。

      具体而言,NGCF-3representation 表现出可识别的聚类,这意味着具有相同颜色的点(即相同用户消费的 item)倾向于形成聚类。

    • 联合分析图 (a) 和图 (b) 中的相同用户(例如 12201 黄色星星和 6880蓝色星星),我们发现:当堆叠三层 embedding 传播层时,他们历史itemembedding 往往更加靠近。这定性地验证了所提出的 embedding 传播层能够将显式的协同信号(通过 NGCF-3 )注入到 representation 中。

  2. 将来的工作:

    • 结合注意力机制进一步改进 NGCF,从而在 embedding 传播过程中学习邻居的可变权重,以及不同阶连接性的可变权重。这将有利于模型的泛化和可解释性。
    • 探索关于 user/item embedding 和图结构的对抗学习,从而增强 NGCF 的鲁棒性。这项工作代表了在基于模型的 CF 中利用消息传递机制开发结构知识的初步尝试,并开辟了新的研究可能性。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文