推荐系统三十六式
刑无刀
“贝壳找房”资深算法专家,8年推荐系统工程师
立即订阅
11382 人已学习
课程目录
已完结 39 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 用知识去对抗技术不平等
免费
第1章 概念篇 (3讲)
【概念篇】你真的需要个性化推荐系统吗?
【概念篇】个性化推荐系统那些绕不开的经典问题
【概念篇】这些你必须应该具备的思维模式
第2章 原理篇 (20讲)
【内容推荐】画鬼容易画人难:用户画像的“能”和“不能”
【内容推荐】从文本到用户画像有多远
【内容推荐】超越标签的内容推荐系统
【近邻推荐】人以群分,你是什么人就看到什么世界
【近邻推荐】解密“看了又看”和“买了又买”
【近邻推荐】协同过滤中的相似度计算方法有哪些
【矩阵分解】那些在Netflix Prize中大放异彩的推荐算法
【矩阵分解】Facebook是怎么为十亿人互相推荐好友的
【矩阵分解】如果关注排序效果,那么这个模型可以帮到你
【模型融合】经典模型融合办法:线性模型和树模型的组合拳
【模型融合】一网打尽协同过滤、矩阵分解和线性模型
【模型融合】深度和宽度兼具的融合模型 Wide and Deep
【MAB问题】简单却有效的Bandit算法
【MAB问题】结合上下文信息的Bandit算法
【MAB问题】如何将Bandit算法与协同过滤结合使用
【深度学习】深度学习在推荐系统中的应用有哪些?
【深度学习】用RNN构建个性化音乐播单
【其他应用算法】构建一个科学的排行榜体系
【其他应用算法】实用的加权采样算法
【其他应用算法】推荐候选池的去重策略
第3章 工程篇 (10讲)
【常见架构】典型的信息流架构是什么样的
【常见架构】Netflix个性化推荐架构
【常见架构】总览推荐架构和搜索、广告的关系
【关键模块】巧妇难为无米之炊:数据采集关键要素
【关键模块】让你的推荐系统反应更快:实时推荐
【关键模块】让数据驱动落地,你需要一个实验平台
【关键模块】 推荐系统服务化、存储选型及API设计
【效果保证】推荐系统的测试方法及常用指标介绍
【效果保证】道高一尺魔高一丈:推荐系统的攻防
【开源工具】和推荐系统有关的开源工具及框架介绍
第4章 产品篇 (3讲)
【产品篇】推荐系统在互联网产品商业链条中的地位
【产品篇】说说信息流的前世今生
【团队篇】组建推荐团队及工程师的学习路径
尾声与参考阅读 (2讲)
推荐系统的参考阅读
【尾声】遇“荐”之后,江湖再见
推荐系统三十六式
登录|注册

【模型融合】经典模型融合办法:线性模型和树模型的组合拳

刑无刀 2018-04-02
推荐系统在技术实现上一般划分为三个阶段:挖掘、召回、排序。

为什么要融合?

挖掘的工作就是对用户和物品做非常深入的结构化分析,庖丁解牛一样,各个角度各个层面的特征都被呈现出来,并且建好索引,供召回阶段使用,大部分挖掘工作都是离线进行的。
接下来就是召回,为什么会有召回?因为物品太多了,每次给一个用户计算推荐结果时,如果对全部物品挨个计算,那将是一场灾难,取而代之的是用一些手段从全量的物品中筛选出一部分比较靠谱的。
最后就是排序,针对筛选出的一部分靠谱的做一个统一的论资排辈,最后这个统一的排序就是今天要讲的主题:融合。
前面巴拉巴拉说了一段,画成图的话会好理解一些,示意图如下。
为什么要融合呢?这还得倒回去说一说召回是什么,以及这个阶段到底发生了什么?
在召回阶段,其实就是各种简单的、复杂的推荐算法,比如说基于内容的推荐,会产生一些推荐结果,比如基于物品的协同过滤会产生一些结果,矩阵分解会产生一些结果,等等。
总之,每种算法都会产生一批推荐结果,一般同时还附带给每个结果产生一个推荐分数,是各自算法给出来的。
于是问题就来了,这些不同算法产生的推荐分数,最后要一起排个先后,难道依据各自的分数吗?
这样是不行的,为什么?有几个原因:
有个算法可能只给出结果,不给分数,比如用决策树产生一些推荐结果;
每种算法给出结果时如果有分数,分数的范围不一定一样,所以不能互相比较,大家各自家庭背景不一样;
即使强行把所有分数都归一化,仍然不能互相比较,因为产生的机制不同,有的可能普遍偏高,有的可能普遍偏低。
既然来自各个地方的状元凑在一起,谁也不服谁,那只能再举行一次入学考试了,这个入学考试就是融合模型。也就是,不同算法只负责推举出候选结果,真正最终是否推荐给用户,由另一个统一的模型说了算,这个就叫做模型的融合。
模型融合的作用除了统一地方军阀,还有集中提升效果的作用。在机器学习中,有专门为融合而生的集成学习思想。
今天要讲的一个典型的模型融合方案是:逻辑回归和梯度提升决策树组合,我可以给它取个名字叫做“辑度组合”。

“辑度组合”原理

在推荐系统的模型融合阶段,就要以产品目标为导向。举个简单的例子,信息流推荐,如果以提高 CTR 为目标,则融合模型就要把预估 CTR 作为本职工作,这个工作谁最能胜任呢,一直以来就是逻辑回归。
下面,我就来简单介绍一些常见的逻辑回归。

逻辑回归

CTR 预估就是在推荐一个物品之前,预估一下用户点击它的概率有多大,再根据这个预估的点击率对物品排序输出。
逻辑回归常常被选来执行这个任务,它的输出值范围就是 0 到 1 之间,刚好满足点击率预估的输出,这是一个基础。因为逻辑回归是广义线性模型,相比于传统线性模型,在线性模型基础上增加了 sigmoid 函数。
下面就简单说说,逻辑回归如何做 CTR 预估?
我还是按照一直以来的套路来讲,先讲它在真正使用时怎么做的,再一步步往回看怎么得到所需要的条件。
在对召回阶段不同算法给出的候选物品计算 CTR 预估时,需要两个东西:
特征;
权重。
第一个是特征,就是用量化、向量的方式把一个用户和一个物品的成对组合表示出来。这里说的量化方式包括两种:实数和布尔。实数好理解,比如一个用户的年龄,一个用户平均在某个品类上每个月的开销,类似等等。
布尔,就是取值 0 或者 1,针对两种类别形式的,比如用户所在的省、市,当时是白天还是晚上,物品的每一个标签。
用户和每一个候选物品都组一下 CP,然后以这种特征化的方式表达出来,就可以计算了,否则类别形式的字段不能直接参与计算。
第二个是权重,每个特征都有一个权重,权重就是特征的话事权。在这场决定哪些物品最终有机会能走到前台的选秀过程中,用户和物品这对 CP 的所有特征都有投票权,只是同人不同命,每个特征的权重不一样,对最终计算 CTR 影响有大有小。
这个权重就很重要了,显然不能由愚蠢的人类来指定,需要模型自主从大量的历史数据中学习得到。
有了特征,它是一个向量,假如把它叫做 x;还有特征的权重,也是一个维度和特征一样的向量,假如叫做 w。
我们通过对 x 和 w 做点积计算,就得到了一个传统线性模型的输出,再用 sigmoid 函数对这个值做一个变换,就得到一个 0 到 1 之间的值,也就是预估的 CTR。
这里所说的 sigmoid 函数长这个样子:
这个函数曲线如图所示。
那看上去其实要做的就是两件事了:搞特征、学权重。
事实上的确如此,甚至前者占据更多的时间。逻辑回归特特征的取值都要求要在 0 到 1 之间。
甚至在一些领域,比如搜索广告,特征全都是布尔取值,只有出现和不出现两种,一旦遇到实数取值的特征,就将它划分成多个区间段,也变成了布尔取值。
除此之外,由于逻辑回归是广义线性模型,所谓广义就是因为加了 sigmoid 函数,所以很多非线性关系它无能为力。
比如说,有一天你发现“ID 为 233 的用户喜欢买各种钢笔”这个事实,它可以有两个特征组合出来,一个是“ID 为 233”,是一个布尔特征,另一个是“物品为钢笔”,也是一个布尔特征,显然构造一个新特征,叫做“ID 为 233 且物品为钢笔”。
只有两个原始特征都取值为 1 时,这个构造出的特征才会取值为 1,这种组合就是非线性,逻辑回归本身对两个原始特征仅仅是线性加权,并不能很好地刻画这个组合关系,非得组合才能助它一臂之力。
类似这样的工作,行话都叫做特征工程,刚才举例所说的特征组合叫做二阶组合,还有三阶组合,只要你高兴,也没人拦着你搞四阶组合。
但是要注意,特征组合的难点在于:组合数目非常庞大,而且并不是所有组合都有效,只有少数组合有效。
需要不断去弄脏双手,脚上沾泥地从数据中发现新的、有效的特征及特征组合。
特征工程 + 线性模型,是模型融合、CTR 预估等居家旅行必备。
权重那部分就是老生常谈了,简单说就是你准备好样本,喂给优化算法,优化算法再挤出新鲜的权重。
权重的学习主要看两个方面:损失函数的最小化,就是模型的偏差是否足够小;另一个就是模型的正则化,就是看模型的方差是否足够小;都是希望模型能够有足够的生命力,在实际生产线上最好能和实验阶段表现一样好。
除了要学习出偏差和方差都较小的模型,还需要能够给工程上留出很多余地,具体来说就是两点,一个是希望越多权重为 0 越好,权重为 0 称之为稀疏,可以减小很多计算复杂度,并且模型更简单,方差那部分会可控。
另一个是希望能够在线学习这些权重,用户源源不断贡献他们的行为,后台就会源源不断地更新权重,这样才能实现生命的大和谐。
要学习逻辑回归的权重,经典的方法如梯度下降一类,尤其是随机梯度下降,这在前面讲矩阵分解时已经提到过,可以实现在实时数据流情形下,更新逻辑回归的权重,每一个样本更新一次。
但是随机梯度下降常被人诟病的是,它什么也表现不好,很难得到稀疏的模型,效果收敛得也很慢。
也就是模型预测结果在通往真正想要到达的靶心路上看上去像是喝醉了酒一样,歪歪斜斜,像是很随机,但是趋势上还是在朝损失函数下降的方向。
后来 Google 在 2013 年 KDD 上发表了新的学习算法:FTRL,一种结合了 L1 正则和 L2 正则的在线优化算法,现在各家公司都采用了这个算法。
这里也顺便提一句,这个专栏重点讲解的是推荐系统落地会用到的东西,尽量通俗易懂。如果深入到机器学习和人工智能其他分支,可以参考极客时间上洪亮劼老师的“AI 技术内参”专栏。
对于我给你讲过的原理,希望可以让你有个直观的理解,在专栏结束后的图书出版计划中,我会在书中更加细致深入地讲原理,就有更多的代码和公式。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《推荐系统三十六式》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(20)

  • 科技狗 置顶
    真的太好了!还有一些困惑希望老师解答一下,gbdt的ntrees都是提前定好的,n颗树为什么产生的是n个特征,为什么不乘以叶子节点数?n颗树的建树过程和做特征组合的过程是浑然一体的还是先建树再做特征?
    2018-04-02
    3
  • slvher
    在Facebook那篇CTR论文中,GBDT起到特征变换器的作用,其每颗子树的叶子节点的输出把原始输入特征映射为以1-of-K方式编码的高阶组合特征(其中K为子树的叶子节点数)。也即,GBDT同时实现了高阶特征组合和特征值布尔化,故可提升LR模型效果。

    本文对这个关键细节的解释不够清楚,感兴趣的话,一定要读原论文。

    作者回复: 你说得对。

    2018-09-17
    3
  • 漂浮
    请教老师个问题,有必要区分用户群进行不同推荐策略模型的开发吗?比如,按照地域,长三角用户执行某种推荐策略,珠三角用户执行某种推荐策略?或者按照用户,学生执行某种策略,非学生执行另外一种?是不是在推荐效果有些明显差异的情况下才需要,差异不大的话,不太需要精细化做?
    2018-04-03
    3
  • Geek_b95d22
    “除了要学习出偏差和方差都较小的模型,还需要能够给工程上留出很很多余地,具体来说就是两点,一个是希望越多权重为 0 越好,权重为 0 称之为稀疏,可以减小很多计算复杂度,并且模型更简单,方差那部分会可控。”

    请问,如果很多的权重都是0,其实意味着这个特征对于结果是没有什么影响的,也就是这个特征其实是没啥意义的,特征工程的目的是生成很多特征,模型训练又希望大多数的特征权重为0,那这两个步骤似乎有些矛盾?

    还是说特征工程是尽可能多地寻找特征,而训练是把其中海量特征里最有用的特征(训练前未知)找出来?

    2018-09-12
    1
  • arfa
    老师好,请问用户id和itemid是否作为特征,多谢
    2018-09-11
    1
  • 明华
    无刀老师,在实际情况下用户ID也需要作为一个特征吗?如果是,那这个特征学出来的权重的意义在哪?还有就是一个系统里如果用户ID用one hot编码那样特征不会很多吗?
    2018-08-10
    1
  • 米乐乐果
    楼上的几个朋友可以看看facebook那篇ctr预估的论文,更详细一点,是个不错的补充

    作者回复: 对,那篇非常好!

    2018-05-06
    1
  • jacket
    老师,最终送入逻辑回归的特征,仅仅是经过GBDT决策的结果,还是会加上原始特征向量呢?为什么?
    2018-04-18
    1
  • 林彦
    谢谢陈老师的无私和专业的分享。学到了好多。

    1. 第二棵树用是否喜欢打游戏来作根节点,累积的误差平方和是1764.57,用是否喜欢戴帽子来作根节点,累积的误差平方和是1986.706。因此第二棵树选择用是否喜欢打游戏。49,71,73岁的人的预测值是-7.13,13、14、15、25、35、68岁的人的预测值是3.57。所有样本按原始顺序的残差(保留小数点后2位)是-2.68,-1.68,-0.68,-28.63,19.32,-15.33,14.37,6.67,8.67。

    2. 请问损失函数−ylog(p)−(1−y)log(1−p)中y是预测值,这个预测值是0或1对应点或不点,还是一个点击的概率值。这里的p对应什么值,如何计算?这个损失函数的公式看着和某些文章中逻辑回归的一类损失函数的计算公式有些接近。其中里面的p的位置对应的是文中提到的sigmoid 函数σ(w×x)。

    3. N 棵 GBDT 树对应N个特征组合我的理解是每一个样本只会被分配到一棵树的某个叶子节点上,相应这棵树从树根到这个叶子的所有问题回答的是否组合就是这个样本的特征组合。“到了叶子节点后,就是 1 或者 0,点或者不变。”这句话我有点不太明白,是不是应该是“点或者不点”?

    4. 文中有2个数值可能有点小的错误。(1)文中选择第一棵树时是否喜欢戴帽子的累积的误差平方和我算出来的是5125.55;(2)第2个数据表格里35岁样本的残差应该是-15.75。
    2018-04-05
    1
  • Geek_86533a
    请问老师,这里输入的特征和前面的矩阵分解、协同过滤有什么联系吗?
    2019-08-18
  • 小陈🥑
    老师请问一下如何将movielens类似的数据集转化为特征矩阵呢?行列分别代表什么呢,每个单元的值又代表什么呢?谢谢🙏
    2019-07-17
  • Geek_405444
    其实考虑另一个问题,假设系统性能足够好,召回阶段召回所有物品,再排序,这种排序的结果是否会比在一个有限的召回集合中进行排序效果好,求刑无刀老师给分析分析
    2019-03-17
  • mgxs
    你好,请问一下融合的时候,样本的标签是由召回阶段不同算法的预测结果构成的吗?比如某个算法预测某个样本喜欢,则该样本类别为1。
    2018-06-14
  • kijiang
    老师,请教一个问题,在本篇文章的图1里,就是排序,召回,融合示意图里,中间的挖掘算法部分,看到了svd,als,fm。我的理解是als是求解fm的一种手段,是fm求解的一部分,为何要独立出来呢?我发现不少资料都会单独把als放在一个挖掘算法中,是否是业内一种约定的写法?

    作者回复: 你理解没错,als是求解svd及很多模型的一个方法。这里说的als通常值得als原始论文中那个模型,用于挖掘召回的,fm常用于CTR 预估。

    2018-06-11
  • kijiang
    老师,请教一个问题,在ctr阶段,使用逻辑回归,将用户与物品组成cp,然后抽取特征。这个特征,与挖掘时期对用户利用各种算法建立的特征,和对物品采取各种手段建立的特征,有何不同?这个阶段的特征提取,是否主要靠人工?
    2018-06-07
  • atlas
    老师,召回使用了多个算法召回一些内容,在召回的过程不需要考虑哪个算法最优吗?要是在召回的阶段已经考虑了最好的算法,那么该算法产出的内容应该是最好的,为什么还需要融合排序这个步骤?
    2018-05-19
  • cook150
    facebook 那篇写CTR预估的论文叫什么呢?
    2018-05-12
  • zgl
    请问逻辑回归重排序后,对所有用户特征权重岂不是都一样的?只不过每个人特征的值不一样,是不是这个意思?
    2018-04-29
  • derek
    老师,我在考虑一个问题,召回策略这么多,如果想要保证策略的多样性,同时又保证线上收益,这种问题有什么比较好的思考切入点吗?如果用规则做,那样非常不优雅
    2018-04-25
  • 卓越
    GBDT送到LR的向量应该是叶子结点的个数吧?每个叶子结点表示一系列特征的组合。
    2018-04-20
收起评论
20
返回
顶部