1. FFM (Field Factorial Machine)
FM的出现是为了解决为了得到交叉特征信息而设计的二阶多项式模型,在二阶多项式模型中,特征组合信息是直接暴力组合在假设中的,如下式所示:
然而,在这样的假设中,我们如果想要得到二阶wij的值,由于交叉特征的稀疏性,并没有足够的数据进行训练,于是得到的结果非常容易过拟合。因此,为了减少参数的个数,我们可以想到用降维的性质,将每个特征针对的值进行降维,这样就引出了Factorial Machine.
在FM中,我们将组合特征参数矩阵wij分解成两个矩阵相乘,这样就可以理解为是组合变量中的两个变量的隐因子,认为将高维特征映射到低维的向量空间中,然后在低维空间中进行特征组合,这样,我们的假设如下:
其实看上式,我们并不能得出来fm相对于二次模型来说,减少了参数,将上式进行变换之后,我们可以得到:
显然,参数的个数简化为kn,在时间的代码中,也是按照化简之后的结果写代码的
考虑到在fm中,每次计算这个特征与其他特征的相似度的时候,对应的都是相同的组合系数,然而不同特征之间的组合系数应该是不同的,比如地域和当地人饮食习惯相关性很大,而地域和当地人的年龄分布相关性却没有那么大(这个只是举例,可能也有很大相关性),所以有了field的概念,就是说每个field不止有一组隐变量,针对别的不同的field的组合,会对应不同的隐变量。这就是FFM的引入:
2. wide & deep
3. deepFM的实现
deepFM是将两个模型进行加和,包括一个fm模型和一个DNN层:
在上图中,两个模型都需要对稀疏输入进行dense embedding,在两个模型中,embedding的方法都是通过fm模型的参数得到的,然后再将fm的结果和将fm进行dnn之后的结果想家,训练的时候同时训练。
实际中的代码还包括一个线性层,其实在fm的模型中本来也有线性层,但是在讲解的时候容易忽略线性层。代码中是这样的:
线性层:
fm层:
deep层:
参考:
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