推荐系统算法系列(一):FM算法

一、FM算法背景

在计算广告和推荐系统中,CTR预估是非常重要的一个环节,判断一个商品的是否进行推荐需要根据CTR预估的点击率来进行。

在进行CTR预估时,除了单特征外,往往要对特征进行组合,对于特征组合来说,业界现在通用的做法主要有两大类:FM系列与Tree系列。实际工程中通常是高维稀疏矩,直接特征交叉会导致计算量过大,特征权值更新缓慢。

而FM的优势就是对这两方面问题的处理:首先是特征组合,通过对两两特征组合,引入交叉项特征,提高模型特征能力;其次是维度灾难,通过引入对参数矩阵进行矩阵分解,对参数的计算节省资源。

FM是在逻辑回归上面衍生出来的,如果对逻辑回归最朴素的特征组合就是二阶笛卡尔乘积,这样暴力组合的问题:

  1. 两两组合导致特征维度灾难
  2. 组合后的特征不见得都有效,事实上大部分可能无效
  3. 组合后的特征样本非常稀疏,即组合容易,但是并不能在样本中找到对应的组合出现,也就没办法在训练时更更新参数。

二、FM算法原理

包含了特征两两组合的逻辑回归线性部分就是: ω 0 + ∑ i = 1 n ω i x i + ∑ i = 1 n ∑ j = i + 1 n w i j x i x j \omega_0+\sum_{i=1}^n\omega_ix_i+\sum_{i=1}^{n}\sum_{j=i+1}^{n}w_{ij}x_ix_j ω0+i=1nωixi+i=1nj=i+1nwijxixj

与线性模型相比,FM的模型就多了后面特征组合的部分。和原始的逻辑回归相比,就多出来了特征两两组合部分,也需要去学习对应的参数权重。

因为逻辑回归在做特征组合时样本稀疏,从而无法学到很多特征组合的权重,所以FM的思想就是对特征两两组合的逻辑回归线性部分公式中的 w i j w_{ij} wij做解耦,让每一个特征学习一个隐因子向量出来。如果学习 w i j w_{ij} wij的话,需要学习 n + ( n − 1 ) + . . . + 1 = n 2 + n 2 n+(n-1)+...+1=\frac{n^2+n}{2} n+(n1)+...+1=2n2+n个参数,使用隐因子向量代替后只需学习 n ∗ k n*k nk个参数。并且如果使用前者直接训练,只有当i,j特征都命中时,才会更新 w i j w_{ij} wij参数,但数据十分稀疏,在训练时有效地更新参数也十分困难。而使用隐因子向量后,只要和i特征有关的交叉,都会更新i特征对应的向量。
就像矩阵分解,为每一个用户和每一个物品各自都学习一个隐因子向量一样,当任何两个特征在实际使用时需要组合,那么两者各自隐因子变量做一个向量点积,就是两者组合特征的权重。因此,对每一个特征分量 x i x_i xi引入辅助向量 V i = ( v i 1 , v i 2 , ⋯ , v i k ) V_i=(v_{i1},v_{i2},⋯,v_{ik}) Vi=(vi1,vi2,,vik)。然后,利用 v i v j T v_iv_j^T vivjT ω i j ω_{ij} ωij进行求解。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VGxJp9QX-1570666412267)(img/V.png)]

FM模型表达式: ω 0 + ∑ i = 1 n ω i x i + ∑ i = 1 n ∑ i = j + 1 n < V i , V j > x i x j \omega_0+\sum_{i=1}^n\omega_ix_i+\sum_{i=1}^{n}\sum_{i=j+1}^{n}x_ix_j ω0+i=1nωixi+i=1ni=j+1n<Vi,Vj>xixj

三、FM求解

具体求解 v i v_i vi v j v_j vj:FM中二阶特征组合部分在实际计算时,复杂度有点高,如果隐因子向量的维度是k,特征维度是n,那这个复杂度就是 O ( k n 2 ) O(kn^2) O(kn2)。其中 n 2 n^2 n2是特征要两两组合,k是每次组合都要对k维向量计算点积。需要进行改造:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uy36RnxK-1570666412269)(img/求解.png)]

第一步到第二步可用矩阵展开,容易理解。

简化后计算过程:

loop1 begin: 循环k次,k就是隐因子向量的维度,其中,循环到第f次时:
	loop2 begin: 循环n个特征,第i次循环时:
​		1. 从第i个特征的隐因子向量中拿出第f维的值
​		2. 计算两个值:A是特征值和f维的值相乘,B是A的平方
​	loop2 end
	把n个A累加起来,并平方得到C,把n个B也累加起来,得到D,用C减D,得到E
loop1 end
把k次循环得到的k个E累加起来,除以2。

这是FM中二阶组合部分的实际计算方法,这样做的复杂度只是 O ( k n ) O(kn) O(kn)

四、FM算法模型训练

FM的目标函数,在这里是把它当作融合模型来看的,用来做CTR预估,因此预测目标是一个二分类,FM的输出还需要经过sigmoid函数变换: σ ( y ^ ) = 1 1 + e ( − y ^ ) \sigma(\hat{y})=\frac{1}{1+e^{(-\hat{y})}} σ(y^)=1+e(y^)1

因此,损失目标函数也就是常用的logistic loss: loss ⁡ ( θ ) = − 1 m ∑ i = 1 m [ y ( i ) log ⁡ ( σ ( y ^ ) ) + ( 1 − y ( i ) ) log ⁡ ( 1 − σ ( y ^ ) ) ] \operatorname{loss}(\theta)=-\frac{1}{m}\sum_{i=1}^m\left[y^{(i)} \log (\sigma(\hat{y}))+(1-y^{(i)}) \log (1-\sigma(\hat{y}))\right] loss(θ)=m1i=1m[y(i)log(σ(y^))+(1y(i))log(1σ(y^))],公式中 σ ( y ^ ) \sigma(\hat{y}) σ(y^)是因子分解机FM的预测输出结果,经过sigmoid函数变换得到的预估CTR。损失函数实际上还需要加上正则项,对这个损失目标函数使用梯度下降或者随机梯度下降就可以得到模型的参数。

五、FM和矩阵分解的关系

FM是把常规矩阵分解,SVD,SVD++,time-SVD全部囊括了,顺便还进行了逻辑回归的工作,也正因如此,FM常用来做模型融合,在推荐系统的排序阶段对召回结果做重排序

参考:

推荐系统三十六式

推荐系统遇上深度学习(一)–FM模型理论和实践

你可能感兴趣的:(推荐系统)