美文网首页
从FM到DeepFM:浅谈推荐系统中的模型演化

从FM到DeepFM:浅谈推荐系统中的模型演化

作者: 小新_XX | 来源:发表于2020-02-21 22:13 被阅读0次

近年来,embedding+DNN的模型组合成为了CTR预估任务的通用框架。本文分析总结一系列相关的模型,包括FM, FNN, PNN, Wide&Deep和DeepFM.

I. Factorization Machine(FM)

1. FM的定义

假设输入特征x是n维向量。

FM的公式:
\hat y(\mathbf x)=w_{0}+\sum_{i=1}^nw_{i}x_{i}+\sum_{i=1}^n\sum_{j=i+1}^n<\mathbf v_i,\mathbf v_j>x_ix_j \tag 1
其中w_0\in \mathbb R, \mathbf w \in \mathbb R^n, \mathbf V \in \mathbb R^{n\times k}, <\cdot, \cdot> 表示向量点乘。

矩阵 \mathbf V 中的一行\mathbf v_i用来表示输入向量的第i个变量,\mathbf v_i的维度为k,参数k\in\mathbb N_0^+,定义了因子分解的维度。FM可以看做线性部分的LR(包含w_0,w_i的项)和非线性的特征组合(包含\mathbf v_i,\mathbf v_j的项)。特征组合项展开之后就是所有特征(x_1,...,x_n)之间的两两相乘,并乘以一个系数<\mathbf v_i,\mathbf v_j>。而这里的k其实就是embedding size,用k维的向量来表达某个输入特征x_i。因此,式(1)是所有特征自身的一阶线性表示以及两两特征之间的二阶交叉表示(即x_ix_ix_j, i, j \in {1,...,n})之和。

图 1. FM的结构

2. FM为什么可以描述稀疏特征

  • 为什么稀疏特征难以学习?

对于推荐系统来说,假设输入特征为最简单的user-item组合。并假设输入数据中一共有M个users,N个items,则每个输入向量的特征为M+N,且由于one-hot encoding,每个输入特征\mathbf x = \{x_1, ..., x_{M+N}\}中只有2个位置非零,如下表所示:

x_1 x_2 ... x_M x_{M+1} x_{M+2} ... x_{M+N}
u_1 u_2 ... u_M i_1 i_2 ... i_N
1 0 ... 0 1 0 ... 0
0 1 ... 0 1 0 ... 0
... ... ... ... ... ... ... ...
1 0 ... 0 0 1 0 0
... ... ... ... ... ... ... ...

对于实际问题,输入数据不可能有所有user和所有item的全组合。假如我们需要预测user u_p 对item i_q 的评分,但输入数据中并没有user u_p 对user i_q的直接评价,这样就会导致无法预测。

这也是协同过滤(Colaborative Filtering)考虑的主要问题。

  • FM为什么可以学习稀疏特征?

在式(1)中,最关键的部分在于第三个交叉项\sum_{i=1}^n\sum_{j=i+1}^n<\mathbf v_i,\mathbf v_j>x_ix_j 。这里\hat w=<\mathbf v_i,\mathbf v_j>表示x_ix_j之间的交互(interaction)FM没有使用独立的参量w_{ij}来表示这一交互,而是选择使用因子相乘的方法来表达。这样不同field之间就可以有交叉。

field的定义:特征种类的个数。如上述例子中有两个field:user和item。

在上述例子中,虽然训练数据中没有u_p对于i_q的评价,但我们可以在学习的过程中,通过其他的输入实例来学习\mathbf v_p\mathbf v_{q}的值,这样就可以间接地学习到u_pi_q之间的关系,并作出预测。

II. FM supported Neural Netrowk(FNN)

1. FNN的设计思想

CTR预估任务的输入多为大规模稀疏的,并且包含很多categorical特征,DNN难以直接学习,无法发挥DNN在拟合高阶特征方面的强大作用。因此FNN使用FM来作为embedding模块,将高维度稀疏特征转化为低纬度稠密特征(这也是ctr预估任务引入embedding的前身)。FM可以学习任意两个特征之间的组合,并将其连同一阶特征输出到后面的DNN中,由DNN来学习特征的高阶非线性抽象。

2. FNN的结构

图2.FNN的结构
  • 首先,FNN对输入数据提出了每个field的特征只有一个1,其余元素都是0的强假设。
    从下至上,从xz是embedding层,类似于FM的结构。\boldsymbol z = (w_0,\boldsymbol z_1, ..., \boldsymbol z_i, ..., \boldsymbol z_n),这里\boldsymbol z_i \in \mathbb R^{K+1}代表embedding层 Field i的输出,可以写作:
    \boldsymbol z_i = \boldsymbol W^i_0 \cdot \boldsymbol x[{\rm start}_i:{\rm end}_i] = (w_i, v_i^1,v_i^2, ..., v_i^K ) \tag2

    这里\boldsymbol W_0^i \in \mathbb R^{(K+1){\rm x}({\rm end}_i-{\rm start}_i+1)}, \boldsymbol W^i_0里每一行的值都是用w_i\boldsymbol v_i来初始化的。\boldsymbol z被用作上层DNN的输入:
    \boldsymbol l_1 = {\rm tanh}(\boldsymbol {W_1 z + b_1})\tag3经过两层FC之后,输出经过sigmoid函数用于预测ctr的值。

  • 将FM的结构用于底层embedding其实是受到了卷积神经网络(CNN)的启发。CNN中使用feature map将空间上相邻的神经元联结起来,这就类似于FM中将不同field的特征互相交叉的过程。此外,FM是Field-wise training for one-hot sparse encoded input. 即将每个特征用其所属的field表示,这种结构可以大大减少输入数据的维度。

  • 参数\boldsymbol W_0的值需要预训练一个FM来得到,因此FNN不是一个end-to-end模型。

III. Product-based Neural Networks(PNN)

图 3. PNN的结构

1. 网络结构

PNN的结构和FNN类似,区别在于PNN在 embedding layer和MLP之间加入了一层product layer,这里的embedding layer与FNN中的相同。product layer分为两个部分:左边的\mathbf z是FM一次项的输出,右边的\mathbf p是FM两两交叉项的输出,如下所示:
\mathbf z = (\boldsymbol f_1, \boldsymbol f_2, ..., \boldsymbol f_N) \tag 4

\boldsymbol p = \{\boldsymbol p_{i,j}\}, i=1,...,N,j=1,...N \tag 5

其中N为输入的field数目。这里\boldsymbol f_i \in \mathbb R^M是field i的embedding 向量, 而\boldsymbol p_{i,j}=g(\boldsymbol f_i, \boldsymbol f_j)定义了特征的两两交叉项。通过定义不同的g(\boldsymbol f_i, \boldsymbol f_j), 可以设计出不同的PNN模型。论文中给出了两种:inner product和outer product。这里向量\boldsymbol p应该有N(N-1)/2维,和FM中的交叉项类似,为两两不重复交叉(即i\neq j)。

这里的embedding向量\boldsymbol f_i可以写作:
\boldsymbol f_i = \boldsymbol W_0^i\boldsymbol x[{\rm start}_i:{\rm end}_i] \tag 6

  • 如果将product layer的二次项输出\boldsymbol p去掉,PNN就等同于FNN。

  • 如果product layer选择inner product,并将PNN的hidden layers(e.g. L1和L2)去掉,同时输出采用相同权重的sum up,则PNN等同于FM。

2. PNN的设计思想

  • PNN使用product layer来探索更多特征交互(feature interaction)的可能性。
  • product layer是做“AND"操作,会更倾向于学习特征间交互的规则(rules)而不是单纯学习特征(features)。由于CTR预测使用的是大规模稀疏网页数据,不同于图像数据那样,相邻的pixel之间都很强的关联性。因此学习数据之间的逻辑(logic)或规则(rules)会显得更有意义,这也是特征交互的体现。
  • 一句话总结:乘比加好!

IV Wide & Deep

1. 设计思想

Google 的 Wide & Deep这篇论文中,首先将推荐系统的任务定义为一个搜索排序过程:给定用户的query,推荐系统要输出一个排好序的item list. 然后提出了两个概念:memorization(记忆性)和generalization(泛化性)。

  • memorization
    指模型学习历史数据中出现过的query-item组合的能力。一般使用线性模型(如logistic regression),搭配特征之间的叉乘(cross-product)来学习;
  • generalization:指模型历史数据中未出现过的新的组合的能力。可以用基于embedding的模型来学习,如FM,DNN等。这些模型会通过embedding将categorical特征映射为低维稠密向量,但其缺点是对于高维稀疏的输入数据,其中的query和item两两之间几乎都没有交叉,但embedding会将所有的query-item pair都映射为低维向量,可能会为用户推荐一些不相关的item。
    Wide & Deep的出发点就是就是将两种结构结合起来,使模型兼具memorization和generalization,并使用联合训练(joint training)的方式完成模型的学习。

2. 模型结构

图4. wide&deep模型结构

这里的Wide需要人工设计特征工程,最主要的就是叉乘变换(cross-product transformation),即将指定的binary特征进行连乘,以捕捉特征之间的交叉关系,为模型加入了非线性。

V. DeepFM

DeepFM是Wide & Deep的升级版,将wide部分用FM来代替,这样就免去了在wide部分人工设计特征交叉,得到一个end-to-end模型,理论上可以学习到所有特征间的interaction。

图5. DeepFM模型结构

VI. 总结

关于CTR预估模型的演变,主要围绕着FM和DNN模型的的不同组合进行,这里对相关概念总结如下

  • Feature interaction(特征交叉/特征组合)

Feature interaction是特征工程中的重要一环。ctr预估任务中,通过将不同类型的特征进行组合,可以发掘出用户不同兴趣的内在关联,有助于更好的预测用户行为。例如在app store的推荐场景中,用户经常在吃饭的时候下载外卖app,说明app类目和time stamp就是两个相关性较强的特征。通过特征交叉将两个特征关联起来会有较好的效果。

在Wide&Deep中,FM部分的输入就经过了人工做叉乘变换(cross-product transformation)来捕捉这种特征组合信息。同时,FM模型本身的输出也包含了不同field特征之间的交叉:<\boldsymbol v_i*\boldsymbol v_j>\boldsymbol x_i*\boldsymbol x_j. 而DNN的结构可以捕捉到更高阶的特征交叉信息。

  • FM与DNN

FM可以捕捉到低阶的特征交叉,而DNN通过学习embedding向量,可以抽象特征交叉的高阶表示。同时,Wide&Deep论文里提到FM和DNN分别负责memorization(捕捉已有特征组合)和generalization(探索未出现过的特征组合),两者结合起来可以发挥更大的作用。

相关文章

网友评论

      本文标题:从FM到DeepFM:浅谈推荐系统中的模型演化

      本文链接:https://www.haomeiwen.com/subject/wochqhtx.html