在计算广告和推荐系统中,CTR 预估是很是重要的一个环节,判断物品是否进行推荐,须要根据 CTR 预估的点击率排序决定。业界经常使用的方法有人工特征 + LR,GBDT + LR,FM 和 FFM 等模型。函数
近几年提出了不少基于 FM 改进的方法,如 DeepFM,FNN,PNN,DCN,xDeepFM 等,今天给你们分享 FM。性能
Factorization Machine (FM) 是由 Steffen Rendle 在 2010 年提出的,模型主要经过特征组合来解决大规模稀疏数据的分类问题。学习
在面对 CTR 预估的问题的时候,咱们经常会转化为下面这种类型的二分类问题。优化
点击 | 性别 | 国别 |
---|---|---|
1 | 男 | 中国 |
0 | 女 | 美国 |
1 | 女 | 法国 |
因为 性别,国别 等特征都是类别特征,因此在使用的时候经常采用 One-Hot Encoding 将其转化为数值类型。ui
点击 | 性别 = 男 | 性别 = 女 | 国别 = 中国 | 国别 = 美国 | 国别 = 法国 |
---|---|---|---|---|---|
1 | 1 | 0 | 1 | 0 | 0 |
0 | 0 | 1 | 0 | 1 | 0 |
1 | 0 | 1 | 0 | 0 | 1 |
上图能够看出,在通过 One-Hot 编码以后,每一个样本的特征空间都变大了许多,特征矩阵变得很是稀疏,在现实生活中,咱们经常能够看见超过 10⁷ 维的特征向量。编码
若是咱们采用单一的线性模型来学习用户的点击,打分习惯,咱们很容易忽略特征潜在的组合关系,好比:女性喜欢化妆品,男性喜欢打游戏,买奶粉的用户经常买尿不湿等。spa
SVM 为了学习交叉特征,引入了核函数的概念,最简单直接的作法就是为两两的特征组合分配一个权重参数。这些新的权重参数和原始特征对应的参数同样,交给模型去在训练阶段学习。如此一来就造成了以下的预测函数:设计
这实际上就是核函数选择为二阶多项式核的 SVM 模型。这样设计的模型看起来可以学到特征的两两交叉带来的信息,但这只是理论上的改进,可是模型在处理大量稀疏数据时,没有很好的泛化能力。blog
因为 $w_{i,j}$ 的取值彻底取决于 $x_i$ 和 $x_j$ 的乘积,在数据稀疏的场景下,可能存在训练集中 $x_ix_j$ 始终为零的状况,这样一来,模型就没法有效的更新权重 $w_{i,j}$ 了,更进一步,在预测阶段,模型遇到 $x_ix_j$ 不为零的状况就很难有效的泛化。排序
既然二阶多项式核 SVM 泛化性能不足的缘由是 $w_{i,j}$ 的取值彻底取决于 $x_i$ 和 $x_j$ 的乘积,那么最直接的办法就是突破这一限制了。
FM 模型的解决办法是为每一个维度的特征 ($x_i$) 学习一个表征向量 ($v_i$, 其实能够理解为特征 ID 的 Embedding 向量)。然后将 $x_i$ 和 $x_j$ 的乘积的权重设定为各自表征向量的点积,也就是有以下形式的预测函数:
显然,FM 模型也具备二阶多项式核 SVM 的优势:可以学习到特征两两交叉带来的信息。
经过下面这个表达能够看出,FM 很像是计算每一个通过 One-Hot 编码变化的特征 Embedding,而后学习不一样特征之间 Embedding 类似度对于最后预测结果的影响。因为咱们能够将上千万维的稀疏向量压缩为几十,或者几百维的 Embedding,极大地减少了模型的参数数量级,从而加强模型的泛化能力,获得更好的预测结果。
咱们回到上一小节举的例子:训练集中 $x_ix_j$ 始终为零。在二阶多项式核 SVM 中,因为参数权重 $w_{i,j}$ 得不到更新,模型没法学到 $x_i$ 和 $x_j$ 交叉带来的信息。可是在 FM 中,$x_i$ 和 $x_j$ 的参数并不彻底由 $x_i$ 和 $x_j$ 的乘积决定。具体来讲,每一维特征的表征向量由该维特征与其它全部维度特征的交叉共同决定。因而,只要存在某个 $k$ 使得 $x_i$ 和 $x_k$ 的乘积不老是为零,那么第 i 维特征的表征向量 $v_i^→$ 就可以学到有效的信息——同理对 $v_j^→$ 也有一样的结论。因而乎,哪怕在训练集中,$x_ix_j$ 始终为零,其参数 $⟨v_i^→,v_j^→⟩$ 也是通过了学习更新的,所以可以表现出很好的泛化性能。
基于矩阵分解的协同过滤是推荐系统中经常使用的一种推荐方案,从历史数据中收集 user 对 item的 评分,能够是显式的打分,也能够是用户的隐式反馈计算的得分。因为 user 和 item 数量很是多,有过打分的 user 和 item 对一般是十分稀少的,基于矩阵分解的协同过滤是来预测那些没有过行为的 user 对 item 的打分,其实是一个评分预测问题。
矩阵分解的方法假设 user 对 item 的打分 R 由 User Embedding 和 Item Embedding 类似性以及用户,物品的偏见决定。
这些参数能够经过最小化经验偏差获得:
从上面的叙述来看,FM 的二阶矩阵也用了矩阵分解的技巧,那么基于矩阵分解的协同过滤和 FM 是什么关系呢?以 user 对 item 评分预测问题为例,基于矩阵分解的协同过滤能够看作 FM的一个特殊例子,对于每个样本,FM 能够看作特征只有 userid 和 itemid 的 onehot 编码后的向量链接而成的向量。另外,FM 能够采用更多的特征,学习更多的组合模式,这是单个矩阵分解的模型所作不到的!所以,FM 比矩阵分解的方法更具广泛性!事实上,如今能用矩阵分解的方法作的方案都直接上 FM 了!
考虑到 FM 模型会对特征进行二阶组合,在有 n 个原始特征时,交叉特征就会有 $(n^2-n)/2$ 个。所以,若是不作任何优化,FM 模型的复杂度会是 $O(n2)$,具体来讲是 $O(kn^2)$(其中 k 是表征向量的长度)。在特征规模很是大的场景中,这是不可接受的。
那么问题来了,是否有办法将复杂度下降到 $O(kn)$ 呢?答案是能够的,咱们来看针对特征交叉项的一系列变换。
能够看到这时的时间复杂度为 $O(kn)$。
从上面的描述能够知道FM能够在线性的时间内进行预测。所以模型的参数能够经过梯度降低的方法(例如随机梯度降低)来学习,对于各类的损失函数。FM模型的梯度是:
因为 $\sum_{j=1}^nv_{j,f}x_j$ 只与 $f$ 有关,与 $i$ 是独立的,能够提早计算出来,而且每次梯度更新能够在常数时间复杂度内完成,所以 FM 参数训练的复杂度也是 $O(kn)$ 。综上可知,FM能够在线性时间训练和预测,是一种很是高效的模型。
FM模型有两个优点:
FM模型的优化点:
若是以为文章对你有帮助,欢迎点赞,转发,收藏。
原创不易,你的支持是我创做的动力!