热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

CTR预估模型——FM、FFM、DeepFM

一、CTR(ClickThroughRate,点击率)点击率(click-throughrate,CTR)是点击特定链接的用户与查看页面,电子邮件或广告的总用户数量之比。它通常用于

一、CTR(Click Through Rate,点击率)

  点击率(click-through rate, CTR) 是点击特定链接的用户与查看页面,电子邮件或广告的总用户数量之比。它通常用于衡量某个网站的在线广告活动是否成功,以及电子邮件活动的有效性,是互联网公司进行流量分配的核心依据之一。

技术分享图片

  第一列Clicked是类别标记,标记用户是否点击了该广告,而其余列则是特征(这里的三个特征都是类别类型),一般的,我们会对数据进行One-hot编码将类别特征转化为数值特征,转化后数据如下:

技术分享图片

  经过One-hot编码后,特征空间是十分稀疏的。特别的,某类别特征有m种不同的取值,则one-hot编码后就会被变为m维,当类别特征越多、类别特征的取值越多,其特征空间就更加稀疏。

  同时通过观察大量的样本数据可以发现,某些特征经过关联之后,与label之间的相关性就会提高。例如,“USA”与“Thanksgiving”、“China”与“Chinese New Year”这样的关联特征,对用户的点击有着正向的影响。换句话说,来自“China”的用户很可能会在“Chinese New Year”有大量的浏览、购买行为,而在“Thanksgiving”却不会有特别的消费行为。这种关联特征与label的正向相关性在实际问题中是普遍存在的,如“化妆品”类商品与“女”性,“球类运动配件”的商品与“男”性,“电影票”的商品与“电影”品类偏好等。因此,引入两个特征的组合是非常有意义的。

  如何表示两个特征的组合呢?一种直接的方法就是采用多项式模型来表示两个特征的组合,技术分享图片

  回想矩阵分解,一个rating可以分解为user矩阵和item矩阵,如下图所示:

技术分享图片

  分解后得到user和item矩阵的维度分别为技术分享图片

  对于上面的训练集,没有(NBC,Adidas)组合,因此,Poly2模型就无法学习到参数技术分享图片

  对于第一条数据来说,FM模型的二次项为:技术分享图片


  • For FMs, each feature has one latent vector, which is used to interact with any other latent vectors:

技术分享图片


  • For FFMs, each feature has several latent vectors, one of them is used depending on the field of the other feature:

技术分享图片

3.1 FFM 数学公式

  因此,FFM的数学公式表示为:

技术分享图片

3.3 FFM使用技巧

  在FFM原论文中,作者指出,FFM模型对于one-hot后类别特征十分有效,但是如果数据不够稀疏,可能相比其它模型提升没有稀疏的时候那么大,此外,对于数值型的数据效果不是特别的好。在Github上有FFM的开源实现,要使用FFM模型,特征需要转化为“field_id:feature_id:value”格式,相比LibSVM的格式多了field_id,即特征所属的field的编号,feature_id是特征编号,value为特征的值。

  此外,美团点评的文章中,提到了训练FFM时的一些注意事项:




    • 样本归一化。FFM默认是进行样本数据的归一化的 。若不进行归一化,很容易造成数据inf溢出,进而引起梯度计算的nan错误。因此,样本层面的数据是推荐进行归一化的。

    • 特征归一化。CTR/CVR模型采用了多种类型的源特征,包括数值型和categorical类型等。但是,categorical类编码后的特征取值只有0或1,较大的数值型特征会造成样本归一化后categorical类生成特征的值非常小,没有区分性。例如,一条用户-商品记录,用户为“男”性,商品的销量是5000个(假设其它特征的值为零),那么归一化后特征“sex=male”(性别为男)的值略小于0002,而“volume”(销量)的值近似为1。特征“sex=male”在这个样本中的作用几乎可以忽略不计,这是相当不合理的。因此,将源数值型特征的值归一化到[0,1]是非常必要的。

    • 省略零值特征。从FFM模型的表达式(3-1)可以看出,零值特征对模型完全没有贡献。包含零值特征的一次项和组合项均为零,对于训练模型参数或者目标值预估是没有作用的。因此,可以省去零值特征,提高FFM模型训练和预测的速度,这也是稀疏样本采用FFM的显著优势。




四、DeepFM

  近年来深度学习模型在解决NLP、CV等领域的问题上取得了不错的效果,于是有学者将深度神经网络模型与FM模型结合,提出了DeepFM模型。FM通过对于每一位特征的隐变量内积来提取特征组合,最后的结果也不错,虽然理论上FM可以对高阶特征组合进行建模,但实际上因为计算复杂度原因,一般都只用到了二阶特征组合。对于告诫特征组合来说,我们很自然想到多层神经网络DNN。

  FM的结构

技术分享图片

  DNN结构

技术分享图片

  DeepFM结构(FM和DNN的特征结合)

技术分享图片

  DeepFM的架构其实特别清晰:




    • 输入的是稀疏特征的id

    • 进行一层lookup 之后得到id的稠密embedding

    • 这个embedding一方面作为隐向量输入到FM层进行计算

    • 同时该embedding进行聚合之后输入到一个DNN模型(deep)

    • 然后将FM层和DNN层的输入求和之后进行co-train



  DeepFM目的是同时学习低阶和高阶的特征交叉,主要由FM和DNN两部分组成,底部共享同样的输入。模型可以表示为:

技术分享图片

  嵌入层的结构如上图所示,有两个有趣的特性:




    • 尽管不同field的输入长度不同,但是embedding之后向量的长度均为k

    • 在FM中得到的隐变量技术分享图片

        从预训练,特征维度以及特征工程的角度进行对比,发现:

      技术分享图片

        从实验效果来看,DeepFM的效果较好:

      技术分享图片

        DeepFM的三大优势:




        • 相对于Wide&Deep不再需要手工构建wide部分;

        • 相对于FNN把FM的隐向量参数直接作为网络参数学习;

        • DeepFM将embedding层结果输入给FM和MLP,两者输出叠加,达到捕捉了低阶和高阶特征交叉的目的。




      五、NFM(Neural Factorization Machines)

        NFM(Neural Factorization Machines)又是在FM上的一个改进工作,出发点是FM通过隐向量可以对完成一个很好的特征组合工作,并且还解决了稀疏的问题,但是FM对于它对于non-linear和higher-order 特征交叉能力不足,而NFM则是结合了FM和NN来弥补这个不足。

      技术分享图片

        DeepFM 是用 Wide & Deep 框架,在 FM 旁边加了一个 NN,最后一并 sigmoid 输出。NFM 的做法则是利用隐向量逐项相乘得到的向量作为 MLP 的输入,构建的 FM + NN 模型。其中:


      • Input Feature Vector层是输入的稀疏向量,可以带权

      • Embedding Layer对输入的稀疏向量look up 成稠密的embedding 向量

      • Bi-Interaction Layer将每个特征embedding进行两两做element-wise product,Bi-Interaction的输出是一个 k维向量(就是隐向量的大小),这层负责了特征之间second-order组合。技术分享图片

        六、AFM(Attentional Factorization Machines)

          AFM(Attentional Factorization Machines)是浙大(Jun Xiao, Hao Ye, Fei Wu)和新加坡国大(Xiangnan He, Hanwang Zhang, Tat-Seng Chua)几位同学提出来的模型。AFM 首先对 FM 做了神经网络改造,而后加入了注意力机制,为不同特征的二阶组合分配不同的权重。在传统的FM中进行特征组合时两两特征之间的组合都是等价的(只能通过隐向量的点积来区别),这里趁着Attention的热度走一波,因为AFM的最大的贡献就是通过Attention建立权重矩阵来学习两两向量组合时不同的权重。下面就是AFM的框架图:

        技术分享图片

          从图中可以很清晰的看出,AFM比FM就是多了一层Attention-based Pooling,该层的作用是通过Attention机制生成一个技术分享图片

         

        参考:

          FM算法详解:https://blog.csdn.net/bitcarmanlee/article/details/52143909

          FM计算:https://blog.csdn.net/shenxiaolu1984/article/details/78740481

          CSDN, 推荐算法:https://blog.csdn.net/asd136912/article/details/78318563

          CSDN,FM&FFM&DeepFFM:https://blog.csdn.net/john_xyz/article/details/78933253

          美团,FM&FFM:https://tech.meituan.com/deep_understanding_of_ffm_principles_and_practices.html

          知乎,Kaggle实战——点击率预估:https://zhuanlan.zhihu.com/p/32500652


推荐阅读
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • CentOS 6.5安装VMware Tools及共享文件夹显示问题解决方法
    本文介绍了在CentOS 6.5上安装VMware Tools及解决共享文件夹显示问题的方法。包括清空CD/DVD使用的ISO镜像文件、创建挂载目录、改变光驱设备的读写权限等步骤。最后给出了拷贝解压VMware Tools的操作。 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
author-avatar
哈哈哈哈哈咩咩
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有