基本定义
在逻辑回归的分类公式中,传入给sigmoid函数的参数是特征的线性组合,计算如公式1所示。该公式的不足之处是没有考虑特征间的相互作用,而特征的相互作用(即特征交叉)是很重要的,例如在CTR预估场景,性别和购买行为就有很强的关联性,女性更愿意购买化妆品,而男性更愿意购买运动产品。为了考虑特征的相互作用,因子分解机(Factorization Machine,简称FM)显示地对两两特征交叉进行建模,计算如公式2所示。
y(x)=w0+∑i=1nwixi(1)\begin{aligned}
y(\mathbf x) & =w_0 + \sum_{i=1}^n w_i x_i \tag{1}
\end{aligned}y(x)=w0+i=1∑nwixi(1)
y(x)=w0+∑i=1nwixi+∑i=1n∑j=i+1nwijxixj(2)\begin{aligned} y(\mathbf x) & =w_0 + \sum_{i=1}^n w_i x_i + \sum_{i=1}^n \sum_{j=i+1}^n w_{ij} x_i x_j \tag{2} \end{aligned}y(x)=w0+i=1∑nwixi+i=1∑nj=i+1∑nwijxixj(2)
对于离散特征而言,特征通常通过one-hot进行编码,one-hot编码后样本变得很稀疏,其中很多特征的取值为0,取值为1的特征只占很少部分。对于这样的样本,在学习交叉特征的权重wijw_{ij}wij时会变得困难,例如当样本的特征xix_ixi和特征xjx_jxj取值为0时,权重wijw_{ij}wij无法学习。为了更好的学习交叉特征的权重,需要对权重矩阵分解,分解后权重wijw_{ij}wij可以表示为两个隐向量的内积,计算如公式3所示。
y(x)=w0+∑i=1nwixi+∑i=1n∑j=i+1n<vi,vj>xixj(3)\begin{aligned} y(\mathbf x) & =w_0 + \sum_{i=1}^n w_i x_i + \sum_{i=1}^n \sum_{j=i+1}^n <\mathbf v_i,\mathbf v_j>x_i x_j \tag{3} \end{aligned}y(x)=w0+i=1∑nwixi+i=1∑nj=i+1∑n<vi,vj>xixj(3)
其中隐向量vi\mathbf v_ivi可以表示为vi\mathbf v_ivi=(vi,1v_{i,1}vi,1,vi,2v_{i,2}vi,2,…,vi,kv_{i,k}vi,k),k为隐向量的维度,进一步可以得到因子分解机(FM)的计算公式。
y(x)=w0+∑i=1nwixi+∑i=1n∑j=i+1n∑t=1kvi,tvj,txixj(4)\begin{aligned} y(\mathbf x) & =w_0 + \sum_{i=1}^n w_i x_i + \sum_{i=1}^n \sum_{j=i+1}^n \sum_{t=1}^k v_{i,t} v_{j,t} x_i x_j \tag{4} \end{aligned}y(x)=w0+i=1∑nwixi+i=1∑nj=i+1∑nt=1∑kvi,tvj,txixj(4)
数学推导
首先公式4中的交叉项可以推导简化,具体推导过程如下:
∑i=1n∑j=i+1n<vi,vj>xixj=12(∑i=1n∑j=1n<vi,vj>xixj−∑i=1n<vi,vi>xixi)=12(∑i=1n∑j=1n∑t=1kvi,tvj,txixj−∑i=1n∑t=1kvi,tvi,txixi)=12∑t=1k(∑i=1n∑j=1nvi,tvj,txixj−∑i=1nvi,tvi,txixi)=12∑t=1k((∑i=1nvi,txi)(∑j=1nvj,txj)−∑i=1nvi,t2xi2)=12∑t=1k((∑i=1nvi,txi)2−∑i=1nvi,t2xi2)\begin{aligned} \sum_{i=1}^n \sum_{j=i+1}^n <\mathbf v_i,\mathbf v_j> x_i x_j & = \frac 12 (\sum_{i=1}^n\sum_{j=1}^n <\mathbf v_i,\mathbf v_j>x_i x_j -\sum_{i=1}^n<\mathbf v_i,\mathbf v_i> x_i x_i) \\ & =\frac 12 (\sum_{i=1}^n \sum_{j=1}^n \sum_{t=1}^k v_{i,t} v_{j,t} x_i x_j-\sum_{i=1}^n \sum_{t=1}^k v_{i,t} v_{i,t} x_i x_i) \\ & = \frac 12 \sum_{t=1}^k(\sum_{i=1}^n \sum_{j=1}^n v_{i,t} v_{j,t} x_i x_j-\sum_{i=1}^n v_{i,t} v_{i,t} x_i x_i) \\ & = \frac 12 \sum_{t=1}^k \Biggl((\sum_{i=1}^n v_{i,t}x_i)( \sum_{j=1}^nv_{j,t}x_j)-\sum_{i=1}^n v_{i,t}^2x_i^2\Biggr) \\ & =\frac 12 \sum_{t=1}^k\Biggl((\sum_{i=1}^n v_{i,t}x_i)^2-\sum_{i=1}^n v_{i,t}^2x_i^2\Biggr) \end{aligned}i=1∑nj=i+1∑n<vi,vj>xixj=21(i=1∑nj=1∑n<vi,vj>xixj−i=1∑n<vi,vi>xixi)=21(i=1∑nj=1∑nt=1∑kvi,tvj,txixj−i=1∑nt=1∑kvi,tvi,txixi)=21t=1∑k(i=1∑nj=1∑nvi,tvj,txixj−i=1∑nvi,tvi,txixi)=21t=1∑k((i=1∑nvi,txi)(j=1∑nvj,txj)−i=1∑nvi,t2xi2)=21t=1∑k((i=1∑nvi,txi)2−i=1∑nvi,t2xi2)
为了求得最优的参数wiw_iwi和vi,tv_{i,t}vi,t,可以应用随机梯度下降算法对参数求偏导数,具体的推导公式如下:
∂y(x)∂θ={1ifθ=w0xiifθ=wixi∑i=1nvi,txi−vi,txi2ifθ=vi,t \frac{\partial y(\mathbf x)}{\partial \theta}=\begin{cases} 1 & if \theta=w_0\\ x_i & if \theta=w_i\\ x_i\sum_{i=1}^nv_{i,t}x_i- v_{i,t}x_i^2 & if \theta=v_{i,t} \end{cases}∂θ∂y(x)=⎩⎪⎨⎪⎧1xixi∑i=1nvi,txi−vi,txi2ifθ=w0ifθ=wiifθ=vi,t
将求得的偏导带入梯度下降公式,可以得到参数θ\thetaθ的更新公式如下:
θ:=θ−α∂y(x)∂θ(5)\begin{aligned} \theta:= \theta - \alpha \frac{\partial y(\mathbf x)}{\partial \theta}\tag{5} \end{aligned}θ:=θ−α∂θ∂y(x)(5)
代码实现
相关代码实现后面统一发布到github上面。