Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

读论文推荐系统之ctr预估-DeepFM模型解析 #11908

Open
guevara opened this issue Dec 5, 2024 · 0 comments
Open

读论文推荐系统之ctr预估-DeepFM模型解析 #11908

guevara opened this issue Dec 5, 2024 · 0 comments

Comments

@guevara
Copy link
Owner

guevara commented Dec 5, 2024

(读论文)推荐系统之ctr预估-DeepFM模型解析



https://ift.tt/No6nl3D



Jesse_jia


今天第二篇(最近更新的都是Deep模型,传统的线性模型会后面找个时间更新的哈)。本篇介绍华为的DeepFM模型 (2017年),此模型在 Wide&Deep 的基础上进行改进,成功解决了一些问题,具体的话下面一起来看下吧。

原文:《Deepfm: a factorization-machine based neural network for ctr prediction


1、问题由来

1.1、背景

CTR 预估 数据特点:

  1. 输入中包含类别型和连续型数据。类别型数据需要 one-hot, 连续型数据可以先离散化再 one-hot,也可以直接保留原值。

  2. 维度非常高。

  3. 数据非常稀疏。

  4. 特征按照 Field 分组。

CTR 预估重点在于学习组合特征。注意,组合特征包括二阶、三阶甚至更高阶的,阶数越高越复杂,越不容易学习。Google的研究者得出结论:高阶和低阶的组合特征都非常重要,同时学习到这两种组合特征的性能要比只考虑其中一种的性能要好。

那么关键问题转化成:如何高效的提取这些组合特征。一种办法就是引入领域知识人工进行特征工程。这样做的弊端是高阶组合特征非常难提取,会耗费极大的人力。而且,有些组合特征是隐藏在数据中的,即使是专家也不一定能提取出来,比如著名的“尿布与啤酒”问题。

在 DeepFM 提出之前,已有 LR,FM、FFM、FNN、PNN(以及三种变体:IPNN,OPNN,PNN*),Wide&Deep 模型,这些模型在 CTR 或者是推荐系统中被广泛使用。

1.2、现有模型的问题


线性模型:最开始 CTR 或者是推荐系统领域,一些线性模型取得了不错的效果(线性模型LR简单、快速并且模型具有可解释,有着很好的拟合能力),但是LR模型是线性模型,表达能力有限,泛化能力较弱,需要做好特征工程,尤其需要交叉特征,才能取得一个良好的效果,然而在工业场景中,特征的数量会很多,可能达到成千上万,甚至数十万,这时特征工程就很难做,还不一定能取得更好的效果。

FM模型:线性模型差强人意,直接导致了 FM 模型应运而生(在 Kaggle 上打比赛提出来的,取得了第一名的成绩)。FM 通过隐向量 latent vector 做内积来表示组合特征,从理论上解决了低阶和高阶组合特征提取的问题。但是实际应用中受限于计算复杂度,一般也就只考虑到 2 阶交叉特征。后面又进行了改进,提出了 FFM,增加了 Field 的概念。

遇上深度学习:随着 DNN 在图像、语音、NLP 等领域取得突破,人们渐渐意识到 DNN 在特征表示上的天然优势。相继提出了使用 CNN 或 RNN 来做 CTR 预估的模型。但是,CNN 模型的缺点是:偏向于学习相邻特征的组合特征。 RNN 模型的缺点是:比较适用于有序列 (时序) 关系的数据。

FNN 的提出,应该算是一次非常不错的尝试:先使用预先训练好的 FM,得到隐向量,然后作为 DNN 的输入来训练模型。缺点在于:受限于 FM 预训练的效果

随后提出了 PNN,PNN 为了捕获高阶组合特征,在embedding layer和first hidden layer之间增加了一个product layer。根据 product layer 使用内积、外积、混合分别衍生出IPNN, OPNN, PNN*三种类型。

但无论是 FNN 还是 PNN,他们都有一个绕不过去的缺点:对于低阶的组合特征,学习到的比较少。 而前面我们说过,低阶特征对于 CTR 也是非常重要的。

Google(上一篇) 意识到了这个问题,为了同时学习低阶和高阶组合特征,提出了 Wide&Deep 模型。它混合了一个 线性模型(Wide part) 和 Deep 模型 (Deep part)。这两部分模型需要不同的输入,而 Wide part 部分的输入,依旧依赖人工特征工程。

但是,这些模型普遍都存在两个问题:

  1. 偏向于提取低阶或者高阶的组合特征,不能同时提取这两种类型的特征。

  2. 需要专业的领域知识来做特征工程。

于是DeepFM 应运而生,成功解决了这两个问题,并做了一些改进,其优点如下:

  1. 不需要预训练 FM 得到隐向量。

  2. 不需要人工特征工程。

  3. 能同时学习低阶和高阶的组合特征。

  4. FM 模块和 Deep 模块共享 Feature Embedding 部分,可以更快的训练,以及更精确的训练学习。

下面就一起来走进模型的细节。


2、模型细节


DeepFM主要做法如下:

  1. FM Component + Deep Component。FM 提取低阶组合特征,Deep 提取高阶组合特征。但是和 Wide&Deep 不同的是,DeepFM 是端到端的训练,不需要人工特征工程。

  2. 共享 feature embedding。FM 和 Deep 共享输入和feature embedding不但使得训练更快,而且使得训练更加准确。相比之下,Wide&Deep 中,input vector 非常大,里面包含了大量的人工设计的 pairwise 组合特征,增加了它的计算复杂度。

模型整体结构图如下所示:

由上面网络结构图可以看到,DeepFM 包括 FM和 DNN两部分,所以模型最终的输出也由这两部分组成:

下面,把结构图进行拆分,分别来看这两部分。

2.1、The FM Component

FM 部分的输出由两部分组成:一个 Addition Unit,多个 内积单元。

这里的 d 是输入 one-hot 之后的维度,我们一般称之为feature_size。对应的是 one-hot 之前的特征维度,我们称之为field_size。

架构图如上图所示:Addition Unit 反映的是 1 阶的特征。内积单元 反映的是 2 阶的组合特征对于预测结果的影响。

这里需要注意三点:

  1. 这里的Wij,也就是,可以理解为DeepFM结构中计算embedding vector的权矩阵(并非是网上很多文章认为的Vi是embedding vector)。

  2. 由于输入特征one-hot编码,所以embedding vector也就是输入层到Dense Embeddings层的权重。

  3. Dense Embeddings层的神经元个数是由embedding vector和field_size共同确定,直观来说就是:神经元的个数为embedding vector * field_size。

FM Component 总结:

  1. FM 模块实现了对于 1 阶和 2 阶组合特征的建模。

  2. 无须预训练。

  3. 没有人工特征工程。

  4. embedding 矩阵的大小是:特征数量 * 嵌入维度。然后用一个 index 表示选择了哪个特征。

需要训练的有两部分:

  1. input_vector 和 Addition Unit 相连的全连接层,也就是 1 阶的 Embedding 矩阵

  2. Sparse Feature 到 Dense Embedding 的 Embedding 矩阵,中间也是全连接的,要训练的是中间的权重矩阵,这个权重矩阵也就是隐向量 Vi

2.2、The Deep Component

Deep Component 架构图:

这里DNN的作用是构造高阶组合特征,网络里面黑色的线是全连接层,参数需要神经网络去学习。且有一个特点:DNN的输入也是embedding vector。所谓的权值共享指的就是这里。

关于DNN网络中的输入a处理方式采用前向传播,如下所示:

这里假设α(0)=(e1,e2,…em)表示 embedding层的输出,那么α(0)作为下一层 DNN隐藏层的输入,其前馈过程如下:

优点:

  1. 模型可以从最原始的特征中,同时学习低阶和高阶组合特征

  2. 不再需要人工特征工程。Wide&Deep 中低阶组合特征就是通过特征工程得到的。


3、总结(具体的对比实验和实现细节等请参阅原论文)


DeepFM优点:

  1. 没有用 FM 去预训练隐向量 Vi,并用 Vi去初始化神经网络。(相比之下 FNN 就需要预训练 FM 来初始化 DNN)。

  2. FM 模块不是独立的,是跟整个模型一起训练学习得到的。(相比之下 Wide&Deep 中的 Wide 和 Deep 部分是没有共享的)

  3. 不需要特征工程。(相比之下 Wide&Deep 中的 Wide 部分需要特征工程)

  4. 训练效率高。(相比 PNN 没有那么多参数)

其中最核心的:

  1. 没有预训练(no pre-training)

  2. 共享 Feature Embedding,没有特征工程(no feature engineering)

  3. 同时学习低阶和高阶组合特征(capture both low-high-order interaction features)

实现DeepFM的一个Demo,感兴趣的童鞋可以关注我的github







via Jesse's Blog

December 5, 2024 at 06:17PM
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant