Wide & deep Model:从Google到华为

3,911 阅读5分钟

在之前的一篇博客基于深度学习的推荐系统(二)MLP based中,我简单地提到了wide&deep model。在这里,我将这一模型单独拿出来加以讲述,因为这个模型是很多工业界推荐系统的根基。从Google在2016年发表这篇文章开始,越来越多的公司开始使用wide&deep model和它的变种。其中,华为提出的DeepFM是一个较为典型的变种,之前也提到过一些,我也会在这篇文章中加以讲述。

Wide & Deep Learning for Recommender Systems

Wide & Deep Learning for Recommender Systems是Google在2016年发表的文章。这篇文章一共只有4页,非常非常短,但是其内容产生了巨大的影响。文章大意如下:

使用非线性特征变换的广义线性模型被广泛用于具有稀疏输入的大规模回归和分类问题。通过一系列特征转换,我们可以完成历史交互的memorization(记忆),用这些特征建立的广义线性模型是有效且可解释的。但如果要提升这类模型的泛化(generalization)性能,需要很多的特征工程工作。深度神经网络可以通过针对稀疏特征学习的低维密集嵌入更好地推广到看不见的特征组合,因此需要较少的特征工程。但是当交互信息较少时,它会overfit,学习到一些本来不存在的关联。我们把前者称为wide,后者称为deep,把这两者组合起来,就得到了wide&deep model。

其实我个人认为文中关于memorization和generalization的定义和我们常用的不太一样,所以为了方便起见,我把原文定义在这里写一遍:

One challenge in recommender systems, similar to the general search ranking problem, is to achieve both memorization and generalization. Memorization can be loosely defined as learning the frequent co-occurrence of items or features and exploiting the correlation available in the historical data. Generalization, on the other hand, is based on transitivity of correlation and explores new feature combinations that have never or rarely occurred in the past. Recommendations based on memorization are usually more topical and directly relevant to the items on which users have already performed actions. Compared with memorization, generalization tends to improve the diversity of the recommended items.

所谓wide model,是指logistic regression等使用人工特征的模型,这些模型尤其常用one-hot编码。这些模型简单可解释,但无法对未在训练集中出现的feature建模。所谓deep model,是指embedding-based models,包括FM和深度神经网络。它们能从稀疏数据中学习到稠密的feature embedding,但如果输入矩阵是稀疏但高秩的,它就可能学习出很多并不存在的关联。

wide部分的表达式为y = W^T_{wide}\{x, \phi(x)\} + b,其中w是参数,x是特征工程引入的input feature,\phi(x)是这些feature被转换后的形式,最常见的转换为cross-product transformation,定义为\phi_k(x) = \prod_{i=1}^{d}x_i^{c_{ki}}, c_{ki} \in \{0, 1\}

deep部分为一个MLP,每一个隐层的形式为为\alpha^{(l+1)} = f(W_{deep}^{(l)}a^{(l)} + b^{(l)})l代表层数, f(\dot~)是激活函数,一般是ReLu。

我们将这两部分合起来,就得到一个wide&deep模型,而合并方式根据目标不同而有所不同。对一个逻辑回归问题,模型的预测输出为P(\hat{r_{ui}} = 1|x) = \sigma(W^T_{wide}\{x, \phi(x)\} + W_{deep}^{(l)}a^{(l_f)} + bias)。其中\sigma代表sigmoid函数,a^{(l_f)}代表最后一层的activation。

我们需要对wide&deep网络进行联合训练。在这里需要注意,联合训练和embedding方法是不同的。一般的embedding方法把不同的部分分开训练,这这个过程中不同的模型相互之间不知道彼此的存在,也不会互相影响,但在联合训练中,整个网络同时被训练,梯度的反向传播同时影响整个模型的所有部分。我们使用mini-batch SGD来训练模型。

文章在Google App store上进行了实验,其实验网络的具体结构为:

DeepFM: An End-to-End Wide & Deep Learning Framework for CTR Prediction

华为的DeepFM应用在华为应用市场上,先后有过两个不同的版本,分别是2017年的 DeepFM: A Factorization-Machine based Neural Network for CTR Prediction和2018年的 DeepFM: An End-to-End Wide & Deep Learning Framework for CTR Prediction。我在这里选择的是后一个版本的文章内容。在做这个之前,同一个作者还写过一篇另一个思路的Holistic Neural Network for CTR Prediction,也是在华为应用市场上完成的,解决的问题是类似的,但方法不太相同,我们就不在这里介绍了。

DeepFM最核心的想法是让deep和wide部分共享参数,具体来说,他们用FM作为wide部分,DNN或者PNN作为deep部分,但是把FM的部分放到NN的embedding层之后,从而让它们共享embedding。其算法结构如图所示:

这样做的主要好处是:原始的wide&deep model的wide的部分,其输入仍要靠特征工程来确定,但deepFM让两部分共享embedding,就不再需要特征工程了。

具体来说,deepFM的数据集由n个(X, y)样本组成,其中X是一个m个field组成的输入,这个输入里包含一个(user, item)对的特征集合,(X, y)随后被转化为对应的输入vector(x, y)y \in \{0, 1\}。整个网络预测的CTR为\hat{y}(x) = sigmoid(y_{FM}(x) + y_{deep}(x))

文章对12个不同的Model做了测试,包括一些wide model, deep model, wide & deep model和DeepFM model,其配置为:

在offline evaluation中,各model的表现如下:

实际上,原始的wide&deep model本身并不常用,但是它的各种变种正在被广泛使用。少年,学了买不了吃亏买不了上当哦~