1. DeepFM算法的提出
由于DeepFM算法有效的结合了因子分解机与神经网络在特征学习中的优点:同时提取到低阶组合特征与高阶组合特征,所以越来越被广泛使用。
在DeepFM中,FM算法负责对一阶特征以及由一阶特征两两组合而成的二阶特征进行特征的提取;DNN算法负责对由输入的一阶特征进行全连接等操作形成的高阶特征进行特征的提取。
具有以下特点:
- 结合了广度和深度模型的优点,联合训练FM模型和DNN模型,同时学习低阶特征组合和高阶特征组合。
 - 端到端模型,无需特征工程。
 - DeepFM 共享相同的输入和 embedding vector,训练更高效。
 - 评估模型时,用到了一个新的指标“Gini Normalization”
 
DeepFM里关于“Field”和“Feature”的理解: 可参考我的文章
其中,DeepFM的输入可由连续型变量和类别型变量共同组成,且类别型变量需要进行One-Hot编码。而正由于One-Hot编码,导致了输入特征变得高维且稀疏。
应对的措施是:针对高维稀疏的输入特征,采用Word2Vec的词嵌入(WordEmbedding)思想,把高维稀疏的向量映射到相对低维且向量元素都不为零的空间向量中。
实际上,这个过程就是FM算法中交叉项计算的过程,具体可参考我的另一篇文章:
下面,把结构图进行拆分。首先是FM部分的结构:

FM 部分的输出如下:
 
这里需要注意三点:
- 这里的wij,也就是<vi,vj>,可以理解为DeepFM结构中计算embedding vector的权矩阵(看到网上很多文章是把vi认为是embedding vector,但仔细分析代码,就会发现这种观点是不正确的)。
 - 由于输入特征one-hot编码,所以embedding vector也就是输入层到Dense Embeddings层的权重,具体可阅读我在
这里DNN的作用是构造高维特征,且有一个特点:DNN的输入也是embedding vector。所谓的权值共享指的就是这里。
关于DNN网络中的输入a处理方式采用前向传播,如下所示:

这里假设
3. DeepFM算法的Python实现
同样的,网上关于DeepFM算法实现有很多很多。需要注意的是两部分:一是训练集的构造,二是模型的设计。
3.1 训练集构造
主要是对连续型变量做正态分布等数据预处理操作、类别型变量的One-hot编码操作、统计One-hot编码后的特征数量、field_size的数量(注:原始特征数量)。
feature_value。对应的特征值,如果是离散特征的话,就是1,如果不是离散特征的话,就保留原来的特征值。

feature_index。用来记录One-hot编码后特征的序号,主要用于通过embedding_lookup选择我们的embedding。

相关代码如下:
import pandas as pd def load_data(): train_data = {} file_path = 'F:/Projects/deep_learning/DeepFM/data/tiny_train_input.csv' data = pd.read_csv(file_path, header=None) data.columns = ['c' + str(i) for i in range(data.shape[1])] label = data.c0.values label = label.reshape(len(label), 1) train_data['y_train'] = label co_feature = pd.DataFrame() ca_feature = pd.DataFrame() ca_col = [] co_col = [] feat_dict = {} cnt = 1 for i in range(1, data.shape[1]): target = data.iloc[:, i] col = target.name l = len(set(target)) # 列里面不同元素的数量 if l > 10: #
 

