FM模型(Factorization Machines)
1.线性回归
回归是一种预测性的,我们是主要根据已有的数据来训练一个回归模型,来预测将要到来的数据的类型。
\text{假设目标值与特征之间线性相关}\\
\hat{y} = wx+b\\\\
\text{我们在定义一个损失函数,假设为均方误差:}\\
L=\frac{1}{n} \sum_{i=1}^{n}(\hat{y_i}-y_i)^2 = \frac{1}{n}\sum_{n=1}^{n}(wx_i+b-y)^2 \\\\
\text{所以现在要最小化损失函数,得到对应的w^*,b^*,即:}\\
(w^*,b^*) = arg \min_{w,b} \sum_{i = 1}^{n}(wx_i+b-y_i)^2
求解$ w^* ,b^*$的方式有两种:
(1)最小二乘法
∂w∂L=n2i=1∑n(wxi+b−yi)xi=n2wi=1∑nxi2−n2i=1∑n(yi−b)xi∂b∂L=n2n=1∑n(wxi+b−yi)=2b+n2i=1∑n(wxi−yi)
接下来另两个偏导数等于0,得到 w,b最优解的闭式解:
∂b∂L=0⇒b=n∑i=1n(yi−wxi)∂w∂L=0⇒wi=1∑nxi2−i=1∑nyixi+bi=1∑nxi=0⇒wi=1∑nxi2−i=1∑nyixi+n=1∑nxin∑i=1n(yi−wxi)=0⇒wi=1∑nxi2−i=1∑nyixi+n1(n=1∑nxii=1∑nyi)−n=1∑nxin∑i=1nwxi=0⇒wi=1∑nxi2−i=1∑nyixi+n1(n=1∑nxii=1∑nyi)−n1w(n=1∑nxi)2=0⇒w(i=1∑nxi2−n1(n=1∑nxi)2)=i=1∑nxiyi−xi=1∑nyi⇒w=∑i=1nxi2−n1(∑n=1nxi)2∑i=1nyi(xi−x)
(2)梯度下降
梯度下降的核心是不断的更新w,b
w←w−α∂w∂Lb←b−α∂b∂L
2.逻辑回归跟线性回归
逻辑回归线性回归判别模型:fw,b(x)=σ(i∑xiyi+b)fw,b=i∑xiyi+b输出:∈(0,1)输出:任意值
3.FM模型(因子分解机)
传统的模型中,特征都是独立的。但是有些特征之间存在交互作用,比如我们说一件衣服,颜色跟版型都会影响穿上的效果;比如同一个版型,一件黑色,一件白色,那么一般我们穿上之后总会觉得黑色的穿上显瘦。
FM考虑到了特征之间的交互作用,并对特征进行了交叉组合。
一般的线性模型:y^=w0+w1x1+w2x2+......+wnxn=w0+i=1∑nwixiFM的模型,我们以二阶多项式模型为例:y^=w0+i=1∑nwixi+i=1∑n−1j=i+1∑nwijxixj(其中n: 样本特征的个数,类别特征onehot后的维度,两两交互可以得到2n(n−1)个交叉项。wij:是每两个特征之间的权重,用于表达这对特征的重要性。)
Q1:
我们分析一下样本经过onehot编码,我们假如样本有n个特征,我们用xi 来表示第 i 个特征,这个特征经过onehot编码后可能是一个m*1的数据(而且每一个特征都不一定是m个)。
那么,问: 我们需不需要对该one-hot之后的样本进行补全,比如我们取特征可以选择的数量最多的为m*1,那么其他特征可选择的量小于m,我们用不用把这个样本矩阵用0 来补齐为 n *m 的矩阵?
答:经过在网上资料的查阅,这个是不需要补齐的,我们在使用到特征的时候使用的方式都是xi 来代替样本的第 i 个特征的编码向量,不需要进行补全。
再问:假如我们补齐了这个矩阵为n*m的矩阵那么上面公式中 ∑i=1n−1∑j=i+1nwijxixj 再计算的时候如何计算,我们倒推一下, xi 是一个m * 1的矩阵,那么wijxi的shape应该是 ()*1的,无法与xj相乘,所以这其中有涉及到矩阵转置吗?如果有,为什么公式不表达?还有如果我们没有补齐,那么计算时,涉及到的维度更加麻烦,怎么解决?
答:计算过程中确实涉及到了矩阵的转置,我们没有进行补全的操作,我们样本的每个特征的编码向量也不固定。 此外我查阅到了wij的一个更详细的表达,下面是更新后的FM公式:
y^=w0+i=1∑nwixi+i=1∑n−1j=i+1∑n<viT,vj>xixj
其中vi,vj是两个隐向量,所有的隐向量构成了一个隐向量矩阵,这个矩阵是一个n*k的矩阵,其中n代表了特征的数量,k代表了隐向量的维度。
这里强调一下: 隐向量矩阵是一个要通过优化算法来不断更新的矩阵。他的维度与隐向量的维度k有关,是初始化的一个值,跟特征维度无关。(注特征维度是指一个特征有多少个可选择项)
Q2:
对于这个公式我有我的疑惑,我在许多地方看到这两个w,我不知道这两个w 是不是同一个矩阵,所以我们接下来从矩阵运算以及实际意义的角度分析一下。
从wixi 相乘,我们知道 xi 应该是可以用 n*1 的矩阵来表示,那么wi 就应该是一个 m * n 的矩阵,代表着第 i 个特征的权重。
从wijxixj 中,我们知道,wij应该是一个n*n的矩阵,且wij又代表样本 i 特征跟样本 j 特征之间的关系权重。
所以,这其实是两个矩阵,我是不太理解为什么要写成一样的符号,对于初学者而言,总会觉得会不会这两个矩阵被大牛给统一了。
Update:
首先是FM的一个表达式:
y^=w0+i=1∑nwixi+i=1∑n−1j=i+1∑nwijxixjy^=w0+i=1∑nwixi+i=1∑n−1j=i+1∑n<viT,vj>xixj
这个表达式的改进原因如下:
1. $w_{ij}$在更新的时候涉及到梯度$x_i,x_j$,而$x_i,x_j$经过onthot后数据非常稀疏,导致大部分参数无法得到从分训练。
1. 考虑到复杂度的问题:原始的$w$是一个$\frac{n(n-1)}{2}$个参数,而改善过后变成了一个n*k的 V 矩阵,因为 k << n,所以降低了训练的复杂度。
我们先了解一个简化式:
i=1∑n−1j=i+1∑nxixj=21(i=1∑nj=1∑nxixj−i=1∑nxixi)
这个公式的思想可以理解为x_ix_j是一个新的矩阵w,那么这个矩阵是一个对称矩阵,因为wij=xixj=xjxi=wji,而公式左边的代表右上三角,所以我们用整个矩阵减去对角线元素然后在取一半就行。
接下来我们在进一步优化上面代码:
y^=w0+i=1∑nwixi+i=1∑n−1j=i+1∑n<viT,vj>xixj=w0+i=1∑nwixi+21(i=1∑nj=1∑nviTvjxixj−i=1∑nviTvixixi)=w0+i=1∑nwixi+21(i=1∑nj=1∑nl=1∑kvi,lTvj,lxixj−i=1∑nl=1∑kvi,lTvi,lxixi)=w0+i=1∑nwixi+21l=1∑k[(i=1∑nvi,lxi)(j=1∑nvj,lxj)−i=1∑nvi,l2xi2]=w0+i=1∑nwixi+21l=1∑k[(i=1∑nvi,lxi)2−i=1∑nvi,l2xi2]
经过这样的一个变化,时间复杂度由O(n2)变为了O(n)。
Loss:
假如我们的任务是一个回归任务,那么模型的损失函数可以是最小二乘损失:
L=−i=1∑n(y^(i)−y(i))2假如这是一个二分类任务,则:y^(i):=σ(y^(i))=1+e−y^(i)1然后我们在计算交叉熵:L=−i=1∑n[y(i)logσ(y^<!−−swig0−−>)+(1−y(i))log(1−y^(i))]