计算广告CTR预估系列(二)--DeepFM实践
本文是计算广告CTR预估系列的第二篇文章,上一篇计算广告CTR预估系列(一)—DeepFM理论侧重理论,本文侧重实践。两者一起食用,疗效最好!
认证阅读完这两篇DeepFM的文章,对该模型应该有比较深入的理解了。
预告:计算广告CTR预估系列(三)—FFM理论与实践。敬请期待…
0. 变量说明
为了方便后面的阅读,我们先说明一下各个名称的含义:
field_size: 输入X在进行one-hot之前的特征维度
feature_size: 输入X在one-hot之后的特征维度, 又记作 n
embedding_size: one-hot后的输入,进行嵌入后的维度,又记作 k
代码中tf中维度None表示任意维度,我们用来表示输入样本的数量这一维度。
1. 架构图与公式
1.1 架构图
让我们来先回顾一下架构图和公式:
架构图包含两部分:FM Component和Deep Component。
其中FM部分用于对1维特征和2维组合特征进行建模;Deep部分用于对高维组合特征进行建模。
1.2 公式
1.2.1 公式参考
DeepFM最后输出公式为:
其中FM部分贡献为:
需要注意的点:
这里省去了原始FM中的常数项,为了方便。
这里的x可以认为是一个样本,d是one-hot之后的总维度,也就是feature_size. 在原始FM论文中对应n参数。
Deep部分贡献为:
这个很好理解,就是神经网络的输出而已,就不再给公式了。
FM论文中原始公式,方便对比参考:
二阶项的化简结果:
1.2.2 FM Component维度问题
这里比较重要:因为关系到代码里面怎么写,下面分别解释:
先看FM-1次项:
首先,我们看到一次项是求和了的。但是在实际代码中,我们并没有对一次项求和。而是输出一个维度为k的向量,这里的k就是embedding_size。
为什么要这么做那?我个人的感觉是:提高最后模型的学习效果。
最后神经网络的输出其实可以看做是logistic regression。它的输入由三部分组成:FM-1维,FM-二维,Deep部分。 自然而然,我们不希望FM-1维只是一个标量,一个数吧。这显然不利于LR模型的学习,那么如果用原始的维度那:公式里是Wi * Xi,Xi的维度是n,n是one-hot之后的维度,这个维度太大了以至于我们才想出了各种办法来解决这个问题,用n显然不行。所以,就用field_size。从逻辑上来说,也是对one-hot之前每个特征维度的一种建模。
再看FM-2维组合特征部分:
在上一小节中,我们看到了FM二阶项的化简结果。最外层是在Embeeding_size上的求和。不做这个求和,而是得到一个embedding_size维度的向量,就是送到最后输出单元的FM的二阶部分。
原因我想跟上面FM-1维的是一样的,求和之后就变成了一个标量,显然不利于后面的学习。
这两部分理解了之后,让我们来看下代码吧!
2. 核心代码拆解
2.1 输入
注意下各个输入变量的维度大小就可以了,没什么特别需要说明的。None在tf里面表示任意维度,此处表示样本数量维度。
2.2 Embedding
重点来了,这里是完成到的转换。
2.3 FM Component - 1维特征
1维特征本来是求和得到一个标量的,为了提高学习效果,我们改为不求和,得到一个field_size维度的向量。相当于是进行了一次k=1的一次embedding。
得到W之后,和输入X相乘,并缩减维度,得到最终FM-1维的输出:
2.4 FM Component - 2维组合特征
在第一节中,我们给出了FM-2维组合特征的化简公式。发现计算的两部分都需要计算vi * xi。所以我们先把这一部分计算出来:
然后分别计算这两部分:
最后得到最终FM-2维组合特征输出结果,维度为embedding_size:
2.5 Deep Component
网络部分比较简单,只要一层一层的前向传递就可以了。只有一个问题需要说明:
网络部分,第一个隐藏层的输入是什么?
我的感觉应该是原始输入嵌入后的结果:
2.6 输出
把前面FM Component和Deep Component的两部分结合起来,就得到了最后输出单元的输入,经过sigmoid函数激活就可以得到最终结果了。
3. 完整代码:
这份代码最主要的目的是学习,直接应用于工程的话还需要做一些优化。比如batch normalization、stack train、batch train以及代码重构等。
本代码可以帮助你快速实验,实现DeepFM,掌握其原理。
另外,可直接运行。
本来是想给出完整代码的,但是贴出来发现太占篇幅,而且手机阅读起来也不是很方便。所以,给出地址好了:
github地址—欢迎follow/star/contribute
另外,附上一份整理的 DeepFM架构图-实现篇 的图。主要是帮助大家理解各个参数的维度、权重weights的维度、需要学习的维度、FM Deep两部分输出的维度。 要想实现DeepFM,只要把每一部分的维度搞清楚,网络的架构搞清楚就问题不大了。
图片看不清的话,去上面github的地址里面取吧。
Reference
获取更多机器学习干货、荐货,欢迎关注机器学习荐货情报局,加入荐货大家庭!