点击率预估算法:FM与FFM[通俗易懂]

点击率预估算法:FM与FFM[通俗易懂]点击率预估算法:FFM@(计算广告)[计算广告]点击率预估算法FFM1FM1背景11线性模型12二项式模型2FM21FM基本原理22数据分析23参数个数24计算时间复杂度25梯度26训练时间复杂度2FFM1背景及基本原理2模型与最优化问题21模型22最优化问题23自适应学习率24FFM算法的最终形式3完整算法流程31计算梯度32

大家好,又见面了,我是你们的朋友全栈君。

1、FM

1.1 背景

1.1.1 线性模型

常见的线性模型,比如线性回归、逻辑回归等,它只考虑了每个特征对结果的单独影响,而没有考虑特征间的组合对结果的影响。

对于一个有n维特征的模型,线性回归的形式如下:

f ( x ) = ω 0 + ω 1 x 1 + ω 2 x 2 + . . . + ω n x n = ω 0 + ∑ i = 1 n ω i x i ( 1 ) \begin{aligned} f(x) &= \omega_0 + \omega_1x_1+\omega_2x_2+…+\omega_nx_n \\ &=\omega_0+\sum_{i=1}^n{\omega_ix_i} \end{aligned} \qquad (1) f(x)=ω0+ω1x1+ω2x2+...+ωnxn=ω0+i=1nωixi(1)

其中 ( ω 0 , ω 1 . . . ω n ) (\omega_0,\omega_1…\omega_n) (ω0,ω1...ωn)为模型参数, ( x 1 , x 2 . . . x n ) (x_1,x_2…x_n) (x1,x2...xn)为特征。
从(1)式可以看出来,模型的最终计算结果是各个特征的独立计算结果,并没有考虑特征之间的相互关系。

举个例子,我们认为“USA”与”Thanksgiving”,”China”与“Chinese new year”这样的组合特征是很有意义的,在这样的组合特征下,会对某些商品表现出更强的购买意愿,而单独考虑国家及节日都是没有意义的。

1.1.2 二项式模型

我们在(1)式的基础上,考虑任意2个特征分量之间的关系,得出以下模型:

f ( x ) = ω 0 + ∑ i = 1 n ω i x i + ∑ i = 1 n − 1 ∑ j = i + 1 n ω i j x i x j ( 2 ) f(x)=\omega_0+\sum_{i=1}^n\omega_ix_i+\sum_{i=1}^{n-1}\sum_{j=i+1}^n\omega_{ij}x_ix_j \qquad (2) f(x)=ω0+i=1nωixi+i=1n1j=i+1nωijxixj(2)

这个模型考虑了任意2个特征分量之间的关系,但并未考虑更高阶的关系。
模型涉及的参数数量为:
1 + n + n ( n − 1 ) 2 = 1 2 ( n 2 + n + 2 ) ( 3 ) 1+n+\frac{n(n-1)}{2}=\frac{1}{2}(n^2+n+2) \qquad (3) 1+n+2n(n1)=21(n2+n+2)(3)

对于参数 ω i \omega_i ωi的训练,只要这个样本中对应的 x i x_i xi不为0,则可以完成一次训练。
但对于参数 ω i j \omega_{ij} ωij的训练,需要这个样本中的 x i x_i xi x j x_j xj同时不为0,才可以完成一次训练。
在数据稀疏的实际应用场景中,二次项 ω i j \omega_{ij} ωij的训练是非常困难的。因为每个 ω i j \omega_{ij} ωij都需要大量 x i x_i xi x j x_j xj都不为0的样本。但在数据稀疏性比较明显的样本中, x i x_i xi x j x_j xj都不为0的样本会非常稀少,这会导致 ω i j \omega_{ij} ωij不能得到足够的训练,从而不准确。

1.2 FM

1.2.1 FM基本原理

为了解决二项式模型中由于数据稀疏引起的训练不足的问题,我们为每个特征维度 x i x_i xi引入一个辅助向量:

V i = ( v i 1 , v i 2 , v i 3 , . . . , v i k ) T ∈ R k , i = 1 , 2 , 3 , . . . , n ( 4 ) V_i = (v_{i1},v_{i2},v_{i3},…,v_{ik})^T\in \mathbb R^k, i=1,2,3,…,n \qquad(4) Vi=(vi1,vi2,vi3,...,vik)TRk,i=1,2,3,...,n(4)
其中 k k k为辅助变量的维度,依经验而定,一般而言,对于特征维度足够多的样本, k &lt; &lt; n k&lt;&lt;n k<<n
ω i j \omega_{ij} ωij表示为:
ω i j = V i T V j = ∑ l = 1 k v i l v j l ( 5 ) \omega_{ij}=V_i^TV_j=\sum_{l=1}^kv_{il}v_{jl} \qquad(5) ωij=ViTVj=l=1kvilvjl(5)
简单的说,我们不再简单的使用样本训练具体的 ω i j \omega_{ij} ωij,而是先训练2个隐变量 V i V_i Vi以及 V j V_j Vj,然后使用式(5)求出最终的 ω i j \omega_{ij} ωij

具体而言, ω i j = V i T V j \omega_{ij}=V_i^TV_j ωij=ViTVj ω h i = V h T V i \omega_{hi}=V_h^TV_i ωhi=VhTVi有相同的项 V i V_i Vi,也就是只要样本中的 x i x_i xi不为0,且最少具有一个其它特征,则这个样本则可用于训练 V i V_i Vi,这就解决了数据稀疏性导致的问题。

于是,在FM中,模型可以表达为:
f ( x ) = ω 0 + ∑ i = 1 n ω i x i + ∑ i = 1 n − 1 ∑ j = i + 1 n ( V i T V j ) x i x j ( 6 ) f(x) = \omega_0+\sum_{i=1}^n\omega_ix_i+\sum_{i=1}^{n-1}\sum_{j=i+1}^n(V_i^TV_j)x_ix_j \qquad(6) f(x)=ω0+i=1nωixi+i=1n1j=i+1n(ViTVj)xixj(6)

1.2.2 数据分析

我们的目标是要求得以下交互矩阵W:
W = ( ω 11 ω 12 . . . ω 1 n ω 21 ω 22 . . . ω 2 n ⋮ ⋮ ⋱ ⋮ ω n 1 ω n 2 . . . ω n n ) n × n ( 7 ) W= \begin{pmatrix} \omega_{11} &amp; \omega_{12}&amp; … &amp;\omega_{1n} \\ \omega_{21} &amp; \omega_{22}&amp; … &amp;\omega_{2n} \\ \vdots &amp;\vdots &amp;\ddots &amp;\vdots\\ \omega_{n1} &amp; \omega_{n2}&amp; … &amp;\omega_{nn} \\ \end{pmatrix}_{n\times n} \qquad(7) W=ω11ω21ωn1ω12ω22ωn2.........ω1nω2nωnnn×n(7)

由于直接求解W不方便,因此我们引入隐变量V:
V = ( v 11 v 12 . . . v 1 k v 21 v 22 . . . v 2 k ⋮ ⋮ ⋱ ⋮ v n 1 v n 2 . . . v n k ) n × k = ( V 1 T V 2 T ⋯ V n T ) ( 8 ) V= \begin{pmatrix} v_{11} &amp; v_{12}&amp; … &amp;v_{1k} \\ v_{21} &amp; v_{22}&amp; … &amp;v_{2k} \\ \vdots &amp;\vdots &amp;\ddots &amp;\vdots\\ v_{n1} &amp; v_{n2}&amp; … &amp;v_{nk} \\ \end{pmatrix}_{n\times k}=\begin{pmatrix} V_1^T\\ V_2^T\\ \cdots \\ V_n^T\\ \end{pmatrix} \qquad(8) V=v11v21vn1v12v22vn2.........v1kv2kvnkn×k=V1TV2TVnT(8)

V V T = W ( 9 ) VV^T = W \qquad(9) VVT=W(9)

如果我们先得到V,则可以得到W了。
现在只剩下一个问题了,是否一个存在V,使得上述式(9)成立。
理论研究表明:当k足够大时,对于任意对称正定的实矩阵 W ∈ R n × n W\in \mathbb R^{n \times n} WRn×n,均存在实矩阵 V ∈ R n × k V\in \mathbb R^{n \times k} VRn×k,使得$ W=VV^T$。

理论分析中要求参数k足够的大,但在高度稀疏数据的场景中,由于 没有足够的样本,因此k通常取较小的值。事实上,对参数 k k k的限制,在一定程度上可以提高模型的泛化能力。

1.2.3参数个数

假设样本中有n个特征,每个特征对应的隐变量维度为k,则参数个数为 1 + n + n k 1+n+nk 1+n+nk
正如上面所言,对于特征维度足够多的样本, k &lt; &lt; n k&lt;&lt;n k<<n

1.2.4 计算时间复杂度

下面我们分析一下已经知道所有参数,代入式(6)计算预测值时的时间复杂度。从式(6)中一看,
f ( x ) = ω 0 + ∑ i = 1 n ω i x i + ∑ i = 1 n − 1 ∑ j = i + 1 n ( V i T V j ) x i x j ( 6 ) f(x) = \omega_0+\sum_{i=1}^n\omega_ix_i+\sum_{i=1}^{n-1}\sum_{j=i+1}^n(V_i^TV_j)x_ix_j \qquad(6) f(x)=ω0+i=1nωixi+i=1n1j=i+1n(ViTVj)xixj(6)
可以看出时间复杂度是 O ( k n 2 ) O(kn^2) O(kn2)。但我们对上述式子的最后一项作变换后,可以得出一个 O ( k n ) O(kn) O(kn)的时间复杂度表达式。

∑ i = 1 n − 1 ∑ j = i + 1 n ( V i T V j ) x i x j = 1 2 ( ∑ i = 1 n ∑ j = 1 n ( V i T V j ) x i x j − ∑ i = 1 n ( V i T V i ) x i x i ) = 1 2 ( ∑ i = 1 n ∑ j = 1 n ∑ l = 1 k v i l v j l x i x j − ∑ i = 1 n ∑ l = 1 k v i l 2 x i 2 ) = 1 2 ∑ l = 1 k ( ∑ i = 1 n ( v i l x i ) ∑ j = 1 n ( v j l x j ) − ∑ i = 1 n v i l 2 x i 2 ) = 1 2 ∑ l = 1 k ( ( ∑ i = 1 n ( v i l x i ) ) 2 − ∑ i = 1 n v i l 2 x i 2 ) ( 10 ) \begin{aligned} \sum_{i=1}^{n-1}\sum_{j=i+1}^n(V_i^TV_j)x_ix_j &amp;= \frac{1}{2}\left(\sum_{i=1}^n\sum_{j=1}^n(V_i^TV_j)x_ix_j-\sum_{i=1}^n(V_i^TV_i)x_ix_i\right) \\ &amp;=\frac{1}{2}\left(\sum_{i=1}^n\sum_{j=1}^n\sum_{l=1}^kv_{il}v_{jl}x_ix_j-\sum_{i=1}^n\sum_{l=1}^k v_{il}^2x_i^2\right)\\ &amp;=\frac{1}{2}\sum_{l=1}^k\left(\sum_{i=1}^n(v_{il}x_i)\sum_{j=1}^n(v_{jl}x_j)-\sum_{i=1}^nv_{il}^2x_i^2\right)\\ &amp;=\frac{1}{2}\sum_{l=1}^k\left(\left(\sum_{i=1}^n(v_{il}x_i)\right)^2-\sum_{i=1}^nv_{il}^2x_i^2\right) \end{aligned} \qquad(10) i=1n1j=i+1n(ViTVj)xixj=21(i=1nj=1n(ViTVj)xixji=1n(ViTVi)xixi)=21(i=1nj=1nl=1kvilvjlxixji=1nl=1kvil2xi2)=21l=1k(i=1n(vilxi)j=1n(vjlxj)i=1nvil2xi2)=21l=1k(i=1n(vilxi))2i=1nvil2xi2(10)
上述式子中的 ∑ i = 1 n ( v i l x i ) \sum_{i=1}^n(v_{il}x_i) i=1n(vilxi)只需要计算一次就好,因此,可以看出上述模型的复杂度为 O ( k n ) O(kn) O(kn)
也就是说我们不要直接使用式(6)来计算预测结果,而应该使用式(10),这样的计算效率更高。

1.2.5 梯度

FM有一个重要的性质:multilinearity:若记 Θ = ( ω 0 , ω 1 , ω 2 , . . . , ω n , v 11 , v 12 , . . . , v n k ) \Theta=(\omega_0,\omega_1,\omega_2,…,\omega_n,v_{11},v_{12},…,v_{nk}) Θ=(ω0,ω1,ω2,...,ωn,v11,v12,...,vnk)表示FM模型的所有参数,则对于任意的 θ ∈ Θ \theta \in \Theta θΘ,存在与 θ \theta θ无关的 g ( x ) g(x) g(x) h ( x ) h(x) h(x),使得式(6)可以表示为:
f ( x ) = g ( x ) + θ h ( x ) ( 11 ) f(x) = g(x) + \theta h(x) \qquad(11) f(x)=g(x)+θh(x)(11)
从式(11)中可以看出,如果我们得到了 g ( x ) g(x) g(x) h ( x ) h(x) h(x),则对于参数 θ \theta θ的梯度为 h ( x ) h(x) h(x)。下面我们分情况讨论。

  • θ = ω 0 \theta=\omega_0 θ=ω0时,式(6)可以表示为:
    f ( x ) = ∑ i = 1 n ω i x i + ∑ i = 1 n − 1 ∑ j = i + 1 n ( V i T V j ) x i x j + ω 0 × 1 ( 12 ) f(x) = \color{blue}{\sum_{i=1}^n\omega_ix_i+\sum_{i=1}^{n-1}\sum_{j=i+1}^n(V_i^TV_j)x_ix_j} +\omega_0 \times \color{red}{1} \qquad(12) f(x)=i=1nωixi+i=1n1j=i+1n(ViTVj)xixj+ω0×1(12)
    上述中的蓝色表示 g ( x ) g(x) g(x),红色表示 h ( x ) h(x) h(x)。下同。
    从上述式子可以看出此时的梯度为1.

  • θ = ω l , l ∈ ( 1 , 2 , . . . , n ) \theta=\omega_l, l \in (1,2,…,n) θ=ωl,l(1,2,...,n)时,
    f ( x ) = ω 0 + ∑ i = 1 ,   i ≠ l n ω i x i + ∑ i = 1 n − 1 ∑ j = i + 1 n ( V i T V j ) x i x j + ω l × x l ( 13 ) f(x) = \color{blue}{\omega_0+\sum_{i=1,\ i \ne l}^n\omega_ix_i+\sum_{i=1}^{n-1}\sum_{j=i+1}^n(V_i^TV_j)x_ix_j}+\omega_l \times \color{red}{x_l} \qquad(13) f(x)=ω0+i=1, i̸=lnωixi+i=1n1j=i+1n(ViTVj)xixj+ωl×xl(13)
    此时梯度为 x l x_l xl

  • θ = v l m \theta=v_{lm} θ=vlm
    f ( x ) = ω 0 + ∑ i = 1 n ω i x i + ∑ i = 1 n − 1 ∑ j = i + 1 n ( ∑ s = 1 , i s ≠ l m , j s ≠ l m k v i s v j s ) x i x j + v l m × x l ∑ i = 1 , i ≠ l n v i m x i ( 14 ) f(x) =\color{blue}{ \omega_0+\sum_{i=1}^n\omega_ix_i+\sum_{i=1}^{n-1}\sum_{j=i+1}^n(\sum_{s=1 , is \ne lm ,js \ne lm}^k v_{is}v_{js})x_ix_j }+v_{lm}\times \color{red}{x_l\sum_{i=1,i \ne l }^n v_{im}x_i} \qquad(14) f(x)=ω0+i=1nωixi+i=1n1j=i+1n(s=1,is̸=lm,js̸=lmkvisvjs)xixj+vlm×xli=1,i̸=lnvimxi(14)
    此时梯度为 x l ∑ i ≠ l v i m x i x_l\sum_{i \ne l } v_{im}x_i xli̸=lvimxi

综合上述结论, f ( x ) f(x) f(x)关于 θ \theta θ的偏导数为:
∂ f ( x ) ∂ θ = { 1 , θ = ω 0 x l , θ = ω l , l ∈ ( 1 , 2 , . . . , n ) x l ∑ i = 1 , i ≠ l n v i m x i θ = v l m ( 15 ) \frac{\partial f(x)}{\partial \theta} = \begin{cases} 1, &amp; \theta=\omega_0 \\ x_l, &amp; \theta=\omega_l, l \in (1,2,…,n) \\ x_l\sum_{i=1,i \ne l }^n v_{im}x_i &amp; \theta=v_{lm} \end{cases} \qquad(15) θf(x)=1,xl,xli=1,i̸=lnvimxiθ=ω0θ=ωl,l(1,2,...,n)θ=vlm(15)

1.2.6 训练时间复杂度

由上述式(15)可以得到:

x l ∑ i = 1 , i ≠ l n v i m x i = x l ∑ i = 1 n v i m x i − v l m x l 2 ( 16 ) x_l\sum_{i=1,i \ne l }^n v_{im}x_i = x_l\sum_{i=1}^n v_{im}x_i-v_{lm}x_l^2 \qquad(16) xli=1,i̸=lnvimxi=xli=1nvimxivlmxl2(16)
对于上式中的前半部分 ∑ i = 1 n v i m x i \sum_{i=1}^n v_{im}x_i i=1nvimxi,对于每个样本只需要计算一次,所以时间复杂度为 O ( n ) O(n) O(n),对于k个隐变量的维度分别计算一次,则复杂度为 O ( k n ) O(kn) O(kn)。其它项的时间复杂度都小于这一项,因此,模型训练的时间复杂度为 O ( k n ) O(kn) O(kn)

详细一点解释:
(1)我们首先计算 ∑ i = 1 n v i m x i \sum_{i=1}^n v_{im}x_i i=1nvimxi,时间复杂度为n,这个值对于所有特征对应的隐变量的某一个维度是相同的。我们设这值为C。

(2)计算每一个特征对应的$x_l\sum_{i=1}^n v_{im}x_i-v_{lm}x_l^2 =Cx_l-v_{lm}x_l^2 $,由于总共有n个特征,因此时间复杂度为n,至此,总的时间复杂度为n+n。

(3)上述只是计算了隐变量的其中一个维度,我们总共有k个维度,因此总的时间复杂度为 k ( n + n ) = O ( k n ) k(n+n)=O(kn) k(n+n)=O(kn).

2、FFM

2.1 背景及基本原理

在FM模型中,每一个特征会对应一个隐变量,但在FFM模型中,认为应该将特征分为多个field,每个特征对应每个field分别有一个隐变量。

举个例子,我们的样本有3种类型的字段:publisher, advertiser, gender,分别可以代表媒体,广告主或者是具体的商品,性别。其中publisher有5种数据,advertiser有10种数据,gender有男女2种,经过one-hot编码以后,每个样本有17个特征,其中只有3个特征非空。

如果使用FM模型,则17个特征,每个特征对应一个隐变量。
如果使用FFM模型,则17个特征,每个特征对应3个隐变量,即每个类型对应一个隐变量,具体而言,就是对应publisher, advertiser, gender三个field各有一个隐变量。

2.2模型与最优化问题

2.2.1 模型

根据上面的描述,可以得出FFM的模型为:

f ( x ) = ω 0 + ∑ i = 1 n ω i x i + ∑ j 1 = 1 n − 1 ∑ j 2 = j 1 + 1 n ( V j 1 , f 2 T V j 2 , f 1 ) x j 1 x j 2 ( 17 ) f(x) = \omega_0+\sum_{i=1}^n\omega_ix_i+\sum_{j1=1}^{n-1}\sum_{j2=j1+1}^n(V_{j1,f2}^TV_{j2,f1})x_{j1}x_{j2} \qquad(17) f(x)=ω0+i=1nωixi+j1=1n1j2=j1+1n(Vj1,f2TVj2,f1)xj1xj2(17)
其中 j 1 , j 2 j1,j2 j1,j2表示特征的索引。我们假设 j 1 j1 j1特征属于 f 1 f1 f1这个field, j 2 j2 j2特征属于 f 2 f2 f2这个field,则 V j 1 , f 2 V_{j1,f2} Vj1,f2表示 j 1 j1 j1这个特征对应 f 2 f2 f2( j 2 j2 j2所属的field)的隐变量,同时 V j 2 , f 1 V_{j2,f1} Vj2,f1表示 j 2 j2 j2这个特征对应 f 1 f1 f1( j 1 j1 j1所属的field)的隐变量。

事实上,在大多数情况下,FFM模型只保留了二次项,即:

ϕ ( V , x ) = ∑ j 1 = 1 n − 1 ∑ j 2 = j 1 + 1 n ( V j 1 , f 2 T V j 2 , f 1 ) x j 1 x j 2 ( 18 ) \phi(V,x) = \sum_{j1=1}^{n-1}\sum_{j2=j1+1}^n(V_{j1,f2}^TV_{j2,f1})x_{j1}x_{j2} \qquad(18) ϕ(V,x)=j1=1n1j2=j1+1n(Vj1,f2TVj2,f1)xj1xj2(18)

2.2.2 最优化问题

根据逻辑回归的损失函数及分析,可以得出FFM的最优化问题为:

min ⁡ λ 2 ∣ ∣ V ∣ ∣ 2 2 + ∑ i = 1 m log ⁡ ( 1 + e x p ( − y i ϕ ( V , x ) ) ) ( 19 ) \min \frac{\lambda}{2}||V||_2^2+\sum_{i=1}^{m}\log(1+exp(-y_i\phi(V,x))) \qquad(19) min2λV22+i=1mlog(1+exp(yiϕ(V,x)))(19)
上面加号的前面部分使用了L2范式,后面部分是逻辑回归的损失函数。m表示样本的数量, y i y_i yi表示训练样本的真实值(如是否点击的-1/1), ϕ ( V , x ) \phi(V,x) ϕ(V,x)表示使用当前的V代入式(18)计算得到的值。

注意,以上的损失函数适用于样本分布为{-1,1}的情况。

2.2.3 自适应学习率

与FTRL一样,FFM也使用了累积梯度作为学习率的一部分,即:
V j 1 , f 2 = V j 1 , f 2 − η 1 + ∑ t ( g v j 1 , f 2 t ) 2 g v j 1 , f 2 ( 20 ) V_{j1,f2} = V_{j1,f2} – \frac{\eta}{\sqrt{1+\sum_t(g_{v_{j1,f2}}^t)^2}}g_{v_{j1,f2}} \qquad(20) Vj1,f2=Vj1,f21+t(gvj1,f2t)2
η
gvj1,f2(20)

其中 g v j 1 , f 2 g_{v_{j1,f2}} gvj1,f2表示对于$V_{j1,f2} 这 个 变 量 的 梯 度 向 量 , 因 为 这个变量的梯度向量,因为 V_{j1,f2} 是 一 个 向 量 , 因 此 是一个向量,因此 g_{v_{j1,f2}} 也 是 一 个 向 量 , 尺 寸 为 隐 变 量 的 维 度 大 小 , 即 k 。 而 也是一个向量,尺寸为隐变量的维度大小,即k。 而 k\sum_t(g_{v_{j1,f2}}t)2$表示从第一个样本到当前样本一直以来的累积梯度平方和。

2.2.4 FFM算法的最终形式

( V j 1 , f 2 ) d = ( V j 1 , f 2 ) d − 1 − η ( G j 1 , f 2 ) d ⋅ ( g j 1 , f 2 ) d ( V j 2 , f 1 ) d = ( V j 2 , f 1 ) d − 1 − η ( G j 2 , f 1 ) d ⋅ ( g j 2 , f 1 ) d \begin{aligned} (V_{j1,f2})_d &amp;=(V_{j1,f2})_{d-1}-\frac{\eta}{\sqrt{(G_{j1,f2})_d}} \cdot (g_{j1,f2})_d \\ (V_{j2,f1})_d &amp;=(V_{j2,f1})_{d-1}-\frac{\eta}{\sqrt{(G_{j2,f1})_d}} \cdot (g_{j2,f1})_d \end{aligned} (Vj1,f2)d(Vj2,f1)d=(Vj1,f2)d1(Gj1,f2)d
η
(gj1,f2)d
=(Vj2,f1)d1(Gj2,f1)d
η
(gj2,f1)d

其中G为累积梯度平方:
( G j 1 , f 2 ) d = ( G j 1 , f 2 ) d − 1 + ( g j 1 , f 2 ) d 2 ( G j 2 , f 1 ) d = ( G j 2 , f 1 ) d − 1 + ( g j 2 , f 1 ) d 2 (G_{j1,f2})_d=(G_{j1,f2})_{d-1}+(g_{j1,f2})_d^2 \\ (G_{j2,f1})_d=(G_{j2,f1})_{d-1}+(g_{j2,f1})_d^2 (Gj1,f2)d=(Gj1,f2)d1+(gj1,f2)d2(Gj2,f1)d=(Gj2,f1)d1+(gj2,f1)d2

g为梯度,比如 g j 1 , f 2 g_{j1,f2} gj1,f2 j 1 j1 j1这个特征对应 f 2 f2 f2这个field的梯度向量:
g j i , f 2 = λ ⋅ V j i , f 2 + κ ⋅ V j 2 , f 1 g j 2 , f 1 = λ ⋅ V j 2 , f 1 + κ ⋅ V j 1 , f 2 g_{ji,f2}=\lambda \cdot V_{ji,f2} + \kappa \cdot V_{j2,f1}\\ g_{j2,f1}=\lambda \cdot V_{j2,f1} + \kappa \cdot V_{j1,f2} gji,f2=λVji,f2+κVj2,f1gj2,f1=λVj2,f1+κVj1,f2
其中 κ \kappa κ为:
κ = ∂ log ⁡ ( 1 + e x p ( − y i ϕ ( V , x ) ) ) ∂ ϕ ( V , x ) = − y 1 + exp ⁡ ( y ϕ ( V , x ) ) \kappa=\frac{\partial\log(1+exp(-y_i\phi(V,x))) }{\partial \phi(V,x) }=\frac{-y}{1+\exp(y\phi(V,x) )} κ=ϕ(V,x)log(1+exp(yiϕ(V,x)))=1+exp(yϕ(V,x))y

2.3完整算法流程

使用随机梯度下降(SGD)训练FFM模型的完整过程如下:

2.3.1 计算梯度

对于每一个样本的每一对特征组合都要计算以下梯度向量。
g j i , f 2 = λ ⋅ V j i , f 2 + κ ⋅ V j 2 , f 1 g j 2 , f 1 = λ ⋅ V j 2 , f 1 + κ ⋅ V j 1 , f 2 ( 21 ) \begin{aligned} g_{ji,f2}=\lambda \cdot V_{ji,f2} + \kappa \cdot V_{j2,f1} \\ g_{j2,f1}=\lambda \cdot V_{j2,f1} + \kappa \cdot V_{j1,f2} \end{aligned} \qquad(21) gji,f2=λVji,f2+κVj2,f1gj2,f1=λVj2,f1+κVj1,f2(21)
其中 κ \kappa κ为式(19)后半部分对应的梯度,即:
κ = ∂ log ⁡ ( 1 + e x p ( − y i ϕ ( V , x ) ) ) ∂ ϕ ( V , x ) = − y 1 + exp ⁡ ( y ϕ ( V , x ) ) ( 22 ) \kappa=\frac{\partial\log(1+exp(-y_i\phi(V,x))) }{\partial \phi(V,x) }=\frac{-y}{1+\exp(y\phi(V,x) )} \qquad(22) κ=ϕ(V,x)log(1+exp(yiϕ(V,x)))=1+exp(yϕ(V,x))y(22)
再重申一次, g g g V V V都是k维的向量,在python中可以作为一个向量计算,在java/c++等需要通过一个循环进行计算。

详细推导(21)式如下:
(1)在SGD中,式(19)可以转化为:
min ⁡ λ 2 ∣ ∣ V ∣ ∣ 2 2 + log ⁡ ( 1 + e x p ( − y i ϕ ( V , x ) ) ) ( 23 ) \min \frac{\lambda}{2}||V||_2^2+\log(1+exp(-y_i\phi(V,x))) \qquad(23) min2λV22+log(1+exp(yiϕ(V,x)))(23)
(2)上式对 V j 1 , f 2 V_{j1,f2} Vj1,f2求偏导,可得:

∂ λ 2 ∣ ∣ V ∣ ∣ 2 2 + log ⁡ ( 1 + e x p ( − y i ϕ ( V , x ) ) ) ∂ V j 1 , f 2 = λ ⋅ V j 1 , f 2 + ∂ log ⁡ ( 1 + e x p ( − y i ϕ ( V , x ) ) ) ∂ V j 1 , f 2 = λ ⋅ V j 1 , f 2 + ∂ log ⁡ ( 1 + e x p ( − y i ϕ ( V , x ) ) ) ∂ ϕ ⋅ ∂ ϕ V j 1 , f 2 = λ ⋅ V j 1 , f 2 + − y 1 + exp ⁡ ( y ϕ ( V , x ) ) ⋅ V j 2 , f 1 ( 24 ) \begin{aligned} &amp;\frac{\partial \frac{\lambda}{2}||V||_2^2+\log(1+exp(-y_i\phi(V,x)))}{\partial V_{j1,f2}} \\ &amp;=\lambda \cdot V_{j1,f2} + \frac{\partial \log(1+exp(-y_i\phi(V,x)))}{\partial V_{j1,f2}}\\ &amp;=\lambda \cdot V_{j1,f2} + \frac{\partial \log(1+exp(-y_i\phi(V,x)))}{\partial \phi} \cdot \frac{\partial \phi}{V_{j1,f2}}\\ &amp;=\lambda \cdot V_{j1,f2} + \frac{-y}{1+\exp(y\phi(V,x) )} \cdot V_{j2,f1} \end{aligned} \qquad(24) Vj1,f22λV22+log(1+exp(yiϕ(V,x)))=λVj1,f2+Vj1,f2log(1+exp(yiϕ(V,x)))=λVj1,f2+ϕlog(1+exp(yiϕ(V,x)))Vj1,f2ϕ=λVj1,f2+1+exp(yϕ(V,x))yVj2,f1(24)

2.3.2 计算累积梯度平方和

计算从第一个样本,到当前样本(第d个)以来的累积梯度平方和:
( G j 1 , f 2 ) d = ( G j 1 , f 2 ) d − 1 + ( g j 1 , f 2 ) d 2 ( G j 2 , f 1 ) d = ( G j 2 , f 1 ) d − 1 + ( g j 2 , f 1 ) d 2 ( 26 ) \begin{aligned} (G_{j1,f2})_d=(G_{j1,f2})_{d-1}+(g_{j1,f2})_d^2 \\ (G_{j2,f1})_d=(G_{j2,f1})_{d-1}+(g_{j2,f1})_d^2 \end{aligned} \qquad(26) (Gj1,f2)d=(Gj1,f2)d1+(gj1,f2)d2(Gj2,f1)d=(Gj2,f1)d1+(gj2,f1)d2(26)

2.3.3 更新隐变量

( V j 1 , f 2 ) d = ( V j 1 , f 2 ) d − 1 − η ( G j 1 , f 2 ) d ⋅ ( g j 1 , f 2 ) d ( V j 2 , f 1 ) d = ( V j 2 , f 1 ) d − 1 − η ( G j 2 , f 1 ) d ⋅ ( g j 2 , f 1 ) d ( 26 ) \begin{aligned} (V_{j1,f2})_d=(V_{j1,f2})_{d-1}-\frac{\eta}{\sqrt{(G_{j1,f2})_d}} \cdot (g_{j1,f2})_d\\ (V_{j2,f1})_d=(V_{j2,f1})_{d-1}-\frac{\eta}{\sqrt{(G_{j2,f1})_d}} \cdot (g_{j2,f1})_d \end{aligned} \qquad(26) (Vj1,f2)d=(Vj1,f2)d1(Gj1,f2)d
η
(gj1,f2)d
(Vj2,f1)d=(Vj2,f1)d1(Gj2,f1)d
η
(gj2,f1)d
(26)

2.3.4 关于初始参数的设定

文献1中如此建议:
(1) η \eta η:没有具体的建议,用户根据经验指定即可,一般会取0.1,0.01,0.001。

(2) V V V:在区间 [ 0 , 1 / k ] [0,1/\sqrt{k}] [0,1/k
]
间的随机值,均匀分布即可。

(3) G G G:设置为1,以避免 ( G j 1 , f 2 ) d − 1 2 (G_{j1,f2})_d^{-\frac{1}{2}} (Gj1,f2)d21出现很大的值。

2.4 时间复杂度

2.4.1 计算时间复杂度

由于式(18)无法做类似于式(10)的简化,因此FFM的计算时间复杂度为 O ( k n 2 ) O(kn^2) O(kn2)

2.4.2 训练时间复杂度

由于训练时,需要先根据式(18)计算 ϕ \phi ϕ,复杂度为 O ( k n 2 ) O(kn^2) O(kn2),计算得到 ϕ \phi ϕ后,还需要按照式(22)计算1次,按照式(21)计算2k次,按照式(23)计算2k次,按照式(24)计算2k次,也就是说,总的训练时间复杂度为:
O ( k n 2 ) + 1 + 2 k + 2 k + 2 k = O ( k n 2 ) O(kn^2) + 1 + 2k + 2k + 2k = O(kn^2) O(kn2)+1+2k+2k+2k=O(kn2)
因此,训练时间复杂度为 O ( k n 2 ) O(kn^2) O(kn2)

2.5 计算速度优化

2.5.1 openMP

OpenMP提供的这种对于并行描述的高层抽象降低了并行编程的难度和复杂度,这样程序员可以把更多的精力投入到并行算法本身,而非其具体实现细节。对基于数据分集的多线程程序设计,OpenMP是一个很好的选择。同时,使用OpenMP也提供了更强的灵活性,可以较容易的适应不同的并行系统配置。线程粒度和负载平衡等是传统多线程程序设计中的难题,但在OpenMP中,OpenMP库从程序员手中接管了部分这两方面的工作。

openPM原生支持C/C++/Fortran,但java可以通过jomp等引入,未测试。

2.5.2 SSE3

。SSE3 中13个新指令的主要目的是改进线程同步和特定应用程序领域,例如媒体和游戏。这些新增指令强化了处理器在浮点转换至整数、复杂算法、视频编码、SIMD浮点寄存器操作以及线程同步等五个方面的表现,最终达到提升多媒体和游戏性能的目的。Intel是从Prescott核心的Pentium 4开始支持SSE3指令集的,而AMD则是从2005年下半年Troy核心的Opteron开始才支持SSE3的。但是需要注意的是,AMD所支持的SSE3与Intel的SSE3并不完全相同,主要是删除了针对Intel超线程技术优化的部分指令。
SSE3指令采用128位的寄存器,可以同时操作4个单精度浮点数或者整数,因此非常类似于向量运算。这对于有大量向量计算的的FFM模型是有用的。
但事实上,计算 ϕ \phi ϕ是几乎无用,而这是最耗时间的部分。

2.5.3 ParameterServer

https://www.zybuluo.com/Dounm/note/517675
Paraeter Server框架中,每个server都只负责分到的部分参数(server共同维持一个全局共享参数)。server节点可以和其他server节点通信,每个server负责自己分到的参数,server group共同维持所有参数的更新。server manage node负责维护一些元数据的一致性,例如各个节点的状态,参数的分配情况。

2.6模型优化

2.6.1 特征编码连续

如果特征的编码不连续,比如编码是有意义的,或者预留空间给之后的编码。如果直接使用最大编码值的作为参数数据尺寸,则会导致大量内存空间的浪费,因此有2种解决方案:
(1)使用hashmap,而非数组。
(2)将有意义的编码映射到一个连续的编码空间。
目前我们使用方式(1),理论上方式(2)的计算速度会更快。

2.6.2 一次项缺失的影响

正如上面式(18)所言,我们经常会忽略了一次项的影响,因此我们可以为每个样本加上一个辅助特征,这相特征的值恒为1,这相当于引入了一次项。

2.6.3 样本归一化

文献1还建议,将样本向量的长度归一化后,性能有少量的提升。
R [ i ] = 1 ∣ ∣ X ∣ ∣ R[i]=\frac{1}{||X||} R[i]=X1

2.6.4 特征归一化

某些特征(如购买个数)有可能很大,而一些类别参数则恒为1,这将导致不同特征最终对模型的影响相关很大,这很不合理。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/132490.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • url加时间戳避免再次请求当前路径出现的缓存问题[通俗易懂]

    url加时间戳避免再次请求当前路径出现的缓存问题[通俗易懂]1.先解释一下,为什么要加时间戳: URL后面添加随机数通常用于防止客户端(浏览器)缓存页面。浏览器缓存是基于url进行缓存的,如果页面允许缓存,则在一定时间内(缓存时效时间前)再次访问相同的URL,浏览器就不会再次发送请求到服务器端,而是直接从缓存中获取指定资源。2.加时间戳的方法:[javascript] viewplain copy

  • 平时在PHP编码时有没有注意到这些问题

    平时在PHP编码时有没有注意到这些问题

  • 学计算机编程应该先学什么,如何自学计算机编程,学编程应该先学什么

    学计算机编程应该先学什么,如何自学计算机编程,学编程应该先学什么我以前学过但后来放弃了我可以给你点建议希望对你有用!!1.编程一般来说还是先学C语言,其实你不学C直接学C++也行,因为在C++中也包含很多C语。。但是我还是建议先学c.虽然要多花点时间但是对你以后过渡到C++和理解一些编程的基础知识,基本概念是很有好处的。学好了C之后就可以选择学java,c++,C#等。。。虽然语言多,但是他们都基于C只是有些地方不同,你可以根据你的就业方向选择一门学精,一…

  • pycharm terminal 进入虚拟环境_pycharm failed to create virtual

    pycharm terminal 进入虚拟环境_pycharm failed to create virtualPycharmterminal激活虚拟环境,首先需要保证系统完成了conda的安装,并在Powershell中完成虚拟环境的创建(操作创建的虚拟环境名称为deep_pool,这个虚拟环境在接下来的操作中会被提及到)。如果不会创建虚拟环境,可以参考下面这个流程:Ubuntu20.4安装Anaconda以及过程中遇到的问题(已解决)_qq_53258482的博客-CSDN博客在虚拟环境创建完成后,在powershell中输入命令Set-ExecutionPolicy-ScopeCurrentUse

  • 成本=固定成本+可变成本_可避免固定成本是机会成本吗

    成本=固定成本+可变成本_可避免固定成本是机会成本吗1、固定成本和可变成本根据成本费用与产量的关系可将总成本费用分为:可变成本;是指随着产品产量的增减而成正比例变化的各项费用。固定成本:是指不随产品产量的变化的各项成本费用。半可变(或半固定)成本:有些成本费用属于半可变成本,如不能熄灭的工业炉的燃料费等。工资、营业费用和流动资金利息等也都可能既有可变因素,又有固定因素。必要时需将半可变(或半固定)成进一步分解为可变成本和…

    2022年10月22日
  • vscode运行php配置_捷达vs5顶配啥配置

    vscode运行php配置_捷达vs5顶配啥配置这篇博文是当初笔者上课需要配置XAMPP,整理出来配置方法,错漏之处没有认真核对,给造成麻烦的同学道个歉。以下有两场修正之处。第一处,XAMPP国内下载地址改成了XAMPP中文网最新版本下载链接,给之前误下p2p的同学再次道个歉。第二处,下载xdebug插件-添加配置处配置信息已经修正,感谢评论区@SabreWulf2020同学另,水平有限暂时无法回复大家的私信问题,请谅解。一、下载XAMPPXAMPP是一个易于安装的Apache发行版,其中包含MariaDB、PHP和Perl。仅仅需要下载并.

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号