欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

Feature-Based Matrix Factorization

最编程 2024-07-23 17:01:21
...

前记

上一篇讲到libFM的作者对比了libFM和SVDFeature,认为SVDFeature也是一种通用的矩阵分解模型,但是各有优缺点:

  • 缺点:SVDFeature有限制条件,只能对两个类别型的特征进行分解;只能用SGD算法来优化,MCMC更好用
  • 优点:在有限制条件下的情况可以使用更高效的优化算法

所以,我们看看为什么作者这么说?

SVDFeature

SVDFeature作者是大神陈天奇,也是XGBoost和cxxnet的作者。本文主要参考资料为论文https://arxiv.org/pdf/1109.2271.pdf和SVDFeature的手册

由Apex Data & Knowledge Management Lab在KDD CUP11竞赛中开发出来的工具包。它的目的是有效地解决基于特征的矩阵分解.

论文组成部分

  • 基础的矩阵分解有什么问题
  • 什么是基于特征的矩阵分解
  • 什么信息能够加入到模型
  • 怎么更有效的训练SVD++
  • 能处理多少数据

矩阵分解要解决什么问题

  • 需要能处理大数据
  • 需要加上收集到的其他特征信息,而不是只用显示或者隐式反馈

什么是基于特征的矩阵分解

  • 通用的模型定义为


    图片.png

其中\alpha表示为用户特征,\beta表示物品特征,\gamma表示全局特征
可以转换成基础的矩阵分解模型,如果我们定义
\gamma = \emptyset , \quad \alpha_k = \begin{cases}1\quad k=u\\0\quad k\neq u \end{cases} ,\quad \beta_k=\begin{cases}1\quad k=i\\0\quad k\neq i \end{cases}

  • 激活函数和损失函数定义
    • 原始的矩阵分解:恒等函数和L2损失
    • 逻辑回归版本的矩阵分解:sigmoid函数和似然损失
    • 二分类问题的矩阵分解:恒等函数和平滑铰链损失
  • 模型训练


    图片.png

哪些信息能给加入到模型来

  • 原始的矩阵分解
    • y = u + b_u + b_i + P^T_uq_i
    • \gamma = \emptyset , \quad \alpha_k = \begin{cases}1\quad k=u\\0\quad k\neq u \end{cases} ,\quad \beta_k=\begin{cases}1\quad k=i\\0\quad k\neq i \end{cases}
  • pairwise-rank模型
    • P(r_{ui} > r_{uj}) = sigmoid(u + b_i - b_j + p^T_u(q_i - q_j))
    • \gamma = \emptyset , \quad \alpha_k = \begin{cases}1\quad k=u\\0\quad k\neq u \end{cases} ,\quad \beta_k=\begin{cases}1\quad k=i\\-1\quad k=j\\0\quad k\neq i,k\neq j \end{cases}
  • 时序信息
    • TODO
  • 领域信息
    • TODO
  • 层次信息
    • TODO

高效的SVD++训练

使用对每个用户将数据group倒一起,每一个用户共享同样的隐式和显示反馈信息来进行加速,具体的原理TODO


图片.png

处理大规模数据

  • 使用外存
  • 用单独的线程进行读取,多线程来进行训练
  • KDDCUP11的比赛只用了2G的数据处理Yahoo! Music 2亿的打分记录

SVDFeature的操作指南

图片.png

r k n m (global features) (user features) (item features)
r表示预测值
k表示全局feature的维度
n表示用户feature的维度
m表示物品feature的维度
5 0 1 1 0:1 10:1表示user0对item10打分5

如果原始数据ua.base的格式为每行uid iid rate, generate feature from ua.base.shuffle
svdpp_randorder ua.base ua.svdpporder
line_reorder ua.base ua.svdpporder ua.base.shuffle

user feedback file
This file contains one line for each user, the order is same as the user order of the user grouped feature file. The first column gives the number of lines in grouped feature file of corresponding user. Then it specifies the implicit feedback information using the sparse feature format.
assume user 3 have rated item 2,4,6,7, and he has 3 lines in the grouped training file, then the extra file for implicit feedback is formatted as follows:
3 4 2:0.5 4:0.5 6:0.5 7:0.5

Summary for User Grouped Input Generation

  • create a file obeying the rule of user grouped format
  • generate feature file according to feature format
  • generate user feedback file if necessary
  • generate binary buffer file.

Usage Example Summary

  • model training:
    svd_feature config.conf num_round=10
  • continue training:
    svd_feature config.conf num_round=10 continue =1
  • rmse evaluation:
    svd_feature_infer config.conf
  • test prediction:
    svd_feature_infer config.conf pred=6 name_pred=pred.txt

http://dataera.org/2013/04/%E7%AE%80%E5%8D%95%E8%AF%B4%E8%AF%B4%E6%8E%A8%E8%8D%90%E6%A8%A1%E5%9E%8B/
我的理解是:非latent部分:feature本身对于rating分数是会有一定作用的,比如用户对于所有物品的打分的平均分,物品收到的平均打分,这就是上述公式的前两项;latent部分,首先假设有N维的latent factor,被用户与产品共享,(所以\mathbf{p}, \mathbf{q}的维度是一致的),所有的feature都可以在latent factor上进行分解,比如,不同的用户本身在latent factor上的“响应值”分布是不同的,不同的物品也是这样,而对于其他feature,比如标签或类别:“动作片”,也将其在latent factor空间进行分解(学出来的latent factor空间的“响应”应该在“动作片”相关的一个或几个factor上特别大)。如此以来,一对user-item pair对应的feature在latent空间分解后相乘(上述公式的第三项)就代表了latent factor各处的rating的预期。对于social relation,可以直接认为是一种feature,用上述公式就能融入。但是还有些更加sophisticated的方法(请自行用recommendation+social relation谷歌),但是,本质上也没有太大的差别。