背景

假设现在有个商品点击预测的任务,有用户端特征性别、年龄、消费力等,商品侧特征价格、销量等,样本为0或者1,现在对特征进行one hot encode,如性别特征用二维表示,男为[1,0],女为[0,1],其他特征相同处理后拼接起来一共有n维,n是所有特征的类别数之和。

Logistic Regression(LR)与二阶

线性模型,y = sigmoid(w, x),w有n维,优点是简单易解释,缺点是太简单,无法挖掘特征组合的情况,如男性+游戏类商品可能是个很强特征。为了弥补这个缺点往往需要人工特征组合,如 手工组合特征 f = 性别是否男 & 商品是否为游戏类,这很依赖人工经验。于是就有了暴力的方法,枚举所有的两两特征的组合(线性二阶多项式),训练参数最大有 n * n个,但是性别男和性别女(相同性别field内)是无法组合的,真实值没这么大。假设与n个特征,m个field,相同field 内部无法组合,则训练参数为0.5 * (n * n - (n/m * n/m) * m )

FM(Factorization Machines)

上面的LR线性二阶多项式参数空间是一个 n * n 的矩阵,过于庞大,可以用两个矩阵相乘得到,这两个矩阵的的维度是 n * k 和 k * n,那么参数空间就是 2 * n * k,k是人为设置的参数,大小可以调节,如果k远远小于n,则参数数量将极大变小,更进一步,这两个矩阵可以用一个矩阵和它的转置来表示。

从embedding角度看,假设k为2,”男性和游戏类目“分别可以在这个矩阵中找到一个2维的向量表示,这两个向量的内积就表示了组合特征对预测结果的影响。

LR的二阶特征组合参数是独立的,如”男性&游戏类目“只看这个特征对最终结果的影响,注重记忆功能;而FM里面,男性这个特征的embedding受到的是来自于各个特征组合的影响,并不独立,注重泛化功能,效果上并不一定比LR二阶更好,但是参数空间是实实在在减少了,另外,FM要求特征embedding后的size一样大小,淘宝百万店铺,十个年龄层级性别,明显不太合适这种方法。

FFM(Field-aware Factorization Machines)

FFM是考虑领域知识的一种FM变种,上面介绍FM,男性这个特征的embedding受到的是来自于各个特征组合的影响,能不能降低这个影响?答案是考虑领域知识。假设有m个field,则男性对每个field都建立一个embedding,参数个数是 n * k *m,这是个鉴于二阶LR和FM之间的一个方法,”男性&游戏类目“ 中的男性这向量,还是受到其他类目组合的影响,但是不受到”男性&价格“这类特征组合的影响。

Embedding + MLP(Multilayer Perceptron)

底层所有特征都做embedding,连接起来,上面再堆叠多层全连接层,这里没有底层特征的组合,但是在可以在高阶组合,学习难度更大。与FM的优势在于,各个特征embedding的长度可以不用保持一致,这样的设置更为合理。

FNN

通过FM预训练embedding,上面再堆叠多层全连接层,是一种特殊的embedding + MLP。

DeepFM

embedding + MLP的方式没有考虑底层(低阶)特征的组合,DeepFM把FM的组合特征引入到 MLP充当”wide部分“,同时MLP也使用了FM的embedding表示联合训练。

NFM(Neural Factorization Machines)

FM是把两个向量做内积,即先把对应位置的元素相乘,后直接相加求和当做组合特征。NFM让两个特征的向量元素相乘,但是不急于直接求和组成特征,而是把所有组合特征元素在各自对应的位置累加起来,做当MLP的输入,个人感觉这种操作底层特征的信息丢失很大。

AFM(Attention Factorization Machine)

所有组合特征元素在各自对应的位置累加起来,AFM在NFM的基础上加入attention子网络,不再是平均求和,而是加权求和。

PNN(Product-based Neural Network)

DeepFM把FM的组合特征引入到 MLP充当”wide部分“,PNN直接FM的组合特征的内积或外积当做deep部分输入,但是这样又会导致product层的节点数至少是输入Field数的平方级别,为了降低节点数,采用外积后的sum pooling降低复杂度,又回到NFM的路子。

DCN(Deep&Cross Network)

采用了残差网络的思想,在高阶进行特征组合,残差 = 上一个隐层的转置 * 该层参数w * 第一个隐层,其中w是要学习的参数,上一个隐层的转置 * w 实际上就是个标量了。下一个隐藏 = 残差 + 上一个隐层+ 偏置项。

几句话总结一个算法之CTR预估模型的更多相关文章

  1. 几句话总结一个算法之Q-Learning与Sarsa

    与Policy Gradients的不同之处在于,这两个算法评估某个状态s执行某个动作a的期望奖励,即Q(s,a) Q(s,a) 有两种方法计算方法,第一种直接查表或者模型预估,Q(s, a) = c ...

  2. 几句话总结一个算法之RNN、LSTM和GRU

    RNN 一般神经网络隐层的计算是h=g(w * x),其中g是激活函数,相比于一般神经网络,RNN需要考虑之前序列的信息,因此它的隐藏h的计算除了当前输入还要考虑上一个状态的隐藏,h=g(w*x+w' ...

  3. 几句话总结一个算法之DQN

    DQN利用深度学习对Q-learning的一个扩展,回顾上篇文章,Q-learning的核心在于Q(s,a)的建模.如果状态s非常复杂,很难通过一张表来存储所有的状态. 深度学习正好可以自动提取s的特 ...

  4. 几句话总结一个算法之Policy Gradients

    强化学习与监督学习的区别在于,监督学习的每条样本都有一个独立的label,而强化学习的奖励(label)是有延后性,往往需要等这个回合结束才知道输赢 Policy Gradients(PG)计算某个状 ...

  5. CTR预估模型演变及学习笔记

    [说在前面]本人博客新手一枚,象牙塔的老白,职业场的小白.以下内容仅为个人见解,欢迎批评指正,不喜勿喷![握手][握手] [再啰嗦一下]如果你对智能推荐感兴趣,欢迎先浏览我的另一篇随笔:智能推荐算法演 ...

  6. 主流CTR预估模型的演化及对比

    https://zhuanlan.zhihu.com/p/35465875 学习和预测用户的反馈对于个性化推荐.信息检索和在线广告等领域都有着极其重要的作用.在这些领域,用户的反馈行为包括点击.收藏. ...

  7. 闲聊DNN CTR预估模型

    原文:http://www.52cs.org/?p=1046 闲聊DNN CTR预估模型 Written by b manongb 作者:Kintocai, 北京大学硕士, 现就职于腾讯. 伦敦大学张 ...

  8. 深度CTR预估模型中的特征自动组合机制演化简史 zz

    众所周知,深度学习在计算机视觉.语音识别.自然语言处理等领域最先取得突破并成为主流方法.但是,深度学习为什么是在这些领域而不是其他领域最先成功呢?我想一个原因就是图像.语音.文本数据在空间和时间上具有 ...

  9. 【转】- 从FM推演各深度CTR预估模型(附代码)

    从FM推演各深度CTR预估模型(附代码) 2018年07月13日 15:04:34 阅读数:584 作者: 龙心尘 && 寒小阳 时间:2018年7月 出处: 龙心尘 寒小阳

随机推荐

  1. Password file not found:.../jmxremote.password

    jmxremote.password 在jdk/jre/lib/management/下,jmxremote.password.template复制,去掉.template后缀 在配置JMX远程访问的 ...

  2. AtCoder diverta 2019 Programming Contest 2

    AtCoder diverta 2019 Programming Contest 2 看起来我也不知道是一个啥比赛. 然后就写写题解QWQ. A - Ball Distribution 有\(n\)个 ...

  3. 如何禁用/关闭vs2017自带的Git工具的?

    对于用习惯了独立Git工具和命令行的人来说,看到Visual Studio自带的Git工具后,很是别扭,到处充满了不习惯,而且是不是还会出现电脑卡顿的现象(可能是我自身电脑配置一般的问题). 如何关闭 ...

  4. 用友U9 查看功能页面实体

    对着当前页面右键查看属性:   在链接后面加上&__dm=true    在打开的页面将鼠标放到字段上,可以看到页面实体是那一个.

  5. ASP.NET MVC IOC 之 Autofac(二)

    在上一章节,我们已经知道了再控制器中如何注入以及使用了.这一章,我们重点讲解下,如何在服务层中使用. 我们新定义一个教师类,在服务层中,通过这个教师类服务层,获取学生的年龄.实现在教师类的服务层中调用 ...

  6. poj3045 Cow Acrobats (思维,贪心)

    题目: poj3045 Cow Acrobats 解析: 贪心题,类似于国王游戏 考虑两个相邻的牛\(i\),\(j\) 设他们上面的牛的重量一共为\(sum\) 把\(i\)放在上面,危险值分别为\ ...

  7. python高级编程——网络编程(二)

    UDP 概念和介绍 UDP --- 用户数据报协议,是一个无连接的简单的面向数据报的运输层协议. UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并 不能保证它们能到达目的地. U ...

  8. 【开发笔记】- Grails框架定义一个不是数据库字段得属性

    实体类 class Book{ String name String author // myfiled 我不想他在数据库中生成book表的字段 String myfield } 添加声明 class ...

  9. 用SWFUpload上传图片小例子

    在开发项目中,经常会用到上传图片,接下来我就用一种简单的方式给大家分享一下使用SWFUpload的方式上传图片. 1.在网站根目录下新建一个SWFUpload文件夹,把下载的组建放在SWFUpload ...

  10. C++运算符重载学习总结

    在C ++中,我们可以使运算符适用于用户定义的类. 这意味着C ++能够为运算符提供数据类型的特殊含义,这种能力称为运算符重载. 例如,我们可以在像String这样的类中重载运算符'+',这样我们就可 ...