CTR预估
CTR预估数据的特征:输入数据包括类别型和连续型数据,类别型数据在经过one-hot编码之后维度非常的高,而且非常稀疏。
CTR预估的重点在于学习组合特征(二阶,三阶甚至高阶的),高阶和低阶的组合特征都非常重要。关键问题是:如何高效的提取这些组合特征,一种就是引入领域知识人工进行特征工程,凡是弊端是高阶组合特征非常难提取,会耗费极大的人力。而且有些组合特征是隐藏在数据中的,无法进行人工提取出来;
其他方法的缺点
在DeepFm提出之前,已经有LR,FM,FFM,FNN,PNN,Wide&Deep模型,这些模型在CTR或者是推荐系统中被广泛使用;
-
LR:无法提取高阶的组合特征,表达能力受限,只能处理线性可分或者近似线性可分的问题;
-
FM:通过隐向量做内积来表示组合特征,从理论上解决了低阶和高阶组合特征提取的问题。但是实际应用中受限于计算复杂度,一般只考虑到二阶交叉特征;
-
FFM:增加了Field的概念;
深度模型的引入:使用CNN或者RNN来做CTR预估的模型 -
FNN:先使用预先训练好的FM,得到隐向量,然后作为DNN的输入来训练模型。缺点在于:受限于FM预训练的效果,只有deep部分且没有对低阶模型建模;
-
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部分的输入,依旧依赖人工特征工程。
该方法解决的问题
其他模型普遍存在两个问题:
- 偏向于提取低阶或者高阶的组合特征,不能够同时提取这两种类型的特征;
- 需要专业的领域知识来做特征工程;
DeepFM在Wide&Deep的基础上进行改进,成功的解决了这两个问题,并做了一些修改;
具体方法实现
FM Component
FM部分的输出由两部分组成,一个Addition Unit,多个内积单元
Addition Unit反应的是一阶特征,内积单元反应的是二阶的组合特征对于预测结果的影响。
输入到输出单元的部分并不是一个标量,而是一个向量,最终的维度是:field_size+embedding_size
第一项
<
w
,
x
>
<w,x>
<w,x>,w的维度就是(feature_size,1),直接把X和W做内积即可。
embedding size对应的是第二项的输出,第二项化简过后的公式:
FM Component总结:
- FM模块实现了对于1阶和二阶组合特征的建模
- 没有使用预训练
- 没有人工特征
- embedding矩阵的大小是:特征数量*嵌入维度;
需要训练的有两部分 - input_vector和Addition Unit相连的全连接层,也就是1阶的Embedding矩阵。
- Sparse Feature到Dense Embedding的Embedding矩阵,中间也是全连接的,要训练的是中间的权重矩阵,这个权重矩阵也就是隐向量V。
Deep Component
Deep Component是用来学习高阶组合特征的,网络里面黑色的先是全连接层,参数需要神经网络去学习;如果把one-hot数据直接放入到DNN中,参数非常多,没有那么多数据去训练这样一个网络,所以增加了一个embedding层,用于降低维度。
embedding层
尽管输入的长度不同,但是映射后长度都是相同的;embedding层的参数其实是全连接的weights,通过网络自己学习到的:
而且FM和Deep模块共享feature embedding的;
该方法的优点
- 不需要预训练FM得到隐向量
- 不需要人工特征工程,端到端的训练;
- 能同时学习低阶和高阶的组合特征;
- FM模块和Deep模块共享feature embedding部分,可以更快的训练,以及更精确的训练学习;相比之下,Wide&Deep输入向量中包含了大量人工设计的pairwise组合特征,增加了计算复杂度;
- 共享feature embedding使得在反向传播时,模型学习feature embedding,而feature-embedding又在前向传播时同时影响低阶和高阶特征的学习,使得学习更加的准确;