编者按:之前推出了《推荐系统系列教程》,反响不错,前面已经推出了十四期,今天按约推出第十五期:一网打尽协同过滤、矩阵分解和线性模型。希望朋友们多点“在看”,多多转发,我会在“在看”数超过20后推出下一篇教程。
推荐系统在技术实现上一般划分为三个阶段:挖掘、召回、排序。
在上一篇文章中,我们讲到了使用逻辑回归和梯度提升决策树组合的模型融合办法,用于CTR预估,我还满怀爱意地给这对组合起了个名字,叫做辑度组合,因为这对组合的确可以在很多地方帮到我们。
这对组合中,梯度提升决策树,也就是人们常说的GBDT,所起的作用就是对原始的特征做各种有效的组合,一棵树就是一种组合决策过程。
这大概就是逻辑回归的宿命吧,作为一个广义线性模型,在这个由非线性组成的世界里,唯有与各种特征组合办法精诚合作,才能活下去。
从特征组合说起
对逻辑回归最朴素的特征组合就是二阶笛卡尔乘积,但是你有没有想过这样暴力组合的问题所在。
1、两两组合导致特征维度灾难;
2、组合后的特征不见得都有效,事实上大部分可能无效;
3、组合后的特征样本非常稀疏,意思就是组合容易,但是并不能在样本中找到对应的组合出现,也就没办法在训练时更新参数。
如果把包含了特征两两组合的逻辑回归线性部分写出来,就是:
这和原始的逻辑回归相 ,就多出来了后面那一大坨,特征两两组合那部分,也需要去学习对应的参数权重。
问题就是两两组合后非常有可能没有样本能够学习到wij,但没有样本可以 来学习到参数,而且在应用时,如果遇到了这样的组合,也就只能放弃,因为没有学到权重。
针对这个问题,就有了一个新的算法模型:因子分解机模型,也叫做FM,即 Factorization Machine。因子分解机也常常用来做模型融合,今天我们就聊聊因子分解机的来龙去脉。
FM 模型
1、原理
因子分解机模型是在 2010 被提出来的。因为逻辑回归在做特征组合时样本稀疏,从而无法学到很多特征组合的权重,所以因子分解机的提出者就想,能 不能对上面那个公式中的 wij 做解耦,让每一个特征学习一个隐因子向量出来。
就好像前面讲矩阵分解时,为每一个用户和每一个物品各自都学习一个隐因 子向量一样,这样一来,任何两个特征不小心在实际使用时相遇了,需要组合,那么各自掏出随身携带的隐因子变量做一个向量点积,就是两者组合特征的权重了。
还是针对逻辑回归的线性部分,用公式写一下更清楚:
这个公式和前面特征组合的公式相比,不同之处就是原来有个wij,变成了这里的两个隐因子向量的点积。
不要小看这个变化。它其实认为两个特征之间,即使没有共同出现在一条样本中,也是有间接联系的。比如说特征 A 和特征 B 曾在一些样本中一起出现过, 特征 B 和特征 C 曾在一些样本中出现过,那么特征 A 和特征 C 无论是否 在样本中一起出现过,仍然是有些联系的。
如果在实际预测 CTR 时,特征 A 和特征 C 真的在一起出现了,如果你用的 是因子分解机模型,这时候你的预测程序就不慌不忙走向数据库,从中取出早 已准备好的特征 A 和特征 C 的隐因子向量,拿出来做一个点积运算,就得到 两者组合的权重。
也许逻辑回归到这一切不禁要问:居然还有这种操作?是的,因子分解机的先进之处就在与此。
现在聪明如你,一定也想到了,既然二阶特征组合可以学到隐因子向量,那么三阶特征组合也可以加进来,四阶,五阶......想一想是不是有点小激动?
不要急,组合越多,计算复杂度就会陡增,所以一般在实际使用中,因子分解机就表演到二阶特征组合就 OK 了。
2、模型训练
因子分解机的参数学习并无特别之处,看目标函数,我在这里是把它当作融合模型来看的,用来做 CTR 预估,因此预测目标是一个二分类,因子分解机的 输出还需要经过 sigmoid 函数变换:
因此,损失目标函数也就是常用的logistic loss:
公式中 σ(ŷ )σ(y^) 是因子分解机的预测输出后,经过 sigmoid 函数变换得到 的预估 CTR,y(i)y(i) 是真实样本的类别标记,正样本是 1,负样本是 0,m是样本总数。
对这个损失目标函数使用梯度下降或者随机梯度下降就可以得到模型的参数,和前面文章里的没有区别。
注意损失函数实际上还需要加上正则项,这在上一篇专栏中已经总结过机器学习损失函数的两板斧,就是偏差和方差。
3、预测阶段
假如现在已经得到了因子分解机的模型参数,你忍不住跃跃欲试想端着它冲上战场。
且慢,因子分解机中二阶特征组合那一坨,在实际计算时,复杂度有点高,如果隐因子向量的维度是 k,特征维度是 n,那这个复杂度就是 O(kn2)O(kn2)。
其中 n 是特征要两两组合,k 是每次组合都要对 k 维向量计算点积。需要对此稍微做一下改造,改造过程如下。
看上去这个有点复杂,你如果不想理解也没关系,我直接告诉你最后该怎么算。
loop1 begin: 循环 k 次,k 就是隐因子向量的维度,其中,循环到第 f 次时做以下事情
loop2 begin: 循环 n 个特征,第 i 次循环时做这样的事情
1、从第 i 个特征的隐因 向 中拿出第 f 维的值;
2、计算两个值:A 是特征值和 f 维的值相乘,B 是 A 的平
loop2 end
把 n 个 A 累加起来,并平方得到 C,把 n 个 B 也累加起来,得到 D
用C 减 D,得到 E
loop1 end
把 k 次循环得到的 k 个 E 累加起来,除以 2
这就是因子分解机中,二阶组合部分的实际计算方法,现在这样做的复杂度只是 O(kn),原来的平方复杂度不见了。
4、打尽其他模型
下面继续带你见识一些因子分解机的神奇之处。看下面这张图,这里示意了一批样本。
这张图中每一条样本都记录了用户对电影的评分,最右边的 y 是评分,也就是预测目标;左边的特征有五种,用户 ID、当前评分的电影 ID、曾经评过的其他分、评分时间、上一次评分的电影。
好,现在我们来看因子分解机如何一网打尽其他模型的,注意,这里说的一网打尽并布是打败,而是说模型可以变形成其他模型。
前面已经说了因子分解机可以实现带有特征组合的逻辑回归。
现在假设图中的样本特征只留下用户 ID 和电影 ID,因子分解机模型就变成:
解释一下如何变成这样的。因为用户 ID 和电影 ID,在一条样本中,各自都只有一个维度是 1,其他都是 0,所以在一阶部分就没有了求和符合,直接是 wu 和 wi,二阶部分特征乘积也只剩下一个 1,其他都为 0 。你瞧,这不就是带有偏置信息的 SVD 吗?
现在继续,在 SVD 基础上把样本中的特征加上用户历史评过分的电影 ID,再求隐因子向量,这就是 SVD++ 呀!
再加上时间信息,就变成 time-SVD。
所以因子分解机是把我之前讲过的矩阵分解一网打尽了,顺便还干起了逻辑回归的工作,也正因如此,因子分解机常常用来做模型融合,在推荐系统的排序阶段肩负起对召回结果做重排序的任务。
5.FFM
因子分解机的故事已经讲完,但我后来在因子分解机基础上改进了一下。改进的思路是:不但认为特征和特征之间潜藏着一些步可告人的关系,还认为特征和特征类型有着千丝万缕的关系。
这个特征类型,就是某些特征实际上是来自数据的同一个字段,比如用户 ID, 占据了很多维度,变成了很多特征,但他们都属于同一个类型,都叫“用户 ID”。 这个特征类型就是字段,即 Field。这种改进叫做 Field-aware Factorization Machines,简称 FFM。
再回顾 下,因子分解机模型的样子是这样:
之前因子分解机认为每个特征有一个隐因子向量,FFM 改进的是二阶组合那部分,改进的模型认为每个特征有 f 个隐因子向量,这里的 f 就是特征一共来 自多少个字段(Field),二阶组合部分改进后如下:
FFM 模型也常用来做 CTR 预估。在 FM 和 FFM 事件过程中,记得要对样 本和特征都做归一化。
总结
今天,我们介绍了另一种常用来做 CTR 预估的模型,因子分解机。因子分 解机最早提出在 2010年,在一些数据挖掘臂赛中都取得了很好的成绩,后来被引入工业界做模型融合,也表现不俗。
严格来说,因子分解机也算是矩阵分解算法的一种,因为它的学习结果也是隐因子向量,也是用过隐因子向量的点积代替原来的单个权重参数。
最后,由于不断提到特征组合的重要性,前有 GBDT,现有 FM,都是在特征组合上花功夫,你也可以思考下,你所用过的特征组合办法有哪些呢?
附:最后再唠叨两句,本系列教程全部免费,但希望大家每期都不要落下,这样可成体系,也希望各位粉丝朋友多多转发,并在看完后点个“在看”,以示鼓励。我会在文章“在看”数超过20后推送出下一篇的教程。希望大家都有所收获。
「 更多干货,更多收获 」
推荐系统教程之十四:经典模型融合方法之线性模型和树模型的组合拳
推荐系统教程之十三:如果关注排序效果,那么这个模型可以帮到你
推荐系统教程之十二:Facebook是怎么为十亿人互相推荐好友的?
推荐系统教程之十一:那些在Netflix Prize中大放异彩的推荐算法
推荐系统教程之九:解密“看了又看”和“买了又买”(Item-based)
推荐系统教程之五:画鬼容易画人难,用户画像的“能”与“不能”
关注我们
智能推荐 个性化推荐技术与产品社区 | 长按并识别关注 |
你的「在看」,我的动力!????