FM算法详解(因子分解机)

1. 什么是FM?

FM即Factor Machine,因子分解机。
任意的 N×N 实对称矩阵都有 N 个线性无关的特征向量。并且这些特征向量都可以正交单位化而得到一组正交且模为 1 的向量。故实对称矩阵 A 可被分解成:
在这里插入图片描述
其中,Q为正交矩阵,Λ为实对角矩阵。在这里插入图片描述

2. 为什么需要FM?

1、特征组合是许多机器学习建模过程中遇到的问题,如果对特征直接建模,很有可能会忽略掉特征与特征之间的关联信息,因此,可以通过构建新的交叉特征这一特征组合方式提高模型的效果。

2、高维的稀疏矩阵是实际工程中常见的问题,并直接会导致计算量过大,特征权值更新缓慢。试想一个10000100的表,每一列都有8种元素,经过one-hot独热编码之后,会产生一个10000800的表。因此表中每行元素只有100个值为1,700个值为0。

而FM的优势就在于对这两方面问题的处理。首先是特征组合,通过对两两特征组合,引入交叉项特征,提高模型得分;其次是高维灾难,通过引入隐向量(对参数矩阵进行矩阵分解),完成对特征的参数估计。

3. FM用在哪?

我们已经知道了FM可以解决特征组合以及高维稀疏矩阵问题,而实际业务场景中,电商、豆瓣等推荐系统的场景是使用最广的领域,打个比方,小王只在豆瓣上浏览过20部电影,而豆瓣上面有20000部电影,如果构建一个基于小王的电影矩阵,毫无疑问,里面将有199980个元素全为0。而类似于这样的问题就可以通过FM来解决。
FM算法与线性回归相比增加了特征的交叉。自动选择了所有特征的两两组合,并且给出了两两组合的权重。

如果给两两特征的组合都给一个权重的话,需要训练的参数太多了。比如我们有N维的特征,这样的话就需要NN量级的参数。FM算法的一个优点是减少了需要训练的参数。这个也是参考了矩阵分解的想法。有N个特征,特征间的权重,需要一个NN的权重矩阵。把这个NN的矩阵分解成 KN的矩阵V的乘积,权重矩阵W=VT*V。把每个特征用长度为K的向量来表示,此处应该是每个特征也有一个向量,而不是每个特征的值有一个向量。比如有一个长度为K的向量来表示性别这个特征。

此处的K是自己设置的,K<<N。

4. FM长什么样?

在展示FM算法前,我们先回顾一下最常见的线性表达式:
在这里插入图片描述
其中w0 为初始权值,或者理解为偏置项,wi 为每个特征xi 对应的权值。可以看到,这种线性表达式只描述了每个特征与输出的关系。

FM的表达式如下,可观察到,只是在线性表达式后面加入了新的交叉项特征及对应的权值。在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5. FM交叉项的展开

5.1 寻找交叉项
FM表达式的求解核心在于对交叉项的求解。下面是很多人用来求解交叉项的展开式。
在这里插入图片描述
通俗点来讲就是把自己乘自己的那部分减掉,只留下交叉项
设有3个变量(特征)x1 x2 x3,每一个特征的隐变量分别为v1=(1 2 3)、v2=(4 5 6)、v3=(1 2 1),即:在这里插入图片描述
所以
在这里插入图片描述
实际上,我们应该考虑的交叉项应该是排除自身组合的项,即对于x1x1、x2x2、x3x3不认为是交叉项,那么真正的交叉项为x1x2、x1x3、x2x1、x2x3、x3x1、x3x2。
去重后,交叉项即x1x2、x1x3、x2x3。这也是公式中1/2出现的原因。
5.2 交叉项权值转换
对交叉项有了基本了解后,下面将进行公式的分解,还是以n=3为例,
在这里插入图片描述
所以,在这里插入图片描述
在这里插入图片描述
5.3 交叉项展开式
上面的例子是对3个特征做的交叉项推导,因此对具有n个特征,FM的交叉项公式就可推广为:在这里插入图片描述
在这里插入图片描述
所以FM算法的交叉项最终可展开为:在这里插入图片描述
从上式可以看出二项式的参数数量由原来的n(n−1)/2个减少为nk个wik,远少于多项式模型的参数数量。另外,参数因子化使得xhxi的参数和xhxj的参数不再相互独立,因为有了xhxh特征关联。因此我们可以在样本系数的情况下相对合理地估计FM的二次项参数。
具体来说,xhxii和xhxj的系数分别为<vh,vi>,<vh,vj>,它们之间的共同项vi,因此所有包含xi的非零组合特征的样本都可以用来学习隐向量vi,很大程度上避免了数据稀疏性造成的影响。
求解<vi,vj>,主要采用了公式(a+b+c)2−a2−b2−c2求出交叉项,FM的复杂度为O(kn2)O(kn2),通过上述等式,FM的二次项化简为只与vi,fvi,f有关的等式。因此,FM可以在线性时间对新样本做出预测,复杂度和LR模型一样,且效果提升不少。

在这里插入图片描述
在这里插入图片描述
5.4 隐向量v就是embedding vector?


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

所以5.3小节中的交叉项可以表示为:

sum((inter_1)^2 - (inter_2)^2)/2

其中:

inter_1 = i*v  shape为(18)

inter_2 = np.multiply(i)*np.multiply(v)  shape为(18)

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

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

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

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

6. 权值求解

利用梯度下降法,通过求损失函数对特征(输入项)的导数计算出梯度,从而更新权值。设m为样本个数,θ为权值。

如果是回归问题,损失函数一般是均方误差(MSE):在这里插入图片描述
所以回归问题的损失函数对权值的梯度(导数)为:在这里插入图片描述
如果是二分类问题,损失函数一般是logit loss:在这里插入图片描述
其中,表示的是阶跃函数Sigmoid。在这里插入图片描述
所以分类问题的损失函数对权值的梯度(导数)为:
在这里插入图片描述在这里插入图片描述
相应的,对于常数项、一次项、交叉项的导数分别为:

在这里插入图片描述

SVM和FM的主要区别在于:

SVM的二元特征交叉参数是独立的,而FM的二元特征交叉参数是两个k维的向量vi、vj,交叉参数就不是独立的,而是相互影响的。
FM可以在原始形式下进行优化学习,而基于kernel的非线性SVM通常需要在对偶形式下进行.
FM的模型预测是与训练样本独立,而SVM则与部分训练样本有关,即支持向量
为什么线性SVM在和多项式SVM在稀疏条件下效果会比较差呢?

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

拓展: FFM算法(Field-aware Factorization Machine)

在CTR预估中,通常会遇到one-hot类型的变量,会导致数据特征的稀疏。未解决这个问题,FFM在FM的基础上进一步改进,在模型中引入类别的概念,即field。将同一个field的特征单独进行one-hot,因此在FFM中,每一维特征都会针对其他特征的每个field,分别学习一个隐变量,该隐变量不仅与特征相关,也与field相关。
假设样本的n个特征属于f个field,那么FFM的二次项有nf个隐向量。而在FM模型中,每一维特征的隐向量只有一个。FM可以看做FFM的特例,把所有特征都归属到一个field的FFM模型。其模型方程为:
在这里插入图片描述
如果隐向量的长度为k,那么FFM的二次参数有nfk个,远多于FM模型的nk个。
FFM实现
损失函数
FFM将问题定义为分类问题,使用的是logistic loss,同时加入正则项
在这里插入图片描述
梯度下降
梯度下降方法有很多种,根据为提高效率分别衍生了批量梯度下降,随机梯度下降及小批量梯度下降,根据需求选择即可

FFM应用
在DSP或者推荐场景中,FFM主要用来评估站内的CTR和CVR,即一个用户对一个商品的潜在点击率和点击后的转化率。
CTR和CVR预估模型都是在线下训练,然后线上预测。两个模型采用的特征大同小异,主要分三类:

用户相关的特征
年龄、性别、职业、兴趣、品类偏好、浏览/购买品类等基本信息,以及用户近期点击量/购买量/消费额等统计信息

商品相关的特征
商品所属品类、销量、价格、评分、历史CTR/CVR等信息

用户-商品匹配特征
浏览/购买品类匹配、浏览/购买商家匹配、兴趣偏好匹配等

为了使用FFM方法,所有的特征必须转换成“field_id:feat_id:value”格式,field_id代表特征所属field的编号,feat_id是特征编号,value是特征的值。数值型的特征比较容易处理,只需分配单独的field编号,如用户评论得分、商品的历史CTR/CVR等。categorical特征需要经过One-Hot编码成数值型,编码产生的所有特征同属于一个field,而特征的值只能是0或1,如用户的性别、年龄段,商品的品类id等。除此之外,还有第三类特征,如用户浏览/购买品类,有多个品类id且用一个数值衡量用户浏览或购买每个品类商品的数量。这类特征按照categorical特征处理,不同的只是特征的值不是0或1,而是代表用户浏览或购买数量的数值。按前述方法得到field_id之后,再对转换后特征顺序编号,得到feat_id,特征的值也可以按照之前的方法获得。

训练FFM

样本归一化:FFM默认是进行样本数据的归一化,即 为真;若此参数设置为假,很容易造成数据inf溢出,进而引起梯度计算的nan错误。因此,样本层面的数据是推荐进行归一化的。
特征归一化:CTR/CVR模型采用了多种类型的源特征,包括数值型和categorical类型等。但是,categorical类编码后的特征取值只有0或1,较大的数值型特征会造成样本归一化后categorical类生成特征的值非常小,没有区分性。例如,一条用户-商品记录,用户为“男”性,商品的销量是5000个(假设其它特征的值为零),那么归一化后特征“sex=male”(性别为男)的值略小于0.0002,而“volume”(销量)的值近似为1。特征“sex=male”在这个样本中的作用几乎可以忽略不计,这是相当不合理的。因此,将源数值型特征的值归一化到 是非常必要的。
省略零值特征:从FFM模型的表达式可以看出,零值特征对模型完全没有贡献。包含零值特征的一次项和组合项均为零,对于训练模型参数或者目标值预估是没有作用的。因此,可以省去零值特征,提高FFM模型训练和预测的速度,这也是稀疏样本采用FFM的显著优势。

发布了46 篇原创文章 · 获赞 10 · 访问量 4397

猜你喜欢

转载自blog.csdn.net/GFDGFHSDS/article/details/104782245