ffm

1. FFM (Field Factorial Machine)

FM的出现是为了解决为了得到交叉特征信息而设计的二阶多项式模型,在二阶多项式模型中,特征组合信息是直接暴力组合在假设中的,如下式所示:

ffm_第1张图片

然而,在这样的假设中,我们如果想要得到二阶wij的值,由于交叉特征的稀疏性,并没有足够的数据进行训练,于是得到的结果非常容易过拟合。因此,为了减少参数的个数,我们可以想到用降维的性质,将每个特征针对的值进行降维,这样就引出了Factorial Machine.

在FM中,我们将组合特征参数矩阵wij分解成两个矩阵相乘,这样就可以理解为是组合变量中的两个变量的隐因子,认为将高维特征映射到低维的向量空间中,然后在低维空间中进行特征组合,这样,我们的假设如下:


ffm_第2张图片

其实看上式,我们并不能得出来fm相对于二次模型来说,减少了参数,将上式进行变换之后,我们可以得到:


ffm_第3张图片

显然,参数的个数简化为kn,在时间的代码中,也是按照化简之后的结果写代码的

ffm_第4张图片

考虑到在fm中,每次计算这个特征与其他特征的相似度的时候,对应的都是相同的组合系数,然而不同特征之间的组合系数应该是不同的,比如地域和当地人饮食习惯相关性很大,而地域和当地人的年龄分布相关性却没有那么大(这个只是举例,可能也有很大相关性),所以有了field的概念,就是说每个field不止有一组隐变量,针对别的不同的field的组合,会对应不同的隐变量。这就是FFM的引入:


ffm_第5张图片

2. wide & deep


ffm_第6张图片

3. deepFM的实现

deepFM是将两个模型进行加和,包括一个fm模型和一个DNN层:


ffm_第7张图片

在上图中,两个模型都需要对稀疏输入进行dense embedding,在两个模型中,embedding的方法都是通过fm模型的参数得到的,然后再将fm的结果和将fm进行dnn之后的结果想家,训练的时候同时训练。

实际中的代码还包括一个线性层,其实在fm的模型中本来也有线性层,但是在讲解的时候容易忽略线性层。代码中是这样的:

线性层:

ffm_第8张图片

fm层:

ffm_第9张图片

deep层:

ffm_第10张图片

参考:

1. Field-aware Factorization Machines for CTR

2. http://blog.csdn.net/u012102306/article/details/51322194

3.fm模型代码:https://github.com/Atomu2014/product-nets/blob/master/python/models.py

3. Wide & Deep Learning for Recommender Systems

4. DeepFM: A Factorization-Machine based Neural Network for CTR Prediction

5. deepfm代码:https://github.com/Leavingseason/OpenLearning4DeepRecsys/blob/master/models/deepFM.py

你可能感兴趣的:(ffm)