自动特征交叉模型包括:FM系列(FM、FFM、AFM)、Embedding MLP(FNN、PNN、NFM、ONN)、双路并行(Wide&Deep、DeepFM、DCN、xDeepFM、AutoINT)
FM系列(FM、FFM、AFM)
FM
- 原理
将特征映射为K维向量,然后两两组合,旨在解决稀疏数据下的特征组合问题。
两两特征组合的方式最简单的方式为多项式组合,在数据稀疏的情况下,使用多项式组合预估的准确性会大大降低,FM提出一种先将特征映射为K维向量,然后两两组合的方式,由于学习到的参数更多,会提高预估的准确性。
- 公式
- 损失函数
(交叉熵损失函数)
- 使用细节
(同LR)
- 实现方法
def model_fn(features, labels, mode, params):
"""
FM model
"""
feature_columns = build_features()
input = tf.feature_column.input_layer(features, feature_columns)
input_dim = input.get_shape().as_list()[-1]
with tf.variable_scope('linear'):
init = tf.random_normal(shape=(input_dim, 1))
w = tf.get_variable('w', dtype=tf.float32, initializer=init, validate_shape=False)
b = tf.get_variable('b', shape=[1], dtype=tf.float32)
linear_term = tf.add(tf.matmul(input, w), b)
with tf.variable_scope('fm_interaction'):
init = tf.truncated_normal(shape=(input_dim, params['factor_dim']))
v = tf.get_variable('v', dtype=tf.float32, initializer=init, validate_shape=False)
sum_square = tf.pow(tf.matmul(input, v), 2)
square_sum = tf.matmul(tf.pow(input, 2), tf.pow(v, 2))
interaction_term = 0.5 * tf.reduce_sum(sum_square - square_sum, axis=1, keep_dims=True)
with tf.variable_scope('output'):
y = tf.math.add(interaction_term, linear_term)
return y
- 论文
Fast context-aware recommendations with factorization machines
- 相关文章
张俊林:推荐系统召回四模型之:全能的FM模型
FFM
- 原理
将特征映射为(Field*K),然后对特征进行两两组合,FFM认为一个特征和其他特征进行组合时,对不同特征应该对应个不同的向量。
- 公式
- 损失函数
(交叉熵损失函数)
- 使用细节
(同LR)
- 实现方法
def model_fn(features, labels, mode, params):
"""
FFM model
"""
feature_columns, field_dict = build_features()
field_dim = len(np.unique(list(field_dict.values())))
input = tf.feature_column.input_layer(features, feature_columns)
input_dim = input.get_shape().as_list()[-1]
with tf.variable_scope('linear'):
linear_term = tf.layers.dense(input, units=1)
with tf.variable_scope('field_aware_interaction'):
init = tf.truncated_normal(shape=(input_dim, field_dim, params['factor_dim']))
v = tf.get_variable('v', dtype=tf.float32, initializer=init, validate_shape=False)
interaction_term = tf.constant(0, dtype=tf.float32)
for i in range(input_dim):
for j in range(i 1, input_dim):
interaction_term = tf.multiply(
tf.reduce_mean(tf.multiply(v[i, field_dict[j], :], v[j, field_dict[i], :])),
tf.multiply(input[:, i], input[:, j])
)
interaction_term = tf.reshape(interaction_term, [-1, 1])
with tf.variable_scope('output'):
y = tf.math.add(interaction_term, linear_term)
return y
- 论文
- 相关文章
张俊林:推荐系统召回四模型之二:沉重的FFM模型
AFM
- 原理
FM会让一个特征固定一个特定的向量,当这个特征与其他特征做交叉时,都是用同样的向量去做计算。这个是很不合理的,因为不同的特征之间的交叉,重要程度是不一样的。如何体现这种重要程度,之前介绍的FFM模型是一个方案。另外,结合了attention机制的AFM模型,也是一种解决方案。
- 公式
- 损失函数
(交叉熵损失函数)
- 使用细节
(同LR)
- 实现方法
- 论文
《Attentional Factorization Machines: Learning the Weight of Feature Interactions via Attention Networks》
- 相关文章
梁勇:推荐系统遇上深度学习(八)--AFM模型理论和实践
Embedding MLP(FNN、PNN、NFM、ONN)
FNN
- 原理
FNN是2016年提出的一种基于FM预训练Embedding的NN模型,其思路也比较简单;FM本身具备学习特征Embedding的能力,DNN具备高阶特征交叉的能力,因此将两者结合是很直接的思路。FM预训练的Embedding可以看做是“先验专家知识”,直接将专家知识输入NN来进行学习。注意,FNN本质上也是两阶段的模型,与Facebook在2014年提出GBDT LR模型在思想上一脉相承。
- 公式
FM MLP
- 损失函数
(交叉熵损失函数)
- 使用细节
(同LR)
- 实现方法
- 论文
- 相关文章
PNN
- 原理
PNN是2016年提出的一种在NN中引入Product Layer的模型,其本质上和FNN类似,都属于Embedding MLP结构。作者认为,在DNN中特征Embedding通过简单的concat或者add都不足以学习到特征之间复杂的依赖信息,因此PNN通过引入Product Layer来进行更复杂和充分的特征交叉关系的学习。PNN主要包含了IPNN和OPNN两种结构,分别对应特征之间Inner Product的交叉计算和Outer Product的交叉计算方式。
- 公式
product layer 中每个节点是两两Field的embedding对应的“product”结果,而非所有Field的。根据 product 函数的不同选择,PNN也有不同实现,这里的想象空间就很多了。文中尝试了相对常见的向量内积(inner product)和外积(outer product),对应 IPNN 和OPNN。
编辑切换为居中
添加图片注释,不超过 140 字(可选)
- 损失函数
- 使用细节
- 实现方法
- 论文
NFM
- 原理
特征交叉方式:NFM将PNN的Product Layer替换成了Bi-interaction Pooling结构来进行特征交叉的学习。
- 公式
Bi-interaction Pooling:
编辑
添加图片注释,不超过 140 字(可选)
编辑
添加图片注释,不超过 140 字(可选)
- 损失函数
- 使用细节
- 实现方法
- 论文
ONN
- 原理
ONN是2019年发表的CTR预估,我们知道PNN通过引入不同的Product操作来进行特征交叉,ONN认为针对不同的特征交叉操作,应该用不同的Embedding,如果用同样的Embedding,那么各个不同操作之间就会互相影响而最终限制了模型的表达。
- 公式
编辑切换为居中
添加图片注释,不超过 140 字(可选)
- 损失函数
- 使用细节
- 实现方法
- 论文
Wide&Deep
- 原理
Wide And Deep是2016年Google提出的用于Google Play app推荐业务的一种算法。其核心思想是通过结合Wide线性模型的记忆性(memorization)和Deep深度模型的泛化性(generalization)来对用户行为信息进行学习建模。
- 公式
编辑切换为居中
添加图片注释,不超过 140 字(可选)
- 损失函数
- 使用细节
- 实现方法
- 论文
DeepFM
- 原理
我们知道FM只能够去显式地捕捉二阶交叉信息,而对于高阶的特征组合却无能为力。DeepFM就是在FM模型的基础上,增加DNN部分,进而提高模型对于高阶组合特征的信息提取。DeepFM能够做到端到端的、自动的进行高阶特征组合,并且不需要人工干预。
编辑切换为居中
添加图片注释,不超过 140 字(可选)
- 公式
- 损失函数
- 使用细节
- 实现方法
- 论文
DCN
- 原理
特征交叉方式:Deep&Cross其实也属于双路并行的模型结构,只不过提出了一种新的模型叫做Cross Net来替代DeepFM中的FM部分。DNN本身虽然具备高阶交叉特征的学习能力,但其对于特征交叉的学习是隐式的、高度非线性的一种方式,因此作者提出了Cross Net,它可以显式地进行特征的高阶交叉,CrossNet相比于DNN的优势主要在于:
公式:
编辑切换为居中
添加图片注释,不超过 140 字(可选)
- 公式
- 损失函数
- 使用细节
- 实现方法
- 论文
xDeepFM
- 原理
xDeepFM全称为eXtreme Deep Factorization Machine,可以看出其是在DeepFM基础上进行了改进。xDeepFM的贡献主要在于提出了压缩交互网络(Compressed Interaction Network),与DCN相同的是,都提出了要cross feature explicitly;但不同的是,DCN中的特征交叉是element- wise的,而CIN中的特征交叉是vector-wise的。
- 公式
编辑切换为居中
添加图片注释,不超过 140 字(可选)
- 损失函数
- 使用细节
- 实现方法
- 论文
AutoINT
- 原理
将self_attention机制引入到推荐场景中。
- 公式
编辑切换为居中
添加图片注释,不超过 140 字(可选)
编辑切换为居中
添加图片注释,不超过 140 字(可选)
- 损失函数
- 使用细节
- 实现方法
- 论文
参考文献:
深入FFM原理与实践
万字长文梳理CTR预估模型发展过程与关系图谱
https://www.bookstack.cn/read/huaxiaozhuan-ai/README.md
阿里妈妈技术:WSDM 2022 | 点击率模型特征交叉方向的发展及CAN模型介绍