机器学习机器学习和人工智能入门机器学习

CTR学习笔记系列—— FM 和 FFM

2018-11-17  本文已影响0人  DataArk

一、为什么要用FM算法

在计算广告和推荐系统中,CTR预估(click-through rate)是非常重要的一个环节,判断一个商品的是否进行推荐需要根据CTR预估的点击率来进行。而在处理这类数据时,我们常常会使用one-hot编码(例如对用户ID、商品ID等),但这样就带了一个问题,数据太过稀疏。在面对如此稀疏的数据时,我们仅仅考虑每一个特征显然是不够的。这个时候,考虑特征之间的组合就显得尤为重要(其实就算不是CTR问题,平常在做特征处理的时候将特征组合起来也是特征工程的一个技巧)。

注意,下面所有的x_ix_j都是指one-hot之后的特征:

one-hot前 one-hot后

二、算法主体

普通的线性模型,我们都是将各个特征独立考虑的,并没有考虑到特征与特征之间的相互关系(在理解的时候完全可以把 x_i 当成一个数来理解):

线性回归

当我们考虑特征之间的组合时,我们稍微改动一下上面的公式就可以得到我们想要的算法:


考虑特征组合的回归

这个公式很好理解,就是把所有的特征都一一相乘再给予权值而已,但这个公式有个问题,对于稀疏数据来说,x_ix_j都不为0的情况太少,这样将导致无法通过训练很好地得到ω_{ij}

所以,将ω_{ij}拆成两块来训练得到:

FM

向量和向量点乘(也就是 v_i * v_j^{T} ) 就是一个数,所以一个ω_{ij}拆成两个向量表示没什么问题。 v_{i,f} 其实就是指 v_i 的每一个元素,这里这个f不要和field这个概念联系起来。

通过下面的推导简化求解的难度:

这块的推导其实一点都不复杂,初高中的时候就在推这样的东西了吧。

第一步其实就是 \sum_{i=1}^{n-1}\sum_{j=i+1}^{n}\left \langle \mathbf{v}_i,\mathbf{v}_j \right \rangle x_ix_j 如果想用 \sum_{i=1}^{n}\sum_{j=1}^{n}\left \langle \mathbf{v}_i,\mathbf{v}_j \right \rangle x_ix_j 来表示(因为这样才好转化成向量和矩阵表示)的话,需要去掉一些重复的部分,所以先减去重复类似下标ii这样的重复 \sum_{i=1}^{n}\left \langle \mathbf{v}_i,\mathbf{v}_i \right \rangle x_ix_i ,然后发现还有类似下标12 21 这样的重复,那么直接除以2就可以完美代替了。

第二步就是把向量表示直接拆出来,用每个元素相乘之后加和来表示(这就是我们在没学向量之前最喜欢的表示了,虽然学了之后还是习惯这种表示)

第三、四步就是结合律了

最后使用梯度下降求解(终于有个高级的了,不对,梯度下降其实就是求导,还是高中的):

这样就得到了FM算法。

注:一开始看好多博客都是矩阵什么的,然后一直用矩阵向量理解上面的式子,结果真的是南辕北辙,再加上对f的错误理解,导致本来这么简单的推导反而纠结了不少时间,真的是满满的怨念。

三、FFM算法

FFM算法在FM算法的基础上引入了类别的概念,即field。例如下图,gender就是一个field(简单来说就是one-hot前的特征名):

one-hot前 one-hot后

然后有人就想了,对每一个field我都用一样的v太奇怪了,那我干脆学习一个v不仅与特征相关,也与field相关好了:

\begin{equation}y=w_0+\sum_{i=1}^n{w_ix_i}+\sum_{i=1}^n{\sum_{j=i+1}^n{<v_{i, f_j}, v_{j,f_i}>x_ix_j}}\label{fm}\end{equation}

由于隐向量与field相关,FFM二次项并不能够化简(额,所以FFM真的是一个拍脑门的想法)。

FFM通常只保留了的二次项,并且由于是CTR预测,所以经常会再加上sigmoid函数(为了防止混淆,使用z代替y,y用来表示最后sigmoid之后的值):

\begin{equation}z=\sum_{i=1}^n{\sum_{j=i+1}^n{<v_{i, f_j}, v_{j,f_i}>x_ix_j}}\label{fm}\end{equation}

y=\sigma(z)=\frac{1}{1+e^{-z}}

求解梯度:
\frac{\partial{z}}{\partial{v_{i, f_j}}}=v_{j,f_i}x_ix_j

令label=0表示负样本,label=1表示正样本,C表示交叉熵损失函数:

\frac{\partial C}{\partial z}=y - label=\left\{\begin{matrix}-\frac{1}{1+e^z} & if\ labei是正样本 \\ \frac{1}{1+e^{-z}} & if\ label是负样本\end{matrix}\right .

\frac{\partial C}{\partial{v_{i,f_j}}}=\frac{\partial C}{\partial z}\frac{\partial{z}}{\partial{v_{i,f_j}}}

当设label=-1表示负样本,label=1表示正样本时,梯度的形式会不同,可以参考原论文或者这篇博客

参考:

  1. https://www.jianshu.com/p/152ae633fb00
  2. https://blog.csdn.net/google19890102/article/details/72866290
  3. https://blog.csdn.net/songbinxu/article/details/80151814
  4. ffm论文
  5. https://www.cnblogs.com/zhangchaoyang/articles/8157893.html
  6. https://www.cnblogs.com/ljygoodgoodstudydaydayup/p/6340129.html
上一篇下一篇

猜你喜欢

热点阅读