Loading...

process

FM ➡️ FFM ➡️ DeepFM

线性模型: f(x)=w0w_0 + i=0n\sum_{i=0}^{n}wiw_i·xix_i
缺点:只考虑了每个特征对结果的影响,而没有考虑特征件组合对结果的影响

SVM模型: f(x)=w0w_0 + i=0n\sum_{i=0}^{n}wiw_i·xix_i + i=0n1\sum_{i=0}^{n-1}j=i+1n\sum_{j=i+1}^{n}wijw_{ij}·xix_ixjx_j
缺点:在稀疏性明显的样本中,xix_ixjx_j都不为0的样本非常少,这会导致wijw_{ij}不能够得到足够的训练,从而不准确。

FM模型: f(x)=w0w_0 + i=0n\sum_{i=0}^{n}wiw_i·xix_i + i=0n1\sum_{i=0}^{n-1}j=i+1n\sum_{j=i+1}^{n}(ViTV_i^TVjV_jxix_ixjx_j
优点:可以在稀疏数据中进行参数估计,FM模型复杂度是线性的,可以用于任何为实值的情况

FFM模型: f(x)=w0w_0 + i=0n\sum_{i=0}^{n}wiw_i·xix_i + i=0n1\sum_{i=0}^{n-1}j=i+1n\sum_{j=i+1}^{n}(Vj1f2TV_{j_1f_2}^TVj2f1V_{j_2f_1}xix_ixjx_j
优点:FFM只会学习到字段之间的交叉,而不会学习同字段内的交叉
x = [u1, u2, m1, m2, c1, c2]
           field1 field2 field3

DeepFM模型:
前面模型的缺点:尽管FM模型理论上可以得到高阶特征关系,但实际应用中一般指采用二阶特征,因为复杂度太高,现有的FNN,PNN和Wide&Deep模型都有着预训练耗时以及需要特征工程等问题

该模型解决的问题:如何找到一种可以兼顾低阶和高阶特征,并且无需特征工程和预训练方法

yFMy_{FM}=<w,x> + i=0d\sum_{i=0}^{d}j=i+1d\sum_{j=i+1}^{d}<ViTV_i^T,VjV_jxix_ixjx_j
         一阶特征                高阶特征

a(l+1)a^{(l+1)} = σ\sigma(W(l)W^{(l)}a(l)a^{(l)} + b(l)b^{(l)})
yDNNy_{DNN} = WH+1W^{|H| + 1}·aHa^{|H|} + bH+1b^{|H| + 1}

y=sigmoid(yFMy_{FM} + yFMy_{FM})

  • Q1:由于类别特征
    无法直接用于数值计算,为了表征这类特征,我们采用独热编
    码将特征向量转换为高维稀疏向量.考虑到高维稀疏特征难
    以处理,通常采用特征嵌入将高维稀疏特征嵌入到低维稠密
    的向量空间中,以获得特征嵌入向量E
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import pandas as pd
from sklearn.decomposition import PCA

# 假设我们有以下的DataFrame
df = pd.DataFrame({
'A': ['dog', 'cat', 'dog', 'dog', 'cat', 'dog'],
'B': ['orange', 'banana', 'banana', 'orange', 'banana', 'orange'],
'C': [1, 2, 3, 4, 5, 6]
})
print(df)
# 对类别特征进行独热编码
df_encoded = pd.get_dummies(df, columns=['A', 'B'])
print(df_encoded)
# 实例化PCA,选择嵌入向量的维度
pca = PCA(n_components=2)

# 使用PCA对独热编码的特征进行降维
df_pca = pca.fit_transform(df_encoded)

# 输出特征嵌入向量E
print(df_pca)

  • Q2:baseline
    LR (Logistic Regression):这是一个基本的线性模型,对原始特征进行线性变换,然后通过sigmoid函数将输出转换成0到1之间的概率。它适用于二分类问题,但只能捕捉到特征的一阶交互(即每个特征对输出的独立影响)。

    FM (Factorization Machine):这是一个能够学习特征对的二阶交互的模型。它使用了矩阵分解的技术,使得在有大量稀疏特征的情况下,也能高效地学习特征的二阶交互。

    DeepFM:这个模型结合了FM和深度学习的技术。它的FM部分用于学习特征的低阶交互,而深度网络部分用于学习特征的高阶交互。这两部分共享同样的输入,使得低阶和高阶交互能够同时被学习。

    xDeepFM:这个模型在DeepFM的基础上进一步引入了CIN(Compressed Interaction Network)部分,用于显式地学习特征的高阶交互。它同时考虑了显式和隐式的特征交互,能够更好地学习特征之间的复杂关系。

    AFM (Attentional Factorization Machine):这个模型在FM的基础上引入了注意力机制。对于每个特征对的交互,AFM都会通过一个注意力网络来计算其重要性,然后将注意力分数用于加权特征对的交互。这使得模型能够区分不同交互特征的重要性。

    AutoInt (Automatic Feature Interaction):这个模型使用了多头自注意力机制来学习特征的交互。自注意力机制使得模型在计算一个特征对输出的影响时,能够考虑到所有其他特征的信息。这使得模型能够自动地、显式地学习特征的高阶交互。


  • Q3:低阶和高阶的特征是什么?你能用DeepFM模型举一个例子吗,帮助我更好的理解DeepFM模型
    "低阶"和"高阶"特征交互通常指的是特征组合的复杂性。

    低阶特征交互通常指的是两个或者少数几个特征之间的交互。例如,在推荐系统中,用户的性别(男或女)和商品的类别(衣服或鞋子)之间的交互可以被看作是一个二阶交互(也就是低阶交互)。如果男性更倾向于购买鞋子,而女性更倾向于购买衣服,这个信息就是一个二阶交互特征。

    高阶特征交互则涉及到三个或者更多的特征。例如,用户的年龄、性别和商品的类别三者之间的交互就是一个三阶交互。如果我们发现年轻的男性用户更倾向于购买运动鞋,而年轻的女性用户更倾向于购买高跟鞋,这个信息就是一个三阶交互特征。

    下面是一个DeepFM模型的例子。假设我们有一个简化的推荐系统问题,特征包括用户的性别(男、女)、年龄(年轻、中年、老年)和商品的类别(衣服、鞋子)。我们想预测一个用户是否会购买一个商品。

    DeepFM会将这些特征先通过embedding转化为连续向量,然后:

    FM部分:DeepFM会学习每对特征之间的交互,也就是二阶交互。例如,它会学习"男性"和"鞋子"的交互对购买行为的影响是什么,"年轻"和"衣服"的交互对购买行为的影响是什么等。

    Deep部分:DeepFM的深度网络部分则会学习更复杂的、高阶的特征交互。例如,它可能会发现年轻的男性用户更喜欢购买运动鞋这样的三阶交互。

    最后,DeepFM会将FM部分和Deep部分的输出合并,然后通过一个sigmoid函数,将它们转化为购买的概率。


  • Q4: 什么是隐变量

    隐变量(latent variable)是指在统计模型中未被直接观测到的变量。它通常用于描述一些隐藏的因素,这些因素影响了我们可以观测到的变量。

    举个简单的例子,假设我们要建立一个模型来预测某个学生的考试成绩。考试成绩是我们可以观测到的变量。但是考试成绩会受到一些隐藏的因素的影响,比如这个学生的智商、学习动机、学习时间等,这些就是隐变量。

    我们可以建立一个回归方程:

    考试成绩 = w1 * 智商 + w2 * 学习动机 + w3 * 学习时间 + 噪声

    这里智商、学习动机和学习时间就是隐变量,它们影响着我们最终观测到的考试成绩,但自己本身是不可观测的。我们需要通过考试成绩反向估计这些隐变量,以建立一个更好的预测模型。

    隐变量在很多机器学习和统计模型中都有应用。比如在隐马尔科夫模型、概率图模型等,都利用隐变量来描绘数据之间的复杂依赖关系。总体来说,隐变量为我们建模提供了更大的灵活性。