Factorization Machines
参考
1. 刘建平的博客: https://www.cnblogs.com/pinard/p/6370127.html
2. Tracholar的博客: https://tracholar.github.io/machine-learning/2017/03/10/factorization-machine.html
3. 知乎小孩不笨的文章: https://zhuanlan.zhihu.com/p/50426292
1 准备
通常,我们的机器学习模型是学习一个映射函数
f ( ⋅ ) → T f(\cdot) \rightarrow T f(⋅)→T
该函数使我们输入的n维实值特征向量 x ∈ R n x \in R^n x∈Rn 映射到一个目标域 T T T,例如对与回归问题,这个目标域 T = R T = R T=R,而对于分类问题, T = { C 1 , C 2 , . . . , C n } T = \{C1, C2, ..., C_n\} T={ C1,C2,...,Cn}。在常见的有监督学习任务中,我们的训练样本数据通常还带有一个标签 y y y,数据格式如:
D = { ( x ( 1 ) , y ( 1 ) ) , ( x ( 2 ) , y ( 2 ) ) , . . . , ( x ( m ) , y ( m ) ) } D = \{(x^{(1)},y^{(1)}), (x^{(2)},y^{(2)}), ..., (x^{(m)},y^{(m)})\} D={ (x(1),y(1)),(x(2),y(2)),...,(x(m),y(m))}
其中 x ( i ) ∈ R n x^{(i)} \in R^n x(i)∈Rn为输入数据,对应样本的特征向量, y ( i ) y^{(i)} y(i)对应该样本的标签, m m m为样本的数目。
在现实世界中,许多应用问题(如文本分析、推荐系统等)会产生高度稀疏的(特征)数据,即特征向量 x ( i ) x^{(i)} x(i)中几乎所有的分量都为0
这里,我们以电影评分系统为例,给出一个关于高度稀疏数据的实例:
关于这个数据各部分含义这里不再解释。
在上面的例子中,特征向量x的实际维度为 ∣ U ∣ + ∣ I ∣ + ∣ I ∣ + 1 + ∣ I ∣ = ∣ U ∣ + 3 ∣ I ∣ + 1 |U|+|I|+|I|+1+|I| = |U|+3|I|+1 ∣U∣+∣I∣+∣I∣+1+∣I∣=∣U∣+3∣I∣+1,真实场景中,用户数目 ∣ U ∣ |U| ∣U∣与电影数目 ∣ I ∣ |I| ∣I∣都非常大,而每个用户对电影的评分数目非常有限。以此可知我们的特征向量x将会多么的稀疏,用 N z ( X ) N_z(X) Nz(X)来表示一条样本数据/特征向量x的非0分量个数,并记:
N z ‾ ( X ) = 1 N ∑ i m N z ( x ( i ) ) \overline{N_z}(X) = \frac{1}{N} \sum_i^m N_z(x^{(i)}) Nz(X)=N1i∑mNz(x(i))
N z ‾ ( X ) \overline{N_z}(X) Nz(X)表示训练集D中所有特征向量中非零分量数的平均数,显然,对于稀疏数据 N z ‾ ( X ) < < m \overline{N_z}(X) << m Nz(X)<<m
2 FM二阶模型方程
对于上面提到的样本数据D,我们先回顾一下线性回归的做法:
y ^ = w 0 + w 1 x 1 + . . . + w n x n \hat{y} = w_0 + w_1x_1 + ... + w_nx_n y^=w0+w1x1+...+wnxn
= w 0 + ∑ i = 1 n w i x i = w_0 + \sum_{i=1}^n w_i x_i =w0+i=1∑nwixi
如果我们采用单一的线性模型来学习用户的点击,打分习惯,各特征分量是相互独立的,没有考虑特征分量之间的相互关系,我们很容易忽略特征中潜在的组合关系,比方说“男性用户”喜欢看“漫威电影”,买“奶粉”的用户也常常买“尿不湿”等等。
为了学习特征间的交叉,SVM通过多项式核函数来实现特征的交叉,实际上和多项式模型是一样的,问题在于二阶项的参数过多,设特征维数为n,那么二阶项的参数数目为 n ( n + 1 ) 2 \frac{n(n+1)}{2} 2n(n+1),对于广告点击率预估问题,由于存在大量id特征,导致 n 可能为 1 0 7 10^7 107维,这样一来,模型参数的量级为 1 0 14 10^{14} 1014,这导致只有极少数的二阶组合模式才能在样本中找到, 而绝大多数模式在样本中找不到,因而模型无法学出对应的权重。例如,对于某个 w i j w_{ij} wij,样本中找不到 x i = 1 , x j = 1 x_i=1,x_j=1 xi=1,xj=1 (这里假定所有的特征都是离散的特征,只取0和1两个值)这种样本,那么wij的梯度恒为0,从而导致参数学习失败!
很容易想到,可以对二阶项参数施加某种限制,减少模型参数的自由度。FM 施加的限制是要求二阶项系数矩阵是低秩的,能够分解为低秩矩阵的乘积。
下面我们做改进:
y ^ =