推荐系统基础之wide&deep模型

1 背景

对于一个推荐系统,我们可以采用协同过滤、矩阵分解等算法来预测用户对物品的评分,根据评分取前N个进行推荐。然而,在实际应用场景中,要计算所有用户对所有物品的评分,计算量十分庞大,并且需要占据巨大的内存,因此,通常的做法是先对所有物品进行召回,以召回的这一部分物品作为候选,再对这些候选物品进行评分或点击率预测,根据预测结果排序,取前N个进行推荐。wide&deep模型就是点击率预测的一个经典模型。

2 wide&deep模型

我们知道,线性模型以给定的原始特征和一些人为设计的交互特征作为输入,它的训练过程就是要找到个输入特征的最优权重,因此,线性模型的一大优点就是能够发掘特征之间直接的、显式的联系,具有“记忆能力”。
深度学习模型则是多层非线性输出的组合,非线性的组合有利于发掘特征之间隐含的、潜在的联系。因此,深度学习模型能够根据输入的特征学习到泛化规则,具有“泛化能力”。
当我们将这两个模型结合起来,就得到了wide&deep模型,其中wide部分就是简单的线性模型(例如逻辑斯蒂回归模型),deep部分就是深度学习模型(例如DNN模型),它同时具有“记忆能力”和“泛化能力”。下图是wide&deep模型的结构图。
推荐系统基础之wide&deep模型
如何理解模型的记忆能力和泛化能力呢?举个例子,我们通常会把篮球和男性联系起来,把化妆品和女性联系起来,这种直接的、简单粗暴的关联起两个特征的能力就是记忆能力,猫是哺乳动物,狮子是哺乳动物,泛化之后就得到所有胎生动物都是哺乳动物的结论,这就是泛化能力。我们会发现,记忆能力偏向于依靠记住用户过去与哪些物品发生了关联来进行推荐,因此推荐的内容缺乏新颖性;泛化能力能够依据输入特征进行扩展,但过度泛化的结果很可能不够准确,会给出用户实际并不感兴趣的推荐,比如上述得到的胎生动物都是哺乳动物的结论就是错误的,事实上鲨鱼虽然是胎生但不是哺乳动物,而是脊椎动物。融合两种能力的wide&deep模型就能够取二者之长,给出一个比较准确又不过度泛化的推荐结果。

2.1 wide部分

wide部分是一个线性模型,它的数学形式如下:
f ( x ) = W X + b f(x)=WX+b f(x)=WX+b
wide部分的输入分为两部分,一部分是原始特征,另一部分是对原始特征人为设计后得到的交互特征,而这个交互特征可以定义为:
推荐系统基础之wide&deep模型
其中 x i x_i xi为特征i的数据, c k i c_{ki} cki用于决定这个特征是否参与构造交互特征k,当 c k i = 0 c_{ki}=0 cki=0时无论 x i x_i xi的值是什么, x i c k i x^{c_{ki}}_i xicki的值都为1,此时特征i就不参与交互特征k的构造。交互特征k只有在参与构造的所有特征都不为0时为非零值,因此这样设计的交互特征能够很好地处理大型稀疏矩阵(通常是对类别特征进行one-hot得到的),过滤掉大量关联度不高的特征,最终得到较少且具有较高关联度的特征。
同时,wide部分模型训练时采用的优化器是带L1正则的FTRL算法,这一算法十分注重模型的稀疏性。
因此,wide部分能够大大压缩特征向量的维度,训练后留下来的特征都是十分重要的,这就有利于发现特征之间显式的关联规则。

2.2 deep部分

deep部分是一个DNN模型,不同于wide部分着重处理稀疏的输入矩阵,deep部分的输入是对特征进行embedding后得到的稠密矩阵,它的数学形式如下:
推荐系统基础之wide&deep模型
deep部分采用AdaGrad优化器来学习。

2.3 组合

wide&deep模型不是将两部分模型分别训练后做模型融合,而是联合训练,即部分特征输入wide部分,另一部分特征输入deep部分,两部分同时进行训练,得到的训练结果在反馈时同时作用于这两部分模型。wide&deep模型的数学形式如下:
推荐系统基础之wide&deep模型