周一我们看了一篇经典的文章,那就是尝试使用受限波兹曼机(RBM)来对推荐系统建模。这应该是最早把深度学习应用到推荐建模的典范。当然,RBM 虽然算是相对比较早的深度学习模型,但其本质上并没有很多后来提出的深度模型的特质,也没有真正发挥出深度学习模型的特有优势。
今天,我们结合几篇论文来看一类深度学习模型,那就是“递归神经网络”(Recurrent Neural Network),简称 RNN,在推荐系统中的应用。这类模型可以解决传统推荐模型中难以对时序信息进行建模的问题,扩宽了推荐系统的应用边界。
时序信息建模
要想说清楚 RNN 对于推荐系统的贡献,我们首先要来看一看为什么需要对时序信息进行建模。
在我们前面介绍的诸多推荐模型中,不管是矩阵分解,还是简单的基于流行度的推荐模型,或是其他更加复杂的张量分解等模型,其实都没有内置“时间”这个概念。
比方说,我们通过矩阵分解来对用户和物品的评分进行建模。在这个建模的场景里,用户物品评分矩阵是针对所有数据的,不管是用户昨天对某个物品进行评分还是今天,甚至是一年以前,所有数据都是在唯一一个矩阵里面加以表示。这么做的好处是,极大地简化了真实情况,不好的地方则是完全忽略了所有评分在时间上的发展。
其实早在 Netflix 大赛中,一些学者就在 Netflix 公布的数据集上发现,用户对于电影的喜爱程度,或者说评分数值,有非常明显的随时间变化而变化的趋势。文末我列的参考文献 [1],这篇论文就是充分挖掘了时间信息从而带来了性能上的提升,如果你有兴趣的话,建议读一读这篇文章。
在深度学习模型,特别是 RNN 之前,如果我们希望对时间进行建模,从模型工具的角度上来说,我们都有哪些选择呢?
一种办法是可以尝试使用传统的“时序模型”(Time Series Models)。这一类模型在统计领域已经使用了较长时间,然而最大的问题就是,很多工具很难直接和我们提到的这些推荐模型进行嫁接。另外一个难点是在嫁接之后,模型的训练算法往往会变得异常复杂,这也给模型的普及和使用带来了很多障碍。
另外一种办法,就是尝试在现有的模型里通过特性(Feature)或者其他的方法,来让当前的模型能够对时间信息进行建模。这个思路其实是对矩阵分解进行了修改。这样做的好处就是可以根据自己的需要在某一个模型上进行必要的更改,然而这么做的先天性缺陷就在于提出来的修改往往只能针对某一个模型,而没有办法扩展到其他模型。
第三种做法是可以利用张量分解(Tensor Factorization)。我们直接把时间作为一个新的维度,因此可以对用户在某一个时间段对某个物品的评分进行建模,有一些工作是基于这个假设的。
不过,直接利用张量分解的最大问题是,张量本身并不是时序模型,利用张量对时序信息进行建模仅仅是因为时序信息大多时候可以被表达成为离散的数据,因此张量才在这里有了用武之地。然而,因为张量无法直接对离散时序的两位数据点之间进行约束建模,比如时间点“昨天”和时间点“今天”可能在张量中占据两个不同的数据点,但是张量本身并不能把这两个数据点联系起来。也就是说,张量在“语义”(Semantics)上其实并不支持时序数据。
基于以上这些原因,我们需要有新的工具来对时序信息进行比较直接的建模,同时也能有相对容易的学习算法。