推荐系统FM模型
好的,我们通过一个电影评分预测的示例来解释因子分解机(Factorization Machines, FM)在推荐系统中的应用。
问题背景
假设有以下4个用户对电影的评分数据:
用户ID | 电影ID | 用户年龄 | 电影类型 | 评分 |
---|---|---|---|---|
U1 | M1 | 25 | 动作 | 5 |
U1 | M2 | 25 | 爱情 | 3 |
U2 | M1 | 30 | 动作 | 4 |
U3 | M3 | 20 | 科幻 | 2 |
目标:预测用户对未评分电影的评分(如预测用户U2对电影M3的评分)。
数据预处理
将分类特征转换为数值特征(独热编码):
假设特征维度如下:
- 用户ID:
U1, U2, U3
→ 3维 - 电影ID:
M1, M2, M3
→ 3维 - 用户年龄:直接保留数值
- 电影类型:
动作, 爱情, 科幻
→ 3维
最终特征向量维度 = 3(用户) + 3(电影) + 1(年龄) + 3(类型) = 10维。
例如,第一条样本 U1, M1, 25, 动作
的编码为:
[1,0,0, 1,0,0, 25, 1,0,0]
FM模型原理
FM的预测公式为:
y ^ = w 0 + ∑ i = 1 n w i x i + ∑ i = 1 n ∑ j = i + 1 n ⟨ v i , v j ⟩ x i x j \hat{y} = w_0 + \sum_{i=1}^n w_i x_i + \sum_{i=1}^n \sum_{j=i+1}^n \langle v_i, v_j \rangle x_i x_j y^=w0+i=1∑nwixi+i=1∑nj=i+1∑n⟨vi,vj⟩xixj
其中:
- w 0 w_0 w0 是全局偏置项
- w i w_i wi 是第i个特征的权重
- v i ∈ R k v_i \in \mathbb{R}^k vi∈Rk 是第i个特征的隐向量(长度为k)
- ⟨ v i , v j ⟩ \langle v_i, v_j \rangle ⟨vi,vj⟩ 是隐向量的点积,建模特征交互。
具体计算示例
假设我们为每个特征分配隐向量(设k=2),初始化参数如下:
特征 | 权重 w i w_i wi | 隐向量 v i v_i vi |
---|---|---|
用户U1 | 0.1 | [0.2, -0.3] |
用户U2 | 0.3 | [0.5, 0.1] |
用户U3 | -0.2 | [-0.4, 0.2] |
电影M1 | 0.5 | [0.1, 0.6] |
电影M2 | -0.3 | [-0.2, 0.4] |
电影M3 | 0.2 | [0.3, -0.1] |
年龄25 | 0.4 | [0.1, -0.2] |
动作类型 | 0.6 | [0.5, 0.3] |
爱情类型 | -0.1 | [-0.2, 0.4] |
科幻类型 | 0.3 | [0.2, -0.1] |
以第一条样本 U1, M1, 25, 动作
为例(评分=5):
-
线性项:
0.1 ( U1 ) + 0.5 ( M1 ) + 0.4 ( 年龄25 ) + 0.6 ( 动作 ) = 0.1 + 0.5 + 0.4 + 0.6 = 1.6 0.1 (\text{U1}) + 0.5 (\text{M1}) + 0.4 (\text{年龄25}) + 0.6 (\text{动作}) = 0.1+0.5+0.4+0.6 = 1.6 0.1(U1)+0.5(M1)+0.4(年龄25)+0.6(动作)=0.1+0.5+0.4+0.6=1.6 -
交叉项(计算交互特征对的隐向量点积):
- U1 & M1: ⟨ [ 0.2 , − 0.3 ] , [ 0.1 , 0.6 ] ⟩ = 0.2 ∗ 0.1 + ( − 0.3 ) ∗ 0.6 = − 0.16 \langle [0.2,-0.3], [0.1,0.6] \rangle = 0.2*0.1 + (-0.3)*0.6 = -0.16 ⟨[0.2,−0.3],[0.1,0.6]⟩=0.2∗0.1+(−0.3)∗0.6=−0.16
- U1 & 年龄25: ⟨ [ 0.2 , − 0.3 ] , [ 0.1 , − 0.2 ] ⟩ = 0.2 ∗ 0.1 + ( − 0.3 ) ∗ ( − 0.2 ) = 0.08 \langle [0.2,-0.3], [0.1,-0.2] \rangle = 0.2*0.1 + (-0.3)*(-0.2) = 0.08 ⟨[0.2,−0.3],[0.1,−0.2]⟩=0.2∗0.1+(−0.3)∗(−0.2)=0.08
- U1 & 动作: ⟨ [ 0.2 , − 0.3 ] , [ 0.5 , 0.3 ] ⟩ = 0.2 ∗ 0.5 + ( − 0.3 ) ∗ 0.3 = 0.1 − 0.09 = 0.01 \langle [0.2,-0.3], [0.5,0.3] \rangle = 0.2*0.5 + (-0.3)*0.3 = 0.1 - 0.09 = 0.01 ⟨[0.2,−0.3],[0.5,0.3]⟩=0.2∗0.5+(−0.3)∗0.3=0.1−0.09=0.01
- M1 & 年龄25: ⟨ [ 0.1 , 0.6 ] , [ 0.1 , − 0.2 ] ⟩ = 0.1 ∗ 0.1 + 0.6 ∗ ( − 0.2 ) = − 0.11 \langle [0.1,0.6], [0.1,-0.2] \rangle = 0.1*0.1 + 0.6*(-0.2) = -0.11 ⟨[0.1,0.6],[0.1,−0.2]⟩=0.1∗0.1+0.6∗(−0.2)=−0.11
- M1 & 动作: ⟨ [ 0.1 , 0.6 ] , [ 0.5 , 0.3 ] ⟩ = 0.1 ∗ 0.5 + 0.6 ∗ 0.3 = 0.23 \langle [0.1,0.6], [0.5,0.3] \rangle = 0.1*0.5 + 0.6*0.3 = 0.23 ⟨[0.1,0.6],[0.5,0.3]⟩=0.1∗0.5+0.6∗0.3=0.23
- 年龄25 & 动作: ⟨ [ 0.1 , − 0.2 ] , [ 0.5 , 0.3 ] ⟩ = 0.1 ∗ 0.5 + ( − 0.2 ) ∗ 0.3 = − 0.01 \langle [0.1,-0.2], [0.5,0.3] \rangle = 0.1*0.5 + (-0.2)*0.3 = -0.01 ⟨[0.1,−0.2],[0.5,0.3]⟩=0.1∗0.5+(−0.2)∗0.3=−0.01
交叉项总和 = -0.16 + 0.08 + 0.01 - 0.11 + 0.23 - 0.01 = 0.04
-
最终预测值:
y ^ = w 0 + 1.6 + 0.04 = 1.64 ( 假设 w 0 = 0 ) \hat{y} = w_0 + 1.6 + 0.04 = 1.64 \quad (\text{假设 } w_0=0) y^=w0+1.6+0.04=1.64(假设 w0=0) -
计算损失:
真实评分=5,预测评分=1.64,平方误差为 ( 5 − 1.64 ) 2 = 11.28 (5-1.64)^2 = 11.28 (5−1.64)2=11.28,通过梯度下降更新参数。
FM的优势
- 自动学习特征交互:即使某些组合(如U3和科幻类型)在训练集中未出现,隐向量也会通过其他交互学习到泛化能力。
- 处理稀疏数据:适合推荐系统中的高维稀疏特征(如用户ID和物品ID)。
- 线性时间复杂度:通过公式变形,二阶交叉项的计算复杂度从 O ( k n 2 ) O(kn^2) O(kn2) 降低到 O ( k n ) O(kn) O(kn)。
总结
FM通过隐向量建模特征交互,解决了传统线性模型无法捕捉特征组合的问题。在推荐系统中,它特别适合处理用户-物品交互数据中的稀疏性和隐式关系。