首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

CTR 预估之 FM

回顾

之前用 FM 做过 CTR 预估,然后之前接触了一些推荐算法,没搞明白这推荐和 CTR 之间的区别。

给出网上的一些回答:

计算广告与推荐系统有哪些区别?

读完后的整体感受是:就推荐系统和 CTR 所属的计算广告来说,两者确实是不同的,是两个不同的具体业务,而就算法这块,两者是相通的。

下面介绍 CTR 中的经典算法 FM(Factorization Machines 因式分解机)。

先来看一组数据,描述的是用户对电影的评分 1-5

我们针对上面的这组数据,目标是预测出用户未做评价的电影,方法可以看我之前的文章隐语义模型(LFM),此处对于上面的做法,我们可以直接看推荐系统算法之 surprise 实战。

此处关于数据的更新,我们仔细来看下:

上图中,计算, 然后计算 R11 和真实值之间的误差,然后再根据这个误差去更新这 6 个参数,更新规则:

# k = 1 -> 3P[1][k] = P[1][k] + alpha * (2 * e11 * Q[k][3] - beta * P[1][k])Q[k][4] = Q[k][5] + alpha * (2 * e11 * P[1][k] - beta * Q[k][6])

从上面的式子我们就可以知道,要想更新 P11,P12,P13,则我们需要 R1k 的评分,即第一个用户的评分,那这个带来的问题就是如果某个用户的评分数据少,则其向量就会不准。

这就是冷启动问题:如果一个用户或者 item 没有任何的行为数据,我们根本无法对其进行预测。

FM

下面再来看一个广告点击的例子。

上面有 3 个特征列,每个特征都是 Categorical 类型,因此做法就是做 one-hot,此处讲个小知识,为什么用 one-hot,而不是直接编码 1,2,3,4,5 呢?为什么要做 one-hot

我们在面对 category 类型的变量的时候,一个常用的方法就是进行 one-hot encoding,但是为什么这么做呢?举个例子,假设有一列叫婚姻状态,可能值有:单身,已婚,离异。我们可以将其直接编码为 0,1,2,这样子的话,我们在一些计算距离的算法中,0 和 1 会比 0 和 2 离的更近,但其实 0,1,2 都是一样的,所有一个解决方法就是将婚姻状态这列转换为 3 列,每列都用 0,1 来表示是否是该值,这样子彼此之间的距离就一样了,保证了语义的一致性。

因此做完 one-hot 后,上面的输入特征就变为:

绝对是一个高维的稀疏向量,如果我们此时用 LR 模型来做,则预测如下:

我们将权重 w 加上了特征名来更清晰的表示权重含义,此时如果想捕捉不同特征之间的联合关系,则要将两个特征一起作为输入,则有如下的式子:

这么做带来的问题是:计算复杂度问题,随着 N 的增加,其计算量是 N^2 增加的,而且要想学习联合特征权重 w,训练数据中必须要有这个联合分布才行。

此时 FM 的解决方法是,我们对于联合特征的权重捕捉上,不在采用简单的单权重,而是采用向量内积来表示:

这么做其实相当于给模型增加了容量(因为模型参数变多了),更关键的是我们从原始数据中捕捉到了更多信息。

我们举个例子来说明上面的问题,看一组数据:

上面数据中,用传统的方法做,我们是学不到 w(NBC, Gucci) 的,因为没有任何训练数据,但是如果我们用 FM 呢?在对于联合特征的学习上,我们主要做的是学习每个特征的分布式表示,就像前文 NFM 中所示:

我们只要有单独的 NBC 和 Gucci 的数据即可,我们就能去学习其隐藏含义了即分布式表示。

另外一点 FM 优于 LR 的是计算效率,我们可以看 FM 论文中:

将原先 n^2 的计算变为了 n*k,k 一般都小于 n,可以说是极大的性能提升。

另外我们可以从神经网络的角度来理解 FM,其结构图如下:

图来自 DeepFM: A Factorization-Machine based Neural Network for CTR Prediction,根据 FM 的公式,可以分为 3 部分,

w0 是全局的,wi 是针对每个特征输入的,vik 是对每个特征进行 embedding 后的。

这么说可能不是很清楚,可以看代码,代码是最好的说明:

原版代码来自 keras-based-fm.

FFM

此处多出来的 F 指代的是 Field-Aware,举个例子,看数据:

上面的 Field 指的就是 P,A,G,每个 Field 下面都有好多类别。

在 FM 算法中,每一个特征只有一个隐向量 v,但是同一个 Field 对不同的 Field 其作用是不同的,譬如同样是 Male,但是当其和 Publisher 和 Advertisor 分别求内积的时候,其作用是不同的,因此希望能够将类别信息加进来,变化部分就是在隐向量这块:

参数个数由原先的 nk 变为了 nfk,n 是特征个数,f 是 field 类别个数,k 是隐向量个数。

总结

本文主要介绍了 FM 和 FFM 的主要思想,下一篇将会是实战篇,使用的库是 xLearn。

你的鼓励是我继续写下去的动力,期待我们共同进步,欢迎关注。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180118G0FGRL00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券