DeepFM算法详解-推荐算法中的皇冠
概述
DeepFM是一种推荐领域炙手可热的算法,在非常多大家熟识的互联网公司都有落地场景。对于DeepFM最佳的阐述一定是来自于它的原始的论文。
地址:https://arxiv.org/pdf/1703.04247.pd
然后再介绍下推荐算法的本源,推荐其实是一个典型的二分类场景。在推荐算法中需要做的事情无非是把一个商品或者广告推送给一个人,然后预测出来这个人喜欢或者不喜欢。这里最难的不是如何实现分类,而是特征的提取。
而特征的提取又分为低阶特征和高阶特征。举个简单的例子什么叫低阶特征,比如一个人n天买了m个馒头,我们可以提取一个特质表示这个人每天的馒头消耗量m/n,这个特征只考虑了2个原始特征的交叉,所以是一个低阶特征。那高阶特征顾名思义,可以通过一个特征表示非常多原始特征的交叉,这也是深度学习所擅长的。
论文中指出,无论是低阶特征还是高阶特征,都有它自己的价值,都对推荐准确性有着很大的影响。而如何利用好低阶和高阶的特征,就是DeepFM最大的特点。
DeepFM与其它算法的比较
通过第一节,大家了解到推荐其实是特征利用的一种博弈。现在就通过特征利用程度介绍下DeepFM与其它算法的区别:
* 逻辑回归(LR):更多考虑线性特征,缺少特征交叉性和高阶特征
* DNN:考虑了高阶特征,缺少了对于低阶特征的考虑
* CNN:考虑近邻特征的关系。较单一,适合图片分类
* RNN:考虑更多的是数据时序性,较单一
* FM:考虑更多低阶特征,缺少高阶特征
* Wide&Deep:同时考虑了低阶特征和高阶特征,但是低阶特征需要手动交叉生成,对用户不友好
* DeepFM:兼顾了低阶和高阶特征,且计算过程中不需要用户干预
文中一份基于开源数据的测试结果也很有说服力:
DeepFM架构介绍
DeepFM这么牛,究竟是如何实现的呢?从架构上可以拆解成FM部分和DNN部分。
最底层是输入的稀疏原始特征(One-hot结果),将特征按照Field进行区分,不理解Field含义的同学请学习下FFM。接着进入了Embedding层,将特征限定到有限的向量空间。Embedding层启到一个压缩的作用,不然推荐场景数据是非常稀疏的,比如一个用户A到电商平台B买东西,A可能只购买了一个商品,但是电商平台B有1000个商品,那么购买产品这个特征通过one-hot衍生就是一个1000维度向量,而且在1000纬度里只有1维度有值。Embedding层会缓解参数爆炸。
接着进入FM层和DNN层,两者共用底层的embedding数据,所以效率很高,整个数据embedding只需要计算一次。
在FM层,主要的工作是通过特征间交叉得到低阶特征,以二阶特征为主。这里面指的注意的是,FM算法的特征交叉不是直接拿原始特征相互交叉计算,而是交叉特征因子分解后的结果,这样更能挖掘出特征深层的信息。
而在DNN层就没有特别多要说的点,就是利用深度学习数据的在网络间的传播性得到高阶特征。
那最终二分类结果怎么判定也是比较粗暴,利用一个sigmoid求和函数的方式,分别参考FM和DNN的结果做出判断:
总结
总体来看,DeepFM会在接下来引领推荐场景一段时间,毕竟这种既考虑低阶又考虑高阶特征的方式具有好的覆盖性,不过整体架构设计上我觉得没有特别多新颖的地方,个人还是很期待在算法领域有本质性突破的技术产生。
目前基于Tensorflow的版本已经比较成熟而且可以达到不错的效果。有兴趣的同学可以看看这个代码实现:
https://github.com/ChenglongChen/tensorflow-DeepFM
里面有数据可以下载,跑起来很简单~
DeepFM算法详解-推荐算法中的皇冠相关推荐
- 算法-详解堆排序算法
title: 算法-详解堆排序算法 date: 2017-07-06 22:00:16 categories: 算法,面试 tags: [算法,Algorithm,面试,排序] description ...
- Unicode双向算法详解(bidi算法)(二)
作者:黄邦勇帅(原名:黄勇)2019-10-17 Unicode双向算法详解(bidi算法)(二) 本文为原创文章,转载请注明出处,或注明转载自"黄邦勇帅(原名:黄勇) 本文是对<C+ ...
- Unicode双向算法详解(bidi算法)(一)
Unicode双向算法详解(bidi算法)(一) 注:本文已独家授权给脚本之家(ID:jb51net)公众号发布 本文为原创文章,转载请注明出处,或注明转载自"黄邦勇帅(原名:黄勇) 本文是 ...
- Unicode双向算法详解(bidi算法)(三)
Unicode双向算法详解(bidi算法)(三) 本文为原创文章,转载请注明出处,或注明转载自"黄邦勇帅(原名:黄勇) 本文是对<C++语法详解>一书相关章节的增补,以增强读者对 ...
- fm算法详解_fm算法(基于fm推荐算法)
在简单频率调制中,两个振荡器都只用正弦曲线(Sinusoidal)的波形.不过,由于. 这使得作曲家也不必用频谱过于复杂的波形完成FM合成.事实上,如用一个频谱成分. 豆瓣FM的推荐算法没有停止,反而 ...
- kmp算法详解php,php中字符串匹配KMP算法实现例子
KMP算法是一个比较高级的算法了,加了改进了,下面我们来在php中实现KMP算法,希望例子对各位同学会带来帮助哦. kmp算法是一种改进的字符串匹配算法,由D.E.Knuth与V.R.Pratt和J. ...
- fm算法详解_FM算法原理分析与实践
一.简介 FM是Steffen Rendle在2010年提出的,FM算法的核心在于特征组合,以此来减少人工参与特征组合工作.对于FM,其优势可分以下三点: FM能处理数据高度稀疏场景,SVM则不能: ...
- python矩阵乘法分治算法_矩阵乘法的Strassen算法详解 --(算法导论分治法求矩阵)...
1 题目描述 2 思路分析 3 解法 4 小结 1 题目描述 请编程实现矩阵乘法,并考虑当矩阵规模较大时的优化方法. 2 思路分析 根据wikipedia上的介绍:两个矩阵的乘法仅当第一个矩阵B的列数 ...
- prim算法详解java_Prim算法(三)之 Java详解
普里姆算法介绍 普里姆(Prim)算法,是用来求加权连通图的最小生成树的算法. 基本思想 对于图G而言,V是所有顶点的集合:现在,设置两个新的集合U和T,其中U用于存放G的最小生成树中的顶点,T存放G ...
- yolov算法详解_YOLOv4算法解读(思维导图)和论文翻译
今天刷看到了YOLOv4之时,有点激动和兴奋,等了很久的YOLOv4,你终究还是出现了 首先附上对论文总结的思维导图,帮助大家更好的理解! 下边是对论文的翻译,有些地方可能翻译的不是很准备,欢迎指正补 ...
最新文章
- PHP 函数 ignore_user_abort定时执行任务的实现
- php 惩罚,【后端开辟】php能够怎样处置惩罚json串
- TPCAST无线传输模块年底将推出 Oculus Rift 版本
- 什么样的技术人员更容易接到软件开发项目?(论干私活儿)
- 当我们在谈深度学习时,到底在谈论什么(三)--转
- re模块常用修饰符_在c语言中修饰符的用法
- 【字典树】添加和查找单词
- 新手学v-text指令
- eclipse编译Duet固件的完整过程
- java8steam流 filler_做有机硅,不懂英文哪能行?——赶紧收藏,说不定哪天就用到了!...
- firefox android 去更新,Firefox Android移动版更新
- 对于踏入社会的我们来说,学历到底有多重要?学历的用途介绍
- 【读论文】Self-supervised feature adaption for infrared and visible image fusion
- SGD的几种优化加速模型动态图形显示
- 概率论—随机事件与随机事件的概率
- STM32版CCD线性摄像头寻线寻迹小车
- 分发系统苹果签名代理推广IOS15安卓苹果应用封装
- Detectron2安装踩坑记录(比较详细版)
- OpenCppCoverage 引起测试程序Crash问题
- 面试环节最后的一问一答
热门文章
- 试喷一下今年的国家最高科学技术奖
- 堆中的off-by-one :ASIS CTF 2016:b00ks
- 青铜器RDM与PTC Windchill协同构建货真价实的PLM解决方案
- otl连接mysql数据库_C++类库:OTL连接MySQL ODBC数据库(insert, update, select)
- java无限循环小数_无限循环小数转化成分数(Java实现)
- Module not found: Error: Can‘t resolve ‘core-js/fn/promise‘
- 【蓝桥杯】真题训练 2014年C++A组 题4 史丰收速算
- linux文件系统 ubi,UBI 文件系统移植 sys 设备信息
- Docker部署Nebula Graph2.0和Studio
- php-redis常用操作