《Improved Recurrent Neural Networks for Session-based Recommendations》
传统的个性化推荐方法通常需要用户画像(指的是用户历史行为信息),至关重要的是,这些方法要求在推荐时识别用户。然而这可能是不可行的,例如:网站的新用户没有任何画像信息,或者用户没有登录,或者用户删除了他们的 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》
中,论文进一步研究了 RNN
在session-based
推荐中的应用。具体而言,作者检查和采纳了文献中的各种技术来完成这项任务,包括:
通过序列预处理( sequence preprocessing
) 和 embedding dropout
来增强数据,从而提升训练并减少过拟合。
通过模型预训练,从而考虑数据分布的时间偏移(temporal shift
)。
使用 privileged information
的蒸馏,从而从小数据集中学习。
此外,论文提出了一种新颖的替代模型,该模型通过直接预测 item embedding
来减少预测的时间成本和空间成本。这使得 RNN
更容易在 real-time setting
中部署 。
论文在 RecSys Challenge 2015
数据集上进行了评估,并证明了作者所提出方法的有效性。
相关工作:
矩阵分解和基于邻域的方法在文献中被广泛应用于推荐系统。
矩阵分解方法基于稀疏的 user-item
交互矩阵,其中推荐问题被公式化为矩阵补全任务(matrix completion task
)。在分解矩阵之后,每个用户都由一个潜在因子向量来表示,每个 item
也都由一个潜在因子向量来表示。然后可以通过对应的 user latent vector
和item 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
的预测性能。流行的方法包括:数据增强、dropout
、batch normalization
、残差连接。我们寻求应用其中一些方法来提升我们模型的训练。
人们提出 learning using privileged information: LUPI
框架来利用一些额外的 feature representation
,这些 feature representation
仅在训练期间可用但是在测试期间不可用。当训练数据量有限时,人们发现使用此类信息是有益的。
在广义蒸馏方法中,student
模型从 teacher
模型提供的 soft label
中学习。如果我们在 privileged dataset
上训练 teacher
模型,那么这种方法可以应用于 LUPI
。在这项工作中,我们提出使用 LUPI
框架来用于点击序列的预测,其中我们使用每个点击序列的未来部分作为 privileged information
。
session-based
推荐的 RNN
:session-based
推荐问题可以公式化为基于序列的预测问题:令所有 item
集合的大小为 click session
,其中 item
的索引并且 click session
中的任何前导点击序列 item
item
的概率。
我们将 item
成为 session
中 next click
的排序分。由于我们通常需要为用户选择一个以上的推荐,因此这里推荐 top-k item
(根据 next click
,则我们用一个 one-hot
编码 pairwise ranking loss
。
我们遵循下图所示 RNN
模型的通用结构。对于recurrent layer
,我们使用 Gated Recurrent Unit: GRU
,因为 《Session-based recommendations with recurrent neural networks》
中发现它优于 LSTM
单元。但是,我们没有使用 stateful RNN
训练过程,在 stateful RNN
训练过程中模型以 session-parallel
、sequence-to-sequence
的方式进行训练。相反,我们的网络处理每个序列 next click
我们还使用可训练的 embedding
来表示所有input
。我们的网络可以通过 Back-Propagation-Through-Time: BPTT
算法在固定数量的 time step
上,使用交叉熵损失来执行标准的 mini-batch
随机梯度下降从而进行训练。如下图所示为一条序列的训练示意图,梯度沿着灰色箭头的反向传播,蓝色为input
序列,橙色为 target output
。
数据增强(data augmentation
):数据增强技术已被广泛应用于图像领域,这里我们提出两种方法来增强点击序列:
第一个方法是 《Artificial neural networks applied to taxi destination prediction》
中提出的序列预处理方法的应用。原始input session
的所有前导(prefix
)都被视为新的训练序列。给定一个训练 session
label
来用于训练:
第二个方法是 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
。
适应时序变化(adapting to temporal changes
):许多机器学习模型的一个关键假设是:输入是独立且同分布的。这在 item recommendation setting
中并非严格如此,因为新的商品只会出现在该商品发布之后的 session
中,并且用户行为/偏好也可能随着时间而改变。此外,推荐系统的目标是对新序列进行预测,即那些来自用户最近行为的序列。因此,在整个数据集上学习推荐模型可能会导致性能下降,因为模型最终会关注一些与最近序列无关的过时属性。
解决这个问题的一种方法是定义一个时间阈值,并在构建模型时丢弃早于该阈值的点击序列。但是,这种方法减少了可供模型学习的训练数据量。
我们提出了一个简单的解决方案:通过预训练获得两全其美的效果。我们首先在整个数据集上训练一个模型,然后使用训练好的模型来初始化一个新模型。这个新模型仅使用近期数据(整个数据集的子集)进行训练,例如从一年点击数据中使用最近一个月的数据来训练。这使得模型能够使用大量数据进行良好的初始化,并聚焦于近期的点击序列。通过这种方式,这类似于在图像领域中使用的 fine-tuning
过程。
使用长期数据训练意味着学习用户的长期兴趣,使用短期数据训练意味着学习用户的短期兴趣。这里的方法通过初始化使得用户长期兴趣作为先验知识:当短期数据丰富时,学到的用户短期兴趣占主导;当短期数据匮乏时,初始的用户长期兴趣占主导。
使用 privileged information
:用户在某个item
之后点击的 item
序列也可能包含有关该 item
的信息,如下图所示的蓝色 item
。这些信息不能用于执行预测,因为我们在进行推荐时无法查看到未来的序列。然而,我们可以利用这些未来的序列用作 privileged information
,以便为我们模型的正则化和训练来提供 soft label
。为此,我们使用广义蒸馏框架。
形式上,给定一个序列 session
的 label
privileged information
定义为:session
的长度。privileged sequence
仅仅是发生在第 item
之后的、逆序的未来序列。我们现在可以在 privileged sequence
teacher
模型,它也具有相同的 label
接下来我们通过最小化以下形式的损失函数来调优我们的 student
模型
其中:label
之间的重要性。
注意:这里的
teacher
序列为未来序列的逆序,它提供soft label
。
这使得 label
中学习,也可以从 teacher
label
(即 soft label
)中进行学习。当可用的训练数据很小的时候,这种学习过程很有用。
论文并未说明
teacher
模型的结构。它的输入是未来序列的逆序,理论上应该和 有所不同。
用于快速预测的 output embedding
:我们输出层需要输出所有 item
的排序分,这不仅消耗内存,也使得预测很慢。在 NLP
中也研究了类似的问题,典型的方法包括 使用 hierarchical softmax layer
、以及采样最高频的 item
。
hierarchical softmax
并不适用于我们的场景,因为我们需要进行 top-k
预测,而不仅仅是 top-1
预测。相反,我们将 item embedding
视为将 item
从 one-hot
编码空间到低维空间的投影。基于这个观点,我们建议训练模型直接预测 next click
的 embedding
。使用真实输出的 embedding
和预测的 embedding
之间的余弦损失来调优模型。该方法的灵感来自于 word2vec
,其中相似的单词具有更接近的embedding
(以余弦距离来衡量)。同样地,我们预期用户在给定序列之后可能点击的 item
应该在 item embedding
空间中接近。
使用这种类型的输出将 final layer
中的参数数量从 embedding
的维度。
这种方法的一个缺点是:它需要为每个 item
提供高质量的 embedding
。获得这种 embedding
的一种方法是从上述模型中抽取和重用经过训练的 item embedding
。
这种方式的
label
是一个embedding
向量,而不再是一个类别。还有一种解决方案:利用负采样技术,从而将
softmax layer
转换为一个双塔架构。
数据集:RecSys Challenge 2015
数据集,其中最后一天的 session
为测试集(包含 15234
个 session
),其它天的 session
作为训练集(包含 7966257
个session
)。预测的候选 item
数量为 37483
。在预处理session
之后,我们有 23670981
个训练序列。
为了更好地评估我们的模型(如 privileged information
和预训练),我们按时间对训练序列进行排序,然后报告我们在训练序列的最近部分上(
评估方式:每个session
被item-by-item
地输入到模型,计算模型在session
的 next click
的排名。评估指标是 Recall@20
和 Mean Reciprocal Rank (MRR)@20
。
对于 M1 ~ M3
,我们直接从 softmax
输出中选取 top 20
个最可能的 item
。对于 M4
,我们计算模型输出与 item embedding
的余弦距离,然后选取 top 20
个最接近的 item
。
最后,我们还报告了每个模型的模型大小和 batch
预测时间。如果模型要部署在真实的推荐系统中,那么这些都是重要的考虑因素。
配置:
所有模型对 item
使用 50
维的 embedding
,embedding
的 dropout rate
为 25%
。
我们使用 Adam
优化器,batch size = 512
。
我们将 item
序列的长度截断为 19
,因为 99%
的原始训练session
的长度小于等于 19
。为简单起见,短于 19
个 item
的序列用零填充,RNN
将忽略这些零。
我们使用 10%
的训练数据作为每个模型的验证集来早停,从而设置每个模型的 epoch
数量。
我们在所有模型中都使用单层 recurrent layer
,因为我们发现更多的层并未提高性能。每个模型的 GRU
设置为 100
个隐单元或 1000
个隐单元。
模型是在 GeForce GTX Titan Black GPU
上,在 keras
和 theano
中定义和训练的。每个模型的详细信息(以及它们的 label
)如下:
M1
:具有 softmax
输出、序列预处理、embedding dropout
的 RNN
模型。recurrent layer
全连接到输出层。
M2
:与 M1
相同,但是针对数据集的最近时间段的部分重新训练了模型。
预训练是在整个数据集上进行的,重新训练是在最近部分上进行的(下图的
x
轴)。
M3
:在每个数据中可用的 privileged information
(未来序列)上训练的 M1
模型。这用于为参数 softmax
的温度超参数) 和 M1
模型提供 soft label
。我们并没有广泛调优这两个超参数。
M4
:模型的输出直接预测 item embedding
。我们在 recurrent layer
和输出层之间添加了一个全连接的隐层,因为我们发现这提高了模型的稳定性。我们为这些模型使用了embedding
,这些 embedding
是由 M1
在整个训练数据集上训练得到的。
下图总结了每个模型在评估指标上的性能。
M1
和 M2
比报告的 baseline RNN
模型产生了显著的性能提升。
从 M1
的结果中,我们看到使用整个数据集进行训练的结果,要比使用使用数据集最近部分重新训练的结果稍差。这表明我们的推荐模型确实需要考虑随时间变化的用户行为。
下表还报告了我们表现最好的模型,我们还列出了 《Session-based recommendations with recurrent neural networks》
中报告的 baseline
结果,包括他们最好的、基于 RNN
的模型(即 TOP1
和 BPR
)以及两种传统算法(即 S-POP
和 Item-KNN
)。令人惊讶的是,从 GRU 100
到 GRU 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
能够部署在真实推荐系统中的步骤。