zoukankan      html  css  js  c++  java
  • Factorization Machine

    Factorization Machine Model

    如果仅考虑两个样本间的交互, 则factorization machine的公式为:

    $hat{y}(mathbf{x}):=w_0 + sum_{i=1}^nw_ix_i + sum_{i=1}^nsum_{j=i+1}^n<mathbf{v}_i, mathbf{v}_j>x_ix_j$

    其中的参数为

    $w_0 in mathcal{R}, mathbf{w}inmathbb{R}^n,mathbf{V}inmathbb{R}^{n imes k} ag{1}$

    $mathbf{v_i}$是样本$i$的向量表示, 维度为$k$, 两个向量的点积越大, 表示这两个样本越相似.

    2路FM(2-way FM)捕获了样本自身以及样本之间的交互, 详解如下

    $w_0$是全局偏置

    $w_i$是第$i$个样本的强度

    $hat{w}_{i,j}:=<mathbf{v}_i, mathbf{v}_j>$代表第$i$个样本和第$j$个样本的交互. 与其为每个样本对都设置一个参数$w_{i,j}$, FM模型将其分解成两个向量之间的乘积.

    通常来说, 对于任一正定矩阵$mathbf{W}$,  只要$k$充分大, 都可以找到一个矩阵$mathbf{V}$使得 $mathbf{W}= mathbf{V} cdot mathbf{V}^t$. 然而如果数据比较稀疏, 因为数据量不够估计复杂的交互矩阵$mathbf{W}$, 通常需要选择小一点的$k$. 而FM把这种交互分解后, 会学习的更好, 因为FM通过分解来打破了交互之间的依赖性, 减少了参数. 下图是一个用于预测用户对电影打分的数据集:

    易知$(1)$式的计算复杂度为$mathit{O}(kn^2)$, 但是其可以做如下化简:

    $sum_{i=1}^nsum_{j=i+1}^n<mathbf{v}_i, mathbf{v}_j>x_ix_j$

    $=frac{1}{2}sum_{i=1}^nsum_{j=1}^n<mathbf{v}_i,mathbf{v}_j>x_ix_j - frac{1}{2}sum_{i=1^n}<mathbf{v}_i, mathbf{v}_j>x_ix_j$

    $=frac{1}{2}left(sum_{i=1}^nsum_{j=1}^nsum_{f=1}^kv_{i, f}v_{j, f}x_ix_j - sum_{i=1}^nsum_{f=1}^kv_{i,f}v_{i,f}x_ix_i ight)$

    $=frac{1}{2}sum_{f=1}^kleft(left(sum_{i=1}^nv_{i, f}x_i ight)left(sum_{j=1}^nv_{j,f}x_j ight) - sum_{i=1}^nv_{i, f}^2x_i^2 ight)$

    $=frac{1}{2}sum_{f=1}^kleft(left(sum_{i=1}^nv_{i, f}x_i ight)^2 -sum_{i=1}^nv_{i, f}^2x_i^2 ight)$

    根据上述化简, $(1)$式的计算复杂度可以变为$mathit{O}(kn)$

    FM可以用作回归, 二分类以及排序. 为了防止过拟合, 最好添加$mathcal{L}_2$正则化项.

    • 回归  直接使用MSE作为Loss
    • 二分类 使用hinge loss或者logit loss.
    • 排序 对样本对$(mathbf{x}^{(a)}, mathbf{x}^{(b)})$进行优化, 使用pairwise的分类loss

    模型学习

    FM的参数$(w_o, mathbf{w}, mathbf{V})$可以通过梯度下降方法来学习, 比如SGD. 

    $frac{partial}{partial heta}=egin{cases} 1 & if hspace{2 pt} heta hspace{2 pt}is hspace{2 pt}w_0 \ x_i, & if hspace{2 pt} heta hspace{2 pt}is hspace{2 pt}w_i \ x_isum_{j=1}^nv_{j, f}x_j - v_{i, f}x_i^2, & if hspace{2 pt} heta hspace{2 pt}ishspace{2 pt} v_{i, f}end{cases}$

    其中$sum_{j=1}^nv_{j, f}x_j$独立于$i$, 可以提前计算. 所以所有的梯度都可以在$mathit{O}(1)$时间内计算得到, 而每个样本的参数更新可以在$mathit{O}(kn)$内完成.

    2路FM可以扩展到k路:

    $hat{y}(x):=w_0 + sum_{i=1}^nw_ix_i + sum_{l=2}^dsum_{i_1=1}^ndotssum_{i_l=i_{l-1}+1}^nleft(prod_{j=1}^lx_{i_{j}} ight) left(sum_{f=1}^{k_l}prod_{j=1}^lv_{i_j, f}^{(l)} ight)$

    参考文献:

    [1]. Factorization Machines. Steffen Rendle. ICDM 2010.

    [2]. From Matrix Factorization to Factorization Machine.

  • 相关阅读:
    redis(二)高级用法
    redis(一) 安装以及基本数据类型操作
    RabbitMQ(五) -- topics
    JS实时数据运算
    Access数据库中Sum函数返回空值(Null)时如何设置为0
    asp检测数字类型函数
    MVC:从客户端中检测到有潜在危险的 Request.Form 值 的解决方法
    WIN8系统安装软件时提示"扩展属性不一致"的解决方法
    免费的网络扫描器-Advanced IP Scanner
    中国电信大亚DP607光猫破解,设置路由,wifi!关闭远程管理,改连接限制,SN码查询!
  • 原文地址:https://www.cnblogs.com/kemaswill/p/4219909.html
Copyright © 2011-2022 走看看