为什么深度学习模型需要加强处理特征交叉的能力?

在我们 Sparrow RecSys 项目的训练样本中其实有两个这样的特征,一个是用户喜欢的电影风格,一个是电影本身的风格,这两个特征明显具有很强的相关性。如果我们能让模型利用起这样的相关性,肯定会对最后的推荐效果有正向的影响。

既然这样,那我们不如去设计一些特定的特征交叉结构,来把这些相关性强的特征,交叉组合在一起,这就是深度学习模型要加强特征交叉能力的原因了。

善于处理特征交叉的机器学习模型 FM

因子分解机模型(Factorization Machine)了,我们可以简称它为 FM

我们看上图中模型的最下面,它的输入是由类别型特征转换成的 One-hot 向量,往上就是深度学习的常规操作,也就是把 One-hot 特征通过 Embedding 层转换成稠密 Embedding 向量。到这里,FM 跟其他深度学习模型其实并没有区别,但再往上区别就明显了。

深度学习模型和 FM 模型的结合 DeepFM

特征交叉新方法:元素积操作

NFM 的模型架构图

DeepFM 的 TensorFlow 实战

模型定义的部分

item_emb_layer = tf.keras.layers.DenseFeatures([movie_emb_col])(inputs)

user_emb_layer = tf.keras.layers.DenseFeatures([user_emb_col])(inputs)

item_genre_emb_layer = tf.keras.layers.DenseFeatures([item_genre_emb_col])(inputs)

user_genre_emb_layer = tf.keras.layers.DenseFeatures([user_genre_emb_col])(inputs)

# FM part, cross different categorical feature embeddings

product_layer_item_user = tf.keras.layers.Dot(axes=1)([item_emb_layer, user_emb_layer])

product_layer_item_genre_user_genre = tf.keras.layers.Dot(axes=1)([item_genre_emb_layer, user_genre_emb_layer])

product_layer_item_genre_user = tf.keras.layers.Dot(axes=1)([item_genre_emb_layer, user_emb_layer])

product_layer_user_genre_item = tf.keras.layers.Dot(axes=1)([item_emb_layer, user_genre_emb_layer])

# deep part, MLP to generalize all input features

deep = tf.keras.layers.DenseFeatures(deep_feature_columns)(inputs)

deep = tf.keras.layers.Dense(64, activation='relu')(deep)

deep = tf.keras.layers.Dense(64, activation='relu')(deep)

# concatenate fm part and deep part

concat_layer = tf.keras.layers.concatenate([product_layer_item_user, product_layer_item_genre_user_genre,

product_layer_item_genre_user, product_layer_user_genre_item, deep], axis=1)

output_layer = tf.keras.layers.Dense(1, activation='sigmoid')(concat_layer)

model = tf.keras.Model(inputs, output_lay)

在整个实践的过程中,有两个地方需要我们重点注意,一个是 FM 部分的构建,另一个是 FM 部分的输出和 Deep 输出的连接。

  • 无标签