DeepFM
算法思想
初始想法
推荐系统中面对的特征往往是海量稀疏特征,如何挖掘出这些海量特征里隐含的组合特征对于改善推荐系统的效果来说非常重要。普通的线性模型时优化时是一个个特征考虑的,没有显示的考虑到组合特征。FM通过对于每一维特征的隐变量内积来提取特征组合。最终的结果也非常好。但是,虽然理论上来讲FM可以对高阶特征组合进行建模,但实际上因为计算复杂度的原因一般都只用到了二阶特征组合。那么对于高阶的特征组合来说,我们很自然的想法,通过多层的神经网络即DNN去解决。
面临的问题
在推荐系统中由于我们会把特征离散化后得到高维稀疏特征,如果直接把这些特征输入到神经网络中的话会导致参数数量爆炸,从时间空间和训练角度上来说都不可行。
解决方法
上面我们提到,在推荐系统中我们一般会对每个特征进行离散化得到这个特征的onehot编码,但是这个onehot编码的维度可能太高,我们一个很自然的想法就是对这个高维的稀疏向量进行降维得到一个低维的稠密向量:
初步模型
在上面的embedding层后面接几个全连接层提取高阶特征,最后加个输出层,我们就得到了初步的模型了
新的问题
按照上面的模型,经过几层全连接层后,输入输出层的似乎只有高阶特征。我们如果希望能同时把高阶特征和低阶特征一起输入到输出层中,应该怎么办呢?
解决办法
DeepFM详解
模型结构
DeepFM包含两部分:FM部分与DNN部分,分别负责低阶特征的提取和高阶特征的提取。这两部分共享同样的输入。DeepFM的预测结果可以写为:
细节分析
模型的DNN部分很好理解,就是embedding+几层全连接层
FM的权重该怎么求呢?我个人认为这就是DeepFM最核心的部分,DeepFM中的FM部分和DNN部分不仅共享输入而且共享隐向量部分权重,FM部分的一阶权重是独立学习的,但是FM部分的每个特征的隐向量是embedding层每个特征对应的embedding权重:
参考博客
https://www.jianshu.com/p/6f1c2643d31b