因子分解机 FM
特征组合/特征交叉
为什么要特征交叉?
特征交叉的目的是「提升模型的效果」: 通过特征交叉,将样本映射至高维空间,从而增加模型的非线性能力,提升模型的预测效果。
从辛普森悖论的角度来看,只用低阶特征可能得出与用高阶特征相反的结论,如LR模型的表达能力很弱,容易得出错误的结论。
辛普森悖论:英国统计学家E.H.辛普森(E.H.Simpson)于1951年提出,指的是在某个条件下的两组数据,分别讨论时都会满足某种性质,可是一旦合并考虑,却可能导致相反的结论。在分组比较中都占优势的一方,在总评中反而是失势的一方。
举例说明:图中总体统计时是一种结论,但是分性别统计结果却截然不同。
人工方式的特征工程,通常有两个问题:
- 特征爆炸
- 大量重要的特征组合都隐藏在数据中,无法被专家识别和设计
针对上述两个问题,广度模型和深度模型提供了不同的解决思路。
- 广度模型包括FM/FFM等大规模低秩(Low-Rank)模型,FM/FFM通过对特征的低秩展开,为每个特征构建隐式向量,并通过隐式向量的内积结果来建模两个特征的组合关系实现对二阶特征组合的自动学习。作为另外一种模型,Poly-2模型则直接对2阶特征组合建模来学习它们的权重。FM/FFM相比于Poly-2模型,优势为以下两点。第一,FM/FFM模型所需要的参数个数远少于Poly-2模型:FM/FFM模型为每个特征构建一个隐式向量,所需要的参数个数为 \(O(km)\),其中k为隐式向量维度,m为特征个数;Poly-2模型为每个2阶特征组合设定一个参数来表示这个2阶特征组合的权重,所需要的参数个数为 \(O(m^2)\)。第二,相比于Poly-2模型,FM/FFM模型能更有效地学习参数:当一个2阶特征组合没有出现在训练集时,Poly-2模型则无法学习该特征组合的权重;但是FM/FFM却依然可以学习,因为该特征组合的权重是由这2个特征的隐式向量内积得到的,而这2个特征的隐式向量可以由别的特征组合学习得到。总体来说,FM/FFM是一种非常有效地对二阶特征组合进行自动学习的模型。
- 深度学习是通过神经网络结构和非线性激活函数,自动学习特征之间复杂的组合关系。目前在APP推荐领域中比较流行的深度模型有FNN/PNN/Wide & Deep。FNN模型是用FM模型来对Embedding层进行初始化的全连接神经网络。PNN模型则是在Embedding层和全连接层之间引入了内积/外积层,来学习特征之间的交互关系。Wide & Deep模型由谷歌提出,将LR和DNN联合训练,在Google Play取得了线上效果的提升。
FM 因子分解
FM算法可以在线性时间内完成模型训练, 是一个非常高效的模型。FM最大特点和优势:FM模型对稀疏数据有更好的学习能力,通过交互项可以学习特征之间的关联关系,并且保证了学习效率和预估能力。
One-Hot编码的特点: 大部分样本的特征比较稀疏; 特征空间大。
通过观察大量的样本数据可以发现,某些特征经过关联之后,与label之间的相关性就会提高。如:“USA”与“Thanksgiving”、“China”与“Chinese New Year”这样的关联特征,对用户的点击有着正向的影响。
多项式模型是包含特征组合的最直观的模型。考虑到计算效率, 我们只讨论二阶多项式模型。
从这个公式可以看出,组合特征的参数一共有\(n(n−1)\over 2\)个,任意两个参数都是独立的。当组合特征的样本数不充足时, 学习到的参数将不准确, 从而会严重影响模型预测的效果(performance)和稳定性。
那么,如何解决二次项参数的训练问题呢?矩阵分解提供了一种解决思路。在Model-based的协同过滤中,一个rating矩阵可以分解为user矩阵和item矩阵,每个user和item都可以采用一个隐向量表示。矩阵W就可以分解为 \(W=V^TV\),V 的第j列便是第 j 维特征的隐向量。每个参数 \(w_{ij}=⟨v_i,v_j⟩\),这就是FM模型的核心思想。因此,FM的模型方程为
隐向量的长度为k(k<<n),包含k个描述特征的因子。
上边这个公式是一个通用的拟合方程,可以采用不同的损失函数用于解决回归、二元分类等问题,比如可以采用MSE(Mean Square Error)损失函数来求解回归问题,也可以采用Hinge、Cross-Entropy损失来求解分类问题。当然,在进行二元分类时,FM的输出需要经过Sigmoid变换,这与Logistic回归是一样的。
当前的FM公式的复杂度是\(\mathcal O(kn^2)\),但是,通过下面的等价转换,可以将FM的二次项化简,其复杂度可以优化到\(\mathcal O(kn)\),即:
详细推导:
FM模型的核心作用可以概括为以下三个:
- FM降低了交叉项参数学习不充分的影响:one-hot编码后的样本数据非常稀疏,组合特征更是如此。为了解决交叉项参数学习不充分、导致模型有偏或不稳定的问题。作者借鉴矩阵分解的思路:每一维特征用k维的隐向量表示,交叉项的参数\(w_{ij}\)用对应特征隐向量的内积表示,即\(⟨v_i,v_j⟩\)。这样参数学习由之前学习交叉项参数\(w_{ij}\)的过程,转变为学习n个单特征对应k维隐向量的过程。
- FM提升了模型预估能力。可以用于预估训练集中没有出现过的特征组合项.
- FM提升了参数学习效率:是在多项式模型基础上对参数的计算做了调整,成为线性复杂度. 从交互项的角度看,FM仅仅是一个可以表示特征之间交互关系的函数表法式,可以推广到更高阶形式,即将多个互异特征分量之间的关联信息考虑进来。例如在广告业务场景中,如果考虑User-Ad-Context三个维度特征之间的关系,在FM模型中对应的degree为3。
FFM 场感知分解机
Field-aware Factorization Machine
FM的缺点: 由于需要两两组合特征, 这样任意两个交叉特征之间都有了直接或者间接的关联, 因此任意两组特征交叉组合的隐向量都是相关的, 这实际上限制了模型的复杂度. 但是如果使得任意一对特征组合都是完全独立的, 这与通过核函数计算特征交叉类似, 有着极高的复杂性和自由度, 模型计算十分复杂. FFM正好介于这两者之间.
FFM引入特征组(field)的概念来优化此问题. FFM把相同性质的特征归于同一个field, 按照级别分别计算当前特征与其它field的特征组合时的特征向量, 这样特征组合的数量将大大减少.
假设样本的 n 个特征属于 f 个field,那么FFM的二次项有 nf个隐向量。而在FM模型中,每一维特征的隐向量只有一个。FM可以看作FFM的特例,是把所有特征都归属到一个field时的FFM模型。FFM模型方程如下:
如果隐向量长度为k, 那么FFM的二次项参数就有nfk个,远多余FM的nk个.
由于FFM的任意两组交叉特征的隐向量都是独立的, 可以取得更好的组合效果, 这也使得FFM二次项并不能够化简,其复杂度为\(\mathcal O(kn^2)\)。
权重求解:
libFFM的实现中采用的是AdaGrad随机梯度下降方法. 并且在FFM公式中省略了常数项和一次项,模型方程如下:
其中,C2是非零特征的二元组合,j1是特征,属于field f1,\(w_{j_1,f_2}\)是特征 j1对field f2 的隐向量。此FFM模型采用logistic loss作为损失函数,和L2惩罚项,因此只能用于二元分类问题。
FwFM
FFM相当于在FM的基础上考虑了不同域的特征之间的交互强度。但是FFM的参数过多,在离线优化以及线上使用时,性能较为一般。FwFM同FFM一样,也是在FM的基础上考虑不同域之间的交互强度关系,但做法不同。FwFM中对不同域之间的交互强度赋予一个统一的权重r,用于建模两个域 \(f_i,f_j\)的交互强度。公式如下:
FwFM与FFM的效果比较接近(可能略差一点),能够实现预测效果和性能的平衡。
FwFM的参数量和时间复杂度均介于FM与FFM之间。
论文中还通过引入改进线性项表示来增强FwFMs的效果:
- feature-wise线性权重,考虑到特征交互项学习到的嵌入向量 vi 应该能够捕获更多关于特征 i 的信息,将其参与到线性项权重的计算中:将每个特征的权重由标量改为向量并与vi向量内积作为权重:\(\sum_{i=1}^{n}{x_i\langle v_i,w_i \rangle}\)。这种思路被称为FFwFM,其实与Word2vec也有点类似,每个位置有两个向量;也与 Attentional FM 的思想比较接近。
- field-wise线性权重,将特征权重wi替换为field权重\(w_{f_i}\),参数量由特征数量n减少为feild数量k,减少参数量能够有更好的泛化性。
FEFM
Field-Embedded Factorization Machines 比FwFM的基础版更进一步,度量两个域之间的交互强度时采用类似马氏距离的矩阵乘法,引入了一个隐式变换矩阵:\(w_{ij}=v_i^T\ W_{f_i,f_j}\ v_j\)。复杂度再次上升一个级别。
它的一个优势是可以对于不同的特征域设置不同大小的隐向量、隐式变换矩阵,因为不同特征包含的信息不同,需要的向量维度也不尽相同,在FM、FFM中为了计算方便,因此设置相同的维度可以直接做内积运算。
DeepFM-深度延伸
DeepFM模型结合了广度和深度模型的优点,联合训练FM模型和DNN模型,来同时学习低阶特征组合和高阶特征组合。此外,DeepFM模型的Deep部分和FM部分共享Embedding层输入,这样Embedding层的隐式向量在(残差反向传播)训练时可以同时接受到两部分的信息,从而使Embedding层的信息表达更加准确。
Wide&Deep 主要思路:低阶部分(memorization)主要是从历史数据中,发现item和特征之间的直接相关性,体现准确性;而高阶部分(generalization)主要是从历史数据中发现之前很少出现的或者没有出现的特征组合,体现出新颖性。
DeepFM 在 Wide&Deep 的基础上进行改进,解决Wide&Deep存在的问题:
- 对低阶或者高阶的组合特征的提取存在偏向(两个部分的关联比较弱)。
- 需要专业的领域知识来做特征工程。
在DeepFM中,wide部分FM负责对一阶特征以及由一阶特征两两组合⽽成的二阶特征进行特征的提取; deep部分的DNN负责对由输⼊的⼀阶特征进行全连接等操作形成的⾼阶特征进行特征的提取。
DeepFM相对于现有的广度模型、深度模型以及Wide & Deep模型的优势在于:
- DeepFM模型同时对低阶特征组合和高阶特征组合建模,从而能够学习到各阶特征之间的组合关系。
- DeepFM模型是一个端到端的模型,不需要额外的人工特征工程(wide部分用FM代替)。
- DeepFM 两部分共享相同的输⼊和 embedding ,不需要预训练 FM 得到隐向量,训练更高效。(Wide&Deep模型两部分的输入不同)
Q:为什么FM和DEEP部分要共用embedding层?
因为这样能使得DeepFM从原始的数据输入中学习到低维和高维的特征交叉。而Wide&Deep模型中两个部分的输入特征不相同,无法共享。
Q:不定长文本数据如何输入deepFM?
- 截断补齐
- 结合文本id+文本长度,在做文本处理之前,先做不等长的sum_pooled的操作
Q:如何对DeepFM进一步优化?
- embedding向量可以通过FM初始化
- Deep层可以做优化
- NFM:把deep层的做NFM类型的处理,其实就是deep层在输入之前也做一个二阶特征的交叉处理和fm层一致
- FM层可以变得交叉更多阶
- XDeepFM
衍生模型:
DeepFwFM:将DNN与FwFM相结合
xDeepFM
出发点:
- 类似deepfm和FNN等模型的高阶的特征交互来自于dnn部分,但是这样的特征交互是不可控且隐式的。
- 向量级别的特征交互而不是元素级交互。经验上,vector-wise的方式构建的特征交叉关系比bit-wise的方式更容易学习。
- 借鉴DeepFM的整体结构,保留两个部分的组合:低阶特征交互+高阶特征交互。借鉴DCN的交叉网络结构自动构造有限高阶交叉特征。
流程概述:
- 构造feature embedding input [batch,field,embedding_size],分别进入DNN、CIN、Linear层
- CIN中:
- 先记录[batch,field,embedding_size]作为X0,reshape为[embedding,batch,field,1]
- 设置三层隐层,单层结点数为200,单层操作如下(以X1为例):
- 获取上一次的layer out:X0
- 进行外积:[embedding,batch,field,1]
*
[embedding,batch,field,1]得到[embedding,batch,field,field] - reshape [embedding,batch,field
*
field],再通过卷积核[1,field*
field,output_layer]卷积得到压缩输出:[embedding,batch,output_layer] - 加偏置项,并进行激活函数处理,完成一轮处理
- 将若干轮的处理结果按照hidden_size维进行合并,并对embedding维度进行pooling得到[batch,embedding]的output层即为结果
- 实际过程中,可以对每层对结果进行采样泛化;可以通过最后层输出的残差连接保证梯度消失等等
CIN
Compressed Interaction Network
- DCN的Cross是bit-wise的,而CIN 是vector-wise的;
- 在第 \(l\) 层,Cross包含从 1 阶 ~ \(l+1\) 阶 的所有组合特征,而CIN只包含 \(l+1\) 阶的组合特征。相应地,Cross在输出层输出全部结果,而CIN在每层都输出中间结果。
通过sum pooling将各层的交叉特征组合起来。而DCN每层的特征: \(X_{l+1}=X_0X_l^TW_l+b_l+X_l\),可以得到来自X0的1,2,3...N阶的特征组合。
NFM
NFM将二阶项送入MLP中,即先做显式的交叉特征再做隐式的特征交叉。Bi-Interaction层的计算方式是将隐式向量的内积改为点积(哈达玛积),输出是一个k维的embedding向量:
NFM可以进一步和FFM、FwFM等模型结合。
AFM-特征自动筛选
两两特征交叉的组合数较多,某些组合可能没有意义,但是参与到模型的学习中时增大了模型学习的复杂度。
一种人工筛选交叉特征的方式是通过计算互信息度量交叉特征重要性。但是人工筛选成本比较大,可以参考业界广泛采用的Attention、门控机制来实现自动特征筛选。
AFM在NFM的思想上引入了Attention:
公式中增加了一个\(\boldsymbol{p}\)作为该层的权重,\(a_{ij}\)通过两层的MLP+Softmax得到:
AutoFis
AFM采用Soft Attention的方式实现了软筛选,并非通常意义上的非0即1的选择方式。AutoFis 模型通过两阶段地训练步骤实现“硬筛选”。第一阶段采用类似FwFW模型的方式学习交叉项的权重(标量),二值量化为{0,1}。为了更好地学习稀疏的权重项,采用GRDA(Generalized regularized dual averaging)优化器。
第二个阶段采用筛选后的特征组合进行模型再训练,采用常规的Adam优化器更新参数。
因子分解机与其它模型对比
与其他模型相比,FM的优势如下:
- FM是一种比较灵活的模型,通过合适的特征变换方式,FM可以模拟二阶多项式核的SVM模型、MF模型、SVD++模型等;
- 相比SVM的二阶多项式核而言,FM在样本稀疏的情况下是有优势的;而且,FM的训练/预测复杂度是线性的,而二项多项式核SVM需要计算核矩阵,核矩阵复杂度就是N平方。
- vs 神经网络. 神经网络难以直接处理高维稀疏的离散特征, 因为这导致神经元的连接参数太多. 而因子分解机可以看作对高维稀疏的离散特征做嵌入(Embedding).
- vs 梯度提升树. 当数据不是高度稀疏时,梯度提升树可以有效地学习到比较复杂的特征组合; 但是在高度稀疏的数据中, 特征二阶组合的数量超过样本的模式数量, 因而梯度梯度提升树无法学习到这种高阶组合.