文章目录
前言
本篇博文主要介绍推荐系统中的常用算法,包括矩阵分解、线性模型(FM和FFM)、树模型、集成算法模型。深度学习模型DNN、Wide&Deep、Deep FM在下一篇博文中介绍。
一、矩阵分解
物品之间的相关性、信息量不因向量维度的增加而线性增加。矩阵内部的数据较为稀疏,而矩阵维度的变化对近邻分析结果影响较大,因此一般采用矩阵分解的方式求解近邻分析模型。矩阵分解的本质是将一个稀疏且纬度较高的矩阵拆解为维度较低的两个矩阵乘积。
矩阵分解的本质是预测用户对一个物品的喜好程度,实际应用中,通常利用矩阵分解的结果进行排序。
假设用户对物品的评价矩阵是
R
m
∗
n
R_{m*n}
Rm∗n,即有
m
m
m个用户,
n
n
n个物品,则可以分解为:
R
m
∗
n
=
P
m
∗
k
Q
k
∗
n
(0)
R_{m*n}=P_{m*k}Q_{k*n} \tag{0}
Rm∗n=Pm∗kQk∗n(0)
1. 奇异值分解(SVD)
矩阵分解是把用户和物品映射到一个 k k k维空间,这个 k k k维空间被称为隐因子,物理含义是隐藏在矩阵数据背后的规律。
用户
u
u
u的向量是
p
u
p_u
pu,物品
i
i
i的向量是
q
i
q_i
qi,那么,将物品
i
i
i推荐给用户
u
u
u的推荐分数为:
r
^
u
i
=
p
u
q
i
T
=
∑
k
p
u
k
q
i
k
\hat{r}_{ui}=p_u q_i^T=\sum_k p_{uk}q_{ik}
r^ui=puqiT=k∑pukqik在机器学习中,奇异值分解(Singular Value Decomposition, SVD)算法的损失函数为:
J
=
m
i
n
q
∗
,
p
∗
∑
(
u
,
i
)
∈
k
(
r
u
i
−
r
^
u
i
)
2
+
λ
(
∥
q
i
∥
2
+
∥
p
u
∥
2
)
J=min_{q^*,p^*} \sum_{(u,i) \in k} (r_{ui} - \hat{r}_{ui})^2 + \lambda (\|q_i\|^2+\|p_u\|^2)
J=minq∗,p∗(u,i)∈k∑(rui−r^ui)2+λ(∥qi∥2+∥pu∥2)上式中,SVD的损失函数由两部分构成:
(
r
u
i
−
r
^
u
i
)
(r_{ui} - \hat{r}_{ui})
(rui−r^ui)是模型的偏差,表示预测的结果与实际用户评分之间的差距,该值越小越好;
(
∥
q
i
∥
2
+
∥
p
u
∥
2
)
(\|q_i\|^2+\|p_u\|^2)
(∥qi∥2+∥pu∥2)用于控制模型方差,表示得到的隐因子越简单越好。损失函数
J
J
J求关于
p
u
k
p_{uk}
puk和
q
i
k
q_{ik}
qik的偏导数如下:
∂
J
∂
p
u
k
=
2
(
−
q
i
k
)
(
r
u
i
−
p
u
q
i
T
)
+
2
λ
p
u
k
\frac{\partial J}{\partial p_{uk}}=2(-q_{ik})(r_{ui}-p_u q_i^T)+2\lambda p_{uk}
∂puk∂J=2(−qik)(rui−puqiT)+2λpuk设
e
u
i
=
(
r
u
i
−
p
u
q
i
T
)
e_{ui}=(r_{ui}-p_u q_i^T)
eui=(rui−puqiT),
e
u
i
e_{ui}
eui为样本的误差,所以
∂
J
∂
p
u
k
=
2
(
−
q
i
k
)
e
u
i
+
2
λ
p
u
k
\frac{\partial J}{\partial p_{uk}}=2(-q_{ik})e_{ui}+2\lambda p_{uk}
∂puk∂J=2(−qik)eui+2λpuk利用随机梯度下降,每遇到一个样本都去更新
p
u
k
p_{uk}
puk,故
p
u
k
=
p
u
k
−
α
∂
J
∂
p
u
k
=
p
u
k
+
2
α
(
q
i
k
e
u
i
−
λ
p
u
k
)
(1)
p_{uk}=p_{uk}-\alpha \frac{\partial J}{\partial p_{uk}}=p_{uk}+2\alpha (q_{ik}e_{ui}-\lambda p_{uk}) \tag{1}
puk=puk−α∂puk∂J=puk+2α(qikeui−λpuk)(1)同理,
q
i
k
=
q
i
k
−
β
∂
J
∂
q
i
k
=
q
i
k
+
2
β
(
p
u
k
e
u
i
−
λ
q
i
k
)
(2)
q_{ik}=q_{ik}-\beta \frac{\partial J}{\partial q_{ik}}=q_{ik}+2\beta (p_{uk}e_{ui}-\lambda q_{ik}) \tag{2}
qik=qik−β∂qik∂J=qik+2β(pukeui−λqik)(2) 通过上述两个公式,就可以在训练中不断迭代更新矩阵内的元素。
SVD算法的学习过程如下:
- 用户对物品的评分矩阵 R R R,每条数据是一个训练样本;
- 将 R R R分解为矩阵 P P P和 Q Q Q,并随机初始化元素值;
- 用矩阵 P P P和 Q Q Q计算预测后的评分;
- 计算实际评分和预测评分之间的误差;
- 按照公式(1)和公式(2)更新参数并更新其中每个元素;
- 按照步骤3-5,直到达到停止条件(设定迭代次数)为止。
SVD还有一个变种是SVD++算法。针对推荐系统中的冷启动问题(显示反馈比隐式反馈少),可以考虑利用用户行为的隐式反馈来弥补。我们可以将用户历史行为中的隐式反馈和用户属性加入用户评分矩阵,这就相当于对原来的矩阵进行了扩展,则有:
r
^
u
i
=
μ
+
b
i
+
b
u
+
⟮
p
u
+
∣
N
(
u
)
∣
−
0.5
∑
i
∈
N
(
u
)
x
i
+
∑
a
∈
A
(
u
)
y
a
⟯
q
i
T
(3)
\hat{r}_{ui}=\mu + b_i + b_u + \lgroup p_u + |N(u)|^{-0.5} \sum _{i \in N(u)} x_i + \sum _{a \in A(u)} y_a \rgroup q_i^T \tag{3}
r^ui=μ+bi+bu+⟮pu+∣N(u)∣−0.5i∈N(u)∑xi+a∈A(u)∑ya⟯qiT(3) 其中,
N
(
u
)
N(u)
N(u)表示用户
u
u
u做出隐式反馈的物品集合,
∣
A
(
u
)
∣
|A(u)|
∣A(u)∣表示这个物品集合的大小,
x
i
x_i
xi是隐式反馈的物品
i
i
i对应的隐因子向量,
y
a
y_a
ya是用户属性
a
a
a对应的隐因子向量。用公式(3)代替SVD损失函数中的
r
^
u
i
\hat{r}_{ui}
r^ui,随机梯度下降算法依然有效。
2. 交替最小二乘(ALS)
矩阵分解算法可以利用随机梯度下降法,也可以利用交替最小二乘(Alternating Least Squares, ALS)法。ALS算法的核心思想是:将矩阵
R
R
R(用户对商品的兴趣矩阵)分解为
P
P
P(用户对于隐特征的兴趣矩阵)和
Q
Q
Q(商品与隐特征的兴趣矩阵的转置矩阵)。由公式(0),可以得到:
P
m
∗
k
=
R
m
∗
n
Q
k
∗
n
−
1
,
Q
k
∗
n
=
P
m
∗
k
−
1
R
m
∗
n
P_{m*k}=R_{m*n}Q_{k*n}^{-1}, Q_{k*n}=P_{m*k}^{-1}R_{m*n}
Pm∗k=Rm∗nQk∗n−1,Qk∗n=Pm∗k−1Rm∗n 使用最小化平方误差函数并加入正则项后,ALS的损失函数为:
L
(
X
,
Y
)
=
∑
(
r
u
i
−
x
u
T
y
i
)
+
α
(
∣
x
u
∣
2
−
∣
y
i
∣
2
)
L(X,Y)=\sum(r_{ui}-x_u^T y_i) + \alpha (|x_u|^2 - |y_i|^2)
L(X,Y)=∑(rui−xuTyi)+α(∣xu∣2−∣yi∣2) ALS算法的学习过程如下:
- 初始化随机矩阵 Q Q Q中的元素值;
- 假设矩阵 Q Q Q已知,则损失函数中的 y y y为已知量,对损失函数中的 x x x求偏导,求解矩阵 P P P;
- 得到矩阵 P P P后,假设矩阵 P P P已知,则损失函数中的 x x x为已知量,对于损失函数中的 y y y求偏导数,求解矩阵 Q Q Q;
- 交替进行步骤2和步骤3,直到误差达到设定条件为止。
如果对隐式反馈的矩阵分解中的ALS算法进一步改进,如进行加权交替,则ALS算法被称为Weighted-ALS(加权交替最小二乘法)。举个例子证明:如果你买了一件比较昂贵的大衣,之后购买心仪的鞋子和裤子的计划可能就会被搁置,但你可能依然会关注这些商品,对应到行为上可能就是多次点击和查看。行为发生的次数是对行为置信度的反映,是加权的一种形式。
所以,Weighted-ALS算法的损失函数
J
J
J为:
J
=
m
i
n
q
∗
,
p
∗
∑
(
u
,
i
)
∈
k
c
u
i
(
r
u
i
−
r
^
u
i
)
2
+
λ
(
∥
q
i
∥
2
+
∥
p
u
∥
2
)
J=min_{q^*,p^*} \sum_{(u,i) \in k} c_{ui} (r_{ui} - \hat{r}_{ui})^2 + \lambda (\|q_i\|^2+\|p_u\|^2)
J=minq∗,p∗(u,i)∈k∑cui(rui−r^ui)2+λ(∥qi∥2+∥pu∥2) 其中,
r
^
u
i
=
p
u
q
i
T
=
∑
k
p
u
k
q
i
k
\hat{r}_{ui}=p_u q_i^T=\sum_k p_{uk} q_{ik}
r^ui=puqiT=∑kpukqik;
c
u
i
=
1
+
α
C
c_{ui}=1+\alpha C
cui=1+αC,
α
\alpha
α是一个超参数,需要调整,默认值为40可以取得较好的效果,
C
C
C表示点击和查看的次数。
3. 贝叶斯个性化推荐(BPR)
排序学习的方法包括单文档方法、文档对方法和文档列表法。SVD和ALS均属于单文档方法,单文档方法只考虑了每个物品,且每个物品都是一个孤立的点。
单文档方法的缺点在于只能收集到正样本,所以在求解过程中往往将有缺失值的样本作为负样本,这会降低预测结果准确率,至少对那些数据有缺失值的用户是否喜欢某物品的判断会产生偏差。而贝叶斯个性化排序(Bayesian Personalized Ranking, BPR)算法可以解决该问题。
BPR算法是基于贝叶斯的个性化推荐,服从两个假设:
- 每个用户之间的行为偏好相互独立;
- 同一个用户对不同物品的排序相互独立。
BPR算法关心的是物品对于用户的相对排序。目标函数如下:
X
u
i
=
∑
n
=
1
K
w
u
n
h
i
n
X_{ui} = \sum _{n=1} ^{K} w_{un} h_{in}
Xui=n=1∑Kwunhin 其中,
K
K
K是隐因子向量的维度数,
w
u
n
w_{un}
wun和
h
i
n
h_{in}
hin分别是用户隐因子和物品隐因子向量的元素值。
BPR算法学习过程是:得到推荐分数后,计算正样本和负样本的分数之差,通过这个差值反映用户对于不同物品的偏好程度。正样本是用户看到后有隐式反馈的物品,负样本是用户看到后没有任何反馈的物品。比如用户
u
u
u看到物品1和物品2的推荐分数差为:
X
u
1
,
2
=
X
u
1
−
X
u
2
X_{u 1, 2} = X_{u 1} - X_{u 2}
Xu1,2=Xu1−Xu2 BPR算法参数的训练过程如下:
在BPR算法中,我们将任意用户对物品的排序进行标记,假设用户 u u u在物品 i i i和物品 j j j之间点击了物品 j j j,我们就得到三元组 < u , j , i > <u,j,i> <u,j,i>,其表示对于用户 u u u,物品 j j j的排序比物品 i i i靠前。对于用户 u u u,得到的多组数据可以作为训练样本 D D D。
设用户组
U
U
U和物品集
I
I
I对应的预测排序矩阵为
X
ˉ
\bar{X}
Xˉ,我们期望得到两个分解后的用户矩阵为
W
W
W和物品集合
H
H
H,则满足
X
ˉ
=
W
H
T
\bar{X}=WH^T
Xˉ=WHT。因为BPR是基于用户维度的,所以对于任意一个用户
u
u
u,对应的任意一个物品
i
i
i,有
X
u
i
=
w
u
h
i
=
∑
n
=
1
K
w
u
n
h
i
n
X_{ui} = w_u h_i = \sum _{n=1} ^{K} w_{un} h_{in}
Xui=wuhi=n=1∑Kwunhin BPR基于最大后验估计对矩阵
W
W
W、
H
H
H进行求解。使用
θ
\theta
θ表示矩阵
W
W
W和
H
H
H,
>
u
>u
>u表示用户
u
u
u对所有物品的全序关系,根据贝叶斯公式,有
P
(
θ
∣
>
u
)
=
P
(
>
u
∣
θ
)
P
(
θ
)
P
(
>
u
)
P(\theta | >u)=\frac{P(>u|\theta)P(\theta)}{P(>u)}
P(θ∣>u)=P(>u)P(>u∣θ)P(θ) 根据假设1,用户之间相互独立,对于任意一个用户来说,
P
(
>
u
)
P(>u)
P(>u)对所有物品是一样的,所以:
P
(
θ
∣
>
u
)
∝
P
(
>
u
∣
θ
)
P
(
θ
)
P(\theta | >u) \varpropto P(>u|\theta)P(\theta)
P(θ∣>u)∝P(>u∣θ)P(θ) 其中,
P
(
>
u
∣
θ
)
P(>u|\theta)
P(>u∣θ)部分与样本数据
D
D
D相关,
P
(
θ
)
P(\theta)
P(θ)与样本数据
D
D
D无关。对于第一部分,根据假设2的用户对不同物品的偏好相互独立,则有
∏
u
∈
U
∏
(
u
,
i
,
j
)
∈
(
U
∗
I
∗
I
)
P
(
i
>
u
j
)
δ
(
(
u
,
i
,
j
)
∈
D
)
(
1
−
P
(
i
>
u
j
)
)
δ
(
(
u
,
i
,
j
)
∉
D
)
\prod _{u \in U} \prod_{(u,i,j) \in (U*I*I)} P(i>uj)^{\delta((u,i,j) \in D)} (1-P(i>uj))^{\delta((u,i,j) \notin D)}
u∈U∏(u,i,j)∈(U∗I∗I)∏P(i>uj)δ((u,i,j)∈D)(1−P(i>uj))δ((u,i,j)∈/D) 其中,
δ
(
b
)
=
{
1
,
b
i
s
t
r
u
e
0
,
o
t
h
e
r
s
\delta (b) = \begin{cases} 1&{,b is true}\\ 0& {,others} \end{cases}
δ(b)={10,bistrue,others,
b
b
b为
(
u
,
i
,
j
)
∈
D
(u,i,j) \in D
(u,i,j)∈D的判断结果。
第一部分可以简化为:
∏
u
∈
U
P
(
>
u
∣
θ
)
=
∏
(
u
,
i
,
j
)
∈
D
P
(
i
>
u
j
∣
θ
)
\prod_{u \in U} P(>u|\theta) = \prod_{(u,i,j) \in D} P(i>uj| \theta)
u∈U∏P(>u∣θ)=(u,i,j)∈D∏P(i>uj∣θ)进一步地,
P
(
i
>
u
j
∣
θ
)
=
σ
(
x
ˉ
u
i
j
(
θ
)
)
P(i>uj|\theta)=\sigma (\bar{x}_{uij}(\theta))
P(i>uj∣θ)=σ(xˉuij(θ)),
σ
x
\sigma{x}
σx是sigmoid函数,也可以使用其他函数代替。对于
x
ˉ
u
i
j
(
θ
)
\bar{x}_{uij}(\theta)
xˉuij(θ),当
i
>
u
j
i>uj
i>uj时,
x
ˉ
u
i
j
(
θ
)
>
0
\bar{x}_{uij}(\theta)>0
xˉuij(θ)>0;反之,
x
ˉ
u
i
j
(
θ
)
<
0
\bar{x}_{uij}(\theta)<0
xˉuij(θ)<0。其中,
x
ˉ
u
i
j
(
θ
)
=
x
ˉ
u
i
(
θ
)
−
x
ˉ
u
j
(
θ
)
\bar{x}_{uij}(\theta) = \bar{x}_{ui}(\theta) - \bar{x}_{uj}(\theta)
xˉuij(θ)=xˉui(θ)−xˉuj(θ),
x
ˉ
u
i
(
θ
)
,
x
ˉ
u
j
(
θ
)
\bar{x}_{ui}(\theta) ,\bar{x}_{uj}(\theta)
xˉui(θ),xˉuj(θ)是矩阵
X
ˉ
\bar{X}
Xˉ中的元素,可用
x
ˉ
u
i
,
x
ˉ
u
j
\bar{x}_{ui} ,\bar{x}_{uj}
xˉui,xˉuj表示。
最终,第一部分优化目标转换为:
∏
u
∈
U
P
(
>
u
∣
θ
)
=
∏
(
u
,
i
,
j
)
∈
D
σ
(
x
ˉ
u
i
−
x
ˉ
u
j
)
\prod_{u \in U} P( >u | \theta) = \prod_{(u,i,j) \in D} \sigma (\bar{x}_{ui} - \bar{x}_{uj})
u∈U∏P(>u∣θ)=(u,i,j)∈D∏σ(xˉui−xˉuj)第二部分
P
(
θ
)
P(\theta)
P(θ)服从正态分布,且均值为0,协方差矩阵是
λ
θ
I
\lambda_{\theta}I
λθI,即
P
(
θ
)
∼
N
(
0
,
λ
θ
I
)
P(\theta) \thicksim N(0,\lambda_{\theta}I)
P(θ)∼N(0,λθI) 注意到,
l
n
P
(
θ
)
lnP(\theta)
lnP(θ)和
∥
θ
∥
2
\| \theta \|^2
∥θ∥2成正比,所以有
l
n
P
(
θ
∣
>
u
)
∝
l
n
P
(
>
u
∣
θ
)
P
(
θ
)
=
l
n
∏
(
u
,
i
,
j
)
∈
D
σ
(
x
ˉ
u
i
−
x
ˉ
u
j
)
+
l
n
P
(
θ
)
∝
∑
(
u
,
i
,
j
)
∈
D
l
n
σ
(
x
ˉ
u
i
−
x
ˉ
u
j
)
+
λ
∥
θ
∥
2
lnP(\theta | >u) \varpropto lnP(>u|\theta)P(\theta) = ln \prod_{(u,i,j) \in D} \sigma(\bar{x}_{ui} - \bar{x}_{uj}) + lnP(\theta) \varpropto \sum_{(u,i,j) \in D} ln \sigma(\bar{x}_{ui} - \bar{x}_{uj}) + \lambda \|\theta\|^2
lnP(θ∣>u)∝lnP(>u∣θ)P(θ)=ln(u,i,j)∈D∏σ(xˉui−xˉuj)+lnP(θ)∝(u,i,j)∈D∑lnσ(xˉui−xˉuj)+λ∥θ∥2使用梯度上升法,对
θ
\theta
θ求导,有:
∂
l
n
P
(
θ
∣
>
u
)
∂
θ
∝
∑
(
u
,
i
,
j
)
∈
D
1
1
+
e
x
ˉ
u
i
−
x
ˉ
u
j
∂
(
x
ˉ
u
i
−
x
ˉ
u
j
)
∂
θ
+
λ
θ
\frac{\partial{lnP(\theta | >u)}}{\partial{\theta}} \varpropto \sum_{(u,i,j) \in D} \frac{1}{1+e^{\bar{x}_{ui} - \bar{x}_{uj}}} \frac{\partial (\bar{x}_{ui} - \bar{x}_{uj})}{\partial \theta} + \lambda \theta
∂θ∂lnP(θ∣>u)∝(u,i,j)∈D∑1+exˉui−xˉuj1∂θ∂(xˉui−xˉuj)+λθ因为
x
ˉ
u
i
−
x
ˉ
u
j
=
∑
f
=
1
K
w
u
f
h
i
f
−
∑
f
=
1
K
w
u
f
h
j
f
\bar{x}_{ui} - \bar{x}_{uj} = \sum_{f=1}^{K}w_{uf}h_{if} - \sum_{f=1}^{K}w_{uf}h_{jf}
xˉui−xˉuj=f=1∑Kwufhif−f=1∑Kwufhjf 所以
∂ ( x ˉ u i − x ˉ u j ) ∂ θ = { ( h i f − h j f ) , θ = w u f w u f , θ = h i f − w u f , θ = h j f \frac{\partial(\bar{x}_{ui} - \bar{x}_{uj})}{\partial \theta} = \begin{cases} (h_{if} - h_{jf})& {,\theta=w_{uf}}\\ w_{uf}& {,\theta=h_{if}}\\ -w_{uf}& {,\theta=h_{jf}} \end{cases} ∂θ∂(xˉui−xˉuj)=⎩⎪⎨⎪⎧(hif−hjf)wuf−wuf,θ=wuf,θ=hif,θ=hjf
二、线性模型
逻辑回归等基础的线性模型均认为特征是相互独立的,但是实际情况下特征之间的依赖关系却是不可忽略的,因此需要进行特征交叉。多数业务场景下,类别特征做完OneHot后会变得相当稀疏,尤其是进行了特征交叉之后,特征空间变得很大。FM模型和FFM模型可用于解决特征交叉下数据稀疏所带来的一系列问题。本博文在这部分主要介绍因子分解机(Factorization Machine, FM)及其变种FFM(Field-aware Factorization Machine)。
1. FM
FM模型通过引入多项式回归模型来加入特征间的关联性的,通常对线性模型增加一个二阶多项式,其多项式模型的公式变为:
y
=
w
0
+
∑
i
=
1
n
w
i
x
i
+
∑
i
=
1
n
−
1
∑
j
=
i
+
1
n
w
i
j
x
i
x
j
(4)
y = w_0 + \sum _{i=1}^n w_i x_i + \sum_{i=1}^{n-1} \sum_{j=i+1}^{n}w_{ij} x_i x_j \tag{4}
y=w0+i=1∑nwixi+i=1∑n−1j=i+1∑nwijxixj(4)上述公式中的二阶项参数共有
n
(
n
−
1
)
/
2
n(n-1)/2
n(n−1)/2种,且任意参数间相互独立,这些参数求解需要大量的非零样本。但是很多时候特征空间是相当稀疏的,这就导致求解结果不准确。
为了解决上述问题,FM模型引入了矩阵分解的思路,对交叉项的稀疏矩阵进行了如下分解:
w
i
j
=
<
v
i
,
v
j
>
w_{ij}=<v_i,v_j>
wij=<vi,vj> 上述矩阵分解思路如下:由于特征之间不是相互独立的,因此可以使用一个隐因子来串联。这类似于推荐算法中,将评分矩阵分解成用户矩阵和物品矩阵,每个用户和物品都可以用一个隐向量表示,两个向量的点乘就是每个用户对于每个物品的评分矩阵。
公式(4)中的二次项系数组成一个对称阵 W W W, W W W可被分解成 V T V V^T V VTV, V V V的第 j j j列及第 j j j维特征的隐向量,因此FM模型可表示成如下。
根据
V
V
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
v
2
.
.
.
v
n
)
V = \left( \begin{matrix} v_{11} & v_{12} & ... & v_{1k}\\ v_{21} & v_{22} & ... & v_{2k}\\ ... & ... & ... & ... \\ v_{n1} & v_{n2} & ... & v_{nk}\\ \end{matrix} \right)_{n*k} = \left( \begin{matrix} v_1 \\ v_2 \\ ... \\ v_n \end{matrix} \right)
V=⎝⎜⎜⎛v11v21...vn1v12v22...vn2............v1kv2k...vnk⎠⎟⎟⎞n∗k=⎝⎜⎜⎛v1v2...vn⎠⎟⎟⎞
简化
W
W
W矩阵:
W
i
j
=
v
i
v
j
T
=
<
v
i
,
v
j
>
W_{ij}=v_i v_j^T = <v_i, v_j>
Wij=vivjT=<vi,vj>. 那么,FM公式如下:
y
=
w
0
+
∑
i
=
1
n
w
i
x
i
+
∑
i
=
1
n
−
1
∑
j
=
i
+
1
n
<
v
i
,
v
j
>
x
i
x
j
y = w_0 + \sum _{i=1}^n w_i x_i + \sum_{i=1}^{n-1} \sum_{j=i+1}^{n} <v_i, v_j> x_i x_j
y=w0+i=1∑nwixi+i=1∑n−1j=i+1∑n<vi,vj>xixj再进一步简化得:
∑
i
=
1
n
−
1
∑
j
=
i
+
1
n
<
v
i
,
v
j
>
x
i
x
j
=
1
2
∑
i
=
1
n
∑
j
=
1
n
<
v
i
,
v
j
>
x
i
x
j
−
1
2
∑
i
=
1
n
<
v
i
,
v
i
>
x
i
x
i
=
1
2
(
∑
i
=
1
n
∑
j
=
1
n
∑
f
=
1
k
v
i
,
f
v
j
,
f
x
i
x
j
−
∑
i
=
1
n
∑
f
=
1
k
v
i
,
f
v
i
,
f
x
i
x
i
)
)
=
1
2
∑
f
=
1
k
(
(
∑
i
=
1
n
v
i
,
f
x
i
)
(
∑
j
=
1
n
v
j
,
f
x
j
)
−
∑
i
=
1
n
v
i
,
f
2
x
i
2
)
=
1
2
∑
f
=
1
k
(
(
∑
i
=
1
n
v
i
,
f
x
i
)
2
−
∑
i
=
1
n
v
i
,
f
2
x
i
2
)
\begin{aligned} & \sum_{i=1} ^{n-1} \sum_{j=i+1} ^{n} <v_i, v_j> x_i x_j \\ & = \frac{1}{2} \sum_{i=1} ^{n} \sum_{j=1} ^{n} <v_i, v_j> x_i x_j - \frac{1}{2} \sum_{i=1} ^{n} <v_i, v_i> x_i x_i \\ & = \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}
i=1∑n−1j=i+1∑n<vi,vj>xixj=21i=1∑nj=1∑n<vi,vj>xixj−21i=1∑n<vi,vi>xixi=21⎝⎛i=1∑nj=1∑nf=1∑kvi,fvj,fxixj−i=1∑nf=1∑kvi,fvi,fxixi)⎠⎞=21f=1∑k((i=1∑nvi,fxi)(j=1∑nvj,fxj)−i=1∑nvi,f2xi2)=21f=1∑k⎝⎛(i=1∑nvi,fxi)2−i=1∑nvi,f2xi2⎠⎞最终,FM公式可以简化为:
y
(
x
)
=
w
0
+
∑
i
=
1
n
w
i
x
i
+
1
2
∑
f
=
1
k
(
(
∑
i
=
1
n
v
i
,
f
x
i
)
2
−
∑
i
=
1
n
v
i
,
f
2
x
i
2
)
y(x) = w_0 + \sum _{i=1}^n w_i x_i + \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)
y(x)=w0+i=1∑nwixi+21f=1∑k⎝⎛(i=1∑nvi,fxi)2−i=1∑nvi,f2xi2⎠⎞ 利用SGD(Sochastic Gradient Descent)训练模型,模型各参数得梯度如下:
∂
y
(
x
)
∂
θ
=
{
1
,
θ
=
w
0
x
i
,
θ
=
w
i
x
i
∑
j
=
1
n
v
j
,
f
x
j
−
v
i
,
f
x
i
2
,
θ
=
v
i
,
f
\frac{\partial y(x)}{\partial \theta} = \begin{cases} 1 & ,\theta = w_0 \\ x_i & ,\theta = w_i \\ x_i \sum_{j=1}^{n}v_{j,f}x_j - v_{i,f}x_i^2 & ,\theta = v_{i,f} \end{cases}
∂θ∂y(x)=⎩⎪⎨⎪⎧1xixi∑j=1nvj,fxj−vi,fxi2,θ=w0,θ=wi,θ=vi,f
2. FFM
FFM把相同特征归于一个域(Filed),交互捕捉不同场之间的数据特征也比较重要。FM中一个特征只对应一个向量,而在实际场景中不同场得特征之间交互时应该使用不同的向量,这就是FFM(Field-aware FM)的提出动机。FM可以看作是FFM的一个特例,把所有的特征都归属于一个域。
假设样本有
n
n
n个特征,同一个特征经过编码(或没有编码)的数值特征放到一个域中,其中有
f
f
f个域,那么FFM的二次项中有
n
∗
f
n*f
n∗f个隐向量。而在FM模型中,所有特征的隐向量只有一个。根据FFM的域的敏感特性,导出FFM模型如下:
y
=
w
0
+
∑
i
=
1
n
w
i
x
i
+
∑
i
=
1
n
∑
j
=
i
+
1
n
<
v
i
,
f
j
,
v
j
,
f
i
>
x
i
x
j
y = w_0 + \sum _{i=1}^n w_i x_i + \sum_{i=1}^{n} \sum_{j=i+1}^{n} <v_{i,fj}, v_{j,fi}> x_i x_j
y=w0+i=1∑nwixi+i=1∑nj=i+1∑n<vi,fj,vj,fi>xixj其中,
f
j
f_j
fj表示第
j
j
j个特征所对应的域。假设隐向量的长度为
k
k
k,那么FFM的二次项中的参数有
n
∗
f
∗
k
n*f*k
n∗f∗k个,远多于FM模型的
n
∗
k
n*k
n∗k个。由于隐向量与Filed有关,因此FFM的二次项并不能够化简,其预测复杂度是
O
(
k
n
2
)
O(kn^2)
O(kn2)。
FFM模型支持并行化处理,所以计算速度有一定的提高。
三、树模型
推荐分为召回和排序两个阶段。在召回阶段,由于处理的数据量较大,要求处理的速度快,因此使用的模型不能太复杂,而且特征不需要太多。但是在排序阶段,因为处理的数据量一般较少,且要求模型足够精确,因此可以选择稍微复杂的模型,使用多个特征进行训练。树模型在排序阶段是一个不错的选择,还可以将弱分类器集成起来组合成一个功能强大的分类器。
1. 决策树
决策时算法是一种归纳分类算法,属于有监督、非参数学习方法。决策树的基本算法是贪心算法,自顶而下递归的方式构建决策树。常用的决策树算法有ID3、C4.5、CART。本博文不对其详细展开介绍了。
2. GBDT
梯度提升迭代决策树(Gradient Boosting Decision Tree, GBDT)是一种Boosting算法,其核心思想是利用前一轮迭代的误差更新训练集的权重,校正前一轮迭代被分类错误的样本。
在使用GBDT过程中,应该注意一下几点:
- 在分类树中,一般通过信息熵增益或信息熵增益率等属性来选择分裂特征和分裂点。在回归树中,一般选择分类增益最大即分类后误差最小的点作为当前的分裂点。
- 当GBDT用于分类时,常用的损失函数有对数损失函数、指数损失函数等。这种损失函数的目的是求预测值为真实值的概率。
- 当GBDT用于回归时,常用的损失函数为平方损失函数、绝对值损失函数、Huber损失函数,每次朝着损失函数的负梯度方向移动。
3. GBDT+LR
多棵树的表达能力远高于单颗树,但RF的预测效果不如GBDT。GBDT+LR模型融合的思想来源于FaceBook公开的论文。
在这个模型中,用已有的特征训练GBDT模型,然后利用GBDT模型学习得到的树构造新特征,最后把这些新特征加入到原有特征中一起训练模型。其构造的新特征向量中的每个元素对应于GBDT模型中树的某个节点。当一个样板点通过某棵树最终落在这棵树的一个叶节点上时,那么新特征向量中这个节点对应的元素为1,而这棵树的其他叶节点对应的元素为0。新特征向量的长度等于GBDT模型中所有树包含的叶节点数之和。这里的每条路径,是通过最小化均方差等方法最终分割出来的有区分性路径,根据该路径得到的特征、特征交叉都相对有区分性,其效果理论上不会亚于采用人工经验的处理方式。
FaceBook的论文中有个例子,如下图:
图中Tree1和Tree2为通过GBDT算法学习出来的两棵树。
x
x
x为一条输入样本,遍历两棵树后,分别落在两棵树的叶子上,Tree1有三个叶子节点,Tree2有两个叶子节点,最终的特征即五维向量。对于输入
x
x
x,落在Tree1的第一个节点上,因此编码
[
1
,
0
,
0
]
[1,0,0]
[1,0,0]。落在Tree2的第二个节点上,因此编码
[
0
,
1
]
[0,1]
[0,1]。所以整体的编码为
[
1
,
0
,
0
,
0
,
1
]
[1,0,0,0,1]
[1,0,0,0,1]。将这类编码作为特征,输入到线性分类模型(LR或FM)中进行分类。
在该论文中GBDT的参数,树的数量最高为500颗(当树的棵树大于500颗时,模型的离线效果没有提升),每棵树的节点不多于12个。
GBDT模型可以学习高阶(树的深度越深,其特征的层级就越高)非线性特征交叉,对应树的一条路径(用叶子节点表示)就是一组高阶特征交叉。通常将一些连续值特征,值空间不大的离散特征都丢给GBDT模型;空间很大的ID特征则留在LR模型中进行训练。这样既能做到高阶特征交叉,又能利用线性模型易于处理大规模稀疏数据的优势。
4. XGBoost
XGBoost(eXtreme Gradient Boosting)是很多CART回归树的集成模型,也是一个大规模、分布式的通用GBDT库,是GBDT的扩展。模型求出的预测值,归于回归问题,预测值可以直接作为目标;对于分类问题,需要映射成概率(如逻辑变换)。
XGBoost算的停止迭代的常用条件有如下几个:
- 引入的特征带来的信息熵增益小于预先设定的阈值;
- 树的深度大于最大深度max_depth;
- 样本权重小于设定阈值。
近几年,XGBoost是机器学习领域的重要算法,它的执行速度比其他Gradient Boosting实现快,而且模型性能在结构化数据集以及分类、回归、排序预测建模上表现突出。
5. LightGBM
LightGBM通过采用基于梯度的的单边采样(Gradient-based One-side Sampling, GOSS)方法和互斥特征捆绑(Exclusive Feature Bunding, EFB)方法,大大提高了模型的训练速度且保证了准确率。接下来依次介绍GOSS算法和EFB算法。
首先看一下GOSS算法。其基本思想是梯度大的样本对信息熵增益的影响大,也就是说梯度大的样本点会贡献更多的信息熵增益。因此,为保证信息熵增益的精度,当我们对样本进行下采样的时候保留大梯度的样本点,而对于梯度小的样本点按照比例进行随机采样即可。这样做一方面保证了大梯度样本的保留,另一方面降低了运算压力,这也是GOSS算法能够使用LightGBM模型训练加速的原因之一。
GOSS算法的实现流程如下:在利用损失函数得到每个样本的梯度之后,对绝对梯度进行排序,取出排序结果中topN作为大梯度样本,在剩余的样本中随机抽取一部分作为小梯度样本,将二者合并,并给予小梯度样本一个权重。权重系数由大小样本占总样本量的比重决定。权重系数为
f
a
c
t
=
1
−
a
b
fact=\frac{1-a}{b}
fact=b1−a 其中
a
a
a是大梯度样本占全部样本的权重,
b
b
b是小梯度样本占全部样本的权重。使用当前样本生成一个新的弱学习器,重复上述步骤,直至模型收敛或达到最大迭代次数为止。
这里要特别说明权重系数的作用:目的是系统提高部分小梯度样本的权重,使当前所使用的小梯度样本能尽可能地担当起原始全部小梯度样本所承担的工作。
EFB算法是LightGBM中内置的对特征降维的方法。EFB是通过互斥特征捆绑进行特征降维。特征降维的思想在于捆绑生成新的特征,在生成新特征的过程中,特征几乎是互斥的,即特征并不同时为非零值。这种情况下才可以将其捆绑成一个新的特征,从而减少特征维度。举个简单的例子,如果当前存在两组特征,分别是 [ 1 , 0 , 1 , 0 , 1 ] [1,0,1,0,1] [1,0,1,0,1]和 [ 0 , 1 , 0 , 1 , 0 ] [0,1,0,1,0] [0,1,0,1,0],那么按照特征合并的思想,可以将这两个特征合并成 [ 1 , 2 , 1 , 2 , 1 ] [1,2,1,2,1] [1,2,1,2,1]。降维之后的特征所含属性与之前并无太大差别。
EFB算法的实现流程如下:构造一个图 G G G,其中每个特征 F F F的权重等于其与其他特征间的特征冲突值。将特征按照由大到小顺序排序并循环。如果当前有捆绑组,则考虑是否将当前特征加入任意一个捆绑组,其阈值由 K K K限定,即加入捆绑组之后,当前捆绑组的最大冲突值不大于 K K K。如果当前没有捆绑组或当前特征值无法加入捆绑组,则以当前特征为起点创建捆绑组。循环结束之后的捆绑组即特征组合结果。
LightGBM相较于其他算法有如下特性:
- Leaf-wise特性:Leaf-wise是在所有叶子节点中选取分裂收敛最大的节点进行。因此在分裂次数相同的情况下,Leaf-wise享有更高的准确度。LightGBM也可以通过设定最大深度即max_depth来避免过拟合问题的发生。
- 类别特征的分裂:LightGBM采用的是直方图加回归树的方式,因此在特征进行分裂时,继承了直方图和回归树的优势。这即保证了准确度,又大大提高了运算速度。
总结
本篇博文主要讲解了矩阵分解算法、线性模型及其变种、常用的树模型。其中,矩阵分解算法经常在推荐系统的离线计算过程中使用到,线性模型以及树模型经常在排序中用到。
推荐系统中用到的深度学习模型将在下一篇博文中总结介绍。