【推荐系统】FM因子分解机(上)

FM是推荐场景下的排序模型。(由于刚接触,很多概念不明确,分上下两篇来记录。FM因子分解机(下)

什么是FM模型

  • FM背景

在计算广告中,CTR预估(click-through rate)是非常重要的一个环节。对于特征组合来说,业界现在通用的做法主要有两大类:FM系列与Tree系列。

  • one-hote编码带来的问题

FM(Factorization Machine)主要是为了解决数据稀疏的情况下,特征怎样组合的问题。已一个广告分类的问题为例,根据用户与广告位的一些特征,来预测用户是否会点击广告。数据如下:(本例来自美团技术团队分享的paper)

clicked是分类值,表明用户有没有点击该广告。1表示点击,0表示未点击。而country,day,ad_type则是对应的特征。

对于这种categorical特征,一般都是进行one-hot编码处理。将上面的数据进行one-hot编码以后,就变成了下面这样

因为是categorical特征,所以经过one-hot编码以后,不可避免的样本的数据就变得很稀疏。举个非常简单的例子,假设淘宝或者京东上的item为100万,如果对item这个维度进行one-hot编码,光这一个维度数据的稀疏度就是百万分之一。由此可见,数据的稀疏性,是我们在实际应用场景中面临的一个非常常见的挑战与问题。

one-hot编码带来的另一个问题是特征空间变大。同样以上面淘宝上的item为例,将item进行one-hot编码以后,样本空间有一个categorical变为了百万维的数值特征。

  • 对特征进行组合(注:也是FM最重要的point!)

普通的线性模型,我们都是将各个特征独立考虑的,并没有考虑到特征与特征之间的相互关系。但实际上,大量的特征之间是有关联的。最简单的以电商为例,一般女性用户看化妆品服装之类的广告比较多,而男性更青睐各种球类装备。那很明显,女性这个特征与化妆品类服装类商品有很大的关联性,男性这个特征与球类装备的关联性更为密切。如果我们能将这些有关联的特征找出来,显然是很有意义的。

一般的线性模型为:

从上面的式子很容易看出,一般的线性模型压根没有考虑特征间的关联。为了表述特征间的相关性,我们采用多项式模型。在多项式模型中,特征 x_i 与 x_j 的组合 x_ix_j 表示。为了简单起见,我们讨论二阶多项式模型。具体的模型表达式如下:

上式中,n 表示样本的特征数量x_i 表示第 i 个特征。与线性模型相比,FM的模型就多了后面特征组合的部分。

总结:特征组合对于推荐排序是非常非常重要的,而FM这个思路已经很简洁优雅地体现了这个思想了(主要是二阶特征组合)。DNN模型一样离不开这个特点,而MLP结构是种低效率地捕获特征组合的结构,所以即使是深度模型,目前一样还离不开类似FM这个能够直白地直接去组合特征的部分

FM模型:一个角度是从特征组合模型的进化角度来讲;另外一个角度从协同过滤模型的进化角度来讲。FM模型就处于这两类模型进化的交汇口。

  • 从LR到SVM再到FM模型

LR模型是CTR预估领域早期最成功的模型,大多工业推荐排序系统采取LR这种“线性模型+人工特征组合引入非线性”的模式。因为LR模型具有简单方便易解释容易上规模等诸多好处,所以目前仍然有不少实际系统仍然采取这种模式。但是,LR模型最大的缺陷就是人工特征工程,耗时费力费人力资源,那么能否将特征组合的能力体现在模型层面呢

如上图在计算公式里加入二阶特征组合即可,任意两个特征进行组合,可以将这个组合出的特征看作一个新特征,融入线性模型中。而组合特征的权重可以用来表示,和一阶特征权重一样,这个组合特征权重在训练阶段学习获得。其实这种二阶特征组合的使用方式,和多项式核SVM是等价的。虽然这个模型看上去貌似解决了二阶特征组合问题了,但是它有个潜在的问题:它对组合特征建模,泛化能力比较弱,尤其是在大规模稀疏特征存在的场景下,这个毛病尤其突出,比如CTR预估和推荐排序,这些场景的最大特点就是特征的大规模稀疏。所以上述模型并未在工业界广泛采用。那么,有什么办法能够解决这个问题吗?

于是,FM模型此刻可以闪亮登场了。如上图所示,FM模型也直接引入任意两个特征的二阶特征组合,和SVM模型最大的不同,在于特征组合权重的计算方法。FM对于每个特征,学习一个大小为k的一维向量,于是,两个特征 x_i 和 x_j 的特征组合的权重值,通过特征对应的向量 v_i 和 v_j 的内积 <v_i,v_j> 来表示。这本质上是在对特征进行embedding化表征,和目前非常常见的各种实体embedding本质思想是一脉相承的。其实,和目前的各种深度DNN排序模型比,它仅仅是少了2层或者3层MLP隐层,用来直接对多阶特征非线性组合建模而已,其它方面基本相同。

FM模型

那么为什么说FM的这种特征embedding模式,在大规模稀疏特征应用环境下比较好用?为什么说它的泛化能力强呢?参考上图说明。即使在训练数据里两个特征并未同时在训练实例里见到过,意味着 x_i and x_j一起出现的次数为0,如果换做SVM的模式,是无法学会这个特征组合的权重的。但是因为FM是学习单个特征的embedding,并不依赖某个特定的特征组合是否出现过,所以只要特征 x_i 和其它任意特征组合出现过,那么就可以学习自己对应的embedding向量。于是,尽管 x_i and x_j 这个特征组合没有看到过,但是在预测的时候,如果看到这个新的特征组合,因为x_ix_j都能学会自己对应的embedding,所以可以通过内积算出这个新特征组合的权重。这是为何说FM模型泛化能力强的根本原因。

其实本质上,这也是目前很多花样的embedding的最核心特点,就是从0/1这种二值硬核匹配,切换为向量软匹配,使得原先匹配不上的,现在能在一定程度上算密切程度了,具备很好的泛化性能。

一些来自于《美团机器学习实战》的提炼:(ps这书讲的一般吧)

为了防止特征组合后得到的特征矩阵十分稀疏,并且训练样本不足的时候,特征矩阵的稀疏性很容易导致相关参数准确性低,因此通过对二次项参数施加某种限制来减少参数自由度。FM施加的显示就是要求二次项参数矩阵是低秩的,能够分解为低秩矩阵的乘积。

所以二次项参数矩阵 W 就可以分解为 W=V^TV ,V 的第 j 列是第 j 维特征的向量。(下图应该是V 的第 j 行是第 j 维特征的向量)

W_{ij}=<V_i,V_j> 就是FM的核心思想。因为在数据很稀疏的情况下,满足 x_ix_j 都不为0的情况非常少,这样将导致 w_{ij} 无法通过训练得出。

因此FM的模型方程为

\phi _{FM}(w,x)=w_0+\sum_{i=1}^{n}w_ix_i+\sum_{i=1}^{n} \sum_{j=i+1}^{n}<v_i,v_j>x_ix_j

v_i 是 i 维特征的权重向量。隐向量长度为k(k<<n),极大减少模型的参数。

参数因子化使得 x_hx_i 和 x_ix_j 不再是独立的, x_hx_i 和 x_ix_j 的系数分别为 <v_h,v_i> 和 <v_i,v_j> ,共有项 v_i ,即所有包含 x_j 的非零组合特征的样本都可以用来学习隐向量 v_i ,这在很大程度上避免了数据稀疏性造成的影响。

而在多项式模型中,w_{hi} 和 w_{ij} 相互独立的。

上面公式是一个通用的拟合方程,采用不同的损失函数解决分类,二元回归等问题。

  • 从MF到FM模型

MF(Matrix Factorization,矩阵分解)模型是个在推荐系统领域里资格很深的老前辈协同过滤模型了。核心思想是通过两个低维小矩阵(一个代表用户embedding矩阵,一个代表物品embedding矩阵)的乘积计算,来模拟真实用户点击或评分产生的大的协同信息稀疏矩阵,本质上是编码了用户和物品协同信息的降维模型。

当训练完成,每个用户和物品得到对应的低维embedding表达后,如果要预测某个 User_i 对 Item_j 的评分的时候,只要它们做个内积计算 <User_i,Item_j> ,这个得分就是预测得分。看到这里,让你想起了什么吗?

本质上,MF模型是FM模型的特例,MF可以被认为是只有User ID 和Item ID这两个特征Fields的FM模型,MF将这两类特征通过矩阵分解,来达到将这两类特征embedding化表达的目的。而FM则可以看作是MF模型的进一步拓展,除了User ID和Item ID这两类特征外,很多其它类型的特征,都可以进一步融入FM模型里,它将所有这些特征转化为embedding低维向量表达,并计算任意两个特征embedding的内积,就是特征组合的权重

从实际大规模数据场景下的应用来讲,在排序阶段,绝大多数只使用ID信息的模型是不实用的,没有引入Side Information,也就是除了User ID/Item ID外的很多其它可用特征的模型,是不具备实战价值的。原因很简单,大多数真实应用场景中,User/Item有很多信息可用,而协同数据只是其中的一种,引入更多特征明显对于更精准地进行个性化推荐是非常有帮助的。而如果模型不支持更多特征的便捷引入,明显受限严重,很难真正实用,这也是为何矩阵分解类的方法很少看到在Ranking阶段使用,通常是作为一路召回形式存在的原因。

这里是我的个人总结(不一定对):

在LR中,我们学习每一个特征的权重,好让再预测一个新样本时,填入x得到y。但是此时损失了特征与特征间的相互关系,所以FM对特征进行组合,还是按照监督学习这种方法,如果按照LR的老路进行权重 w 的预测,将会面临一个问题:

在 one-hot 后,矩阵大规模稀疏的时候,特征 x_i 与 x_j 的组合 x_ix_j ,会有很多的 x_ix_j 等于 0,那么在给定样本 x 的时候就无法计算出权重了。

为了解决这个问题,FM亮点也在于特征组合权重的计算方法。

我们不是再为每一个特征学习出一个值了,而是为每个特征学习出一个 1\times k 的向量(隐向量)(实质在对特征进行embedding),所以哪怕 x_ix_j=0,也不影响特征组合的权重。

  • FM是学习单个特征的embedding,并不依赖某个特定的特征组合是否出现过,所以只要特征 x_i 和其它任意特征组合出现过,那么就可以学习自己对应的embedding向量。
  • 在预测的时候,如果看到这个新的特征组合,x_ix_j 使用自己训练阶段学习所获得的对应的embedding(1*k的隐向量),所以可以通过内积算出这个新特征组合的权重。

所以特征组合 x_ix_j 的权重为 <v_i \cdot v_j>,这个值呢?这样计算:

两个向量a = [a1, a2,…, an]和b = [b1, b2,…, bn]的点积定义为:a·b=a1b1+a2b2+……+anbn。

-- 但我有个小疑问?

\phi _{FM}(w,x)=w_0+\sum_{i=1}^{n}w_ix_i+\sum_{i=1}^{n} \sum_{j=i+1}^{n}<v_i,v_j>x_ix_j,此时 \sum_{i=1}^{n}w_ix_i这一项的 我w 是值还是向量呢?是值,参考LR。

一张训练数据的图便于更好的理解:

上面x是特征向量,y是用户的评分,我们可以看到用户向量中,对用户id和电影id都进行了one-hot编码,然后还加入了用户的历史行为和时间特征。(看看有多稀疏!!!)


一些扩展(可不看,FM已结束)

工业推荐系统整体架构

一个典型的工业级推荐系统整体架构可以参考上图,一般分为在线部分,近线部分和离线部分。

对于在线部分来说,一般要经历几个阶段。首先通过召回环节,将给用户推荐的物品降到千以下规模;如果召回阶段返回的物品还是太多,可以加入粗排阶段,这个阶段是可选的,粗排可以通过一些简单排序模型进一步减少往后续环节传递的物品;再往后是精排阶段,这里可以使用复杂的模型来对少量物品精准排序。对某个用户来说,即使精排推荐结果出来了,一般并不会直接展示给用户,可能还要上一些业务策略,比如去已读,推荐多样化,加入广告等各种业务策略。之后形成最终推荐结果,将结果展示给用户。

对于近线部分来说,主要目的是实时收集用户行为反馈,并选择训练实例,实时抽取拼接特征,并近乎实时地更新在线推荐模型。这样做的好处是用户的最新兴趣能够近乎实时地体现到推荐结果里。

对于离线部分而言,通过对线上用户点击日志的存储和清理,整理离线训练数据,并周期性地更新推荐模型。对于超大规模数据和机器学习模型来说,往往需要高效地分布式机器学习平台来对离线训练进行支持。

因为粗排是可选的,对于大多数推荐系统来说,通常在线部分的主体分为两个阶段就够,第一个阶段是召回,第二个阶段是排序。因为个性化推荐需要给每个用户展现不同的信息流或者物品流,而对于每个用户来说,可供推荐的物品,在具备一定规模的公司里,是百万到千万级别,甚至上亿。所以对于每一个用户,如果对于千万级别物品都使用先进的模型挨个进行排序打分,明显速度上是算不过来的,资源投入考虑这么做也不划算。从这里可以看出,召回阶段的主要职责是:从千万量级的候选物品里,采取简单模型将推荐物品候选集合快速筛减到千级别甚至百级别,这样将候选集合数量降下来,之后在排序阶段就可以上一些复杂模型,细致地对候选集进行个性化排序。

从上面在线推荐两阶段任务的划分,我们可以看出,召回阶段因为需要计算的候选集合太大,所以要想速度快,就只能上简单模型,使用少量特征,保证泛化能力,尽量让用户感兴趣的物品在这个阶段能够找回来;而排序阶段核心目标是要精准,因为它处理的物品数据量小,所以可以采用尽可能多的特征,使用比较复杂的模型,一切以精准为目标。

多路召回怎么做

目前工业界推荐系统的召回阶段一般是怎么做的呢?这句话就是:“一只穿云箭,千军万马来相见”。如果和推荐系统对应起来理解,这里的“穿云箭”就是召回系统,而千军万马就是各路花式召回策略。

目前工业界的推荐系统,在召回阶段,一般都采取多路召回策略。上图展示了一个简化版本的例子,以微博信息流排序为例,不同业务召回路数不太一样,但是常用的召回策略,基本都会包含,比如兴趣标签,兴趣Topic,兴趣实体,协同过滤,热门,相同地域等,多者几十路召回,少者也有7/8路召回。

对于每一路召回,会拉回K条相关物料,这个K值是个超参,需要通过线上AB测试来确定合理的取值范围。如果你对算法敏感的话,会发现这里有个潜在的问题,如果召回路数太多,对应的超参就多,这些超参组合空间很大,如何设定合理的各路召回数量是个问题。另外,如果是多路召回,这个超参往往不太可能是用户个性化的,而是对于所有用户,每一路拉回的数量都是固定的,这里明显有优化空间。按理说,不同用户也许对于每一路内容感兴趣程度是不一样的,更感兴趣的那一路就应该多召回一些,所以如果能把这些超参改为个性化配置是很好的,但是多路召回策略下,虽然也不是不能做,但是即使做,看起来还是很Trick的。有什么好办法能解决这个问题吗?


第一个问题:我们知道在个性化推荐系统里,第一个环节一般是召回阶段,而召回阶段工业界目前常规的做法是多路召回,每一路召回可能采取一个不同的策略。那么打破常规的思考之一是:是否我们能够使用一个统一的模型,将多路召回改造成单模型单路召回策略?如果不能,那是为什么?如果能,怎么做才可以?这样做有什么好处和坏处?

第二个问题:我们同样知道,目前实用化的工业界的推荐系统通常由两个环节构成,召回阶段和排序阶段,那么为什么要这么划分?它们各自的职责是什么?打破常规的另外一个思考是:是否存在一个模型,这个模型可以将召回阶段和排序阶段统一起来,就是把两阶段推荐环节改成单模型单环节推荐流程?就是说靠一个模型一个阶段把传统的两阶段推荐系统做的事情一步到位做完?如果不能,为什么不能?如果能,怎么做才可以?什么样的模型才能担当起这种重任呢?而在现实世界里是否存在这个模型?这个思路真的可行吗?

参考:

推荐系统召回四模型之:全能的FM模型 - 张俊林的文章 - 知乎

FM算法详解

CTR 预估之 FM (图片还挺有助于理解的)

发布了316 篇原创文章 · 获赞 96 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/weixin_31866177/article/details/105185037