【通俗易懂】手把手带你实现DeepFM!

勘误:本文修正了原文中的两处错误。感谢群友对文中错误的指正!小编以后也会更加细心的校对文章质量

1、模型输入部分,label的shape应该是[None,1]

2、FM一次项的系数应该由feature_bias获得。

可以说,DeepFM是目前最受欢迎的CTR预估模型之一,不仅是在交流群中被大家提及最多的,同时也是在面试中最多被提及的:

1、Deepfm的原理,DeepFM是一个模型还是代表了一类模型,DeepFM对FM做了什么样的改进,FM的公式如何化简并求解梯度(滴滴)
2、FM、DeepFM介绍一下(猫眼)
3、DeepFm模型介绍一下(一点资讯)
4、DeepFM介绍下 & FM推导(一点资讯)

这次咱们一起来回顾一下DeepFM模型,以及手把手来实现一波!

1、DeepFM原理回顾

先来回顾一下DeepFM的模型结构:

DeepFM包含两部分:因子分解机部分与神经网络部分,分别负责低阶特征的提取和高阶特征的提取。这两部分共享同样的嵌入层输入。DeepFM的预测结果可以写为:

嵌入层

嵌入层(embedding layer)的结构如上图所示。通过嵌入层,尽管不同field的长度不同(不同离散变量的取值个数可能不同),但是embedding之后向量的长度均为K(我们提前设定好的embedding-size)。通过代码可以发现,在得到embedding之后,我们还将对应的特征值乘到了embedding上,这主要是由于fm部分和dnn部分共享嵌入层作为输入,而fm中的二次项如下:

FM部分

FM部分的详细结构如下:

FM部分是一个因子分解机。关于因子分解机可以参阅文章[Rendle, 2010] Steffen Rendle. Factorization machines. In ICDM, 2010.。因为引入了隐变量的原因,对于几乎不出现或者很少出现的隐变量,FM也可以很好的学习。

FM的输出公式为:

深度部分

深度部分是一个多层前馈神经网络。我们这里不再赘述。

有关模型具体如何操作,我们可以通过代码来进一步加深认识。

2、代码实现

2.1 Embedding介绍

DeepFM中,很重要的一项就是embedding操作,所以我们先来看看什么是embedding,可以简单的理解为,将一个特征转换为一个向量。在推荐系统当中,我们经常会遇到离散变量,如userid、itemid。对于离散变量,我们一般的做法是将其转换为one-hot,但对于itemid这种离散变量,转换成one-hot之后维度非常高,但里面只有一个是1,其余都为0。这种情况下,我们的通常做法就是将其转换为embedding。

embedding的过程是什么样子的呢?它其实就是一层全连接的神经网络,如下图所示:

假设一个离散变量共有5个取值,也就是说one-hot之后会变成5维,我们想将其转换为embedding表示,其实就是接入了一层全连接神经网络。由于只有一个位置是1,其余位置是0,因此得到的embedding就是与其相连的图中红线上的权重。

2.2 tf.nn.embedding_lookup函数介绍

在tf1.x中,我们使用embedding_lookup函数来实现embedding,代码如下:

# embedding
embedding = tf.constant(
        [[0.21,0.41,0.51,0.11]],
        [0.22,0.42,0.52,0.12],
        [0.23,0.43,0.53,0.13],
        [0.24,0.44,0.54,0.14]],dtype=tf.float32)


feature_batch = tf.constant([2,3,1,0])


get_embedding1 = tf.nn.embedding_lookup(embedding,feature_batch)

在embedding_lookup中,第一个参数相当于一个二维的词表,并根据第二个参数中指定的索引,去词表中寻找并返回对应的行。上面的过程为:

注意这里的维度的变化,假设我们的feature_batch 是 1维的tensor,长度为4,而embedding的长度为4,那么得到的结果是 4 * 4 的,同理,假设feature_batch是2 *4的,embedding_lookup后的结果是2 * 4 * 4。每一个索引返回embedding table中的一行,自然维度会+1。

上文说过,embedding层其实是一个全连接神经网络层,那么其过程等价于:

可以得到下面的代码:


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值