用户在互联网上的操作路径往往都是一个序列,比如看电影、点击商品、购买、看新闻等,可以用以下的序列进行表示:
因此对于这个序列如何建模来获取整个用户的意图行为至关重要,而之前传统的ML只能基于统计或者经验的方式来尽量抽取这些序列信息,并无法直接处理整个序列,16年提出的GRU4REC利用RNN-Based对用户序列进行建模并且取得了不错的效果,同时也会有一些研究对于GRU4REC做了不少改进和扩展,本文主要对GRU4REC以及扩展做一些记录。
GRU4REC
GRU4REC是Session信息和GRU结合起来完成了推荐,他给定的场景是:
用户在我们的应用上有一段行为Session(比如说点击item的需求),然后在于该Session信息来预测接下来可能会发生点击的item,而这笔的Session信息主要使用GRU模型来进行刻画:
1.这边第一步的输入是用户的行为序列: [x1,x2,x3,..,xN]
2.这些行为序列可以接下来使用两种Embedidng表示,一种是One-Hot方式,另一种是在One-Hot接下来过一个Embedding层
3.将所有的输入进行向量化表示之后,会过若干层的GRU(就是比较核心的序列化建模了)
4.完成序列化建模之后再进行一个Feedforward的网络转换
- 最终对下一个目标进行预测,这边的目标其实就是xN+1
(作者说这种方式性能好,但是我到觉得这种场景下One-Hot不是很合适,One-Hot在这边维度太巨大,并且会特别的稀疏,可能还是查表的来的好)
其实GRU4REC的整个思路还是很清晰,模型也很简单,但是该算法中比较重要的应该是他的加速优化和LOSS的选择可能会有比较大的参考价值意义:
为了能提高训练的效率,采用两种策略来进行训练的优化:
- 使用Mini-Batch来进行训练:
因为用户行为的Session有长有短,并且他的差异性很大,传统的滑窗方式来构建训练数据并不适用,他这里用的策略是将不同的Session给拼接了起来,在同一个序列中如果遇到下一次Session时,会将GRU中的向量参数给重新初始化掉,因为这边GRU是对Step进行预测,所以在序列中间直接初始化掉问题也不大,这样还可以提升数据的利用率,会比简单PADDING的方式更加的合适。
2.取巧的训练数据采样:
原始的模型中是需要过softmax对于每个item都计算才能对目标的item进行训练,因为item的维度非常高,所以这里的计算量是超级大的。作者在这里比较机智的在目标的样本中根据热门程度进行了采样,采样完成之后将同一个mini-batch中但是是其他Session的next-item作为负样本。用这些正负样本来训练整个神经网络。下面这个图对于采样非常形象了:
因此这个模型现在已经转为对正负样本的一个0-1分类的问题,而且推荐里面,并不存在绝对的正负样本,用户也可能会对多个item存在偏好,所以这边比较合适Loss Function就是用Pair-Wise的模式了(只需要 正样本的score大于负样本即可):
GRU4REC-Sampling
GRU4REC-Sampling也是在基于GRU4REC上的缺陷提出了额外的Sampling和新的Loss Function
作者认为GRU4REC存在下面三种局限:
BatchSize一般都是比较小的,在总样本较多时,如果采样少的话,分数比较高的负样本被采样进来的概率就偏少了(这里高分数要用于下面的Loss)
BatchSize会影响运行速度,但是由于设计的是Mini-Batch并行的方式,所以增加BatchSize也不会对速度有多大的影响
虽然GRU4REC用的是根据热度采样,但是实际中全根据热度也不一定适应所有数据集
所以在GRU4REC-Sampling中又进行了额外的采样:同样是在Mini-Batch中进行采样,采样时根据这个公式supp^αi,而这边的α是一个0~1的值,如果α=0表示均匀采样,如果α=1为完全的热门采样。
另外GRU4REC中的BPR和TOP1会存在梯度的消失问题,因此作者设计了一种新的损失函数希望来最大化正样本的分数:
从这儿可以看出,新的损失函数是对Max-Score的负样本做pair,但是这种是不可求导了,所以作者用了一种近似的方式来实现,刚刚对Max-Score做负样本的方式可以转为Score越大,则Loss中的权重也越大,而这个权重可以用归一化的softmax来表示:
看结果提升还是挺明显的。
GRU4REC-DWell
GRU4REC-DWell也是基于GRU4REC的一个简单的改进,其中GRU4REC已经证明在时序的推荐中序列化的建模非常有用。
另外作者认为在用户行为序列中,每个item的停留时间是非常重要的一个特征,而之前的GRU4REC算法只是用于简单的交互行为来构建样本,所以GRU4REC-DWell主要是很巧妙将用户在序列item上的停留时间和GRU4REC结合了起来:
HRNN
话说看到HRNN的思路,感觉非常的优美。用户往往会存在多段不连续的Session(比如逛淘宝时,早上公交逛一次,中午午睡时逛一次,晚上睡前逛一次,这样就有三段Session序列,每一段内部是连续的),而之前的模型都是将这些Session行为都是独立训练的,文本中作者认为同一用户的不同Session间是有关联的,建模每一段Session可以发现用户的衍化。
所以作者提出了一种层次化的RNN序列建模,在每一段的Session-Level内部使用RNN建模的同时,会有一个User-Level的RNN来建模当前用户跨Session的行为,而User-Level的RNN的输入就是每一段Session-Level的final state。
用户的所用行为表示为
感谢:
Hidasi, Balázs, et al. “Session-based recommendations with recurrent neural networks.” arXiv preprint arXiv:1511.06939 (2015).
Hidasi, Balázs, and Alexandros Karatzoglou. “Recurrent neural networks with top-k gains for session-based recommendations.” arXiv preprint arXiv:1706.03847 (2017).
Bogina, Veronika, and Tsvi Kuflik. “Incorporating dwell time in session-based recommendations with recurrent Neural networks.” CEUR Workshop Proceedings. Vol. 1922. 2017.
Quadrana, Massimo, et al. “Personalizing session-based recommendations with hierarchical recurrent neural networks.” Proceedings of the Eleventh ACM Conference on Recommender Systems. ACM, 2017.
http://kubicode.me/2018/09/19/Deep%20Learning/GRU4REC-Session-Based-Recommendation/