返回介绍

数学基础

统计学习

深度学习

工具

Scala

十一、GRU4Rec Top-k Gains [2018]

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

  1. 在推荐系统中,RNN 已被应用于 session-based 推荐,并取得了令人印象深刻的结果。与传统的 similarity-based 方法相比,RNN 的优势在于它们可以有效地建模整个 session 的用户交互(如点击、查看等等)。通过建模整个sessionRNN 实际上可以学到 session 的“主题theme”,从而提供比传统方法更准确的推荐(效果提升在 20% ~ 30% 之间)。

    推荐的主要目标之一是根据用户偏好对 item 进行排名。即,item list 尾部的 item(用户不喜欢的 item)的确切排名或评分并不那么重要,但是将用户喜欢的 item 正确地排名在 item list 头部(如 top 5/10/20 的位置)非常重要。为了通过机器学习实现这一点,通常必须利用 learning to rank 技术,具体而言是 ranking 目标和 ranking loss 函数。当前的 session-based RNN 方法使用 ranking loss 函数,具体而言是 pairwise ranking loss 函数。

    与大多数深度学习方法一样,选择良好的 ranking loss 会对模型性能产生非常重要的影响。

    • 由于深度学习方法需要在多个 layer 上传播梯度,损失函数的梯度会反向传播,因此损失函数的质量会影响优化的质量和模型的参数。
    • 此外,由于推荐任务的特性,通常需要大输出空间large output space(因为系统的 item set 较大)。这为 ranking loss 的设计带来了独特的挑战。我们将看到,解决这个大输出空间问题的方式对于模型性能非常关键。

    在论文《Recurrent Neural Networks with Top-k Gains for Session-based Recommendations》中,作者分析用于session-based 推荐的 RNN 中使用的 ranking loss 函数。这种分析导致了一组新的 ranking loss 函数,与之前的常用损失函数相比,RNN 的性能提高了 35% 而没有显著的计算开销。论文本质上设计了一组新的损失函数,它结合了深度学习的 learning 、以及 learning to rank 的文献。来自工业界的若干个数据集的实验结果表明:论文方法的推荐准确性得到显著提升。结合这些改进,RNN 与传统 memory-based 协同过滤方法的差异提高到 53%(以 MRRRecall@20 指标衡量),这表明深度学习方法为推荐系统领域带来了潜力。

  2. 相关工作:

    • session-based 推荐中采用的主要方法之一是 item-to-item 推荐方法,该方法主要用于缺失用户画像(指的是用户历史行为信息)时的 session-based 推荐。在该 setting 中,item-to-item 相似度矩阵是从可用的 session 数据中预先计算的,并且在 session 中经常被一起点击的 item 被认为是相似的。然后在 session 期间使用这个相似度矩阵向用户推荐当前点击 item 最相似的 item

    • Long Short-Term Memory: LSTM 网络是一种 RNN,已被证明可以解决困扰普通类型 RNN 的优化问题。LSTM 的一个稍微简化的版本是我们在这项工作中使用的 Gated Recurrent Unit: GRURNN 已被成功应用于 session-based 推荐领域。

      • 《Session-based Recommendations with Recurrent Neural Networks》session-based 推荐任务提出了一个具有 pairwise ranking lossRNN
      • 《Improved Recurrent Neural Networks for Session-based Recommendations》 提出了数据增强技术来提高用于 session-based 推荐的 RNN 的性能,但是这些技术具有增加训练时间的副作用,因为单个 session 被拆分为若干个 sub-session 进行训练。
      • 《Parallel Recurrent Neural Network Architectures for Feature-rich Session-based Recommendations》 提出了通过特征信息(如来自被点击 item 的文本和图像)增强的 RNN 用于 session-based 推荐,并显示出比普通RNN模型更好的性能。

      RNN 也被用于更标准的 user-item 协同过滤 setting,其目的是建模 user factoritem factor 的演变,结果不那么引人注目,所提出的方法几乎没有优于标准的矩阵分解方法。这是意料之中的,因为在数据集的时间范围内,没有强有力的证据表明用户口味的演变,并且对不在相同 session 中消费的 item 进行序列建模(指的是协同过滤中未考虑 session 信息),可能不会带来很大收益。

    • 这项工作涉及的另一个领域是针对推荐系统量身定制的损失函数。在这个领域,特别是在矩阵分解技术的背景下,已有一些工作。协同过滤中最早的 learning to rank 技术之一是由《COFIRANK Maximum Margin Matrix Factorization for Collaborative Ranking》 引入的。本质上,该论文引入了一个 listwise loss 函数以及用于优化因子的 alternating bundle 方法。后续一些工作为协同过滤引入了更多的 ranking loss 函数。注意,这些损失函数虽然在矩阵分解中运行良好,但是并不能以任何方式保证它们是 RNN 的最佳选择,因为在 RNN 中进行反向传播要比在矩阵分解中更加困难。事实上,我们将看到 BPR(一种流行的损失函数)需要进行重大修改,从提高 session-based 推荐中的 RNN 的效果。

      与在深度网络中对大输出空间进行采样从而对语言模型进行有效损失计算相关的另一项工作是 blackout方法(《Blackout: Speeding up recurrent neural network language models with very large vocabularies》),该方法本质上应用了类似于《Session-based Recommendations with Recurrent Neural Networks》 中使用的采样过程,以便有效地计算 categorical cross-entropy loss

11.1 输出采样

  1. 我们将 《Session-based Recommendations with Recurrent Neural Networks》 中实现的 RNN 算法称作 GRU4Rec。在本节中,我们将重新审视 GRU4Rec 如何对输出进行负采样并讨论其重要性。我们扩展了负采样技术,增加了 additional sample ,并认为这对于提高推荐准确性至关重要。

    注意,“样本” 有两种含义:一种含义是用于训练的实例,也称作 example ;另一种含义是采样程序所采样到的实例。在这一章节,我们避免使用 “样本”,而代替以 example(用于模型训练)、sample(用于采样程序)。

  2. 在每个训练 step 中,GRU4Recsession 中当前事件eventitem(以 one-hot 向量表示)作为输入。网络的输出对应于item set 中每个 item 的分数 score ,代表每个 item 成为 session 中的 next item 的可能性。

    训练过程会遍历 session 中的所有事件。基于 backpropagation through time: BPTT 训练的复杂度为O(NE(H2+HNO))$ O\left(N_E\left(H^2 + HN_O\right)\right) $ ,其中:NE$ N_E $ 为 training event 的数量,H$ H $ 为隐层维度(隐单元数量),NO$ N_O $ 为输出维度(输出单元的数量,即item set 规模)。计算所有 item 的分数是非常不切实际的,因为这使得模型 unscalable 。因此,GRU4Rec 使用采样机制并在训练期间仅计算 item set 的某个子集的分数。

  3. 神经网络通常并不是每次训练一个实例example,而是每次训练一批example ,这种做法被称作 mini-batch trainingmini-batch training 有若干好处:

    • 更好地利用当前硬件的并行化能力,从而训练更快 training faster
    • 产生比随机梯度训练更稳定的梯度,从而收敛更快 converging faster

    GRU4Rec 引入了基于 mini-batch sampling 。对于 mini-batch 中的每个example,相同 mini-batch 的其它example作为negative sample,如下图所示。从算法实现的角度来看,这种方法是实用的,并且对于 GPU 也可以有效地实现。

  4. 可以使用三种不同的 listwise ranking loss 函数之一来训练网络(参考后面的小节)。所有损失函数都需要 target item (即 next itemground truth )的分数、以及至少一个negative item(即 target item 以外的 item )的分数。ranking loss 的一个特性是:模型只有当 target item 的分数没有大幅超越negative item的分数时才会进行学习,否则 item 已经按正确的顺序排列因此模型没有什么可学的(此时梯度接近于零,模型参数几乎不更新)。因此,在进行负采样时,采样到高分 item 作为 negative item 中至关重要。

    一个 item 是否高分取决于实际计算分数的 context(即 item 序列)。热门 item 在许多情况下通常分数都很高,因此基于热度的采样 popularity-based sampling 是一种很好的采样策略。mini-batch sampling 基本上是一种popularity-based sampling 的形式,因为一个 item 作为negative item的概率与它在数据集中出现的频次(即,热门程度)成正比。

    一个 item 在数据集中出现次数越多,则它成为 target item 的机会越多,那么它的平均预估分也就越高。

    popularity-based sampling 的问题在于:当算法学到将 target item 排在热门 item 之上,模型几乎停止学习(因为 target item 已经排序正确,模型接下来没什么可学的),但是模型对于长尾高分 item(这部分 item 不是热门的因此未被负采样,但是预估分数仍然很高) 的排序仍然可能不准确。

    即,模型对热门 item 学习较好,对中长尾 item 的学习较差。

    另一方面,如果使用均匀负采样,那么由于大量低分negative item的存在,均匀负采样会减慢学习速度(对于大部分negative itemtarget item 已经排序正确因此模型没什么可学)。但是,如果无限期训练,可能会产生整体上更准确的模型(相比 popularity-based sampling )。

    根据我们的经验,popularity-based sampling 通常会产生更好的结果(因为均匀负采样需要“无限期”训练才能得到更好的结果)。

  5. 将负采样与 mini-batch 联系起来有若干实际好处,但由于以下三个原因导致过于严格:

    • mini-batch size 一般较小,从几十到几百不等。如果 item set 的规模很大,那么较小的采样规模使得无法包含所有高分的negative item

    • mini-batch size 对训练有直接影响。例如,我们发现使用更小的 mini-batch size30 ~ 100)进行训练会产生更准确的模型。但是由于并行化,在 GPU 上使用更大的 mini-batch size 训练会更快。

    • mini-batch sampling 方法本质上是 popularity-based 的,这通常是一个很好的策略,但可能不是对所有数据集都是最优的。

      第三条理由有点无赖,作者并未给出一些例子来说明。

    因此,我们使用 additional sample 来扩展 GRU4Rec。我们采样了NA$ N_A $ 个item 用作 mini-batch 内所有example 所共享的negative item。 这些additional sample 与来自 mini-batch samplingNB1$ N_B-1 $ 个sample 一起使用,其中NB$ N_B $ 为 mini-batch sizeadditional sample 可以通过任何策略采样得到。我们以suppiα$ \text{supp}_i^\alpha $ 成比例的方式进行采样,其中:

    • suppi$ \text{supp}_i $ 为 itemi$ i $ 的 support(即数据集中出现的次数)。
    • α$ \alpha $ 为采样的超参数(0α1$ 0\le\alpha\le 1 $ ) 。如果α=0$ \alpha=0 $ 那么就是均匀采样,如果α=1$ \alpha=1 $ 那么就是popularity-based sampling

    添加更多 sample 自然会增加复杂度,因为输出单元的数量从NB$ N_B $ (popularity-based sampling)增加到NA+BB$ N_A+B_B $ ( additional sample )。然而,计算很容易并行化,因此当 sample 规模达到一定规模之前,增加更多 sample 对于现代 GPU 上的训练时间并没有实际增加。

    既然 additional sample 的核心是增加高分 negative item ,那么我们可以根据先验知识,为每个 target item 构建一批高分的 negative item 。例如 :当前用户历史点击的 item、当前用户相似的用户历史点击的 item (基于 user-to-user 规则)、已有高分negative item 相似的 item (基于 item-to-item 规则),等等。这些就是 hard 负样本。

    注意:

    • 训练期间不仅要有 hard 负样本,还要有 easy 负样本(即低分 negative item)。至于采样到的 negative item 的分数分布是否和 item set 保持一致,可以探讨。
    • 验证、测试、上线推断期间,必须使得采样到的 negative item 的分数分布和 item set 保持一致,否则评估结果可能没有说服力。
  6. 然而, additional sample 的有效实现并非易事。根据 GPU 上的分布进行采样目前还没有得到很好的支持,因此采样速度很慢,因此它应该由 CPU 处理或者需要某种形式的解决方法。

    • 如果由 CPU 处理,则被采样的 item ID 应该与 mini-batchitem ID 一起提供给 GPU。然而,每次生成一个新的 mini-batch 时对分布进行采样需要一些时间,因此 GPU 的执行经常被中断,导致 GPU 利用率低,从而训练缓慢。
    • 如果利用 GPU 上某种形式的解决方法,则基于分布的采样被转换为包含多个 GPU 操作的一个序列,与我们使用的深度学习框架的内置采样方法相比,整体执行速度更快。

    在这两种情况下,单次采样几个 item 的效率都低于单次采样大量 item 的效率。因此,我们还实现了一个缓存 cache 用于预采样 pre-sample 以及存储大量 negative sample 。当训练用完这些 sample 并且一旦缓存变空(每用一个 sample 就会清空对应的缓存),就会重新计算缓存。我们发现,与完全不使用缓存的方案相比,预采样 1 千万到 1 亿个 item ID 显著提高了训练速度。

11.2 损失函数设计

  1. 本小节中,我们检查 GRU4Rec 中实现的损失函数并确定它们的弱点。我们提出了两种方法来解决交叉熵损失函数的数值不稳定性 numerical instability。我们展示了当我们向输出中添加更多 sample 时,使用 TOP1 pairwise lossBPR pairwise losslearning 如何降级 degrade ,并提出一组基于 pairwise losse 的损失函数来缓解这个问题。

    我们注意到,虽然我们的目标是改善 GRU4Rec,但是本小节中提出的损失函数也可以与其它模型一起使用,例如矩阵分解模型。

11.2.1 categorical cross-entropy

  1. categorical cross-entropy 衡量了预测的概率分布q$ \mathbf q $ 和真实分布p$ \mathbf p $ 之间的距离:

    H(p,q)=j=1Npjlogqj

    该损失函数常用于机器学习和深度学习,特别是多类分类问题。next item 推荐任务可以解释为分类任务,其中 class label 是系统中的 item id,每个 item 序列所分配的 label 是该序列的 next item 。 在 single-label 场景下(如 next item 推荐),真实分布是 next itemone-hot 向量,其中 target item 对应的元素为 1 而其它所有位置全零。预测的概率分布由分配给每个 item 的预测分数组成。注意,output score 需要执行转换从而形成分布的形式,常见的转换是使用 softmax

    交叉熵本身是一个 pointwise loss,因为它是在单个 coordinate 上(即分布上的每个点)定义的独立损失的总和。将交叉熵与 softmax 相结合会在损失函数中引入 listwise 属性,因为 coordinate 现在不再是独立的了。结合交叉熵与 softmax,我们得到如下的、定义在score 上的损失函数(假设 target item 的索引为i$ i $ ):

    si=exp(ri)j=1Nexp(rj)Lxe=logsi=logexp(ri)j=1Nexp(rj)

    其中:rj$ r_j $ 为 itemj$ j $ 的预测分数,N$ N $ 为 item set 大小。

  2. 修复不稳定性 instabilityGRU4Rec 中可用的损失函数之一是带 softmax 的交叉熵。《Session-based Recommendations with Recurrent Neural Networks》 在实验部分报告了交叉熵比其它损失函数略好的结果,但是论文认为交叉熵损失对于大部分超参数空间而言是不稳定的,因此建议不要使用它。

    这种不稳定性来自于有限的数值精度 limited numerical precision 。假设存在itemk$ k $ 使得rkri$ r_k\gg r_i $ ,由于精度有限,则si$ s_i $ 变得非常小并且四舍五入为零。然后损失函数计算log0$ \log 0 $ ,而log0$ \log 0 $ 是未定义的。规避该问题的两种方法为:

    • 计算log(si+ϵ)$ -\log(s_i + \epsilon) $ ,其中ϵ$ \epsilon $ 是一个非常小的正数(这里我们使用1024$ 10^{-24} $ ) 。
    • 通过ri+logj=1Nexp(rj)$ -r_i + \log\sum_{j=1}^N \exp(r_j) $ 来直接计算logsi$ -\log s_i $ 。

    前者引入了一些噪声,而后者不允许 transformationloss 分开使用(即,ri+logj=1Nexp(rj)$ -r_i + \log\sum_{j=1}^N \exp(r_j) $ 将 transformationloss 融合在一起,无法分离使用)。这两种方法都可以稳定stabilize损失函数,我们没有观察到这两种变体的结果存在任何差异。

11.2.2 TOP1&BPR

  1. GRU4Rec 提供了两个基于 pairwise loss 的损失函数。pairwise losstarget item 分数与一个 negative item 进行比较。如果 target item 分数低于 negative item 分数,那么损失较大。GRU4Rec 对每个 target item 计算多个 negative item 的损失,因此损失函数由这些 pairwise loss 的均值组成。这导致了一个 listwise loss 函数,它由多个 pairwise loss 组成。

    • 其中一个损失函数是 TOP1,其定义为:

      Ltop1=1NSj=1NSσ(rjri)+σ(rj2)

      其中:NS$ N_S $ 为negative item 数量,j$ j $ 在 negative item 上迭代,i$ i $ 为 target item

      这是一个由两部分组成的、启发式的组合损失:

      • 第一部分旨在将 target item 分数推高到 negative item 分数之上。
      • 第二部分旨在将 negative item 分数降低到零。这一部分充当正则化器regularizer,但它并不是直接约束模型权重,而是惩罚 negative item 的高分。由于每个 item 在某个训练 example 中都充当 negative item,因此通常会降低整体的分数。
    • 另一个损失函数是基于流行的 Bayesian Personalized Ranking: BPR 损失,其定义为:

      Lbpr=1NSj=1NSlogσ(rirj)

      该损失函数最大化 target item 分数超过 negative item 分数的概率。由于概率P(ri>rj)$ P(r_i\gt r_j) $ 是不连续的,因此近似为σ(rirj)$ \sigma(r_i - r_j) $ 。

  2. 梯度消失 vanishing gradient:取每个 pairwise loss 的均值会产生不想要的副作用。我们分析 TOP1 损失和 BPR 损失相对于 target item 分数ri$ r_i $ 的梯度,结果表明:在某些情况下梯度将消失,因此模型停止学习。TOP1 损失和 BPR 损失相对于 target item 分数ri$ r_i $ 的梯度为:

    Ltop1ri=1NSj=1NSσ(rjri)(1σ(rjri))Lbprri=1NSj=1NS(1σ(rirj))

    对于 pairwise loss,人们通常希望得到高分的 negative item,因为这些sample 会产生大的梯度。或者直观而言,如果 negative item 的分数已经远低于 target item 的分数,那么就不再可以从该 negative item 中学到任何东西了。

    我们将rjri$ r_j\ll r_i $ 的 negative item 记做 negative irrelevant itemrjri$ r_j\gg r_i $ 的 negative item 记做 negative relevant item 。对于一个 negative irrelevant itemj$ j $ ,Ltop1ri$ \frac{\mathcal L_\text{top1}}{\partial r_i} $ 中的σ(rjri)$ \sigma(r_j-r_i) $ 将趋近于零(以及Lbprri$ \frac{\mathcal L_\text{bpr}}{\partial r_i} $ 中的1σ(rirj)$ 1-\sigma(r_i-r_j) $ 也将趋于零)。因此,任何 negative irrelevant item 基本上不会对总梯度增加任何东西。同时,平均梯度总是被 negative item 的数量所打折(即,除以NS$ N_S $ )。通过增加 sample 数量NS$ N_S $ ,negative irrelevant item 数量的增加速度比 negative relevant item 数量的增加速度更快,因为大多数 item 作为 negative item 是不相关irrelevant的。对于 non popularity-based sampling 以及大的 sample 数量,情况尤其如此。因此,随着 sample 数量NS$ N_S $ 的增加,损失函数的梯度开始消失。这种梯度消失是违反直觉的,并且损害了算法的潜力。

    本质上是由于 negative relevent item 的稀疏性导致。

    • 如果 negative relevent itemnegative irrelevent item 的数量是 1:1 的关系,那么NS$ N_S $ 的增加不大可能出现梯度消失,因为NS$ N_S $ 的增加使得 negative relevent item 也同比例的增加。
    • 如果 negative relevent itemnegative irrelevent item 的数量是 1:100000 的关系,那么NS$ N_S $ 的增加很可能出现梯度消失,因为NS$ N_S $ 增加一万个但是 negative relevent item 数量几乎不变(NS$ N_S $ 需要增加十万个才会新增一个 negative relevent item),因此使得损失函数的梯度下降很多。

    注意,TOP1 损失对于rjri$ r_j\gg r_i $ 的 negative relevant item 也有些敏感,这是损失函数设计中的疏忽。虽然这种情况不太可能发生,但是也不能排除。例如,在将一个冷门的 target item 与非常热门的 sample 进行比较时,尤其在学习的早期阶段,target item 分数可能远低于这个热门 sample 的分数。

    我们专注于损失函数对于 target item 分数ri$ r_i $ 的梯度, 而损失函数对于 negative item 分数rj$ r_j $ 的梯度也存在类似的问题。

    Ltop1rj=1NS[σ(rjri)×(1σ(rjri))+σ(rj2)×(1σ(rj2))×2rj]Lbprrj=1NS(1σ(rirj))

    这意味着即使某些 negative itemj$ j $ 是 relevant 的,损失函数的梯度也会随着 negative item 数量NS$ N_S $ 的增加而减少。

11.2.3 ranking-max 损失

  1. 为了克服随着sample 数量NS$ N_S $ 增加导致梯度消失的问题,我们提出了基于单个 pairwise loss 的、新的 listwise loss 系列。基本思想是:将 target item 分数与最相关的 negative item 分数进行比较。令最相关的 negative item (即分数最大的 negative item)为rmax=maxjrj$ r_\max^-=\max_j r_j $ ,则这个损失函数定义为:

    Lpairwise-max(ri,{rj}j=1NS)=Lpairwise(ri,maxjrj)=Lpairwise(ri,rmax)

    max 函数是不可微的,因此无法应用于梯度下降。因此,我们使用 softmax 函数代替 max 从而保持损失函数的可微性。注意,这里的 softmax 变换仅用于 negative item(即排除ri$ r_i $ ),因为我们想要从 negative item 中寻找最大的分数。这使得在Lpairwise-max$ \mathcal L_\text{pairwise-max} $ 中,每个 negative item 都需要考虑它获得最大分数的可能性。基于这个总体思路,我们现在推导出 TOP1-max 损失函数和 BPR-max 损失函数。

    softmax 在交叉熵损失、ranking-max 损失中有所区别:

    • 在交叉熵损失中需要考虑 target itemnegative item,即sj=exp(rj)j=1Nexp(rj)$ s_j = \frac{\exp(r_j)}{\sum_{j^\prime=1}^N \exp(r_{j^\prime})} $ ,这里N$ N $ 为考虑了 target item 的集合大小
    • ranking-max 损失中仅考虑 negative item ,即sj=exp(rj)j=1NSexp(rj)$ s_j = \frac{\exp(r_j)}{\sum_{j^\prime=1}^{N_S}\exp(r_{j^\prime})} $ ,这里NS$ N_S $ 为不考虑 target item 的集合大小。

    另外这里的 softmax 还可以引入温度超参数T$ T $ ,但是注意数值稳定性问题(例如T$ T $ 太大导致梯度不稳定)。

  2. TOP1-max 损失函数:TOP1-max 损失相当简单,它被定义为:

    Ltop1-max=j=1NSsj×(σ(rjri)+σ(rj2))

    其中:sj=exp(rj)j=1NSexp(rj)$ s_j = \frac{\exp(r_j)}{\sum_{j^\prime=1}^{N_S}\exp(r_{j^\prime})} $ 为rj$ r_j $ 的 softmax 值。

    可以对所有negative item 应用正则化(即,j=1NS(sj×σ(rjri)+σ(rj2))$ \sum_{j=1}^{N_S} \left(s_j\times\sigma(r_j-r_i) + \sigma\left(r_j^2\right)\right) $ ),而不一定仅对最大分数的 negative item 应用正则化。但是我们发现对最大分数的 negative item 应用正则化的实验效果更好,因此我们保持这种方式。

    TOP1-max 损失的梯度是对单个 pairwise 梯度的加权平均(注意,j=1Nsj=1.0$ \sum_{j=1}^N s_j=1.0 $ ),权重为 negative item 分数的 softmaxsj$ s_j $ ,即:

    Ltop1-maxri=j=1NSsj×σ(rjri)(1σ(rjri))j=1Nsj=j=1NSsj×σ(rjri)(1σ(rjri))
    • 如果rj$ r_j $ 远小于rmax$ r_\max^- $ ,那么权重sj$ s_j $ 几乎为零,并且分数接近rmax$ r_\max^- $ 的example 将有更大的权重。这解决了更多 sample 导致梯度的问题,因为 negative irrelevant item 将被忽略,最终梯度将指向 negative relevant item 的梯度。
    • 如果所有的rj$ r_j $ 都相差无几,这表明所有 sample 都是 irrelevant 的,那么每个 pairwise 梯度将接近于零。这不是什么问题,因为如果 target item 分数大于所有 negative item 分数,则没有什么可以学习的。

    不幸的是, TOP1-max 损失对于分数很大的 negative item 是敏感的,如rjri$ r_j\gg r_i $ 时导致(1σ(rjri))0$ (1-\sigma(r_j-r_i)) \simeq 0 $ 。这是由于 TOP1 pairwise loss 本身所引起的,与我们的聚合方式无关。

  3. BPR-maxBPR 的概率性解释为,最大化 target item 分数ri$ r_i $ 高于rmax$ r_\max^- $ 的概率。这可以用条件概率重写为:

    P(ri>rmax)=j=1NSP(ri>rjrj=rmax)P(rj=rmax)

    其中:

    • P(rj=rmax)$ P(r_j = r_\max^-) $ 表示 negative itemj$ j $ 为最大分数的概率,它以sj=exp(rj)j=1NSexp(rj)$ s_j = \frac{\exp(r_j)}{\sum_{j^\prime=1}^{N_S}\exp(r_{j^\prime})} $ 来近似。
    • P(ri>rjrj=rmax)$ P\left(r_i\gt r_j\mid r_j = r_\max^-\right) $ 表示 target item 分数高于最大分数的 negative itemj$ j $ 的概率,它以σ(rirj)$ \sigma(r_i-r_j) $ 来近似。

    我们想要最小化负的对数似然,则得到损失函数:

    Lbpr-max=logj=1NSsj×σ(rirj)

    这个损失函数对于 target itemri$ r_i $ 的梯度为:

    Lbpr-maxri=j=1NSsj×σ(rirj)(1σ(rirj))j=1NSsj×σ(rirj)
    • BPR-max 的梯度是单个 BPR 梯度的加权平均,权重为sj×σ(rirj)$ s_j\times \sigma(r_i-r_j) $ 。

    • negative itemj$ j $ 和k$ k $ 之间的相对权重为:

      sj×σ(rirj)sk×σ(rirk)=exp(rj)+exp(ri+rj+rk)exp(rk)+exp(ri+rj+rk)

      如果rirj+rk$ r_i\gg r_j+r_k $ 或者ri$ r_i $ 和rk$ r_k $ 都很小,那么这个相对权重的行为类似于 softmax。否则这个相对权重就是一个平滑的 softmax

      这意味着当ri$ r_i $ 很小的时候,negative item之间的权重分布会更均匀,但是较高分数的 negative item 将得到更多关注。随着ri$ r_i $ 变得更高,关注将迅速转移到分数高的 negative item 上。这是一种理想的行为。

  4. 读者注:BPR-max 并不是简单地对 BPRsoftmax加权,而是移动了 log 的位置:

    Ltop1=1NSj=1NSσ(rjri)+σ(rj2),Ltop1-max=j=1NSsj×(σ(rjri)+σ(σj2))Lbpr=1NSj=1NSlogσ(rirj),Lbpr-max=logj=1NSsj×σ(rirj)

    Top1-max 损失函数仅仅是将 Top1 损失的均匀权重1/NS$ 1/N_S $ 替换为 softmax 权重sj$ s_j $ 。但是,BPR-max 损失函数将 BPR 的均匀权重1/NS$ 1/N_S $ 替换为sj$ s_j $ ,并且将作用于σ()$ \sigma(\cdot) $ 的 log 函数变为作用于()$ \sum(\cdot) $ 。

    另一个版本的 BPR-max 是:

    Lbpr-max-var=j=1NSsj×logσ(rirj)Lbpr-max-varri=j=1NSsj×(1σ(rirj))

    这个损失函数似乎比论文中的Lbpr-max$ \mathcal L_\text{bpr-max} $ 更好,因为Lbpr-max$ \mathcal L_\text{bpr-max} $ 对于分数很大的 negative item 是敏感的(如rjri$ r_j\gg r_i $ ,此时σ(rirj)0$ \sigma(r_i-r_j)\simeq 0 $ ) ,而Lbpr-max-var$ \mathcal L_\text{bpr-max-var} $ 不存在这个问题。为什么论文不采用Lbpr-max-var$ \mathcal L_\text{bpr-max-var} $ 这个损失函数,作者并未说明。读者猜测Lbpr-max-var$ \mathcal L_\text{bpr-max-var} $ 的效果更好,可以通过实验来验证。

  5. 损失函数(TOP1-maxBPR-max 损失)对于 negative itemrj$ r_j $ 的梯度与softmax scoresj$ s_j $ 成正比(注,前面给的公式都是针对 target itemri$ r_i $ 的梯度),这意味着只有接近rmax$ r_\max^- $ 的 negative item 才会被更新。这是有益的,因为如果 negative item 的分数很低,则不需要进行参数更新 。

    skrj={sj(1sj),k=jsjsk,kjLtop1-maxrj=sj×[σ(rjri)(1σ(rjri))+σ(rj2)×(1σ(rj2))×2rj]+sj2×[σ(rjri)+σ(σj2)]sj×Ltop1-maxLbpr-maxrj=sjsj×σ2(rirj)j=1NSsj×σ(rirj)Lbpr-max-varrj=sj×(1σ(rirj))sj×logσ(rirj)+sj×Lbpr-max-var
    • 如果一个 negative item 的分数远高于其它 negative item,那么它的参数将是唯一被更新的,并且梯度将与 target item 分数和 negative item 分数之间 pairwise loss 的梯度一致。
    • 如果如果 negative item 的分数比较平衡,那么梯度介于上述梯度和零之间。
  6. 下图描述了在不同 target item 排名的条件下, BPR 损失的梯度和 BPR-max 损失的梯度(针对target item 分数ri$ r_i $ 的梯度)的表现。target item 排名指的是超过 target item 分数的 negative item 数量,例如 rank 0 表示 target item 分数高于所有 negative item 。较小的rank 值意味着 negative relevant item 较少。

    该图描述了两种损失相对于ri$ r_i $ 梯度取反(即负的梯度)之后的均值,并且在第一个 epoch(训练开始)、第十个 epoch(训练结束)对整个数据集进行评估:

    • 左图没有使用 additional sample,仅使用来自 mini-batch size = 32batch 内其它 example
    • 中图和右图添加了 2048additional negative item ,其中右图聚焦于前 200 的排名。

    可以看到:

    • 当有更多 negative relevant item(即 rank 值更大)时,BPR 的梯度略高。这是很自然的,因为 BPR-max 关注的是最接近rmax$ r_\max^- $ 的sample,而忽略了其它 negative relevant item 。当 target item 排名在 list 末尾时,这减慢了 BPR-max 的学习,但是差异并不显著。

    • 另一方面,随着 negative relevant item 数量的减少(即 rank 值更小),BPR 的梯度迅速消失。梯度消失的点与 sample 总量有关。

      • sample 总量较小的情况下(左图),BPR 的梯度在 rank = 5 附近开始消失。相比之下,BPR-max 直到 rank 0 才开始消失。
      • 同时,随着 sample 的增多(中图),BPR 梯度非常低(例如在右图看到 rank = 5BPR 的梯度相比左图要小得多),即使对于 rank 100 - 500 也是如此。相比之下,BPR-max 的梯度仍然是在 rank 较小的点才开始显著下降。

      这意味着,比如说,我们可以优化算法将 target item 的排名从 500 优化到 50,但是很难继续推进到排名为 5 (因为这时发生了梯度消失,模型无法继续学习)。并且发生梯度消失的点随着 sample 量的增加而提前。另一方面,BPR-max 表现良好,并且能够一路提高 target item 分数。

  7. 分数正则化score regularizationBPR-max:尽管我们表明启发式的 TOP1 损失对于分数非常高的 negative relevant item 很敏感,但是在 《Session-based Recommendations with Recurrent Neural Networks》 中发现它的性能优于 BPR。据我们的观察,TOP1-max 也是优于 BPR-max 。部分原因在于很少同时出现rjri$ r_j\gg r_i $ 且rj0$ r_j\simeq 0 $ 。如果仅满足rjri$ r_j\gg r_i $ 但是rj>0$ r_j\gt 0 $ ,那么关于ri$ r_i $ 的梯度可能会消失,但是 TOP1 的正则化部分保证rj$ r_j $ 向零移动,这甚至可能使得下一次更新ri$ r_i $ 成为可能。TOP1 中的分数正则化对整个学习过程非常有益,因此即使损失函数可能不是理论上的最优,它也可以取得很好的效果。

    GRU4Rec 支持两种形式的正则化:模型参数的 dropoutL2 正则化。TOP1 的正则化与这些正则化是不同的。根据我们的经验,模型参数的 L2 正则化会降低模型性能。我们的假设是:某些模型权重不应该被正则化,如用于计算更新门 update gate 和复位门 reset gate 的权重矩阵。对 negative item 高分进行惩罚可以约束模型,但是没有显式地正则化权重。

    因此,我们也在 BPR-max 损失函数中添加了分数正则化。我们尝试了几种分数正则化的方法。性能最好的一种方法是:我们将 negative item 分数设置在独立的零均值高斯分布上,高斯分布的方差与 softmax 分数成反比。这需要对接近rmax$ r_\max^- $ 的negative item 分数进行更强的正则化,这在我们的 case 中是理想的。

    我们最小化负的对数似然并像以前一样进行函数近似,从而得到最终形式的 BPR-max 损失函数:

    Lbpr-max=(logj=1NSsj×σ(rirj))+(λj=1NSsj×rj2)

    其中:正则化项是 negative item 分数进行加权 L2 正则化,权重为 softmax 分数sj$ s_j $ ,λ$ \lambda $ 为正则化系数(一个超参数)。

    这里的正则化与 TOP1 正则化有三个区别:

    • 这里使用平方正则化,而 TOP1 使用σ(rj2)$ \sigma\left(r_j^2\right) $ 正则化。
    • 这里使用了正则化系数λ$ \lambda $ ,而 TOP1 没有使用系数。猜测的原因是:在 TOP1 中损失部分和正则化部分处于同一个量级(0.0 ~ 1.0 之间),而这里的损失部分和正则化部分处于不同量级。
    • 这里更关注negative item 的高分,使得尽可能将 negative item 高分打压下来。而 TOP1 是一视同仁,认为 negative item 高分的下降,与 negative item 低分的下降,效用是相同的。

    这意味着我们也可以改造 TOP1 损失,利用平方正则化、正则化系数、以及权重sj$ s_j $ 。

11.3 实验

  1. 数据集:

    • RSC15数据集:基于 RecSys Challange 2015 的数据集,其中包含来自在线电商的点击事件和购买事件。这里我们仅保留点击事件。
    • VIDEO 数据集和 VIDXL 数据集:是专属数据集proprietary dataset,其中包含来自在线视频服务的观看事件。
    • CLASS 数据集:也是一个专属数据集,包含来自在线分类站点的网页浏览事件。

    数据集经过轻微的预处理,然后划分为训练集和测试集。单个 session 要么属于训练集、要么属于测试集。我们基于 session 首个事件的时间来拆分数据集。

    • RSC15 数据集以及拆分与 《Session-based Recommendations with Recurrent Neural Networks》 中的完全相同。
    • VIDXL 数据集和 CLASS 数据集以及拆分与 《Parallel Recurrent Neural Network Architectures for Feature-rich Session-based Recommendations》 中的完全相同。
    • VIDEO 数据集与《Session-based Recommendations with Recurrent Neural Networks》 中的来源相同,但是子集略有不同。

    下表给出了数据集的主要特性。

  2. 评估方式:我们评估 next item prediction ,即我们迭代测试集 session 以及它们包含的事件。对于每个事件,算法都预测该 sessionnext event 对应的 item 。由于 VIDXL 测试集很大,我们将 target item 分数与测试期间最热门的 50000item 的分数进行比较。

    由于推荐系统一次只能推荐几个 item,用户选择的实际 item 应该包含在推荐列表的前面几个 item 中。因此,我们的主要评估指标是 recall@20,即:在所有 test case 的推荐列表的 top-20 中,具有 target itemcase 的比例。召回不考虑 target item 的实际排名,只需要它位于推荐列表的 top-N 。这很好地建模了某些实际场景,在这些场景中推荐位置和顺序无关紧要。召回率通常也与重要的在线 KPI 密切相关,如点击率 CTR

    实验中使用的第二个指标是 Mean Reciprocal Rank: MRR@20,它是target item 的排名倒数reciprocal rank的均值。如果 target itemrank > 20,那么排名倒数设为零。MRR 考虑 target item 的排名,这适用于推荐顺序很重要的场景,例如更尾部排名的 item 仅在屏幕滚动之后才可见。

  3. baseline 方法和配置:我们的 baseline 是原始的 GRU4Rec 算法,我们的目标是对其进行改进。我们将原始论文提出的 TOP1 损失视为 baseline 。隐层有 100 个单元。

    • 我们还对比了 item-kNN 的性能,这是 next item prediction 的一个 natural baseline
    • RSC15VIDXLCLASS 的结果直接取自相应的论文(《Session-based Recommendations with Recurrent Neural Networks》《Parallel Recurrent Neural Network Architectures for Feature-rich Session-based Recommendations》)。
    • VIDEO 数据集以 《Session-based Recommendations with Recurrent Neural Networks》 中给出的最佳超参数进行评估。
    • 我们针对所提出的改进在单独的验证集上进行单独的超参数调优。

    这些方法在 Python 中的 Theano 框架下实现。

11.3.1 additional sample

  1. 第一组实验检查了 additional negative item 对于推荐准确性的影响。我们在 CLASS 数据集和 VIDEO 数据集上进行了实验。由于结果非常相似,因此我们剔除了 VIDEO 数据集的结果从而节省一些空间。下图描述了不同损失函数(TOP1、交叉熵、TOP1-maxBPR-max )的网络的性能。我们度量了不同数量的 additional sample 下的推荐准确性,也度量了没有任何采样并计算所有得分时的推荐准确性(即 x 轴为 ALL 的点)。正如我们之前所讨论的,后一种情况更具理论性,因为它是不可 scalable 的。

    • 正如理论所暗示的,TOP1 损失不能很好地处理大量的 sample 。当增加少量的 additional sample 时,模型性能略有提高,因为包含 negative relevant item 的机会在增加。但是随着sample 的继续增加,模型性能迅速下降,因为会包含大量 negative irrelevant item

    • 另一方面,所有其它三个损失函数都对添加更多 sample 反应良好。

      • 对于交叉熵损失,收益递减的点发生在大约几千个 additional sample

      • TOP1-max 在那个点之后开始略微降低准确性。

      • BPR-max 随着更多的 sample 而性能一直提升,但是在使用到所有 item 时会略微降低准确性。

        BPR-max 使用所有 item 时,会失去随机性。众所周知,一定程度上的随机性有利于学到更好的模型。

  2. 添加 additional sample 会增加计算成本,但由于现代 GPU 上易于并行化,大部分成本都得到了缓解。下图显示了不同 sample size 的训练时间。注意,y 轴的时间为对数坐标。

    实际的训练时间不仅取决于数据集,还取决于模型超参数(尤其是 mini-batch size)以及框架如何支持某些用于计算损失函数的算子。然而,所有损失的趋势都是相似的。

    • 例如,网络的完整训练大约需要 6 ~7 分钟,即使增加到 512additional sample 也不会增加训练时间。
    • 在收益递减的点,即在 2048additional sample 时,训练时间仍然在 7 ~ 8 分钟左右,只是略有增加。
    • 在那之后,由于超出了我们使用的 GPU 的并行化能力,训练时间迅速增加。

    VIDEO 数据集上的趋势也是相似的,训练时间从 20 分钟左右开始,在 2048additional sample 时开始增加(到 24 分钟),此后迅速增加。这意味着与数据增强方法不同,我们提所提出的方法在实践中使用时可以是零成本或很少的额外成本的。

  3. 在接下来的实验中,我们对控制采样的α$ \alpha $ 参数进行参数敏感性分析。下图给出了交叉熵、TOP1-maxBPR-max 在不同α$ \alpha $ 值上的性能。

    • 对于交叉熵,当 sample size 较小时它倾向于较高的α$ \alpha $ 值,当 sample size 较大时它倾向于较低的α$ \alpha $ 值。这与我们在前面的讨论是一致的:热门 samplesample size 非常有限并且训练开始阶段非常有用,但是可能很快就会耗尽。 因此,如果我们有办法(例如足够大的 sample size )切换到更平衡的采样,那么可能是有益的。此外,在这种情况下,均匀采样可以被少量的、从 minibatch 采样得到的 popularity based sample 所补充。

    • 另一方面,ranking-max loss 似乎更喜欢中间略偏高一点的值,而在极端情况下的表现最差。我们假设这主要是由于:

      • 它们是基于 pairwise losse ,而这通常需要 popular sample
      • 它们采用了 score regularization:通过 popularity based sampling ,最热门 item 的分数将降低到超出预期的水平,因此效果较差。

11.3.2 损失函数

  1. 我们度量了所提出的改进在 baseline 上的性能增益。准确性的大幅提升来自于 additional sample 和损失函数的组合。下图展示了我们最重要的结果。除了原始版本的 GRU4Recitem-kNN 之外,我们还包括了没有 additional sampling 的交叉熵 cross-entropy: XE 损失的结果,从而确认固定交叉熵损失的性能仍然略好于 TOP1

    • additional sample 和适当的损失函数的组合,其效果是惊人的,其最好的结果比原始 GRU4Rec 的准确性高出 18% ~ 37.5%、比 item-kNN 的准确性高出 55% 。当都采用 additional sample 时,BPR-max 的性能与交叉熵相似或更好。

      实际上发现带 additional sample 的交叉熵损失函数已经效果很好了,将交叉熵损失替换为 ranking-max 损失的收益不大。

    • RSC15 上,《Improved Recurrent Neural Networks for Session-based Recommendations》 使用数据增强报告了 recall@20 大约在 0.685MRR@20 大约在 0.29。与我们的解决方案不同,数据增强大大增加了训练时间。数据增强和我们的改进并不互斥,因此通过结合这两种方法,可以获得更好的结果。

11.3.3 统一的 item representation

  1. 以前的实验没有发现在 GRU layer 之前使用 embedding layer 的任何好处。embeddinhg layer 的作用是将 item ID 转换为潜在 representation 空间。在推荐系统的术语中,item embedding 对应于 item feature vector。现有的 GRU 网络已有另外一个 item feature matrix ,它是 output weight matrix 的形式。通过统一representation,即在 embedding layeroutput layer 之间共享权重矩阵,我们可以更快地学习更好的 item representation

    初步实验(如下表)显式,对于大多数数据集,recall@20 有额外的轻微改进,而 MRR@20 则略有下降。然而,对于 CLASS 数据集,当使用统一 embedding 时,召回率和 MRR 都显著增加。此外,统一 embedding 还具有将整体内存占用和模型大小减少约 4 倍的额外好处。

    作者并没有探索这里的原因,遗憾。

11.3.4 在线测试

  1. 基于本文提出的改进,在 online video portal 上的大规模在线 A/B test 中评估 GRU4Rec 在技术上也变得可行。推荐展示在每个视频页面上,并且在页面加载后立即可用。该网站具有自动播放功能,类似于 Youtube 上的。如果用户点击推荐的某个 item、或者通过自动播放来访问推荐的某个 item (这意味着用户开始访问推荐队列),那么系统不会计算新的推荐列表,因此用户可以与一组推荐的 item 进行多次交互。用户也可以直接访问视频(而不是通过推荐列表的方式,比如直接访问视频的 url 地址),那么系统为该用户生成一组新的视频推荐。

  2. 实验配置:将 GRU4Rec 与经过微调的复杂推荐逻辑进行比较,持续时间为 2.5 个月。用户分为三组:

    • 第一组由 baseline 逻辑提供推荐服务。

    • 第二组由 GRU4Recnext best 来提供推荐服务,这意味着算法推荐的 item 很可能是用户 session 中的 next item

    • 第三组由 GRU4Recsequence mode 来提供推荐服务,其中 GRU4Rec 根据迄今为止的 session 来生成一个 item 序列。序列是贪婪地生成的,即算法假设它的 next guess 到目前为止是正确的。

      sequence mode 会生成next itemnext next item ... 等等的序列,而不是 next item

    机器人botpower 用户(例如,长时间播放视频的用户)会从评估结果中过滤掉,因为它们可能会扭曲结果。机器人是根据 user agent 过滤的。每天过滤掉身份不明的机器人和 power 用户以及具有不切实际行为模式的用户。受过滤影响的 non-bot 用户比例非常低(占比大约 0.1%)。

  3. 评估指标:我们使用不同的 KPI 来评估效果,每个 KPI 都与推荐请求的数量相关:观看时长是该组观看视频的总秒数,视频播放量是改组至少观看了一定时长的视频数量,点击量是改组点击推荐的次数。

    当实验组和对照组的请求数量几乎相等时,总量的比较结果与均值的比较结果几乎相同。

    下图展示了 GRU4Rec 相对于复杂逻辑的相对性能增益。error bar 代表 p=0.05 的置信区间。

    • GRU4Rec 在两种预测模式下都优于 baseline。观看时长提高了 5%、视频播放量提高 了 5%、点击量提高了 4%
    • 在观看时长和视频播放量方面,sequence modenext best 的表现更好,但是在点击量方面则不然。这是因为 sequence mode 更适合自动播放功能,从而导致用户的点击量减少。另一方面,虽然基于 next best guess 的预测是相关的,但是它们是更加多样化的,并且用户更有可能跳过推荐列表中的视频。sequence mode 更适合视频系列 video series 和其它紧密结合的视频。
    • 我们还注意到,随着两种预测模式同时运行,并通过反馈环feedback loop 从彼此的推荐中学习,它们之间观看时长和视频播放量的差异开始慢慢消失。

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

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

发布评论

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