本文主要介绍FFM(FFM, Field-aware Factorization Machine)
FFM模型
- FFM最初概念来自Yu-Chin Juan(阮毓钦,毕业于中国台湾大学,现在美国Criteo工作)与其比赛队员,他们借鉴了Michael Jahrer的论文中的field概念提出了FM的升级版模型
Field的概念
- FFM把相同性质的特征归于同一个Field,
- 比如“Day=26/11/15”、“Day=1/7/14”、“Day=19/2/15”这三个特征都是代表日期的,可以放到同一个field中
- 简单来说,就是同一个categorical特征经过One-Hot编码生成的数值特征都可以放到同一个field,包括用户性别、职业、品类偏好等
模型推导
- FM 对每个特征 \(x_i\) 学习一个 \(k\) 维隐向量\(v_i\), 二次项参数数量为\(nk\)
- FFM 对每个特征 \(x_i\) 和每个域(field) \(f_j\) 学习一个 \(k\) 维隐向量\(v_{i,f_{j}}\), 二次项参数数量为\(nfk\)
- 假设样本的特征有 \(n\) 个
- 假设filed有 \(f\) 个
- 建模方程
$$y(x) = w_0 + \sum_{i=1}^n w_i x_i + \sum_{i=1}^n \sum_{j=i+1}^n \langle \mathbf{v}_{i, f_j}, \mathbf{v}_{j, f_i} \rangle x_i x_j \label{eq:ffm}\tag{4}$$- 值得注意的是,上面的公式中,\(\mathbf{v}_{i, f_j}\)的第二个下标是 \(f_j\) ,不是 \(f_i\) ,表示的是, 同一个特征\(x_{i}\)在对不同的域(Field) \(f_j\) 中的特征 \(x_j\) 组合时,FFM考虑到 \(x_j\)的域不同,应该用不同的组合方式,所以使用不同的隐向量
- FM中 \(x_i\) 的隐向量为 \(v_i\)
- FFM中 \(x_i\) 的隐向量有多个,确切的说是隐矩阵, 对每个不同的域Field(包括\(x_i\)自身所在的域), 都有一个隐向量 \(v_{i,f_{j}}\) , 和不同类型的特征组合时,我们选择他们对应域的隐变量与之相乘
- 当前模型的二次项一共有\(\frac{n(n-1)}{2}\)项, 计算复杂度为\(O(n^2)\) 与FM化简前相同, FFM这里不能化简, 所以训练和预测复杂度计算复杂度为 \(O(n^2)\)
FFM需要关注的细节
- 样本归一化, FFM默认进行样本归一化, 有个参数
pa.norm
设置为真即可;若此参数设置为假,很容易造成数据inf溢出,进而引起梯度计算的nan错误
* 因此,样本层面的数据是推荐进行归一化的- [待更新],样本归一化的具体操作,样本归一化的作用是什么?
- 特征归一化,这里由于样本归一化后categorical的特征会变得非常小
- 省略零值特征, 从建模方程可以看出, 零值特征对FFM模型完全没有贡献,包含零值特征的一切组合均为零