DeepFM实践

  • 场景
  • FM模型
  • DeepFM模型
  • 代码实践

场景

CTR预估是目前推荐系统的核心技术,其目标是预估用户点击推荐内容的概率,在特征工程中,二阶特征的交叉非常重要,但是人为的特征交叉及其繁琐,且需要很多领域和业务经验。FM模型具有特征自动交叉的作用,能够学到二阶特征,但是无法学习到更高阶的特征,DNN可以学习到高阶特征组合,结合FM和DNN,产生了DeepFM模型。本文简单的介绍了FM模型和DeepFM模型,并给出了一些代码案例。

FM模型

作用:将特征向量化后,利用特征向量的点积作为交叉项的权重,从而进行自动二阶交叉。
优点:泛化能力强,尤其是大规模稀疏特征场景,对于没有同时出现的特征交叉也可以学到权重。

本质上,MF模型是FM模型的特例,MF可以被认为是只有User ID 和Item ID这两个特征Fields的FM模型,MF将这两类特征通过矩阵分解,来达到将这两类特征embedding化表达的目的。而FM则可以看作是MF模型的进一步拓展,除了User ID和Item ID这两类特征外,很多其它类型的特征,都可以进一步融入FM模型里,它将所有这些特征转化为embedding低维向量表达,并计算任意两个特征embedding的内积,就是特征组合的权重

算法效率:
从FM的原始数学公式看,因为在进行二阶(2-order)特征组合的时候,假设有n个不同的特征,那么二阶特征组合意味着任意两个特征都要进行交叉组合,所以可以直接推论得出:FM的时间复杂度是n的平方。
二阶特征交叉公式改写后,复杂度为:kn

DeepFM模型

DeepFM模型包含FM和DNN两部分,FM模型可以抽取low-order特征,DNN可以抽取high-order特征。无需Wide&Deep模型人工特征工程

代码实践

特征分为两种:
onehot特征:用户属性,歌曲属性等
连续特征:用户在不通类目下的偏好,歌曲转化率等。
FM部分输入:onehot特征
DNN部分数据:concat (onehot+dense)
输入:feat_index (B x F) feat_value (B x F)
embedding 层, 对每个特征映射到k维度的embedding向量: B X F X K

 # model
self.embeddings = tf.nn.embedding_lookup(self.weights["feature_embeddings"], self.feat_index)
feat_value = tf.reshape(self.feat_value, shape=[-1, self.field_size, 1])
self.embeddings = tf.multiply(self.embeddings, feat_value)

FM计算模块,一阶项和二阶交叉项


# ---------- first order term ----------
self.y_first_order = tf.nn.embedding_lookup(self.weights["feature_bias"], self.feat_index) # None * F * 1
self.y_first_order = tf.reduce_sum(tf.multiply(self.y_first_order, feat_value), 2)  # None * F
self.y_first_order = tf.nn.dropout(self.y_first_order, self.dropout_keep_fm[0]) # None * F# ---------- second order term ---------------# sum_square part
self.summed_features_emb = tf.reduce_sum(self.embeddings, 1)  # None * K
self.summed_features_emb_square = tf.square(self.summed_features_emb)  # None * K# square_sum part
self.squared_features_emb = tf.square(self.embeddings)
self.squared_sum_features_emb = tf.reduce_sum(self.squared_features_emb, 1)  # None * K# second order
self.y_second_order = 0.5 * tf.subtract(self.summed_features_emb_square, self.squared_sum_features_emb)  # None * K
self.y_second_order = tf.nn.dropout(self.y_second_order, self.dropout_keep_fm[1])  # None * K

Deep项

# ---------- Deep component ----------
self.y_deep = tf.reshape(self.embeddings, shape=[-1, self.field_size * self.embedding_size]) # None * (F*K)
self.y_deep = tf.nn.dropout(self.y_deep, self.dropout_keep_deep[0])
for i in range(0, len(self.deep_layers)):self.y_deep = tf.add(tf.matmul(self.y_deep, self.weights["layer_%d" %i]), self.weights["bias_%d"%i]) # None * layer[i] * 1if self.batch_norm:self.y_deep = self.batch_norm_layer(self.y_deep, train_phase=self.train_phase, scope_bn="bn_%d" %i) # None * layer[i] * 1self.y_deep = self.deep_layers_activation(self.y_deep)self.y_deep = tf.nn.dropout(self.y_deep, self.dropout_keep_deep[1+i]) # dropout at each Deep layer

最后将Deep层和FM层的输出concat到一起,经过一层隐层+sigmod输出

# ---------- DeepFM ----------
if self.use_fm and self.use_deep:concat_input = tf.concat([self.y_first_order, self.y_second_order, self.y_deep], axis=1)
elif self.use_fm:concat_input = tf.concat([self.y_first_order, self.y_second_order], axis=1)
elif self.use_deep:concat_input = self.y_deep
self.out = tf.add(tf.matmul(concat_input, self.weights["concat_projection"]), self.weights["concat_bias"])
self.out = tf.nn.sigmoid(self.out)
self.loss = tf.losses.log_loss(self.label, self.out)

DeepFM模型介绍相关推荐

  1. CTR深度学习模型之 DeepFM 模型解读

    CTR 系列文章: 广告点击率(CTR)预测经典模型 GBDT + LR 理解与实践(附数据 + 代码) CTR经典模型串讲:FM / FFM / 双线性 FFM 相关推导与理解 CTR深度学习模型之 ...

  2. 推荐算法DeepFM原理介绍及tensorflow代码实现

    DeepFM 目标: 产生背景: 模型介绍: 善于处理特征交叉的机器学习模型 FM 如何优化FM的计算效率 深度学习模型和 FM 模型的结合 DeepFM 特征交叉新方法:元素积操作 技巧: 代码部分 ...

  3. 【推荐系统】DeepFM模型分析

    目录 一.原理 二.pytorch代码分析 1.数据准备 2.构建模型 2.1.FM模型 2.2.DNN模型 2.3.DeepFM模型 三.代码讲解 & 连接 emb层收敛速度慢的原因 1.输 ...

  4. 自然语言处理中N-Gram模型介绍

    转载一下,这文章写的真好! 自然语言处理中N-Gram模型介绍 - 知乎 容易看懂,. 也是解决了,好奇为什么不用3. 因为,如果使用3的话.那么数量就会大的吓人!

  5. 高速串行总线的设计基础(一)同步时序模型介绍

    文章目录 前言 芯片间通信的时序模型 系统同步 源同步 自同步 并串转换 串并转换 时钟/数据恢复 参考文章 前言 高速信号设计涉及到方方面面的知识积累,也许TOC你认为即使没有掌握甚至没有听过一些高 ...

  6. 数据库系统概念总结:第二章 关系模型介绍

    周末无事水文章,期末备考的总结资料 第二章 关系模型介绍 2.1 关系数据的结构 关系数据库由表(table)组成,每个表有唯一的名字.一般来说,表中一行代表了一组值之间的一种联系 表中一行代表了一组 ...

  7. 5种网络IO模型介绍

    5种网络IO模型介绍 IO 模型分为以下几种: 阻塞IO 非阻塞IO 信号驱动IO IO多路复用 异步IO 前四个为同步IO 1 阻塞IO 一个IO操作需要两步: 等待数据和拷贝数据. blockin ...

  8. 经典Wide Deep模型介绍及tensorflow 2代码实现

    Wide & Deep模型介绍 目标: 内容: 一. 模型介绍 二. 推荐系统架构 三. Wide部分 四. Deep部分 五. Wide和Deep一起训练 六. 系统实现 (1)数据生成阶段 ...

  9. 学习笔记(36):Python网络编程并发编程-IO模型介绍

    立即学习:https://edu.csdn.net/course/play/24458/296460?utm_source=blogtoedu I/O模型介绍:I/O模型表示处于等待状态的模型,如套接 ...

最新文章

  1. 用yum源配合源码包安装openresty、mariadb、php7服务
  2. eclipse配置java环境_Java工作环境的配置与Eclipse的安装过程
  3. [转载] java给对象中的包装类设置默认值
  4. Linux环境SOCKET编程1:套接字
  5. html判断文本框和按钮,css样式之区分input是按钮还是文本框的方法
  6. Sqlite 对数据进行增删改查
  7. 均方根误差,平均绝对误差,均方误差,标准差计算方法
  8. 普乐郡——回乐县(城市记忆7)
  9. sqoop导数到各个数据库,可以套用
  10. 腾讯云图-一次性加载全部数据
  11. 基于单片机HCSR501人体感应智能台灯设计(毕设课设)
  12. mysql 排序序列_Mysql序列(八)—— group by排序问题 怀瑾握瑜XI
  13. rk3399 rv1126上使用wk2124
  14. CSDN博客添加加QQ好友按钮
  15. mysql 1004_mysql授权问题:1004 Access denied for user '用户名'@'%' to database
  16. 数据结构——链表经典OJ题题解
  17. python逻辑运算符优先级
  18. Windows7跳过系统密码的详细操作
  19. 反转每对括号间的子串 c语言,1190. 反转每对括号间的子串
  20. 云服务器上能运行虚拟机吗,云服务器上能运行虚拟机吗

热门文章

  1. 微服务学习之Nacos(服务注册与发现)
  2. 基于网络营销的中小企业品牌建设探析
  3. Python常用30个小技巧分享
  4. IDEA常用场景搜索快捷键(当前类、当前项目、全局)
  5. 非线性最小二乘问题的高斯-牛顿算法
  6. MATLAB报错:未定义函数或变量解决办法
  7. 旁路缓存(Cache-aside)
  8. Java实现QQ仿写(一)
  9. python子类调用父类的方法
  10. android recovery设置selinux为permissive