文章目录

  • 前言
  • 一、矩阵分解
    • 1. 奇异值分解(SVD)
    • 2. 交替最小二乘(ALS)
    • 3. 贝叶斯个性化推荐(BPR)
  • 二、线性模型
    • 1. FM
    • 2. FFM
  • 三、树模型
    • 1. 决策树
    • 2. GBDT
    • 3. GBDT+LR
    • 4. XGBoost
    • 5. LightGBM
  • 总结

前言

本篇博文主要介绍推荐系统中的常用算法,包括矩阵分解、线性模型(FM和FFM)、树模型、集成算法模型。深度学习模型DNN、Wide&Deep、Deep FM在下一篇博文中介绍。


一、矩阵分解

物品之间的相关性、信息量不因向量维度的增加而线性增加。矩阵内部的数据较为稀疏,而矩阵维度的变化对近邻分析结果影响较大,因此一般采用矩阵分解的方式求解近邻分析模型。矩阵分解的本质是将一个稀疏且纬度较高的矩阵拆解为维度较低的两个矩阵乘积。

矩阵分解的本质是预测用户对一个物品的喜好程度,实际应用中,通常利用矩阵分解的结果进行排序。

假设用户对物品的评价矩阵是Rm∗nR_{m*n}Rm∗n​,即有mmm个用户,nnn个物品,则可以分解为:
Rm∗n=Pm∗kQk∗n(0)R_{m*n}=P_{m*k}Q_{k*n} \tag{0}Rm∗n​=Pm∗k​Qk∗n​(0)

1. 奇异值分解(SVD)

矩阵分解是把用户和物品映射到一个kkk维空间,这个kkk维空间被称为隐因子,物理含义是隐藏在矩阵数据背后的规律。

用户uuu的向量是pup_upu​,物品iii的向量是qiq_iqi​,那么,将物品iii推荐给用户uuu的推荐分数为:
r^ui=puqiT=∑kpukqik\hat{r}_{ui}=p_u q_i^T=\sum_k p_{uk}q_{ik}r^ui​=pu​qiT​=k∑​puk​qik​在机器学习中,奇异值分解(Singular Value Decomposition, SVD)算法的损失函数为:
J=minq∗,p∗∑(u,i)∈k(rui−r^ui)2+λ(∥qi∥2+∥pu∥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的损失函数由两部分构成:(rui−r^ui)(r_{ui} - \hat{r}_{ui})(rui​−r^ui​)是模型的偏差,表示预测的结果与实际用户评分之间的差距,该值越小越好;(∥qi∥2+∥pu∥2)(\|q_i\|^2+\|p_u\|^2)(∥qi​∥2+∥pu​∥2)用于控制模型方差,表示得到的隐因子越简单越好。损失函数JJJ求关于pukp_{uk}puk​和qikq_{ik}qik​的偏导数如下:
∂J∂puk=2(−qik)(rui−puqiT)+2λpuk\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​−pu​qiT​)+2λpuk​设eui=(rui−puqiT)e_{ui}=(r_{ui}-p_u q_i^T)eui​=(rui​−pu​qiT​),euie_{ui}eui​为样本的误差,所以
∂J∂puk=2(−qik)eui+2λpuk\frac{\partial J}{\partial p_{uk}}=2(-q_{ik})e_{ui}+2\lambda p_{uk}∂puk​∂J​=2(−qik​)eui​+2λpuk​利用随机梯度下降,每遇到一个样本都去更新pukp_{uk}puk​,故
puk=puk−α∂J∂puk=puk+2α(qikeui−λpuk)(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α(qik​eui​−λpuk​)(1)同理,
qik=qik−β∂J∂qik=qik+2β(pukeui−λqik)(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β(puk​eui​−λqik​)(2) 通过上述两个公式,就可以在训练中不断迭代更新矩阵内的元素。

SVD算法的学习过程如下:

  1. 用户对物品的评分矩阵RRR,每条数据是一个训练样本;
  2. 将RRR分解为矩阵PPP和QQQ,并随机初始化元素值;
  3. 用矩阵PPP和QQQ计算预测后的评分;
  4. 计算实际评分和预测评分之间的误差;
  5. 按照公式(1)和公式(2)更新参数并更新其中每个元素;
  6. 按照步骤3-5,直到达到停止条件(设定迭代次数)为止。

SVD还有一个变种是SVD++算法。针对推荐系统中的冷启动问题(显示反馈比隐式反馈少),可以考虑利用用户行为的隐式反馈来弥补。我们可以将用户历史行为中的隐式反馈和用户属性加入用户评分矩阵,这就相当于对原来的矩阵进行了扩展,则有:
r^ui=μ+bi+bu+⟮pu+∣N(u)∣−0.5∑i∈N(u)xi+∑a∈A(u)ya⟯qiT(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)表示用户uuu做出隐式反馈的物品集合,∣A(u)∣|A(u)|∣A(u)∣表示这个物品集合的大小,xix_ixi​是隐式反馈的物品iii对应的隐因子向量,yay_aya​是用户属性aaa对应的隐因子向量。用公式(3)代替SVD损失函数中的r^ui\hat{r}_{ui}r^ui​,随机梯度下降算法依然有效。

2. 交替最小二乘(ALS)

矩阵分解算法可以利用随机梯度下降法,也可以利用交替最小二乘(Alternating Least Squares, ALS)法。ALS算法的核心思想是:将矩阵RRR(用户对商品的兴趣矩阵)分解为PPP(用户对于隐特征的兴趣矩阵)和QQQ(商品与隐特征的兴趣矩阵的转置矩阵)。由公式(0),可以得到:
Pm∗k=Rm∗nQk∗n−1,Qk∗n=Pm∗k−1Rm∗nP_{m*k}=R_{m*n}Q_{k*n}^{-1}, Q_{k*n}=P_{m*k}^{-1}R_{m*n}Pm∗k​=Rm∗n​Qk∗n−1​,Qk∗n​=Pm∗k−1​Rm∗n​ 使用最小化平方误差函数并加入正则项后,ALS的损失函数为:
L(X,Y)=∑(rui−xuTyi)+α(∣xu∣2−∣yi∣2)L(X,Y)=\sum(r_{ui}-x_u^T y_i) + \alpha (|x_u|^2 - |y_i|^2)L(X,Y)=∑(rui​−xuT​yi​)+α(∣xu​∣2−∣yi​∣2) ALS算法的学习过程如下:

  1. 初始化随机矩阵QQQ中的元素值;
  2. 假设矩阵QQQ已知,则损失函数中的yyy为已知量,对损失函数中的xxx求偏导,求解矩阵PPP;
  3. 得到矩阵PPP后,假设矩阵PPP已知,则损失函数中的xxx为已知量,对于损失函数中的yyy求偏导数,求解矩阵QQQ;
  4. 交替进行步骤2和步骤3,直到误差达到设定条件为止。

如果对隐式反馈的矩阵分解中的ALS算法进一步改进,如进行加权交替,则ALS算法被称为Weighted-ALS(加权交替最小二乘法)。举个例子证明:如果你买了一件比较昂贵的大衣,之后购买心仪的鞋子和裤子的计划可能就会被搁置,但你可能依然会关注这些商品,对应到行为上可能就是多次点击和查看。行为发生的次数是对行为置信度的反映,是加权的一种形式。

所以,Weighted-ALS算法的损失函数JJJ为:
J=minq∗,p∗∑(u,i)∈kcui(rui−r^ui)2+λ(∥qi∥2+∥pu∥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^ui=puqiT=∑kpukqik\hat{r}_{ui}=p_u q_i^T=\sum_k p_{uk} q_{ik}r^ui​=pu​qiT​=∑k​puk​qik​;cui=1+αCc_{ui}=1+\alpha Ccui​=1+αC,α\alphaα是一个超参数,需要调整,默认值为40可以取得较好的效果,CCC表示点击和查看的次数。

3. 贝叶斯个性化推荐(BPR)

排序学习的方法包括单文档方法、文档对方法和文档列表法。SVD和ALS均属于单文档方法,单文档方法只考虑了每个物品,且每个物品都是一个孤立的点。

单文档方法的缺点在于只能收集到正样本,所以在求解过程中往往将有缺失值的样本作为负样本,这会降低预测结果准确率,至少对那些数据有缺失值的用户是否喜欢某物品的判断会产生偏差。而贝叶斯个性化排序(Bayesian Personalized Ranking, BPR)算法可以解决该问题。

BPR算法是基于贝叶斯的个性化推荐,服从两个假设:

  1. 每个用户之间的行为偏好相互独立;
  2. 同一个用户对不同物品的排序相互独立。

BPR算法关心的是物品对于用户的相对排序。目标函数如下:
Xui=∑n=1KwunhinX_{ui} = \sum _{n=1} ^{K} w_{un} h_{in}Xui​=n=1∑K​wun​hin​ 其中,KKK是隐因子向量的维度数,wunw_{un}wun​和hinh_{in}hin​分别是用户隐因子和物品隐因子向量的元素值。

BPR算法学习过程是:得到推荐分数后,计算正样本和负样本的分数之差,通过这个差值反映用户对于不同物品的偏好程度。正样本是用户看到后有隐式反馈的物品,负样本是用户看到后没有任何反馈的物品。比如用户uuu看到物品1和物品2的推荐分数差为:
Xu1,2=Xu1−Xu2X_{u 1, 2} = X_{u 1} - X_{u 2}Xu1,2​=Xu1​−Xu2​ BPR算法参数的训练过程如下:

在BPR算法中,我们将任意用户对物品的排序进行标记,假设用户uuu在物品iii和物品jjj之间点击了物品jjj,我们就得到三元组<u,j,i><u,j,i><u,j,i>,其表示对于用户uuu,物品jjj的排序比物品iii靠前。对于用户uuu,得到的多组数据可以作为训练样本DDD。

设用户组UUU和物品集III对应的预测排序矩阵为Xˉ\bar{X}Xˉ,我们期望得到两个分解后的用户矩阵为WWW和物品集合HHH,则满足Xˉ=WHT\bar{X}=WH^TXˉ=WHT。因为BPR是基于用户维度的,所以对于任意一个用户uuu,对应的任意一个物品iii,有
Xui=wuhi=∑n=1KwunhinX_{ui} = w_u h_i = \sum _{n=1} ^{K} w_{un} h_{in}Xui​=wu​hi​=n=1∑K​wun​hin​ BPR基于最大后验估计对矩阵WWW、HHH进行求解。使用θ\thetaθ表示矩阵WWW和HHH,>u>u>u表示用户uuu对所有物品的全序关系,根据贝叶斯公式,有
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∣θ)部分与样本数据DDD相关,P(θ)P(\theta)P(θ)与样本数据DDD无关。对于第一部分,根据假设2的用户对不同物品的偏好相互独立,则有
∏u∈U∏(u,i,j)∈(U∗I∗I)P(i>uj)δ((u,i,j)∈D)(1−P(i>uj))δ((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,bistrue0,others\delta (b) = \begin{cases} 1&{,b is true}\\ 0& {,others} \end{cases}δ(b)={10​,bistrue,others​,bbb为(u,i,j)∈D(u,i,j) \in D(u,i,j)∈D的判断结果。

第一部分可以简化为:
∏u∈UP(>u∣θ)=∏(u,i,j)∈DP(i>uj∣θ)\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>uj∣θ)=σ(xˉuij(θ))P(i>uj|\theta)=\sigma (\bar{x}_{uij}(\theta))P(i>uj∣θ)=σ(xˉuij​(θ)),σx\sigma{x}σx是sigmoid函数,也可以使用其他函数代替。对于xˉuij(θ)\bar{x}_{uij}(\theta)xˉuij​(θ),当i>uji>uji>uj时,xˉuij(θ)>0\bar{x}_{uij}(\theta)>0xˉuij​(θ)>0;反之,xˉuij(θ)<0\bar{x}_{uij}(\theta)<0xˉuij​(θ)<0。其中,xˉuij(θ)=xˉui(θ)−xˉuj(θ)\bar{x}_{uij}(\theta) = \bar{x}_{ui}(\theta) - \bar{x}_{uj}(\theta)xˉuij​(θ)=xˉui​(θ)−xˉuj​(θ),xˉui(θ),xˉuj(θ)\bar{x}_{ui}(\theta) ,\bar{x}_{uj}(\theta)xˉui​(θ),xˉuj​(θ)是矩阵Xˉ\bar{X}Xˉ中的元素,可用xˉui,xˉuj\bar{x}_{ui} ,\bar{x}_{uj}xˉui​,xˉuj​表示。

最终,第一部分优化目标转换为:
∏u∈UP(>u∣θ)=∏(u,i,j)∈Dσ(xˉui−xˉuj)\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) 注意到,lnP(θ)lnP(\theta)lnP(θ)和∥θ∥2\| \theta \|^2∥θ∥2成正比,所以有
lnP(θ∣>u)∝lnP(>u∣θ)P(θ)=ln∏(u,i,j)∈Dσ(xˉui−xˉuj)+lnP(θ)∝∑(u,i,j)∈Dlnσ(xˉui−xˉuj)+λ∥θ∥2lnP(\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θ求导,有:
∂lnP(θ∣>u)∂θ∝∑(u,i,j)∈D11+exˉui−xˉuj∂(xˉui−xˉuj)∂θ+λθ\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ˉuj​1​∂θ∂(xˉui​−xˉuj​)​+λθ因为
xˉui−xˉuj=∑f=1Kwufhif−∑f=1Kwufhjf\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∑K​wuf​hif​−f=1∑K​wuf​hjf​ 所以

∂(xˉui−xˉuj)∂θ={(hif−hjf),θ=wufwuf,θ=hif−wuf,θ=hjf\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=w0+∑i=1nwixi+∑i=1n−1∑j=i+1nwijxixj(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∑n​wi​xi​+i=1∑n−1​j=i+1∑n​wij​xi​xj​(4)上述公式中的二阶项参数共有n(n−1)/2n(n-1)/2n(n−1)/2种,且任意参数间相互独立,这些参数求解需要大量的非零样本。但是很多时候特征空间是相当稀疏的,这就导致求解结果不准确。

为了解决上述问题,FM模型引入了矩阵分解的思路,对交叉项的稀疏矩阵进行了如下分解:
wij=<vi,vj>w_{ij}=<v_i,v_j> wij​=<vi​,vj​> 上述矩阵分解思路如下:由于特征之间不是相互独立的,因此可以使用一个隐因子来串联。这类似于推荐算法中,将评分矩阵分解成用户矩阵和物品矩阵,每个用户和物品都可以用一个隐向量表示,两个向量的点乘就是每个用户对于每个物品的评分矩阵。

公式(4)中的二次项系数组成一个对称阵WWW,WWW可被分解成VTVV^T VVTV,VVV的第jjj列及第jjj维特征的隐向量,因此FM模型可表示成如下。

根据VVV向量
V=(v11v12...v1kv21v22...v2k............vn1vn2...vnk)n∗k=(v1v2...vn)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=⎝⎜⎜⎛​v11​v21​...vn1​​v12​v22​...vn2​​............​v1k​v2k​...vnk​​⎠⎟⎟⎞​n∗k​=⎝⎜⎜⎛​v1​v2​...vn​​⎠⎟⎟⎞​
简化WWW矩阵:Wij=vivjT=<vi,vj>W_{ij}=v_i v_j^T = <v_i, v_j>Wij​=vi​vjT​=<vi​,vj​>. 那么,FM公式如下:
y=w0+∑i=1nwixi+∑i=1n−1∑j=i+1n<vi,vj>xixjy = 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∑n​wi​xi​+i=1∑n−1​j=i+1∑n​<vi​,vj​>xi​xj​再进一步简化得:
∑i=1n−1∑j=i+1n<vi,vj>xixj=12∑i=1n∑j=1n<vi,vj>xixj−12∑i=1n<vi,vi>xixi=12(∑i=1n∑j=1n∑f=1kvi,fvj,fxixj−∑i=1n∑f=1kvi,fvi,fxixi))=12∑f=1k((∑i=1nvi,fxi)(∑j=1nvj,fxj)−∑i=1nvi,f2xi2)=12∑f=1k((∑i=1nvi,fxi)2−∑i=1nvi,f2xi2)\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−1​j=i+1∑n​<vi​,vj​>xi​xj​=21​i=1∑n​j=1∑n​<vi​,vj​>xi​xj​−21​i=1∑n​<vi​,vi​>xi​xi​=21​⎝⎛​i=1∑n​j=1∑n​f=1∑k​vi,f​vj,f​xi​xj​−i=1∑n​f=1∑k​vi,f​vi,f​xi​xi​)⎠⎞​=21​f=1∑k​((i=1∑n​vi,f​xi​)(j=1∑n​vj,f​xj​)−i=1∑n​vi,f2​xi2​)=21​f=1∑k​⎝⎛​(i=1∑n​vi,f​xi​)2−i=1∑n​vi,f2​xi2​⎠⎞​​最终,FM公式可以简化为:
y(x)=w0+∑i=1nwixi+12∑f=1k((∑i=1nvi,fxi)2−∑i=1nvi,f2xi2)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∑n​wi​xi​+21​f=1∑k​⎝⎛​(i=1∑n​vi,f​xi​)2−i=1∑n​vi,f2​xi2​⎠⎞​ 利用SGD(Sochastic Gradient Descent)训练模型,模型各参数得梯度如下:
∂y(x)∂θ={1,θ=w0xi,θ=wixi∑j=1nvj,fxj−vi,fxi2,θ=vi,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)​=⎩⎪⎨⎪⎧​1xi​xi​∑j=1n​vj,f​xj​−vi,f​xi2​​,θ=w0​,θ=wi​,θ=vi,f​​

2. FFM

FFM把相同特征归于一个域(Filed),交互捕捉不同场之间的数据特征也比较重要。FM中一个特征只对应一个向量,而在实际场景中不同场得特征之间交互时应该使用不同的向量,这就是FFM(Field-aware FM)的提出动机。FM可以看作是FFM的一个特例,把所有的特征都归属于一个域。

假设样本有nnn个特征,同一个特征经过编码(或没有编码)的数值特征放到一个域中,其中有fff个域,那么FFM的二次项中有n∗fn*fn∗f个隐向量。而在FM模型中,所有特征的隐向量只有一个。根据FFM的域的敏感特性,导出FFM模型如下:
y=w0+∑i=1nwixi+∑i=1n∑j=i+1n<vi,fj,vj,fi>xixjy = 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∑n​wi​xi​+i=1∑n​j=i+1∑n​<vi,fj​,vj,fi​>xi​xj​其中,fjf_jfj​表示第jjj个特征所对应的域。假设隐向量的长度为kkk,那么FFM的二次项中的参数有n∗f∗kn*f*kn∗f∗k个,远多于FM模型的n∗kn*kn∗k个。由于隐向量与Filed有关,因此FFM的二次项并不能够化简,其预测复杂度是O(kn2)O(kn^2)O(kn2)。

FFM模型支持并行化处理,所以计算速度有一定的提高。

三、树模型

推荐分为召回和排序两个阶段。在召回阶段,由于处理的数据量较大,要求处理的速度快,因此使用的模型不能太复杂,而且特征不需要太多。但是在排序阶段,因为处理的数据量一般较少,且要求模型足够精确,因此可以选择稍微复杂的模型,使用多个特征进行训练。树模型在排序阶段是一个不错的选择,还可以将弱分类器集成起来组合成一个功能强大的分类器。

1. 决策树

决策时算法是一种归纳分类算法,属于有监督、非参数学习方法。决策树的基本算法是贪心算法,自顶而下递归的方式构建决策树。常用的决策树算法有ID3、C4.5、CART。本博文不对其详细展开介绍了。

2. GBDT

梯度提升迭代决策树(Gradient Boosting Decision Tree, GBDT)是一种Boosting算法,其核心思想是利用前一轮迭代的误差更新训练集的权重,校正前一轮迭代被分类错误的样本。

在使用GBDT过程中,应该注意一下几点:

  1. 在分类树中,一般通过信息熵增益或信息熵增益率等属性来选择分裂特征和分裂点。在回归树中,一般选择分类增益最大即分类后误差最小的点作为当前的分裂点。
  2. 当GBDT用于分类时,常用的损失函数有对数损失函数、指数损失函数等。这种损失函数的目的是求预测值为真实值的概率。
  3. 当GBDT用于回归时,常用的损失函数为平方损失函数、绝对值损失函数、Huber损失函数,每次朝着损失函数的负梯度方向移动。

3. GBDT+LR

多棵树的表达能力远高于单颗树,但RF的预测效果不如GBDT。GBDT+LR模型融合的思想来源于FaceBook公开的论文。

在这个模型中,用已有的特征训练GBDT模型,然后利用GBDT模型学习得到的树构造新特征,最后把这些新特征加入到原有特征中一起训练模型。其构造的新特征向量中的每个元素对应于GBDT模型中树的某个节点。当一个样板点通过某棵树最终落在这棵树的一个叶节点上时,那么新特征向量中这个节点对应的元素为1,而这棵树的其他叶节点对应的元素为0。新特征向量的长度等于GBDT模型中所有树包含的叶节点数之和。这里的每条路径,是通过最小化均方差等方法最终分割出来的有区分性路径,根据该路径得到的特征、特征交叉都相对有区分性,其效果理论上不会亚于采用人工经验的处理方式。

FaceBook的论文中有个例子,如下图:


图中Tree1和Tree2为通过GBDT算法学习出来的两棵树。xxx为一条输入样本,遍历两棵树后,分别落在两棵树的叶子上,Tree1有三个叶子节点,Tree2有两个叶子节点,最终的特征即五维向量。对于输入xxx,落在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算的停止迭代的常用条件有如下几个:

  1. 引入的特征带来的信息熵增益小于预先设定的阈值;
  2. 树的深度大于最大深度max_depth;
  3. 样本权重小于设定阈值。

近几年,XGBoost是机器学习领域的重要算法,它的执行速度比其他Gradient Boosting实现快,而且模型性能在结构化数据集以及分类、回归、排序预测建模上表现突出。

5. LightGBM

LightGBM通过采用基于梯度的的单边采样(Gradient-based One-side Sampling, GOSS)方法和互斥特征捆绑(Exclusive Feature Bunding, EFB)方法,大大提高了模型的训练速度且保证了准确率。接下来依次介绍GOSS算法和EFB算法。

首先看一下GOSS算法。其基本思想是梯度大的样本对信息熵增益的影响大,也就是说梯度大的样本点会贡献更多的信息熵增益。因此,为保证信息熵增益的精度,当我们对样本进行下采样的时候保留大梯度的样本点,而对于梯度小的样本点按照比例进行随机采样即可。这样做一方面保证了大梯度样本的保留,另一方面降低了运算压力,这也是GOSS算法能够使用LightGBM模型训练加速的原因之一。

GOSS算法的实现流程如下:在利用损失函数得到每个样本的梯度之后,对绝对梯度进行排序,取出排序结果中topN作为大梯度样本,在剩余的样本中随机抽取一部分作为小梯度样本,将二者合并,并给予小梯度样本一个权重。权重系数由大小样本占总样本量的比重决定。权重系数为
fact=1−abfact=\frac{1-a}{b} fact=b1−a​ 其中aaa是大梯度样本占全部样本的权重,bbb是小梯度样本占全部样本的权重。使用当前样本生成一个新的弱学习器,重复上述步骤,直至模型收敛或达到最大迭代次数为止。

这里要特别说明权重系数的作用:目的是系统提高部分小梯度样本的权重,使当前所使用的小梯度样本能尽可能地担当起原始全部小梯度样本所承担的工作。

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算法的实现流程如下:构造一个图GGG,其中每个特征FFF的权重等于其与其他特征间的特征冲突值。将特征按照由大到小顺序排序并循环。如果当前有捆绑组,则考虑是否将当前特征加入任意一个捆绑组,其阈值由KKK限定,即加入捆绑组之后,当前捆绑组的最大冲突值不大于KKK。如果当前没有捆绑组或当前特征值无法加入捆绑组,则以当前特征为起点创建捆绑组。循环结束之后的捆绑组即特征组合结果。

LightGBM相较于其他算法有如下特性:

  1. Leaf-wise特性:Leaf-wise是在所有叶子节点中选取分裂收敛最大的节点进行。因此在分裂次数相同的情况下,Leaf-wise享有更高的准确度。LightGBM也可以通过设定最大深度即max_depth来避免过拟合问题的发生。
  2. 类别特征的分裂:LightGBM采用的是直方图加回归树的方式,因此在特征进行分裂时,继承了直方图和回归树的优势。这即保证了准确度,又大大提高了运算速度。

总结

本篇博文主要讲解了矩阵分解算法、线性模型及其变种、常用的树模型。其中,矩阵分解算法经常在推荐系统的离线计算过程中使用到,线性模型以及树模型经常在排序中用到。

推荐系统中用到的深度学习模型将在下一篇博文中总结介绍。

推荐系统的主要算法(1)相关推荐

  1. 推荐系统中常用算法 以及优点缺点对比

    推荐系统中常用算法 以及优点缺点对比 2014/09/20 [Martin导读]随着互联网特别是社会化网络的快速发展,我们正处于信息过载的时代.用户面对过量的信息很难找到自己真正感兴趣的内容,而内容提 ...

  2. 推荐系统之 BPR 算法及 Librec的BPR算法实现【1】

    [推荐系统之 BPR 算法] 1.关于BPR的论文原文: BPR: Bayesian Personalized Ranking from Implicit Feedback 2.参考1:论文快读 - ...

  3. 全民K歌推荐系统架构、算法及后台设计实践

    猜你喜欢 0.2021年轻人性生活调研报告1.如何搭建一套个性化推荐系统?2.从零开始搭建创业公司后台技术栈3.2021年10月份热门报告免费下载4.微博推荐算法实践与机器学习平台演进5.腾讯PCG推 ...

  4. 推荐系统架构与算法流程详解

    你知道的越多,不知道的就越多,业余的像一棵小草! 成功路上并不拥挤,因为坚持的人不多. 编辑:业余草 zhuanlan.zhihu.com/p/259985388 推荐:https://www.xtt ...

  5. 推荐系统-协同过滤算法简介简化版实例

    必须先忏悔一下太久没记录学习轨迹,最近感觉脑子里一团浆糊,搞得自己非常难受,自信心也是被严重摧毁.训斥自己必须要保持记录的习惯,因为这不仅是对知识的整理,更让你知道其实你知道的很多! 因为刚结束了一个 ...

  6. 推荐系统的常用算法,选择,漫谈,推荐系统开源软件汇总

    推荐系统的常用算法概述 前一阵子准备毕业论文的开题,一直在看推荐系统相关的论文.对推荐系统有了一个更加清晰和理性的认识,也对推荐算法有了深入了解.借此机会总结分享一下,大家多多拍砖. 推荐系统的出现 ...

  7. 推荐系统之--CF算法

    上一节我们已经讲了CB算法这一次我们就来介绍推荐系统下一个算法: CF(Collaborative Filterin)基于协同过滤的推荐算法 CF算法包含如下两类: User-Base CF 和 It ...

  8. 【干货】全民K歌推荐系统架构、算法及后台设计.pdf(附下载链接)

    今天给大家带来腾讯音乐娱乐集团所做的分享<全民K歌推荐系统架构.算法及后台设计.pdf>,本分享共包含如下三大部分: 1.推荐系统架构及粗排设计: 2.精排与多目标模型迭代: 3.召回及推 ...

  9. 简单在线音乐推荐网 基于用户、物品的协同过滤推荐算法 使用Python+Django+Mysql开发技术 在线音乐推荐系统 音乐网站推荐系统 个性化推荐算法开发 人工智能、大数据分布式、机器学习开发

    简单在线音乐推荐网 基于用户.物品的协同过滤推荐算法 使用Python+Django+Mysql开发技术 在线音乐推荐系统 音乐网站推荐系统 个性化推荐算法开发 人工智能.大数据分布式.机器学习开发S ...

  10. 推荐系统产品与算法概述 | 深度

    作者丨gongyouliu 转载自大数据与人工智能(ID:gh_b8b5b02c348b) 作者在<推荐系统的工程实现>(点击蓝字可回顾)这篇文章的第五部分"推荐系统范式&quo ...

最新文章

  1. Android之linux基础教学之六 异常
  2. 什么叫网站灰度发布?
  3. centos6.4安装使用wine 持续更新中
  4. [蓝桥杯2015决赛]积分之迷-枚举(水题)
  5. virtualbox+vagrant学习-2(command cli)-15-vagrant resume命令
  6. excel和mysql php_php将mysql数据库和Excel相互导入和导出的方法
  7. 2018.9.18opencv3.4.1 + vs 2017 community +win 10 x64+cmake 3.11.3终终终章!
  8. bz2解压命令_Linux文件操作之文件压缩与解压缩命令详解
  9. 物联网卡不能使用的原因有哪些
  10. java 局部变量 for_java-增强的for循环中局部变量的范围
  11. 30个Java自学网站
  12. 6个免费下载课件的资源网站,小学、初中、高中、大学全覆盖!
  13. 锐起3.1无盘服务器,[迎新春]锐起3.1无盘XP万能包13V2(IE8版本)
  14. 小米电视联网后显示无法解析小米电视服务器,小米电视连上无线不能上网怎么回事?教你解决办法...
  15. 《硬核父母的五项修炼》读后感
  16. 什么是SCRM 客户scrm管理系统 - whale 帷幄
  17. 毕业设计之 ---基于大数据分析的航空公司客户价值分析
  18. 港股开盘价是如何产生的
  19. 【调剂】2020年东北石油大学非常规油气研究院--赵小青老师课题组招生
  20. 课程体系包括哪些要素_课程体系包括哪些要素

热门文章

  1. mysql命令更新数据库_命令操作MySQL数据库
  2. 如何保险检查SD卡为扩容卡
  3. 开通慢直播,RTMP协议和RTSP协议如何选择?
  4. Win10系统解决图片打开方式没有照片查看器
  5. 经典按键java手机游戏_菜鸟也能轻松吃鸡的神器——莱仕达P30S手机游戏手柄体验...
  6. ai图像处理软件集大成者:Leawo PhotoIns Pro中文版介绍
  7. cryptojs vue 使用_vue 中引入cryptoJS
  8. android使用h5框架,轻量级Android  H5 Native Hybrid 框架
  9. 华为设备为(USG6000)的防火墙:配置远程管理防火墙最常见的几种方式。
  10. Anaconda配置OpenCV