推荐系统遇上深度学习(四十)-SESSION-BASED RECOMMENDATIONS WITH RECURRENT NEURAL NETWORKS
大家好,在本文中我们将深入探讨Session-Based Recommendation这一主题。这篇论文的题目是《SESSION-BASED RECOMMENDATIONS WITH RECURRENT NEURAL NETWORKS》,它详细阐述了基于循环神经网络的方法用于实现会话推荐过程的具体机制和应用效果。具体信息如下:访问链接[http://arxiv.org/abs/1511.06939]即可获取完整论文内容。
此外,在本研究中使用的代码位置在以下链接中获取:https://github.com/princewen/tensorflow_practice/tree/master/recommendation/Basic-SessionBasedRNN-Demo
可参考Python 2版本代码来源:该GitHub仓库中的GRU4Rec模型实现了基于长短时记忆的推荐系统
首先掌握Session-Based Recommendation的基本概念。其基本原理是基于会话机制进行的信息过滤,在使用一个app的过程中,通过分析用户的活动变化而产生的个性化推荐;另一种情况是根据用户的短暂行为序列进行动态调整,在某些情况下,并不需要等到用户完全退出应用后才能形成会话;例如,在airbnb的研究文献中,如果前后两次操作间隔在30分钟以内,则被视为同一个session
1、模型介绍
1.1 背景介绍
在本文之前(2016年),对话式推荐系统主要包含物品based collaborative filtering和MDP-based approaches两种方法。
基于物品的协同过滤主要依据的是商品间的相似度矩阵。当用户在一个session中对某一个商品进行访问时,则会通过相似度矩阵计算出与之相似的商品,并将其推荐给该用户。该方法因其简便性和广泛的应用而受到重视;然而该方法仅考虑用户的最后一次互动记录而不包含之前的多次互动信息(文献中这样表述),尽管如此,在实际应用中或许可以通过加权的方式综合多次点击的影响。
基于马尔可夫决策过程构建的推荐系统属于强化学习框架下的研究范畴。该系统的核心机制在于通过分析用户的点击行为来推断转移概率,并以此为基础进行精准化的推荐。然而这种做法的一个显著问题是当物品数量增多时构建所有可能的点击序列变得极为复杂(虽然考虑到当前研究背景这一限制已经较为合理,在现代条件下我们可以通过深度求索算法等技术加以改进)。
1.2 基于RNN的会话推荐
回归主题,在文章中提出采用 recurrent neural network(RNN)技术进行对话推荐过程,并附有相应的结构图如图所示。

该模型架构非常简洁,在Session期间内的一系列点击数据为x = [x₁, x₂, x₃,…, x_{r−1}, x_r]。随后将x₁、x₂等数据逐一输入至该模型,并通过其预测下一次点击的对象。
首先,在序列中每个物品xt都被转换为其one-hot表示。接着将其映射到对应的嵌入表示。经由N个GRU单元的处理后,通过一个全连接层计算出下一轮每个物品被点击的概率。
值得注意的是,在我的参考代码中,每个物品实际上对应了两套不同的embedding方案。其中一个是用于接收输入信息的input embedding(即来自xt),另一个是用于计算物品点击概率的那个output embedding(即来自yt)。具体来说,在xt经过多层GRU结构进行处理后生成的output向量为w1;而将yt对应的softmax输出作为w2,则会发现它们之间的点积运算可以直接得到对yt未经过softmax处理的概率计算结果。这种设计方式确实带有注意力机制的特点,请大家自行查看提供的代码实现细节。
1.3 模型的小trick
为了提高训练的效率,文章采用两种策略来加快简化训练代价,分别为:
Session-parallel MINI BATCHES
通过更高效的并行计算。论文采用 mini-batch 处理方式。其图示如下所示。

可以观察到,在实验设置中设置了五个不同的会话(Session1至Session5),其中每个会话的时长分别为4、2、6、2、3。假设批量大小设置为3,则系统首先将前三个会话用于模型训练过程。然而,在实际运行过程中发现,在完成第三个物品的处理后,第2个会话已结束。因此,在此情况下需要切换至第4个会话来进行后续操作,并且需要注意的是,在GRU层中需要将状态重新初始化为空值以确保模型能够继续正常运行。
Sampling On the output
当输出中的物品数量过多时(即物品数量如果过多的话),模型输出的空间维度过高会导致计算量变得非常庞大(即计算量会变得非常庞大)。为了应对这一问题,在实践中通常采用负采样策略来解决这一问题(即通常采用负采样策略来解决这一问题)。研究论文则巧妙地利用了同一批次中的其他序列信息来生成负样本(具体而言,在每个batch中选择同一序列下下一个点击位置对应的items作为负样本)。
在如图所示的情况下,在输入参数设置为i₁₁时,在模型运行过程中其正样本输出为i₁₂。相应地,在预期结果中相应的负样本则包括i₂₂和i₃₂。
1.4 Rank Loss
这里,论文提出了两种pair-wise的损失函数,分别为BPR 和TOP1 。
BPR
BPR损失,对比了正样本和每个负样本的点击概率值,其计算公式如下:

在其中,在这种情况下,“i”表示正样本,“j”表示负样本。如果正样本的点击率高于负样本,则损失较小;反之则会导致较大的损失。
TOP1
第二个损失函数感觉与第一个损失函数较为接近,在负样本点击概率上进行了调整,并在经过sigmoid变换后并未再进行对数操作:

1.5 实验结果
文对所提出的推荐模型进行了系统性对比实验,并与按热度排序推荐算法、基于会话的热度推荐方法、基于物品协同过滤技术、以及BPR-MF矩阵分解方法等进行了性能评估。研究中采用RecSys Challenge 2015公开数据集以及具有时长特性的Youtube-like在线视频流数据集作为实验样本。通过Recall@20和MRR@20两个关键指标量化评估各算法性能表现

接着,在多个不同的数据集上通过采用不同的损失函数进行模型训练各评价指标的对比结果表明:

实证研究表明,在对比实验中,在采用本文所提出的Rank Loss框架下进行优化训练后,在保持模型复杂度不变的前提下,在测试集上的准确率较之前的方法提升了约20%。
1.6 关于损失函数的讨论
让我们来深入探讨一下我在阅读本文时所遇到的一个疑虑点:为什么pair-wise损失函数相较于point-wise损失函数表现出更好的性能呢?具体来说,在不同的应用场景中这一差异会有所体现。例如,在电子商务领域以及外卖订餐场景中我们会遇到大量商品供消费者选择的情况。在这种情况下,并不能简单地将其视为非黑即白的分类问题;相反的是,在这种情形下我们关心的是消费者对不同商品之间的相对偏好关系——换句话说,在面对多个选项时消费者的偏好吗?此时采用pair-wise损失函数可能会带来更好的预测效果。而在广告投放中通常会展示单一的广告内容——如果某个广告被点击,则表示该广告具有吸引力;反之则表示未被选择。因此,在这样的场景下我们可以将这个问题视为典型的分类任务并采用point-wise损失函数来进行建模。
另外需要注意的是,在比较两种损失函数时(即point-wise损失函数与pair-wise损失函数),我们发现pair-wise损失函数需要收集更多样本数据。如果在样本数量相对较少的情况下(即数据量较少的时候),point-wise损失函数可能更适合应用。
以上仅仅是我个人的观点,咱们可以一起讨论,进步!
