CTR预估算法(浅层模型)

1. 发展

在CTR预估中,Logistic Regression应该是最早被应用而且应用最广泛的模型了。输入是one-hot之后的特征,输出是点击广告的概率。对于类别型特征,one-hot之后,每一个取值都变成了一维新的特征。线性模型有一个致命的缺点:对于每一个维度特征权重的学习是独立的,很难有效的学习到组合特征的权重。

为了解决这个问题,相继提出了改进模型Poly2和FM。Poly2又叫做degree-2 polynomial mappings,它对于每一对组合特征都会学习一个权重,从名字上应该能看出来,最高考虑2维组合特征;FM则是通过把特征组合分解成两个隐向量的内积来学习组合特征的权重,理论上可以提取任意高维组合特征,但是出于计算复杂度的考虑,实际往往也只是到2维组合特征。

关于FM,在CTR预估系列的第四篇文章中我们会给出详细介绍,敬请期待~

FFM全称是Field-aware Factorization Machines,是从PITF(pairwise interaction tensor factorization)改进而来的。PITF限制了特征维度为User、Item、Tag这三个维度,而且主要关注的问题是个性化标签推荐。FFM去掉了对于特征维度的限制,并且专注于CTR预估问题,更加泛化通用。这也是两者间仅有的区别。

2. 理论公式

CTR预估模型中,LR,FM,FFM的目标函数或者说是损失函数,都可以统一为:

包括两部分:正则项 + 经验损失。经验损失用的是logistic loss.

对于线性模型有:

决策函数为:

对于FM有:

对于FFM有:


其中,j1, j2表示特征维度,f1, f2分别表示j1, j2所属的field。

公式有点多,是不是有点乱?没关系,让我们来理一理!

首先,为了简单,上面公式中省略了常数项和一次项。
其次,我们知道统计学习三要素:模型+策略+算法,模型就是要学习的条件概率分布或决策函数。由决策函数表示的模型为非概率模型,由条件概率分布表示的模型为概率模型。我们可以认为上面的函数就是决策函数,针对不同的模型线性模型、Poly2、FM、FFM,决策函数自然也不同。。里面的x对应一条样本,x的下标表示该条样本中,不同维度特征的取值。
最后,我们的目标函数就是最小化:正则项 + logistic_loss。其中logistic_loss自然就和模型的决策函数有关了。

3. 思想

3.1 Poly2

对于Poly2:

  1. 相比于kernel method,训练时间要短

  2. 为每一个组合特征都学习一个权重。特征权重之间是独立

  3. 又叫做degree-2 polynomial mapping,多项式线性模型,主要是2维组合特征

决策函数为

Poly2最naive的版本,认为每一对组合特征都是一个新特征。但是这样模型大小是O(n^2),模型太大了无法学习。
Vowpal Wabbit (VW)是一个库,通过对j1和j2做hash,解决了这个问题。

换句话说,函数h(j1,j2)是一个Hash函数。作用是将j1和j2,映射到一个合理的自然数上。为什么会有这样奇怪的举动那?原因是:CTR问题的输入维度一般比较高,Poly2考虑所有的2维组合特征,为每个组合特征都要学习一个权重,这个维度是O(n^2)。所以我们把原来的维度通过Hash,转换到一个合理的维度范围,再进行学习。

VW和FFM中实现的Hash函数如下:

3.2 FM

这里简单介绍下,详细介绍CTR系列后续文章会更新,敬请关注

FM的做法:

  1. 为每一维特征都学习一个隐向量

  2. 每一个隐向量都包含k个latent factors。k是人为设定的超参数

  3. 每一个组合特征对于最终预测结果的影响,或者说权重,都通过对应的隐向量的内积来表示

FM的论文里有提到,FM效果比Poly2要好的原因,个人认为这也是FM的核心所在:
最主要的原因可以说是样本不够充分造成的。 有人会说,CTR问题的训练集一般很大,样本怎么会不够用那?输入数据one-hot之后,维度会很高,而且非常稀疏,相比之下样本数量就没那么多了。

举个例子,假设这是我们的训练数据:

具体来说,原因有两点:

1, 样本不充分。 Poly2学习到的权重不准确。

在ESPN的广告中,Adidas的样本只有一个,预测结果是-1。那么Poly2对于这个组合特征会学到一个非常大的负的权重 . 因为只有这一个样本,而且label是-1. 模型就认为只要这个pair出现,那么基本上预测结果就是-1, 所以对应的weights会是一个非常大的负值。
但是,FM不同,对于样本(ESPN,阿迪)的预测,是由两个向量决定的:W_espn * W_adidas 。 而这两个向量,可以单独的去从其他的pair中学习,比如(ESPN,Nike), (BBC, Adidas). 所以FM这样学习的更加准确。
也就是说,样本的不充分会导致Poly2学习的权重不准确,而FM的会更加准确。

2,样本中根本没有出现这个组合特征。 Poly2学习不到权重。

比如(NBC, Gucci)这一对样本取值,在给出的训练集上根本就没有。
Poly2会什么都学不到,或者认为weights是0,所以给出的预测也就没有意义。但是FM不同,可以单独的从其他的pair中学习到W_nbc, W_gucci 所以FM仍然可以给出有意义的预测。
这里面的关键在于:Poly2中对于每个组合特征的权重是独立的,比如和其他的任何权重都没有关系,他们是相互独立的,你无法从其他的权重中得到关于的任何信息。

FM中组合特征的权重不再是独立的,比如,它是由两部分组成的 V_NBC, V_Gucci。虽然(NBC, Gucci)没有这个样本。但是可以从包含NBC的其他样本中学习到V_NBC, 从包含Gucci的其他样本中学习到V_Gucci。那么就可以估计出(NBC, Gucci)的权重了。
这也更加符合逻辑。(NBC,Gucci)和(NBC,Adidas)都含有NBC,所有他们的权重应该是有一些联系,而不应该是完全独立的。

3.3 FFM

3.3.1 FFM模型—思想

FFM是从PITF改进来的,后者用于推荐系统中的个性化标签。

PITF起初是应用在推荐系统中的,开始只考虑三个维度的特征:User、Tag、Item。并且在三个不同的latent space学习了组合特征:(User,Tag),(User, Item), (Tag, Item). 后来又加上了更多的特征:AdId, UserId, QueryId等,并且也被应用于CTR。但是,PITF的目标毕竟还是推荐系统,而且限制特征维度为User Tag Item这三个维度。

所以,FFM应运而生!

CTR大部分的数据集的 特征都可以被分组到field中。FFM就是在FM的基础上利用了这些分组的信息。

举例来说,假设训练集只有一条训练样本:

FM模型的决策函数是:

注意:这里不要写成 
这关乎到FM中一个重要的问题,隐向量矩阵V到底表示的是什么?
V的一行表示一个特征,但是这个特征是one-hot之后的,上表中给出的是one-hot之前的。也就是说,one-hot之后,之前那些取值比如:ESPN Nike Male都变成了特征,他们一个取值就是一个维度!!惊不惊喜,意不意外!那么FM学习的就是每个取值(每个维度)的隐向量,所以这里要这么写。

在FM中,对于任意一个特征维度,比如ESPN,它只有一个latent vector。 无论是在(ESPN, Nike),还是(ESPN,Male)都用同一个latent vector。但是Nike Male属于不同的field,所以可能需要使用不同的latent vector。

这就是FFM的出发点:每一个特征,针对不同的field使用不同的latent vector.

FFM函数的决策函数是:

在FFM中,特征ESPN不再是一个latent vector用到底,而是针对Field A和Field G使用不同的隐向量来计算。因为隐向量变多了,所以隐向量的维度会远远小于FM的。

3.3.2 FFM模型—方程

根据FFM对Field敏感的特性,可以导出其模型方程为:

其中,fj是第j个特征所属的field,fi是第i个特征所属的field。如果隐向量的维度是k,field的个数是f,那么FFM的参数个数是nfk。FFM的二次项并不能化简,计算复杂度就是O(kn^2)

3.3.3 FFM模型—学习算法

FFM模型使用logistic loss作为损失函数,加上L2惩罚项,因此只能用于二分类。损失函数:

其中,yi是-1,+1表示label,L是样本数量,lambda是惩罚项系数。模型采用SGD优化,优化流程如下:

tr,va,pa分别是训练样本集,验证样本集,参数设置。流程如下:

  1. 根据样本特征数量(tr.n),样本field数量(tr.m),以及参数pa来初始化model。也就是随机的生成模型的参数

  2. 如果pa.norm为真,就对训练集tr和验证集va,在样本维度进行归一化。也就是除以每个样本的模

  3. 对每一轮迭代,如果pa.rand为真,就先打乱训练集tr的顺序。一共迭代pa.itr轮

  4. 训练集中每一个样本执行如下操作:

    1. 根据模型当前参数,计算当前样本FFM的输出项f(x)

    2. 使用交叉熵损失函数,计算当前样本的损失 log(1 + exp(-y*f(x)))

    3. 利用单个样本的损失函数,计算梯度,再根据梯度来更新模型参数

  5. 对于验证集每一个样本,计算FFM输出和损失

  6. 重复3~5,直到到达设置迭代轮数,或验证误差达到最小

为了加快SGD算法的速度,FFM的实现中采用了如下四种优化

  1. 梯度分布计算。


    损失函数求导中,这一部分和单个W无关,可以只计算一次,之后更新每一个W的时候都用这一个值。W参数的个数为nfk,这样做可以极大的减少运算量。

  2. AdaGrad自适应调整学习速率。

    普通的SGD调整学习率用指数递减,而FFM是参考AdaGrad来更新的。

    其中,Wj1,f2是特征j1针对field f2的隐向量的一个因素(k中的一个,为了简单k维度的下标未给出)。t表示每一轮的迭代。从式子中可以看出,随着迭代的进行,不断的累积梯度,使得学习速率逐渐下降。但是,每个参数学习速率的更新速度是不同的,与其历史梯度有关。根据AdaGrad的特点,对于样本比较稀疏的特征,学习速率要大于样本比较密集的特征。所以参数可以较快速达到最优,又不会造成损失误差的大幅震荡。

  3. OpenMP多核并行计算。

    OpenMP基于共享内存实现多核并行计算。FFM并行化的点:在上面算法的第四步,对每一个样本点执行,求FFM输出,求损失,求梯度,更新梯度模型参数。是在样本层面的并行化

  4. SSE指令集加快向量内积运算。

    SSE是CPU对数据层并行的关键指令,常用于多媒体和游戏的应用程序中。FFM中有大量的向量运算,采用SSE来加快向量内积的运算速度,对模型训练非常有利。

3.3.4 FFM模型—多值类别型特征

原始的FFM模型建模时,对于离散特征做one-hot处理,这样同一个样本,同一个field只会有一个特征取值为1,其余的都是0.
但是,当原始的离散特征取值有多个时,该怎么处理那?比如:

对于Genre这一个类别型变量来说,一条样本中它可能有多个取值。我们的做法是:依旧认为他们属于同一个Field,但是属于不同的特征
对于上述训练集,我们会得到5个特征,其中Genre=ComedyGenre=Drame是属于同一个Field的两个不同特征维度。FFM要求我们对field进行编号,然后对feature进行编号。这两个编号是单独进行的。Price是连续型数值,不用one-hot。如下:

对应的FFM输出为:

下标中,蓝色对应feature编号,红色对应field编号。绿色是特征取值。

4. 各模型计算复杂度


FFM是计算复杂度最高的。FM很好的平衡了计算开销和效果。其实这是一个trade off。

5. 优缺点

FFM优点:
细化隐向量的表示,同一特征针对不同field使用不同隐向量,模型建模更加准确

FFM缺点:
计算复杂度比较高,参数个数为nfk,计算复杂度为O(k * n^2)

6. 使用FFM需要注意的地方

  1. 样本归一化。即pa.norm为真,对样本进行归一化,否则容易造成数据溢出,梯度计算失败。

  2. 特征归一化。为了消除不同特征取值范围不同,量纲不同造成的问题,需要对特征进行归一化。

  3. Early stopping。一定要设置早停策略,FFM很容易过拟合。

  4. 省略零值特征。零值特征对模型没有任何贡献,无论是1次项还是2次项都为0。这也是系数样本采用FFM的显著优势。

 

 

1. CTR预估

CTR预估数据特点

  1. 输入中包含类别型和连续型数据。类别型数据需要one-hot,连续型数据可以先离散化再one-hot,也可以直接保留原值

  2. 维度非常高

  3. 数据非常稀疏

  4. 特征按照Field分组

CTR预估重点在于学习组合特征。注意,组合特征包括二阶、三阶甚至更高阶的,阶数越高越复杂,越不容易学习。Google的论文研究得出结论:高阶和低阶的组合特征都非常重要,同时学习到这两种组合特征的性能要比只考虑其中一种的性能要好。

那么关键问题转化成:如何高效的提取这些组合特征。一种办法就是引入领域知识人工进行特征工程。这样做的弊端是高阶组合特征非常难提取,会耗费极大的人力。而且,有些组合特征是隐藏在数据中的,即使是专家也不一定能提取出来,比如著名的“尿布与啤酒”问题。

2. 模型演进历史

2.1 线性模型

线性模型最大的缺点就是无法提取高阶的组合特征,依赖于人工的特征组合,这也直接使得它表达能力受限,基本上只能处理线性可分或近似线性可分的问题。。所以常用的做法是人为的加入pairwise feature interactions。即使是这样:对于那些出现很少或者没有出现的组合特征以及高阶组合特征依旧无法提取。

2.2 FM模型

FM模型通过对于每一维特征的隐变量(latent vector)内积来提取特征组合,从理论上解决了低阶和高阶组合特征提取的问题。但是实际应用中受限于计算复杂度,一般也就只考虑到2阶交叉特征。那么对于高阶的特征组合来说,可以通过多层的神经网络即DNN去解决。

线性模型:思路及问题

线性模型:xi是某个特征值,目标是给每个特征学习一个对应的权重:wi,最终的模型预测值是所有的特征值乘以对应权重的和。

线性模型取值范围可以无限大,不可控,LR在线性模型基础上,通过S形sigmoid函数把它压到0和1之间,所以LR为广义线性模型。

线性模型优点:简单,速度快,解释性好,易扩展。缺点:没有考虑特征间的关系,不能够捕获特征组合。

线性模型改进:加入特征组合

在线性模型的的基础上,任意两个特征的组合当作一个新特征可以把组合特征显式地、简单的揉进了这个公式,它的优点是:现在能够捕获两两特征组合。但改过来的模型本质是SVM,其缺点是特征组合的泛化能力弱,需进一步对其进行修改。

FM模型

FM将权重wi,j,换成了vi和vj的点积。vi是:对于xi这个特征来说它会学到一个embedding向量,特征组合权重是通过两个单特征各自的embedding的内积呈现的,因为它内积完就是个数值,可以代表它的权重。

SVM泛化能力弱,FM的泛化能力强。

 

 

 

 

FM模型

因子分解机(Factorization Machine,简称FM)主要是为了解决高维数据稀疏的情况下,特征怎样组合的问题。高维稀疏数据:通过引入隐向量(对参数矩阵进行矩阵分解),完成对特征的参数估计;特征组合:通过对两两特征组合,引入交叉项特征,提高模型表达能力。所以,FM模型在高度稀疏的条件下能够更好地挖掘数据特征间的相关性,尤其是对于在训练样本中没出现的交叉数据;而且FM在计算目标函数和在随机梯度下降做优化学习时都可以在线性时间内完成。

在传统的线性模型中,每个特征都是独立的,如果需要考虑特征与特征之间的相互作用,可能需要人工对特征进行交叉组合。非线性SVM可以对特征进行核变换,但是在特征高度稀疏的情况下,并不能很好的进行学习。由于推荐系统是一个高度系数的数据场景,由此产生了FM系列算法,包括FM,FFM,DeepFM等算法。

逻辑回归无法学习到特征间的组合关系,而特征组合关系在推荐和CTR预估中却是比较常见的。在进行点击率预估时,特征通常来自于用户、广告和上下文环境,如果没有对一这些特征进行组合,模型就无法学习到所有有用的信息。例如,同一个用户在不同时间或者地点感兴趣的广告是不同的;同一件商品在不同地区的受欢迎程度也是不同的。但人工对特征组合需要做大量的特征工程工作,对特征做暴力组合模型又太复杂、参数太多。模型训练迭代无论是内存开销还是时间开销都计人很难接受,迭代效果往往一也比较差。因子分解机和场感知因子分解机是可以自动做特征组合,并且算法效率比较高的模型。

 利用模型来做特征组合,我们很容易想到使用支持向量机的核函数来实现特征之间的交叉。但是多项式核函数的问题就是二次参数过多。设特征维数为n,则二次项的参数数 ,特别是某些广告ID、用户ID类特征,其特征维数可能达到几百万维,这导致只有极少数的二阶组合模式才能找到,所以这些特征组合后得到的特征矩阵就是十分稀疏。而在训练样本不足的时候,特征矩阵的稀疏性很容易导致相关参数准确性较低,导致模型效果不好。而我们可以通过对二次项参数施加某种限制来减少参数的自由度。

one-hot编码带来的问题

以广告CTR为例,根据用户与广告位的一些特征,预测用户是否会点击广告。clicked是label,1点击,0未点击。country,day,ad_type是样本的特征。对于类别特征,一般进行one-hot编码。

one-hot编码会使低维稠密矩阵变为高维的稀疏矩阵,样本特征空间变大,而且数据变得非常稀疏,直接导致计算量过大,特征权值更新缓慢。

对特征进行组合

在进行CTR预估时,除了单特征外,往往要对特征进行组合。如果对原始特征直接建模,很有可能会忽略掉特征与特征之间的关联信息。以电商为例,一般女性用户看化妆品服装之类的广告比较多,而男性更青睐各种球类装备。那很明显,女性这个特征与化妆品类服装类商品有很大的关联性,男性这个特征与球类装备的关联性更为密切。因此,可以通过构建新的交叉特征这一特征组合方式提高模型的效果。如果我们能将这些有关联的特征找出来,显然是很有意义的。

在传统的线性模型如LR中,每个特征都是独立的,没有考虑到特征与特征之间的相互关系,如果需要考虑特征与特征直接的交互作用,需要人工对特征进行交叉组合,但是,LR模型最大的缺陷就是人工特征工程,耗时费力,那么能否将特征组合的能力体现在模型层面呢;非线性SVM可以对特征进行kernel映射,但是在特征高度稀疏的情况下,并不能很好地进行学习;比如为了表述特征间的相关性,采用多项式模型,对任意两个特征进行组合,在多项式模型中,特征xi与xj的组合用xixj表示。二阶多项式模型表达式如下:

为二阶多项式模型的二阶特征组合和多项式核SVM是等价的。解决了二阶特征组合问题了,但它对组合特征建模,当存在大规模稀疏特征时泛化能力比较弱。

FM

    二元交叉的FM(2-way FM)目标函数如下:

    其中,w是输入特征的参数,<vi,vj>是输入特征i,j间的交叉参数,v是k维向量。FM表达式的求解核心在于对交叉项的求解。

组合部分的特征相关参数共有n(n−1)/2个。在数据很稀疏的情况下,满足xi,xj都不为0的情况非常少,这样将导致ωij无法通过训练得出。为了求出ωij,我们对每一个特征分量xi引入辅助向量Vi=(vi1,vi2,⋯,vik)。然后,利用vivj^T对ωij进行求解。


FM模型也直接引入任意两个特征的二阶特征组合,和SVM模型最大的不同,在于特征组合权重的计算方法FM对于每个特征,学习一个大小为k的一维向量,本质上是在对特征进行embedding化表征。于是,两个特征  和  的特征组合的权重值,通过特征对应的向量  和 的内积  来表示。FM模型和目前的各种深度DNN排序模型比,它仅仅是少了2层或者3层MLP隐层,用来直接对多阶特征非线性组合建模,其它方面基本相同。

FM的这种特征embedding模式,在大规模稀疏特征应用环境下效果较好,泛化能力强。因为即使在训练数据里两个特征并未同时在训练实例里见到过,即  一起出现的次数为0,如果换做SVM的模式,是无法学会这个特征组合的权重的。但是因为FM是学习单个特征的embedding,并不依赖某个特定的特征组合是否出现过,所以只要特征  和其它任意特征组合出现过,那么就可以学习自己对应的embedding向量。于是,尽管  这个特征组合没有看到过,但是在预测的时候,如果看到这个新的特征组合,因为  和  都能学会自己对应的embedding,所以可以通过内积算出这个新特征组合的权重。这是FM模型泛化能力强的根本原因。其实本质上,这也是目前很多embedding的最核心特点,就是从0/1这种二值硬核匹配,切换为向量软匹配,使得原先匹配不上的,现在能在一定程度上算密切程度了,具备很好的泛化性能。

为什么要通过向量v的学习方式而不是简单的wij参数呢?

这是因为在稀疏条件下,这样的表示方法打破了特征的独立性,能够更好地挖掘特征之间的相关性。以上述电影为例,我们要估计用户A和电影ST的关系w(A&ST)以更好地预测y,如果是简单地考虑特征之间的共现情况来估计w(A&ST),从已有的训练样本来看,这两者并没有共现,因此学习出来的w(A&ST)=0。而实际上,A和ST应该是存在某种联系的,从用户角度来看,A和B都看过SW,而B还看过ST,说明A也可能喜欢ST,说明A很有可能也喜欢ST。而通过向量v来表示用户和电影,任意两两之间的交互都会影响v的更新,从前面举的例子就可以看过,A和B看过SW,这样的交互关系就会导致v(ST)的学习更新,因此通过向量v的学习方式能够更好的挖掘特征间的相互关系,尤其在稀疏条件下。

简单谈谈算法的效率问题

从FM的原始数学公式看,因为在进行二阶(2-order)特征组合的时候,假设有n个不同的特征,那么二阶特征组合意味着任意两个特征都要进行交叉组合,时间复杂度是O(k*n^2)。通过数学公式的巧妙转化可以变成O(kn)。利用了2xy = (x+y)^2 – x^2 – y^2的思路。

对于一个实用化模型来说,效果是否足够好只是一个方面,计算效率是否够高也很重要,在数据量特别大的情况下,如果在效果好和速度快之间做选择,很多时候跑得快的简单模型会胜出,这是为何LR模型在CTR预估领域一直被广泛使用的原因。

而FFM模型则是反例,作为排序模型,效果确实是要优于FM模型的,但是FFM模型对参数存储量要求太多,以及无法能做到FM的运行效率,如果中小数据规模做排序没什么问题,但是数据量一旦大起来,对资源和效率的要求会急剧升高,这是严重阻碍FFM模型大规模数据场景实用化的重要因素。现在很多效果好的DNN排序模型,考虑到运算效率问题,其实不具备实用价值,算起来太复杂,效果好得又很有限,超大规模训练或者在线 Serving速度根本跟不上。如果你原始线上版本是LR做升级方案,我给的建议会是这个序列:LR—>FM-->Wide&Deep->DeepFM—>干点其他的。

如何优化FM的计算效率

FM被广泛采用并成功替代LR模型的一个关键所在是:它可以通过数学公式改写,把表面貌似是  的复杂度降低到  ,其中n是特征数量,k是特征的embedding size,这样就将FM模型改成与LR类似和特征数量n成线性规模的时间复杂度了

FM公式是怎么改写的那么,如何求解vi和vj呢?主要采用了公式:

\large \begin{aligned} & \sum_{i=1}^{n} \sum_{j=i+1}^{n}\left\langle\mathbf{v}_{i}, \mathbf{v}_{j}\right\rangle x_{i} x_{j} \\=& \frac{1}{2}\left(\sum_{i=1}^{n} \sum_{j=1}^{n}\left\langle\mathbf{v}_{i}, \mathbf{v}_{j}\right\rangle x_{i} x_{j}-\sum_{i=1}^{n}\left\langle\mathbf{v}_{i}, \mathbf{v}_{i}\right\rangle x_{i} x_{i}\right) \\=& \frac{1}{2}\left(\sum_{i=1}^{n} \sum_{j=1}^{n} \sum_{f=1}^{k} v_{i, f} v_{j, f} x_{i} x_{j}-\sum_{i=1}^{n} \sum_{f=1}^{k} v_{i, f} v_{i, f} x_{i} x_{i}\right) \\=& \frac{1}{2} \sum_{f=1}^{k}\left(\left(\sum_{i=1}^{n} v_{i, f} x_{i}\right)\left(\sum_{j=1}^{n} v_{j, f} x_{j}\right)-\sum_{i=1}^{n} v_{i, f}^{2} x_{i}^{2}\right) \\=& \frac{1}{2} \sum_{f=1}^{k}\left(\left(\sum_{i=1}^{n} v_{i, f} x_{i}\right)^{2}-\sum_{i=1}^{n} v_{i, f}^{2} x_{i}^{2}\right) \end{aligned}

第一步:改变求和的上下标后,会多两个东西,1、原来没有<Vi,Vi>,现在要把它去掉;2、原来<Vi,Vj>和<Vj,Vi>算作一项,现在要乘1/2

第二步:Vi和Vj是K维向量,把点积公式展开

第三步:把k维向量共同的点积部分提取到外部

第四步:两个不同的下标i和j,求和后值相同,所以可以合并为一个下标,乘积改为平方项

于是,通过上述四步的公式改写,FM模型时间复杂度就降低到了 了,n还有点大,但是推荐数据的特征值是极为稀疏的,大量xi取值是0,真正需要计算的特征数n是远远小于总特征数目n的,这会进一步极大加快FM的运算效率。

经过这样的分解之后,我们就可以通过随机梯度下降SGD进行求解:

FM目标函数可以在线性时间内完成,那么对于大多数的损失函数而言,FM里面的参数w和v更新通过随机梯度下降SGD的方法同样可以在线性时间内完成,比如logit loss,hinge loss,square loss,模型参数的梯度计算如下:对于常数项、一次项、交叉项的导数分别为:

模型延伸:多元交叉

    前面提到到都是二元交叉,其实可以延伸到多元交叉,目标函数如下:(看起来复杂度好像很高,其实也是可以在线性时间内完成的)

隐向量v就是embedding vector?

假设训练数据集dataMatrix的shape为(20000,9),取其中一行数据作为一条样本i,那么样本i 的shape为(1,9),同时假设隐向量vi的shape为(9,8)(注:8为自定义值,代表embedding vector的长度)

可以看到,样本i 经过交叉项中的计算后,得到向量shape为(1,8)。

由于维度变低,所以此计算过程可以近似认为在交叉项中对样本i 进行了embedding vector转换。

故,我们需要对之前的理解进行修正:

  1. 我们口中的隐向量vi实际上是一个向量组,其形状为(输入特征One-hot后的长度,自定义长度);
  2. 隐向量vi代表的并不是embedding vector,而是在对输入进行embedding vector的向量组,也可理解为是一个权矩阵;
  3. 由输入i*vi得到的向量才是真正的embedding vector。

https://www.cnblogs.com/wkang/p/9588360.html

从MF到FM模型

Matrix Factorization基本原理

MF(Matrix Factorization,矩阵分解)核心思想是通过两个低维小矩阵(一个代表用户embedding矩阵,一个代表物品embedding矩阵)的乘积计算,来模拟真实用户点击或评分产生的大的协同信息稀疏矩阵,本质上是编码了用户和物品协同信息的降维模型。

当训练完成,每个用户和物品得到对应的低维embedding表达后,如果要预测某个  对  的评分的时候,只要它们做个内积计算  ,这个得分就是预测得分。

MF和FM本质思想上有很多相同点。Matrix Factorization到FM的转换

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

FM继承了MF的特征embedding化表达这个优点,同时引入了更多Side information作为特征,将更多特征及Side information embedding化融入FM模型中。所以很明显FM模型更灵活,能适应更多场合的应用范围。

其一:在你有使用MF做协同过滤的想法的时,可以优先考虑引入FM,因为可以在实现等价功能的基础上,很方便地融入其它任意你想加入的特征,扩展性更好。

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

1、FM 对比 SVM

SVM的线性模型函数表示为:

2)FM 对比 SVM

    看到上面的式子,是不是觉得跟FM特别像?SVM和FM的主要区别在于,SVM的二元特征交叉参数是独立的,如wij,而FM的二元特征交叉参数是两个k维的向量vi、vj,这样子的话,<vi,vj>和<vi,vk>就不是独立的,而是相互影响的。

    为什么线性SVM在和多项式SVM在稀疏条件下效果会比较差呢?线性svm只有一维特征,不能挖掘深层次的组合特征在实际预测中并没有很好的表现;而多项式svn正如前面提到的,交叉的多个特征需要在训练集上共现才能被学习到,否则该对应的参数就为0,这样对于测试集上的case而言这样的特征就失去了意义,因此在稀疏条件下,SVM表现并不能让人满意。而FM不一样,通过向量化的交叉,可以学习到不同特征之间的交互,进行提取到更深层次的抽象意义。

    此外,FM和SVM的区别还体现在:1)FM可以在原始形式下进行优化学习,而基于kernel的非线性SVM通常需要在对偶形式下进行;2)FM的模型预测是与训练样本独立,而SVM则与部分训练样本有关,即支持向量。

https://www.cnblogs.com/AndyJee/p/7879765.html

这里需要强调下改写之后的FM公式的第一个平方项,怎么理解这个平方项的含义呢?这里其实蕴含了后面要讲的使用FM模型统一多路召回的基本思想,所以这里特殊提示一下。

参考上图,你体会下这个计算过程。它其实等价于什么?

这个平方项,它等价于将FM的所有特征项的embedding向量累加,之后求内积。我再问下之前问过的问题:“我们怎样利用FM模型做统一的召回?”这个平方项的含义对你有启发吗?你可以仔细想想它们之间的关联。

因子分解机施加的限制就是要求二次项参数矩阵是低秩的,能够分解为低秩矩阵的乘积。所有。换句话说,就是因子分解机模型的核心思想。因此因子分解机的模型方程为:

其中,vi是i维特征的权重向量,<·,·)代表向量点积。隐向量长度为k(一般设置在100以内,k<<n,极大减少模型的参数。但参数因子化使得xhx‘和xixj不一再是相互独立的,xhx‘和xixj的系数分别为(vn, vi>和(二‘Wi),它们有共同项vi也就是说,所有包含xj的非零组合特征的样本都可以用来学习隐向量vi,这在很大程度上避免了数据稀疏性造成的影响。而在多项式模型中,w。‘和Wi,是相互独立的。显而易见,上面公式是一个通用的拟合方程,可以采用不同的损失函数用于解决分类、二元回归等问题,比如可以采用均方误差损失函数来求解回归问题,也司一以采用Hinge/Cross-Enn}opy损失来求解分类问题。在进行二元分类时,因子分解机输出需要经过Sigmoid变换,这与逻辑回归是一样的直观上因子分解机每次迭代都需要计算}i=1界i+lwu vj )xixj ,
 


FFM模型

FFM(Field-aware Factorization Machine),能意识到特征域(Field)存在的FM模型。通过引入field的概念,FFM把相同性质的特征归于同一个field,相当于把FM中已经细分的feature再次进行拆分进行特征组合。

在上面的广告点击案例中,“Day=26/11/15”、“Day=1/7/14”、“Day=19/2/15”这三个特征都是代表日期的,可以放到同一个field中。同理,Country也可以放到一个field中。简单来说,同一个categorical特征经过One-Hot编码生成的数值特征都可以放到同一个field,包括用户国籍,广告类型,日期等等。

在FFM中,每一维特征 xi,针对其它特征的每一种field fj,都会学习一个隐向量 v_i,fj。因此,隐向量不仅与特征相关,也与field相关。也就是说,“Day=26/11/15”这个特征与“Country”特征和“Ad_type"特征进行关联的时候使用不同的隐向量,这与“Country”和“Ad_type”的内在差异相符,也是FFM中“field-aware”的由来。

假设样本的 n个特征属于 f个field,那么FFM的二次项有 nf个隐向量。而在FM模型中,每一维特征的隐向量只有一个。FM可以看作FFM的特例,是把所有特征都归属到一个field时的FFM模型。根据FFM的field敏感特性,可以导出其模型方程。

可以看到,如果隐向量的长度为 k,那么FFM的二次参数有 nfk 个,远多于FM模型的 nk个。此外,由于隐向量与field相关,FFM二次项并不能够化简,其预测复杂度是 O(kn^2)。

下面以一个例子简单说明FFM的特征组合方式。输入记录如下:

这条记录可以编码成5个特征,其中“Genre=Comedy”和“Genre=Drama”属于同一个field,“Price”是数值型,不用One-Hot编码转换。为了方便说明FFM的样本格式,我们将所有的特征和对应的field映射成整数编号。

那么,FFM的组合特征有10项,如下图所示。

其中,红色是field编号,蓝色是特征编号。

2、FFM实现细节

这里讲得只是一种FFM的实现方式,并不是唯一的。

损失函数
FFM将问题定义为分类问题,使用的是logistic loss,同时加入了正则项

逻辑回归其实是有两种表述方式的损失函数的,取决于你将类别定义为0和1还是1和-1。大家可以参考下下面的文章:https://www.cnblogs.com/ljygoodgoodstudydaydayup/p/6340129.html。当我们将类别设定为1和-1的时候,逻辑回归的损失函数就是上面的样子。

举广告CTR的例子:包含三个特征域(Field):投放广告的网站Publisher(特征值ESPN、Vogue、NBC),广告主Advertiser(特征值Nike、Adidas、Gucci),用户性别特征Gender(特征值Male、Female)。由这个例子可以看出组合特征的重要性:如果在体育网站ESPN上发布Nike的广告,那么100次展现,80次会被点击,而20次不会被点击。意味着组合特征(Publisher=”ESPN” and Advertiser=”Nike”)是个很强的预测用户是否点击的二阶组合特征。

FM模型在做二阶特征组合的时候,对于每个二阶组合特征的权重,是根据对应两个特征的Embedding向量内积,来作为这个组合特征重要性的指示。当训练好FM模型后,每个特征都可以学会一个特征embedding向量,参考上图。当做预测的时候,比如我们接收到上面例子的数据,需要预测用户是否会点击这条广告,则对三个特征做两两组合,每个组合特征的权重,可以根据两个对应的特征embedding内积求得,对所有组合特征求和后,套接Sigmoid函数即可做出二分类预测。

对于FM模型来说,每个特征学会唯一的一个特征embedding向量,拿Vespn这个特征作为例子,当这个特征和其它特征域的某个特征进行二阶特征组合的时候,不论哪个特征域的特征和Vespn特征进行组合,Vespn这个特征都反复使用同一个特征embedding去做内积,所以可以理解为Vespn这个特征在和不同特征域特征进行组合的时候,共享了同一个特征向量。

既然FM模型的某个特征,在和任意其它特征域的特征进行组合求权重的时候,共享了同一个特征向量。那么,如果我们把这个事情做地更细致些,比如Vespn这个特征,当它和Nike(所属特征域Advertiser)组合的时候用一个特征embedding向量,而当它和Male(所属特征域Gendor)组合的时候,使用另外一个特征embedding向量,这样是否在描述特征组合的时候更细腻一些?也就是说,当Vespn这个特征和属于Advertiser这个域的特征进行组合的时候,用一个特征embedding;和属于Gendor这个特征域的特征进行组合的时候,用另外一个特征embedding。这意味着,如果有F个特征域,那么每个特征由FM模型的一个k维特征embedding,拓展成了(F-1)个k维特征embedding。之所以是F-1,而不是F,是因为特征不和自己组合,所以不用考虑自己。

例子有三个特征域,所以Vespn有两个特征embedding,当和Nike特征组合的时候,用的是针对Advertisor这个特征域的embedding去做内积;而当和Male这个特征组合的时候,则用的是针对Gendor这个特征域的embedding去做内积。同理,Nike和Male这两个特征也是根据和它组合特征所属特征域的不同,采用不同的特征向量去做内积。而两两特征组合这个事情的做法,FFM和FM则是完全相同的,区别就是每个特征对应的特征embedding个数不同。FM每个特征只有一个共享的embedding向量,而对于FFM的一个特征,则有(F-1)个特征embedding向量,用于和不同的特征域特征组合时使用。

假设模型具有n个特征,那么FM模型的参数量是n*k(暂时忽略掉一阶特征的参数),其中k是特征向量大小。因为每个特征具有(F-1)个k维特征向量,所以它的FFM模型参数量是(F-1)*n*k,参数量比FM模型扩充了(F-1)倍。如果我们的任务有100个特征域,FFM模型的参数量就是FM模型的大约100倍。FM模型可以通过公式改写,把本来看着是n的平方的计算复杂度,降低到  。而FFM无法做类似的改写,它的计算复杂度是  ,这明显在计算速度上也比FM模型慢得多。急剧膨胀的参数量,较高的时间复杂度,使FFM模型相对FM模型是略显笨重的。

FFM模型参数量太大,在训练时容易过拟合,需要采取早停等防止过拟合的手段。而根据经验,FFM模型的k值可以取得小一些,一般在几千万训练数据规模下,取8到10能取得较好的效果。

FFM是FM的一个特例,它更细致地刻画了这个特征。首先它做了任意两个特征组合,但是区别在于,怎么刻划这个特征?FM只有一个向量,但FFM现在有两个向量,也就意味着同一个特征,要和不同的fields进行组合的时候,会用不同的embedding去组合,它的参数量更多。对于一个特征来说,原先是一个vector,现在会拓成F个vector,F是特征fields的个数,只要有跟其它特征的任意组合,就有一个vector来代表,这就是FFM的基本思想。

FFM模型参数相比FM扩大了F倍(F=特征fields个数),虽然效果好于FM模型,但是难以实用化(参数太大,太耗内存),双线性FFM,可以达到接近于FFM的效果,但内存消耗远小于FFM模型

FFM模型改进版:双线性FFM(Bilinear-FFM)模型

双线性FFM模型:基本思路

因为每个特征现在有F个vector来表示它的参数空间,每个特征都需要跟上F个vector,一般CTR任务中的特征数量是非常大的,所以FFM的参数量就异常地大。能不能把跟每个特征走的参数矩阵,抽出它们的共性,所有特征大家一起共享地来用这个参数?如果你一起用的话,就能够共享这个参数矩阵,你就能把参数量降下来,这就是双线性FFM的核心思想。vi,vj还是跟FM一样,还是用一个vector来表达,但是把两个特征交互的信息放在共享参数里面去学,这就是双线性FFM的核心思想。

双线性FFM模型 共享参数矩阵W的设计,可以有三种选择。

类型1,不论有多少个特征,大家都共享同一个W,这是参数量最小的一种形式。W的参数量是K×K,K就是特征embedding的size。

类型2,每个fields给一个不同的W。有12个Fields,就有12个W,每个Fields,各自学各自的W。

类型3,Fields还可以组合,有12个不同Fields,就有12×12种Fields间的组合,如果每个组合给一个W,这就能更加细化地描述特征组合。

所以这里可以有三种不同的W定义。此外还可以有一个变化点,即可以加入Layer Norm,我们试过,加入Layer Norm影响比较大。

在两个工业级数据集Criteo和Avazu上进行实验,数据量约在四千到四千五百万的CTR数据。

双线性FFM模型:效果对比

双线性FFM的AUC达到了0.7995,Fields组合效果是最好的,接近于FFM,但稍微低一点。还有个变化点,可以加入Layer Norm,同样加到了那三个模型里面去,最好的效果达到了0.8035,已经超过FFM,而且效果比较显著。

结论:双线性FFM的推荐效果是可以达到与FFM相当,或者说超过FFM的性能的,而且Layer Norm对这个事情有明显的提升作用。

双线性FFM模型:新增参数量对比

我们来估算一下,改进的双线性FFM模型,它的参数量跟FFM比是什么情况?如果说我们用Criteo这个4500万的数据集,它有230万个特征,39个Fields,假设embedding size是10,如果用FFM就会有8.97亿的参数量,而用双线性FFM,FM部分是大概2300万的参数,刚才三个改进模型中,类型一100个参数,类型二3900个参数,类型三15万参数,与FFM相比,参数差了38倍,但性能两者是相当的,这就是这个模型的价值所在。

双线性FFM模型:总结

  1. 性能优于或者接近于FFM模型
  2. 参数量是FFM模型的2.6%

总结一下双线性FFM模型:它的性能接近于FFM,但是参数量是FFM模型的2.6%,这是它的优点所在。

https://tech.meituan.com/2016/03/03/deep-understanding-of-ffm-principles-and-practices.html

https://www.hrwhisper.me/machine-learning-fm-ffm-deepfm-deepffm/

https://mp.weixin.qq.com/s/avof0o9nGNqy6eyOgikEgw

美团ffm

场感知因子分解机原理

通过观察因子分解机模型我们可以发现,这虽然对特征的计算进行了非常大的简化,但在实际预测中,特征间往往有巨大的差异,因子分解机任意两组特征交叉的隐向虽都是相关的,这实际_!二限制了模型的复杂度。可是如果任意一对特征组合都是完全独立的,这与之前提到的通过支持向量机核函数来计算特征交叉类似,它们有着极高的复杂性和自由度,模型计算十分复杂,效果也不明显,
实际上,可以通过引人特征组(场)的概念来优化这个问题。阮毓钦及其比赛队员借鉴了Michael Jahrer的论文中的场概念,提出了基于因子分解机的优化模型。场感知因子分解机把相同性质的特征归于同一个场,按照场级别分别计算当前特征与其他场里特征组合时的特征向量。

在场感知因子分解机中,何一维特征xix} ,针对其他特征的每一种场fi寿组合,都会学习一个隐向量}i}f jvl}fi·它按照特征的含义将规则分为多个场,每个特征属于某个特定的场·每个特征将映射出多个隐向量,每个隐向量对应一个场。当两个特征组合时,它们分别用这两个特征对应的场的隐向量做内积,因此场感知因子分解机的模型方程为:

其中,}J,f‘是翔个特征所属的场。如果隐向量长度为k,那么场感知因子分解机的二次参数有nfk个,远多于因子分解机模型的nk个。由于场感知因子分解机引人了场的概念,每两组特征交叉的隐向量都是独立的,可以取得更好的组合效果,这也使得场感知因子分解机的无法像因子分解机}}S样通过优化把计算复杂度变成线性时间复杂度,因此场感知因子分解机对每个样本预测的时间复杂度为0(knz),但场感知因子分解机的k值通常远小于因子分解机的lc值。在因子分解机模型中,每一维特征的隐向量只有一个,因子分解机可以看作场感知因子分解机的特例,是把所有特征都归属到一个场时的场感知因子分解机模型。LibFFM在具体实现的时候选取的是AdaGrad的随机梯度下降算法,因此使用随机梯度下降法对场感知因子分解机的求解算法如下。

场感知因子分解机可以自动做特征组合和处理高维稀疏特,因而它在处理大量离散特征的问题上往往有比较好的效果。使用场感知因子分解机时要注意对连续特征归一化或离散化    

下面我们介绍一下因子分解机、场感知因子分解机与其他模型的对比关系。

  • 因子分解机与场感知因子分解机。场感知因子分解机对因子分解机模型引人场的概念,增加了模型的复杂度和模型的表达能力可以将因子分解机理解为场感知因子分解机的特殊简化模式,即所有的特征都属于同一个场。
  • 因子分解机与神经网络。神经网络难以直接处理高维稀疏的离散特征,因为这导致神经元的连接参数太多。而因子分解机可以看作对高维稀疏的离散特征做嵌人(Embedding ),上而举的例子也可以看作将每个用户和每个广告嵌人到低维连续的嵌入空间中,然后在这个嵌入空间中比较用户和广告的相似性来学习到用户对广告的偏好

因子分解机和梯度提升树。因子分解机与梯度提升树都可以做特征组合,Facebook就基于梯度提升树学习过特征的组合,梯度提升树可以方便对特征做高阶组合当数据不是高度稀疏时,梯度提升树可以有效地学习到比较复杂的特征组合;但是在高度稀疏的数据中,特征二阶组合的数量就足以让绝大多数模式找不到样本,因而梯度提升树无法学习到这种高阶组合

因子分解机与其他模型。因子分解机是一种比较灵活的模型,通过合适的特征变换方式, 因子分解机可以模拟二阶多项式核的支持向量机模型、MF模型、S V D++模型等。但SVD++与MF在特征的扩展性上都不如因子分解机,而支持向量机核函数计算复杂度较高。
 

猜你喜欢

转载自blog.csdn.net/Yasin0/article/details/89707575