目录
[1. FM模型要解决的核心问题](#1. FM模型要解决的核心问题)
[2. FM模型的核心思想](#2. FM模型的核心思想)
[3. FM模型的原理与公式](#3. FM模型的原理与公式)
a) 模型公式 模型公式)
b) 计算优化 计算优化)
1. FM模型要解决的核心问题
在广告推荐和CTR预估中,我们最常遇到的数据特点是:
- 高维稀疏性 :特征通常来自用户的性别、年龄、地域,广告的类别、来源等,这些特征经过One-Hot编码后会变成一个维度极高(可能上百万维)的向量。但每个样本(例如一次广告展示)中,只有极少数的特征是非零的(例如一个来自北京的青年男性用户),绝大部分特征都是0。
- 特征组合 :决定用户是否点击一个广告的,往往不是单个特征,而是多个特征的组合。例如,"男性用户"和"游戏广告"组合在一起,点击率可能会很高;而"女性用户"和"游戏广告"组合在一起,点击率可能就偏低。捕捉这些特征之间的交互作用至关重要。
传统的模型(如逻辑回归)的困境:
逻辑回归模型本质上是一个线性模型,无法自动捕捉特征交互。为了让它能学习特征组合,工程师必须手动进行特征工程,例如将"性别"和"广告类别"组合成一个新的特征"性别-广告类别交叉特征"。这种方式存在巨大问题:
- 难以穷举 :在超高维特征下,有价值的组合特征可能非常多,人工难以发现所有有效的组合。
- 计算爆炸 :组合后的特征维度是指数级增长的,模型训练的计算和存储成本无法承受。
- 稀疏性下的失效 :对于从未出现过的特征组合(例如某个地区的某个小众爱好),由于在训练数据中没有样本,模型无法学习其权重。
FM模型就是为了优雅地解决上述问题而提出的。
2. FM模型的核心思想
FM的核心思想是:将特征交互矩阵进行矩阵分解,用低维稠密向量来表征每个特征,从而解决稀疏数据下的特征组合学习问题。
简单来说,它不再为每一对特征组合 (xi, xj)
学习一个独立的权重 Wij
(这在稀疏数据下基本学不好),而是为每个特征 学习一个K维的隐向量(Latent Vector) 。然后,两个特征交互的权重就由它们对应的隐向量的内积 〈Vi, Vj〉
来估计。
这样做的好处是:
即使特征 i
和特征 j
在训练数据中从未同时出现过(比如"北京用户"和"某款冷门游戏"),我们仍然可以估计它们组合的权重,因为我们有从其他组合中学到的 V_北京
和 V_冷门游戏
向量。这极大地提升了模型的泛化能力。
3. FM模型的原理与公式
a) 模型公式
FM模型的方程如下(以二阶交叉为例):
我们来分解一下这个公式:
- 常数项 (
):全局偏置。
- 一阶线性项 (
):类似于逻辑回归,衡量每个特征独自对目标的影响。
- 二阶交叉项 (
):这是FM的精髓。它建模了所有两两特征之间的交互作用。
Vi
是特征i
的隐向量,是一个长度为k
的稠密向量。〈Vi, Vj〉
是两个向量的点积,其结果代表了特征i
和特征j
的组合权重。
b) 计算优化
直接计算二阶项的时间复杂度是 O(kn²)
,对于高维特征来说很慢。FM论文中通过数学变换将其优化到了 O(kn)
,使其非常高效:
这个变换是FM能投入实际应用的关键,它让计算量只与特征数量 n
和隐向量长度 k
成正比。
4.一个详细的例子:预测用户点击游戏广告的概率
我们继续使用LR例子中的场景,但这次用FM模型来解决。用户是23岁的男性Alice,广告是《王者荣耀》游戏。
第一步:特征表示(Feature Representation)
特征工程和LR一样,我们需要将类别特征进行One-Hot编码,形成稀疏特征向量。假设我们的特征库只有6个特征,那么这次广告请求可以表示为:
X = [x_user_male=1, x_user_age=23, x_hist_game_click=3, x_ad_category_game=1, x_time_evening=1, x_os_ios=1]
注意 :在工业界,这个向量的长度可能是几百万维,但大部分值为0,只有少数几个为1或某个连续值。这种极端稀疏性是广告/推荐领域的典型特征。
第二步:模型架构 - FM如何工作
FM模型的公式如下:
关键思想 :FM没有为每一对特征组合 (i, j)
直接学习一个权重 (在稀疏数据下,很多
会因为没有共现而无法训练),而是通过学习两个k维的隐向量
v_i
和 v_j
,用它们的点积来表示这个权重。
第三步:隐向量(Embedding)的奇妙之处
假设隐向量维度 k=2
。模型为我们的6个特征都分别学习了一个2维的隐向量:
-
v_1 (user_male) = [0.2, 0.6]
-
v_2 (user_age=23) = [0.1, -0.3]
(连续特征也有对应的隐向量) -
v_3 (hist_game_click=3) = [0.9, 0.4]
-
v_4 (ad_category_game) = [0.5, 0.7]
-
v_5 (time_evening) = [0.3, 0.1]
-
v_6 (os_ios) = [-0.2, 0.5]
现在,我们来看一个具体的组合。我们想计算特征 user_male (i=1)
和特征 ad_category_game (j=4)
这个组合的权重。
-
在LR中,我们需要事先手动创建这个组合特征
x_male_game
并希望数据能学习到它的权重w_male_game
。 -
在FM中,这个权重是动态计算出来的:
<v_1, v_4> = (0.2 * 0.5) + (0.6 * 0.7) = 0.1 + 0.42 = 0.52
这个 0.52
就是模型认为"男性用户"和"游戏广告"这个组合对"点击"的贡献强度。 这个值会在模型训练过程中不断更新优化。
第四步:解决稀疏性问题 - FM的强大泛化能力
假设在训练数据中,从来没有出现过 用户使用iOS
和 广告类别为游戏
同时出现的情况。那么在LR模型中,权重 w_os_ios_game
永远为0,模型无法对这个未知组合做出判断。
但在FM模型中:
-
特征
os_ios (v_6 = [-0.2, 0.5])
可能通过和其他特征(如time_evening
)的交互,已经学到了一些信息。 -
特征
ad_category_game (v_4 = [0.5, 0.7])
也通过和user_male
、hist_game_click
的交互学到了很多信息。 -
当模型遇到这个从未出现过的组合时,它可以直接计算隐向量的点积来得到一个合理的权重估计:
<v_6, v_4> = (-0.2*0.5) + (0.5*0.7) = -0.1 + 0.35 = 0.25
这意味着,FM模型即使面对从未出现过的特征组合,也能做出相当准确的预测! 这种泛化能力是其最大的优势。
第五步:效率问题 - 数学变换的魔力
直接计算所有两两特征组合,复杂度是O(n²),在特征百万维的场景下是不可行的。FM通过一个数学变换(推导过程面试不要求必会),将二阶项的计算复杂度优化到了O(kn),变得和线性模型一样高效!
最终公式变换为:
这个公式允许我们高效地计算二阶项。
5.FM在广告系统中的优缺点总结
优点:
-
自动特征交叉:无需人工参与,自动学习所有二阶特征组合,解放了生产力。
-
强大的泛化能力:通过隐向量,能够对未出现过的特征组合进行有效预测,这在极度稀疏的广告场景下至关重要。
-
高效的计算性能:通过数学变换,时间复杂度优化到O(kn),可用于工业级大数据场景。
缺点:
-
仅限于二阶交叉:虽然二阶交叉很重要,但更高阶的组合(如"年轻男性在晚上使用iOS设备看游戏广告")可能也包含重要信息,标准FM无法捕获。(后续的DeepFM等模型解决了这个问题)
-
隐向量内积不一定是最优:点积运算可能不是衡量两个特征组合关系的最优方式。
FM模型的核心思想是用隐向量的点积 来代替单一的组合特征权重。这解决了LR模型在稀疏数据下无法学习未见特征组合的问题,实现了自动化的二阶特征交叉,并且通过数学优化保证了计算效率。它是推荐系统从手工时代走向自动化时代的一个里程碑式模型。