目录
3 xDeepFM
3.1 xDeepFM原理
3.2 特征交叉结构CIN
3.2.1 field-wise交叉
3.2.2 交叉组合压缩
3.3 CIN特点
3.3.1 特征显式高阶自动交叉
3.3.2 网络复杂度
3.3.2.1 空间复杂度
3.3.2.2 时间复杂度
3.3.3 CIN和其它特征交叉结构的关联
3.3.3.1 CIN和CN
3.3.3.2 CIN和FM
3.3.4 优缺点
3.4 CIN代码实现
相关面试问题
3 xDeepFM
xDeepFM[3]出自论文《xDeepFM: Combining Explicit and Implicit Feature Interactions for Recommender Systems》,由中科大、北大与微软合作发表在 KDD2018。xDeepFM虽然名字看起来很像DeepFM,但其模型结构和设计思路更接近DCN系列,通过特征交叉网络的设计,实现field-wise的显式高阶特征交叉,充分考虑了特征field的信息,弥补了DCN和DCN-V2进行bit-wise特征交叉时对field信息的丢失,从而实现更有效的特征交叉。
3.1 xDeepFM原理
xDeepFM的网络结构框架保持了DCN系列模型的特点:包括特征交叉部分和DNN部分,如图8所示,其特征交叉部分为CIN(Compressed Interaction Network)结构。不同于DCN模型,其特征交叉结构第L层的输出包含了从1阶到L+1阶的所有交叉组合项,因此可直接将特征交叉部分最后一层输出作为特征交叉结果;xDeepFM的特征交叉结构CIN第L层的输出结果只包含L+1阶的交叉组合项,因此需将CIN的每一层输出concat,再和线性部分和DNN输出结合,送入输出层得到结果。

图8 xDeepFM模型结构
3.2 特征交叉结构CIN
xDeepFM的特征交叉,是对输入特征进行field和field的两两组合,实现field-wise的交叉,再将两两组合的结果压缩到指定的filed个数。图9表示了特征交叉结构CIN的框架,每层操作得到对应阶数的交叉特征

图9 CIN结构
CIN每层所做的操作包括两部分:(1) 特征进行field-wise交叉,即在filed之间两两交叉组合,(2) 通过矩阵对两两交叉组合结果进行线性加权,把输出压缩到指定field个数的特征表征,如式子(10)和图10所示。
3.2.1 field-wise交叉
3.2.2 交叉组合压缩
field之间的两两交叉组合结果
图10表示了对两两交叉组合结果(

图10 CIN单层操作
3.3 CIN特点
CIN的设计思路和DCN中特征交叉结构(CN)的设计的类似,因此具有DCN的特点:(1) 实现了显式高阶特征自动交叉,(2) 特征交叉阶数由网络深度决定。
3.3.1 特征显式高阶自动交叉
CIN的输出包括了从2阶到L+1阶的所有交叉组合,也可以从归纳法理解。
3.3.2 网络复杂度
3.3.2.1 空间复杂度
从CIN的结构可以看出,每层的参数参数量由
对于权重矩阵
3.3.2.2 时间复杂度
CIN每层的操作包括两部分:(1) field两两组合,进行哈达玛乘积操作,(2) 两两组合结果线性加权。每两个field之间的哈达玛积操作时间复杂度为D,一共有
3.3.3 CIN和其它特征交叉结构的关联
3.3.3.1 CIN和CN
CIN和CN的设计出发点类似,通过每层得到更高阶的交叉特征。不同的是,(1) CN是bit-wise,CIN是field-wise的;(2) CIN在
3.3.3.2 CIN和FM
乍看CIN和FM没有太多相似点,但从两者的原理可以发现,CIN是进阶版的FM,模型名eXtreme Deep Factorization Machine(xDeepF)也侧面反应了两者的关联。
FM结构是对每种交叉组合中的两个field向量进行内积操作,即哈达玛积操作后sum pooling,得到每种组合的标量表征,最后再对所有组合求和。FM中内积操作可以理解为CIN中将
3.3.4 优缺点
了解了CIN的特点后,xDeepFM的优缺点则很明显。
其优点包括:(1) 模型可实现特征的显式高阶自动交叉;(2) 实现了field-wise的特征交叉,充分考虑特征在同一个field中的信息
xDeepFM的缺点也很明显,CIN的时间复杂度高,在模型线上推理时耗时多,可能会导致线上服务超时问题。
3.4 CIN代码实现
对CIN的原理理解清楚后,其代码实现也很简单。
代码5 xDeepFM特征交叉结构CIN代码实现
def xdeepfm_cin(params, input_layer, mode, layer_dropout=1):'''cross feature module: CINReference: KDD2018, xDeepFM: Combining Explicit and Implicit Feature Interactions for Recommender Systemsparams: the model config paramsinput_layer: [B, F, D]'''layer_name = 'cross_layers_cin'field_size = input_layer.shape[1].value # return the F number input_layer [B, F, D]field_dim = input_layer.shape[2].value # the embedding size of each domain, in this model, the size of all fields is sameoutput_size = params.cross_layers['out_dim']layer_num = params.cross_layers['layer_num']kernel_initializer = tf.glorot_uniform_initializer()embedding_layer_0 = tf.transpose(input_layer, [0, 2, 1]) # [B, D, F]embedding_layer_extend_0 = tf.expand_dims(embedding_layer_0, axis=3) # [B, D, F, 1]embedding_layer_l = embedding_layer_0 # [B, D, F]embedding_layer_out = []for i in range(layer_num):index = i + 1embedding_layer_extend_l = tf.expand_dims(embedding_layer_l, axis=2) # [B, D, 1, F]kernel = tf.get_variable(name="{0}_kernel_{1}".format(layer_name, index),shape=[field_dim, field_dim, field_dim],dtype=tf.float32,initializer=kernel_initializer,) # [F, F, F]embedding_layer_m_0_l = tf.multiply(embedding_layer_extend_0, # [B, D, F, 1]embedding_layer_extend_l, # [B, D, 1, F]name="{0}_m_0_l_{1}".format(layer_name, index),) # [B, D, F, F]embedding_layer_l = tf.tensordot(embedding_layer_m_0_l, # [B, D, F, F]kernel, # [F, F, F]axes=([2, 3], [1, 0]),name="{0}_m_0_l_w_{1}".format(layer_name, index),) # [B, D, F]if layer_dropout < 1.0:embedding_layer_l = tf.layers.dropout(embedding_layer_l, rate=(1 - layer_dropout),training=(mode == tf.estimator.ModeKeys.TRAIN),name="{0}_layer_{1}_dropout".format(layer_name, index),)# sum at D-axisembedding_layer_out.append(tf.reduce_sum(embedding_layer_l, axis=1, keepdims=False)) # layer_num * [B, F]# all rank cross feature concatembedding_layer_l = tf.concat(embedding_layer_out, axis=1) # [B, layer_num*F]# 可按实际情况是否线性变换output_w = tf.get_variable("{0}_output_w".format(layer_name),shape=[field_size * field_dim, output_size],dtype=tf.float32,initializer=kernel_initializer,)output_layer = tf.matmul(embedding_layer_l, output_w, name="{0}_output".format(layer_name)) # [B, Output]return output_layer
相关面试问题
xDeepFM的网络结构
CIN结构、原理、参数量
CIN的优缺点,和DCN、FM的关联和区别
reference
[3] xDeepFM: Combining Explicit and Implicit Feature Interactions for Recommender Systems。https://arxiv.org/pdf/1803.05170.pdf
下一篇将总结特征交叉的系列模型,后续将陆续分享多目标、激活函数等。
以及朋友们有什么想要一起探讨的,可以在评论区告诉我,共同学习一起进步呀~
推荐系列文章:
- 推荐模型结构-特征交叉
- 基础知识类
- 工具类
微信最近对公众号的推送算法改版较大,为了更好地找到我,动动手对这个公众号置顶呀~
公众号的内容会同时在知乎专栏更新,有兴趣的朋友可以在知乎找我玩(知乎账号:婷播播),知乎专栏:推荐学习笔记。
生活的思考和记录会在另一个公众号更新,有兴趣的朋友也可以动手关注一下




