一、Improved GRU4Rec [2016]

《Improved Recurrent Neural Networks for Session-based Recommendations》

  1. 传统的个性化推荐方法通常需要用户画像(指的是用户历史行为信息),至关重要的是,这些方法要求在推荐时识别用户。然而这可能是不可行的,例如:网站的新用户没有任何画像信息,或者用户没有登录,或者用户删除了他们的 tracking 信息。这导致了基于用户历史的推荐方法的冷启动问题。

    另一种替代方法依赖于历史数据,并提供 session-based 推荐。在这个 setting 中,推荐系统仅根据用户在当前 session 中的行为进行推荐。这避免了上述冷启动问题,但我们必须确保系统保持准确率和及时响应(即,预测不会耗费太长时间)。最近,《Session-based recommendations with recurrent neural networks》 提出了 RNN 用于 session-based 推荐。作者展示了 RNN 相对于传统模型在 session-based 推荐上的显著改进。

    在论文 《Improved Recurrent Neural Networks for Session-based Recommendations》 中,论文进一步研究了 RNNsession-based 推荐中的应用。具体而言,作者检查和采纳了文献中的各种技术来完成这项任务,包括:

    • 通过序列预处理( sequence preprocessing) 和 embedding dropout 来增强数据,从而提升训练并减少过拟合。

    • 通过模型预训练,从而考虑数据分布的时间偏移(temporal shift)。

    • 使用 privileged information 的蒸馏,从而从小数据集中学习。

    此外,论文提出了一种新颖的替代模型,该模型通过直接预测 item embedding 来减少预测的时间成本和空间成本。这使得 RNN 更容易在 real-time setting 中部署 。

    论文在 RecSys Challenge 2015 数据集上进行了评估,并证明了作者所提出方法的有效性。

  2. 相关工作:

    • 矩阵分解和基于邻域的方法在文献中被广泛应用于推荐系统。

      • 矩阵分解方法基于稀疏的 user-item 交互矩阵,其中推荐问题被公式化为矩阵补全任务(matrix completion task)。在分解矩阵之后,每个用户都由一个潜在因子向量来表示,每个 item 也都由一个潜在因子向量来表示。然后可以通过对应的 user latent vectoritem latent vector 内积来补全 user-item 矩阵的缺失值。

        由于这需要我们同时识别用户向量和 item 向量,因此矩阵分解方法无法直接适用于用户未知的 session-based 推荐。解决这个冷启动问题的一种方法是使用成对偏好回归(pairwise preference regression )。

      • 基于邻域的方法利用 target item 和用户购买历史 item 之间的相似性。通过比较 session similarity,基于邻域的方法可以应用于 session-based 推荐。

    • 深度学习最近在图像识别、语音识别、自然语言处理等领域取得了非常成功的应用。在《Session-based recommendations with recurrent neural networks》 中,作者提出 RNN 来用于 session-based 推荐。作者将 RNN(带有自定义的 ranking loss)与现有的 session-based 预测方法进行比较,发现 RNN-based 方法的性能相比 baseline 要提升 20% ~ 30%。我们的工作与之密切相关,我们研究该 RNN 模型的扩展。

      《Sequential click prediction for sponsored search with recurrent neural networks》 中,作者还使用 RNN 进行点击序列预测。他们考虑了历史用户行为,也考虑了每个用户和每个 item 的、手工设计的特征。在这项工作中,我们完全依赖于自动学习的 feature representation

    • 也有许多工作提出了方法来提高 DNN 的预测性能。流行的方法包括:数据增强、dropoutbatch normalization、残差连接。我们寻求应用其中一些方法来提升我们模型的训练。

    • 人们提出 learning using privileged information: LUPI 框架来利用一些额外的 feature representation,这些 feature representation 仅在训练期间可用但是在测试期间不可用。当训练数据量有限时,人们发现使用此类信息是有益的。

      在广义蒸馏方法中,student 模型从 teacher 模型提供的 soft label 中学习。如果我们在 privileged dataset 上训练 teacher 模型,那么这种方法可以应用于 LUPI 。在这项工作中,我们提出使用 LUPI 框架来用于点击序列的预测,其中我们使用每个点击序列的未来部分作为 privileged information

1.1 模型

  1. session-based 推荐的 RNNsession-based 推荐问题可以公式化为基于序列的预测问题:令所有 item 集合的大小为 m ,令 [x1,x2,,xn1,xn] 为一个 click session,其中 xiR 为被点击 item 的索引并且 1xim 。我们寻求一个模型 M,使得对于 click session 中的任何前导点击序列 x=[x1,x2,,xr1,xr],1r<n ,我们得到输出 y=M(x),其中 y=(y1,,ym)Rmyiitem i 是第 r+1 个被点击 item 的概率。

    我们将 y 视为每个 item 成为 sessionnext click的排序分。由于我们通常需要为用户选择一个以上的推荐,因此这里推荐 top-k item (根据 y 进行排名)。令 xr+1 为前导点击序列 xnext click,则我们用一个 one-hot 编码 er+1Rm来表示它,然后计算它与 y 的交叉熵 L(y,er+1) 。也可以使用 pairwise ranking loss

    我们遵循下图所示 RNN 模型的通用结构。对于recurrent layer ,我们使用 Gated Recurrent Unit: GRU ,因为 《Session-based recommendations with recurrent neural networks》 中发现它优于 LSTM 单元。但是,我们没有使用 stateful RNN 训练过程,在 stateful RNN 训练过程中模型以 session-parallelsequence-to-sequence 的方式进行训练。相反,我们的网络处理每个序列 [x1,x2,,xr],并且训练用于预测该序列的 next click xr+1

    我们还使用可训练的 embedding 来表示所有input。我们的网络可以通过 Back-Propagation-Through-Time: BPTT 算法在固定数量的 time step 上,使用交叉熵损失来执行标准的 mini-batch 随机梯度下降从而进行训练。如下图所示为一条序列的训练示意图,梯度沿着灰色箭头的反向传播,蓝色为input 序列,橙色为 target output

     

  2. 数据增强(data augmentation):数据增强技术已被广泛应用于图像领域,这里我们提出两种方法来增强点击序列:

    • 第一个方法是 《Artificial neural networks applied to taxi destination prediction》 中提出的序列预处理方法的应用。原始input session 的所有前导(prefix)都被视为新的训练序列。给定一个训练 session [x1,x2,,xn],我们生成序列和对应的 label 来用于训练:

      ([x1],x2),([x1,x2],x3),,([x1,x2,,xn1],xn)
    • 第二个方法是 dropout ,它是应用于 input sequence 的正则化形式。对点击序列应用 dropout 相当于随机删除部分click 的预处理步骤。直观而言,这使得我们的模型对 noisy click 不太敏感,例如用户可能不小心点击了不感兴趣的 item。因此,dropout 使模型不太可能过拟合特定的noisy 序列。dropout 也可以被视为一种数据增强形式,它生成更短的、被裁剪的序列来用于模型训练。

      这里是 dropout 输入序列中原始的 item id,而不是 dropout 对应的 item embedding 。在本论文里二者是相同的,但是需要实验来验证?

    我们将这两种方法应用于我们的所有模型。下图展示了一个示例:图中是一个包含了四个点击的session,虚线轮廓表示训练期间被dropout 的点击,灰色表示训练序列,橙色表示 output label,蓝色表示 privileged information (它们不用于标准的训练过程)。

    注意,相同序列在不同的训练epoch 会丢弃不同的点击item

  3. 适应时序变化(adapting to temporal changes):许多机器学习模型的一个关键假设是:输入是独立且同分布的。这在 item recommendation setting 中并非严格如此,因为新的商品只会出现在该商品发布之后的 session 中,并且用户行为/偏好也可能随着时间而改变。此外,推荐系统的目标是对新序列进行预测,即那些来自用户最近行为的序列。因此,在整个数据集上学习推荐模型可能会导致性能下降,因为模型最终会关注一些与最近序列无关的过时属性。

    解决这个问题的一种方法是定义一个时间阈值,并在构建模型时丢弃早于该阈值的点击序列。但是,这种方法减少了可供模型学习的训练数据量。

    我们提出了一个简单的解决方案:通过预训练获得两全其美的效果。我们首先在整个数据集上训练一个模型,然后使用训练好的模型来初始化一个新模型。这个新模型仅使用近期数据(整个数据集的子集)进行训练,例如从一年点击数据中使用最近一个月的数据来训练。这使得模型能够使用大量数据进行良好的初始化,并聚焦于近期的点击序列。通过这种方式,这类似于在图像领域中使用的 fine-tuning 过程。

    使用长期数据训练意味着学习用户的长期兴趣,使用短期数据训练意味着学习用户的短期兴趣。这里的方法通过初始化使得用户长期兴趣作为先验知识:当短期数据丰富时,学到的用户短期兴趣占主导;当短期数据匮乏时,初始的用户长期兴趣占主导。

  4. 使用 privileged information:用户在某个item 之后点击的 item 序列也可能包含有关该 item 的信息,如下图所示的蓝色 item 。这些信息不能用于执行预测,因为我们在进行推荐时无法查看到未来的序列。然而,我们可以利用这些未来的序列用作 privileged information,以便为我们模型的正则化和训练来提供 soft label 。为此,我们使用广义蒸馏框架。

    形式上,给定一个序列 [x1,x2,,xr] 和来自sessionlabel xr+1 ,我们将 privileged information 定义为:x=[xn,xn1,,xr+2] ,其中 n 为原始 session 的长度。privileged sequence 仅仅是发生在第 r+1item 之后的、逆序的未来序列。我们现在可以在 privileged sequence x 上训练一个 teacher模型,它也具有相同的 label xr+1

    接下来我们通过最小化以下形式的损失函数来调优我们的 student 模型 M(x)

    (1λ)×L(M(x),er+1)+λ×L(M(x),M(x))

    其中:λ[0,1] 为超参数用于平衡两个 label 之间的重要性。

    注意:这里的 teacher 序列为未来序列的逆序,它提供 soft label

    这使得 M 既可以从真实label 中学习,也可以从 teacher M 预测的 label(即 soft label )中进行学习。当可用的训练数据很小的时候,这种学习过程很有用。

    论文并未说明 teacher 模型 M 的结构。它的输入是未来序列的逆序,理论上应该和 M 有所不同。

  5. 用于快速预测的 output embedding:我们输出层需要输出所有 item 的排序分,这不仅消耗内存,也使得预测很慢。在 NLP 中也研究了类似的问题,典型的方法包括 使用 hierarchical softmax layer、以及采样最高频的 item

    hierarchical softmax 并不适用于我们的场景,因为我们需要进行 top-k 预测,而不仅仅是 top-1 预测。相反,我们将 item embedding 视为将 itemone-hot 编码空间到低维空间的投影。基于这个观点,我们建议训练模型直接预测 next clickembedding 。使用真实输出的 embedding 和预测的 embedding 之间的余弦损失来调优模型。该方法的灵感来自于 word2vec,其中相似的单词具有更接近的embedding (以余弦距离来衡量)。同样地,我们预期用户在给定序列之后可能点击的 item 应该在 item embedding 空间中接近。

    使用这种类型的输出将 final layer 中的参数数量从 H×m (输入为 H 维、输出为 m 维的全连接层)降低到 H×d (输入为 H 维、输出为 d 维的全连接层),其中 H 为最后一个隐藏的维度,dembedding 的维度。

    这种方法的一个缺点是:它需要为每个 item 提供高质量的 embedding。获得这种 embedding 的一种方法是从上述模型中抽取和重用经过训练的 item embedding

    这种方式的 label 是一个 embedding 向量,而不再是一个类别。

    还有一种解决方案:利用负采样技术,从而将 softmax layer 转换为一个双塔架构。

1.2 实验

  1. 数据集:RecSys Challenge 2015 数据集,其中最后一天的 session 为测试集(包含 15234session),其它天的 session 作为训练集(包含 7966257session )。预测的候选 item 数量为 37483 。在预处理session 之后,我们有 23670981 个训练序列。

    为了更好地评估我们的模型(如 privileged information 和预训练),我们按时间对训练序列进行排序,然后报告我们在训练序列的最近部分上({1256,164,116,14,11})训练的模型的结果。

  2. 评估方式:每个sessionitem-by-item 地输入到模型,计算模型在sessionnext click 的排名。评估指标是 Recall@20Mean Reciprocal Rank (MRR)@20

    对于 M1 ~ M3,我们直接从 softmax 输出中选取 top 20 个最可能的 item。对于 M4,我们计算模型输出与 item embedding 的余弦距离,然后选取 top 20 个最接近的 item

    最后,我们还报告了每个模型的模型大小和 batch 预测时间。如果模型要部署在真实的推荐系统中,那么这些都是重要的考虑因素。

  3. 配置:

    • 所有模型对 item 使用 50 维的 embeddingembeddingdropout rate25%

    • 我们使用 Adam 优化器,batch size = 512

    • 我们将 item 序列的长度截断为 19 ,因为 99% 的原始训练session 的长度小于等于 19。为简单起见,短于 19item 的序列用零填充,RNN 将忽略这些零。

    • 我们使用 10% 的训练数据作为每个模型的验证集来早停,从而设置每个模型的 epoch 数量。

    • 我们在所有模型中都使用单层 recurrent layer,因为我们发现更多的层并未提高性能。每个模型的 GRU 设置为 100 个隐单元或 1000 个隐单元。

    模型是在 GeForce GTX Titan Black GPU 上,在 kerastheano 中定义和训练的。每个模型的详细信息(以及它们的 label)如下:

    • M1:具有 softmax 输出、序列预处理、embedding dropoutRNN 模型。recurrent layer 全连接到输出层。

    • M2:与 M1 相同,但是针对数据集的最近时间段的部分重新训练了模型。

      预训练是在整个数据集上进行的,重新训练是在最近部分上进行的(下图的 x 轴)。

    • M3:在每个数据中可用的 privileged information(未来序列)上训练的 M1 模型。这用于为参数 T=1softmax 的温度超参数) 和 λ=0.2 的另一个 M1 模型提供 soft label。我们并没有广泛调优这两个超参数。

    • M4:模型的输出直接预测 item embedding。我们在 recurrent layer 和输出层之间添加了一个全连接的隐层,因为我们发现这提高了模型的稳定性。我们为这些模型使用了embedding,这些 embedding 是由 M1 在整个训练数据集上训练得到的。

  4. 下图总结了每个模型在评估指标上的性能。

    • M1M2 比报告的 baseline RNN 模型产生了显著的性能提升。

      • M1 的结果中,我们看到使用整个数据集进行训练的结果,要比使用使用数据集最近部分重新训练的结果稍差。这表明我们的推荐模型确实需要考虑随时间变化的用户行为。

      • 下表还报告了我们表现最好的模型,我们还列出了 《Session-based recommendations with recurrent neural networks》 中报告的 baseline 结果,包括他们最好的、基于 RNN 的模型(即 TOP1BPR)以及两种传统算法(即 S-POPItem-KNN)。令人惊讶的是,从 GRU 100GRU 1000,我们模型的性能(M1 ~ M3 )并未显著提升。

      • 我们发现 privileged information 模型(M3)的训练时间非常长。我们省略了 GRU size 1000 的结果,因为它无法在合理的时间内进行训练。我们认为训练时间急剧增加的主要原因是:需要计算 soft label、以及为每个 mini-batch 计算针对这些 soft label 的相应交叉熵损失。当可能的 soft label 数量很大时,这种扩展性很差,就像这里的情况一样。尽管如此,在最小的数据集上(即仅使用最近 1/8 的训练数据),M3 相比 M1 产生了适度的性能提升。这与 《Unifying distillation and privileged information》privileged information 的使用是一致的,并且表明它在可用数据很少的环境中可能很有用。

      • 最后,与我们的其它模型相比,M4 在预测准确性方面表现不佳(尽管它仍然比 baseline 有所提高)。如果可以使用质量更好的 embedding 作为目标,我们或许能够进一步提升 M4 的准确性。例如我们没有使用item 的任何辅助信息,如类别、品牌。

        另一方面,batch prediction 时间和模型大小如下表所示。对于 M4 模型,仅使用基于分类的模型(M1 ~ M3)的大约 60% 的预测时间就可以在 M4 中进行预测。M4 的参数也少得多,因此需要的内存更少。总之,这些都是使 RNN 能够部署在真实推荐系统中的步骤。