FM英文全称是“Factorization Machine”,简称FM模型,中文名“因子分解机”。算法
FM模型其实有些年头了,是2010年由Rendle提出的,可是真正在各大厂大规模在CTR预估和推荐领域普遍使用,其实也就是最近几年的事。性能优化
FM模型 原理参考: https://zhuanlan.zhihu.com/p/50426292ide
不过我给个我的判断:我以为FM是推荐系统工程师应该熟练掌握和应用的必备算法,即便你看不少DNN版本的排序模型,你应该大多数状况会看到它的影子,性能
缘由其实很简单:特征组合对于推荐排序是很是很是重要的,而FM这个思路已经很简洁优雅地体现了这个思想了(主要是二阶特征组合)。学习
DNN模型同样离不开这个特色,而MLP结构是种低效率地捕获特征组合的结构,因此即便是深度模型,目前同样还离不开相似FM这个可以直白地直接去组合特征的部分。测试
这是你会反复发现它的缘由所在,固然也许是它本人,也许不必定是它本人,可是必定是它的变体。大数据
一、LR模型是CTR预估领域早期最成功的模型,大多工业推荐排序系统采起LR这种“线性模型+人工特征组合引入非线性”的模式。由于LR模型具备简单方便易解释容易上规模等诸多好处,因此目前仍然有很多实际系统仍然采起这种模式。可是,LR模型最大的缺陷就是人工特征工程,耗时费力费人力资源,那么可否将特征组合的能力体如今模型层面呢?优化
二、其实想达到这一点并不难,如上图在计算公式里加入二阶特征组合便可,任意两个特征进行组合,能够将这个组合出的特征看做一个新特征,融入线性模型中。而组合特征的权重能够用来表示,和一阶特征权重同样,这个组合特征权重在训练阶段学习得到。其实这种二阶特征组合的使用方式,和多项式核SVM是等价的。虽然这个模型看上去貌似解决了二阶特征组合问题了,可是它有个潜在的问题:它对组合特征建模,泛化能力比较弱,尤为是在大规模稀疏特征存在的场景下,这个毛病尤为突出,好比CTR预估和推荐排序,这些场景的最大特色就是特征的大规模稀疏。因此上述模型并未在工业界普遍采用。那么,有什么办法可以解决这个问题吗?编码
四、那么为何说FM的这种特征embedding模式,在大规模稀疏特征应用环境下比较好用?为何说它的泛化能力强呢?参考上图说明。即便在训练数据里两个特征并未同时在训练实例里见到过,意味着 一块儿出现的次数为0,若是换作SVM的模式,是没法学会这个特征组合的权重的。可是由于FM是学习单个特征的embedding,并不依赖某个特定的特征组合是否出现过,因此只要特征
和其它任意特征组合出现过,那么就能够学习本身对应的embedding向量。因而,尽管
这个特征组合没有看到过,可是在预测的时候,若是看到这个新的特征组合,由于
和
都能学会本身对应的embedding,因此能够经过内积算出这个新特征组合的权重。这是为什么说FM模型泛化能力强的根本缘由。orm
其实本质上,这也是目前不少花样的embedding的最核心特色,就是从0/1这种二值硬核匹配,切换为向量软匹配,使得原先匹配不上的,如今能在必定程度上算密切程度了,具有很好的泛化性能。
三、本质上,MF模型是FM模型的特例,MF能够被认为是只有User ID 和Item ID这两个特征Fields的FM模型,MF将这两类特征经过矩阵分解,来达到将这两类特征embedding化表达的目的。而FM则能够看做是MF模型的进一步拓展,除了User ID和Item ID这两类特征外,不少其它类型的特征,均可以进一步融入FM模型里,它将全部这些特征转化为embedding低维向量表达,并计算任意两个特征embedding的内积,就是特征组合的权重,若是FM只使用User ID 和Item ID,你套到FM公式里,看看它的预测过程和MF的预测过程同样吗?
从谁更早使用特征embedding表达这个角度来看的话,很明显,和FM比起来,MF才是真正的前辈,无非是特征类型比较少而已。而FM继承了MF的特征embedding化表达这个优势,同时引入了更多Side information做为特征,将更多特征及Side information embedding化融入FM模型中。因此很明显FM模型更灵活,能适应更多场合的应用范围。
鉴于MF和FM以上错综复杂剪不断理还乱的关系,我推论出下面的观点(我的意见):
其一:在你有使用MF作协同过滤的想法的时候,暂时压抑一下这种冲动,能够优先考虑引入FM来作的,而非传统的MF,由于能够在实现等价功能的基础上,很方便地融入其它任意你想加入的特征,把手头的事情作得更丰富多彩。
其二:从实际大规模数据场景下的应用来说,在排序阶段,绝大多数只使用ID信息的模型是不实用的,没有引入Side Information,也就是除了User ID/Item ID外的不少其它可用特征的模型,是不具有实战价值的。缘由很简单,大多数真实应用场景中,User/Item有不少信息可用,而协同数据只是其中的一种,引入更多特征明显对于更精准地进行个性化推荐是很是有帮助的。而若是模型不支持更多特征的便捷引入,明显受限严重,很难真正实用,这也是为什么矩阵分解类的方法不多看到在Ranking阶段使用,一般是做为一路召回形式存在的缘由。
在数据量特别大的状况下,若是在效果好和速度快之间作选择,不少时候跑得快的简单模型会胜出,这是为什么LR模型在CTR预估领域一直被普遍使用的缘由。
而FFM模型则是反例,咱们在几个数据集合上测试过,FFM模型做为排序模型,效果确实是要优于FM模型的,可是FFM模型对参数存储量要求太多,以及没法能作到FM的运行效率,若是中小数据规模作排序没什么问题,可是数据量一旦大起来,对资源和效率的要求会急剧升高,这是严重阻碍FFM模型大规模数据场景实用化的重要因素。
再顺手谈谈DNN排序模型,如今貌似看着有不少版本的DNN排序模型,可是考虑到上面讲的运算效率问题,你会发现太多所谓效果好的模型,其实不具有实用价值,算起来太复杂了,效果好得又颇有限,超大规模训练或者在线 Serving速度根本跟不上。除非,大家公司有具有至关强悍实力的工程团队,可以进行超大数据规模下的大规模性能优化,那当我上面这句话没说。
我对排序模型,若是你打算推上线真用起来的话,建议是,沿着这个序列尝试:FM-->DeepFM。你看着路径有点短是吗?确实比较短。若是DeepFM作不出效果,别再试着去尝试更复杂的模型了,仍是多从其它方面考虑考虑优化方案为好。有些复杂些的模型,也许效果确实好一些,在个别大公司也许真作上线了,可是极可能效果好不是算法的功劳,是工程能力强等多个因素共同致使的,人家能作,你未必作的了。至于被普遍尝试的Wide &Deep,我我的对它有偏见,因此直接被我跳过了。固然,若是你原始线上版本是LR,是能够直接先尝试Wide&Deep的,可是即便如此,要我作升级方案,我给的建议会是这个序列:LR—>FM-->DeepFM—>干点其余的。
上文书提到过,目前工业界推荐系统在召回阶段,大多数采用了多路召回策略,好比典型的召回路有:基于用户兴趣标签的召回;基于协同过滤的召回;基于热点的召回;基于地域的召回;基于Topic的召回;基于命名实体的召回等等,除此外还有不少其它类型的召回路。
如今咱们来探讨下第一个问题:在召回阶段,可否用一个统一的模型把多路召回招安?就是说改形成利用单个模型,单路召回的模式?具体到这篇文章,就是说可否利用FM模型来把多路召回统一块儿来?
在回答上述问题以前,我估计你会提出疑问:目前你们用多路召回用的好好的,为啥要画蛇添足,用一个模型把多路召回统一块儿来呢?这个问题很是好,咱们确实应该先看这么作的必要性。
咱们先来讲明下统一召回和多路召回各自的优缺点,我以为使用统一召回模式,相对多路召回有以下优势:
首先,采用多路召回,每一路召回由于采起的策略或者模型不一样,因此各自的召回模型得分不可比较,好比利用协同过滤召回找到的候选Item得分,与基于兴趣标签这一路召回找到的候选Item得分,彻底是不可比较的。这也是为什么要用第二阶段Ranking来将分数统一的缘由。而若是采起统一的召回模型,好比FM模型,那么不论候选项Item来自于哪里,它们在召回阶段的得分是彻底可比的。
其次,貌似在目前“召回+Ranking”两阶段推荐模型下,多路召回分数不可比这个问题不是特别大,由于咱们能够依靠Ranking阶段来让它们可比便可。可是其实多路召回分数不可比会直接引起一个问题:对于每一路召回,咱们应该返回多少个Item是合适的呢?若是在多路召回模式下,这个问题就很难解决。既然分数不可比,那么每一路召回多少候选项K就成为了超参,须要不断调整这个参数上线作AB测试,才能找到合适的数值。而若是召回路数特别多,因而每一路召回带有一个超参K,就是这一路召回多少条候选项,这样的超参组合空间是很是大的。因此到底哪一组超参是最优的,就很难定。其实现实状况中,不少时候这个超参都是拍脑壳上线测试,找到最优的超参组合几率是很低的。
而若是假设咱们统一用FM模型来作召回,其实就不存在上面这个问题。这样,咱们能够在召回阶段作到更好的个性化,好比有的用户喜欢看热门的内容,那么热门内容在召回阶段返回的比例就高,而其它内容返回比例就低。因此,能够认为各路召回的这组超参数就彻底依靠FM模型调整成个性化的了,很明显这是使用单路单模型作召回的一个特别明显的好处。
再次,对于工业界大型的推荐系统来讲,有极大的可能作召回的技术人员和作Ranking的技术人员是两拨人。这里隐含着一个潜在可能会发生的问题,好比召回阶段新增了一路召回,可是作Ranking的哥们不知道这个事情,在Ranking的时候没有把能体现新增召回路特性的特征加到Ranking阶段的特征中。这样体现出来的效果是:新增召回路看上去没什么用,由于即便你找回来了,并且用户真的可能点击,可是在排序阶段死活排不上去。也就是说,在召回和排序之间可能存在信息鸿沟的问题,由于目前召回和排序二者的表达模式差别很大,排序阶段以特征为表达方式,召回则以“路/策略/具体模型”为表达方式,二者之间差别很大,是比较容易产生上述现象的。
可是若是咱们采用FM模型来作召回的话,新增一路召回就转化为新增特征的问题,而这一点和Ranking阶段在表现形式上是相同的,对于召回和排序两个阶段来讲,二者都转化成了新增特征问题,因此两个阶段的改进语言体系统一,就不太容易出现上述现象。
上面三点,是我能想到的采用统一召回模型,相对多路召回的几个好处。可是是否是多路召回必定不如统一召回呢?其实也不是,很明显多路召回这种策略,上线一个新召回方式比较灵活,对线上的召回系统影响很小,由于不一样路召回之间没有耦合关系。可是若是采用统一召回,当想新增一种召回方式的时候,表现为新增一种或者几种特征,可能须要彻底从新训练一个新的FM模型,整个召回系统从新部署上线,灵活性比多路召回要差。
上面讲的是必要性,讲完了必要性,咱们下面先探讨如何用FM模型作召回,而后再讨论如何把多路召回改形成单路召回,这实际上是两个不一样的问题。