编者按:之前推出了《推荐系统系列教程》,反响不错,前面已经推出了十四期,今天按约推出第十五期:一网打尽协同过滤、矩阵分解和线性模型。希望朋友们多点“在看”,多多转发,我会在“在看”数超过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)

推荐系统教程之八:人以群分,你是什么人就看到什么世界

推荐系统教程之七:超越标签的内容推荐系统

推荐系统教程之六:从文本到用户画像有多远

推荐系统教程之五:画鬼容易画人难,用户画像的“能”与“不能”

推荐系统教程之四:这些你必须具备的思维模式

推荐系统教程之三:个性化推荐系统那些绕不开的经典话题

推荐系统教程之二:你真的需要搭建个性化推荐系统吗?

推荐系统教程之一:用知识去对抗技术不平等

【干货】史上最全个性化推荐技术资料包(附下载链接)

如何搭建一套个性化推荐系统

关注我们

智能推荐

个性化推荐技术与产品社区

长按并识别关注

你的「在看」,我的动力!????

推荐系统系列教程之十五:一网打尽协同过滤、矩阵分解和线性模型相关推荐

  1. Java NIO系列教程(十 五)Java NIO Path

    转载自  Java NIO系列教程(十 五)Java NIO Path 译文链接  译者:章筱虎 Java的Path接口是Java NIO2 的一部分,是对Java6 和Java7的 NIO的更新.J ...

  2. SpringBoot 系列教程(八十五):Spring Boot使用MD5加盐验签Api接口之前后端分离架构设计

    加密算法参考: 浅谈常见的七种加密算法及实现 加密算法参考: 加密算法(DES,AES,RSA,MD5,SHA1,Base64)比较和项目应用 目的: 通过对API接口请求报文签名,后端进行验签处理, ...

  3. 推荐系统系列教程之十六:深度和宽度兼具的融合模型

    编者按:之前推出了<推荐系统系列教程>,反响不错,前面已经推出了十五期,今天按约推出第十六期:深度和宽度兼具的融合模型.希望粉丝朋友们多点"在看",多多转发,我会在&q ...

  4. 推荐系统系列教程之十四:经典模型融合方法----线性模型和树模型的组合拳

    编者按:之前推出了<推荐系统系列教程>,反响不错,前面已经推出了十三期,今天按约推出第十四期:经典模型融合办法----线性模型和树模型的组合拳.希望朋友们多点"在看", ...

  5. 推荐系统系列教程之十二:Facebook是怎么为十亿人互相推荐好友的?

    编者按:之前推出了<推荐系统系列教程>,反响不错,前面已经推出了十一期,今天按约推出第十二期:Facebook是怎么为十亿人互相推荐好友的.希望朋友们多点"在看",多多 ...

  6. boltzmann_推荐系统系列第7部分:用于协同过滤的Boltzmann机器的3个变体

    boltzmann RecSys系列 (RecSys Series) Update: This article is part of a series where I explore recommen ...

  7. Express全系列教程之(十五):文件下载

    简介 文件下载非常简单,仅需通过res.download()执行即可,他可以写为3种形式: res.download('/report-12345.pdf');res.download('/repor ...

  8. SpringBoot 系列教程(六十五):Spring Boot整合WxJava开发微信公众号

    一.前言 做微信公众号开发项目以及近两年整了,积累了一点微薄的行业经验,既然开了微信开发专栏博客,那么今天就来回忆回忆,从零开始搭建一个微信公众号开发的框架,可以用于企业级项目开发的脚手架,同时搭配博 ...

  9. 机器学习基础(三十五)—— 协同过滤(从匹配用户到匹配商品)

    考虑如下的用户对影片的打分,由嵌套字典定义: critics = {'Lisa Rose': {'Lady in the Water': 2.5, 'Snakes on a Plane': 3.5,' ...

最新文章

  1. Qt creator使用笔记
  2. KLayout 软件使用崩溃
  3. 自制CSDN博客评论邮件提醒
  4. 【29.70%】【codeforces 723D】Lakes in Berland
  5. 本地开发时连接后台数据库时出现的错误,附自救方法
  6. Android external storage
  7. Spring 容器(Spring 的上下文)
  8. 操作系统学习之用C语言模拟CLOCK算法
  9. OSI七层模型及应用
  10. 自己写的.Net(C#)代码×××
  11. python回测函数_Python事件化回测双均线
  12. 如何设置PPT演示文稿的倒计时器
  13. Yann LeCun、Yoshua Bengio和Geoffrey Hinton的联合综述《Deep Learning》翻译
  14. activiti设计器会签人员配置
  15. vue项目将localhost改成自己的ip访问
  16. 哪个dns服务器延迟最低,可以立即测出延迟最小的DNS
  17. win10时间不准_Win10实用技巧之win10系统电脑重置
  18. nvidia agx xavier平台imx334 驱动调试记录
  19. HTML“计算机输出”标签 codekbdsampttvarpre
  20. Django 重写authenticate实现输入账号、邮箱、手机号登录验证

热门文章

  1. 台积电:无法回应检调中的案件,不评论单一客户特定订单
  2. 小米关联公司被列入经营异常
  3. Hello log4net——做一个实用好用的log4net的demo(转)
  4. Docker 系列之 常用镜像
  5. 华为S5300系列交换机V100R005SPH020升级补丁
  6. oracle/PL/SQL编程(4)
  7. 为什么会有jQuery、Dojo、Ext、Prototype、YUI、Zepto这么多JS包?
  8. InfluxDb系列:几个关键概念(主要是和关系数据库做对比)
  9. 甭给《程序员》把脉——你不是主编
  10. iOS开发----UI部分----iPhone各类屏幕的分辨率