《深度学习推荐系统实战》 学习笔记 3月Day 26

511 阅读3分钟

20 | DeepFM:如何让你的模型更好地处理特征交叉?

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

曾经红极一时的机器学习模型因子分解机模型(Factorization Machine)了,我们可以简称它为 FM。

image.png
介绍了FM模型中的FM层在处理特征交叉问题上的独特优势,相比于其他深度学习模型,FM层通过多个内积操作单元对不同特征向量进行两两组合,从而充分组合不同特征,提高了模型效率和精度。与Embedding MLP模型不同,FM层避免了MLP内部进行低效交叉的问题。

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

学习过 Wide&Deep 结构之后,我们一定可以快速给出答案,我们当然可以把 FM 跟其他深度学习模型组合起来,生成一个全新的既有强特征组合能力,又有强拟合能力的模型。基于这样的思想,DeepFM 模型就诞生了。

image.png

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

image.png

image.png

DeepFM 的 TensorFlow 实战

接下来,又到了 TensorFlow 实践的时间了,今天我们将要实现 DeepFM 模型。有了之前实现 Wide&Deep 模型的经验,我想你实现起 DeepFM 也不会困难。跟前几节课一样,实践过程中的特征处理、模型训练评估的部分都是相同的,我也就不再重复了,我们重点看模型定义的部分。我把这部分的代码也放在了下面,你可以结合它来看我的讲解。

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 输出的连接。在构建 FM 部分的时候,我们先为 FM 部分选择了 4 个用于交叉的类别型特征,分别是用户 ID、电影 ID、用户喜欢的风格和电影自己的风格。接着,我们使用 Dot layer 把用户特征和电影特征两两交叉,这就完成了 FM 部分的构建。而 Deep 部分的实现,其实和我们之前实现过的 Wide&Deep 模型的 Deep 部分完全一样。只不过,最终我们会使用 concatenate 层,去把 FM 部分的输出和 Deep 部分的输出连接起来,输入到输出层的 sigmoid 神经元,从而产生最终的预估分数。那关于 DeepFM 的全部代码,你可以参照 SparrowRecsys 项目中的 DeepFM.py 文件。

小结

DeepFM 模型在解决特征交叉问题上非常有优势,它会使用一个独特的 FM 层来专门处理特征之间的交叉问题。具体来说,就是使用点积、元素积等操作让不同特征之间进行两两组合,再把组合后的结果输入的输出神经元中,这会大大加强模型特征组合的能力。因此,DeepFM 模型相比于 Embedding MLP、Wide&Deep 等模型,往往具有更好的推荐效果。实现 DeepFM 模型的过程并不困难,我们主要记住三点就可以了:它是由 FM 和 Deep 两部分组成的;在实现 FM 部分特征交叉层的时候,我们使用了多个 Dot Product 操作单元完成不同特征的两两交叉;Deep 部分则与 Wide&Deep 模型一样,负责所有输入特征的深度拟合,提高模型整体的表达能力刚才说的重点知识,我都整理在了下面的表格中,你可以看一看。此文章为3月Day25学习笔记,内容来源于极客时间《深度学习推荐系统实战》,强烈推荐该课程!