当前位置: 首页 > news >正文

广告推荐模型3:域感知因子分解机(Field-aware Factorization Machine, FFM)

一、FFM模型的核心思想:引入“域”的概念,实现更精细的特征交叉

FFM的核心洞察是:在FM中,一个特征在与任何其他特征交叉时都使用同一个隐向量,这是不合理的。一个特征在与不同“类别”的特征交叉时,应该有不同的表现。

FFM通过引入 “域(Field)” 的概念来解决这个问题。

  • 什么是“域”(Field)? 一个“域”是指包含多个特征的一个类别分组

    • 例如,所有描述“用户”的特征(如性别、年龄)属于User Field

    • 所有描述“广告”的特征(如类别、广告主)属于Ad Field

    • 所有描述“上下文”的特征(如时间、设备)属于Context Field

在FFM中,每个特征不再只有一个隐向量,而是针对每一个其他“域”,都有一个专门的隐向量。这就是“域感知”(Field-aware)的含义。

二、一个详细的例子:预测用户点击游戏广告的概率

我们继续使用之前的场景,但这次用FFM模型。用户是23岁的男性Alice,广告是《王者荣耀》游戏。

第一步:定义特征与域(Feature & Field Design)

这是FFM模型成功的关键。我们需要先为所有特征划分“域”。

特征名称原始特征值特征符号所属域 (Field)
用户性别x₁User Field (F_u)
用户年龄23x₂User Field (F_u)
历史游戏点击3x₃User Behavior Field (F_ub)
广告类别游戏x₄Ad Field (F_a)
时间段晚上x₅Context Field (F_c)
操作系统iOSx₆Context Field (F_c)

第二步:FFM的隐向量——数量爆炸的艺术

在FM中,每个特征只有一个隐向量(例如,v₄ 代表“广告类别=游戏”)。
在FFM中,每个特征会有 (总域数 - 1) 个隐向量,因为它需要针对每一个其他域,都有一个专属的向量。

假设我们的隐向量维度 k=2。那么特征 x₄(广告类别=游戏)将拥有多个隐向量:

  • v₄, User:当与User Field的特征(如x₁性别x₂年龄)交叉时,使用这个向量。

  • v₄, Behavior:当与User Behavior Field的特征(如x₃历史点击)交叉时,使用这个向量。

  • v₄, Context:当与Context Field的特征(如x₅时间x₆系统)交叉时,使用这个向量。

注意:它不需要为自己所在的域准备向量,因为同域内的特征一般不进行交叉。

第三步:FFM如何计算特征交叉权重?

FFM模型的方程如下:

\hat{y}(x) = w_{0} + \sum_{i=1}^{n} w_{i} x_{i} + \sum_{i=1}^{n} \sum_{j=i+1}^{n} \left\langle \mathbf{v}_{i, F_{j}}, \mathbf{v}_{j, F_{i}} \right\rangle x_{i} x_{j}

与FM的公式对比,你会发现唯一的变化在二阶项的内积部分:

\sum_{i} \sum_{j} \langle \mathbf{v}_{i, \text{Field}(j)}, \mathbf{v}_{j, \text{Field}(i)} \rangle x_i x_j

这个公式非常关键:当计算特征 i 和特征 j 的交叉权重时:

  1. 特征 i 使用其针对特征 j 所属域(Field(j)) 的隐向量 v_{i, Field(j)}

  2. 特征 j 使用其针对特征 i 所属域(Field(i)) 的隐向量 v_{j, Field(i)}

  3. 计算这两个向量的点积。

让我们看一个具体的交叉计算:计算特征 x₄ (广告类别=游戏,属于 F_a) 和 x₁ (用户性别=男,属于 F_u) 的组合效应。

  1. 对于特征 x₄(广告游戏),它要交互的对象 x₁ 属于 User Field (F_u)。因此,它使用针对 User Field 的隐向量 v_{4, F_u}。假设 v_{4, F_u} = [0.5, 0.7]

  2. 对于特征 x₁(用户男性),它要交互的对象 x₄ 属于 Ad Field (F_a)。因此,它使用针对 Ad Field 的隐向量 v_{1, F_a}。假设 v_{1, F_a} = [0.3, 0.9]

  3. 它们的交叉权重为:<v_{4, F_u}, v_{1, F_a}> = (0.5*0.3) + (0.7*0.9) = 0.15 + 0.63 = 0.78

再对比一下FM的计算:
在FM中,无论跟谁交叉,x₄ 只用 v₄ = [0.5, 0.7]x₁ 只用 v₁ = [0.2, 0.6],得到的权重是 <v₄, v₁> = 0.52

FFM的计算结果(0.78)和FM(0.52)完全不同! FFM的模型容量更大,能学习到更精细的组合模式。它认为“游戏广告”在面对“用户属性”时,其贡献度应该比一个全局的向量所表达的要更高。

第四步:再看一个例子——理解“域感知”的优势

现在计算另一个组合:x₄ (广告游戏,F_a) 和 x₅ (时间晚上,F_c)。

  1. 特征 x₄ 看到交互对象 x₅ 属于 Context Field (F_c),于是使用 v_{4, F_c}。假设 v_{4, F_c} = [0.1, 0.2]

  2. 特征 x₅ 看到交互对象 x₄ 属于 Ad Field (F_a),于是使用 v_{5, F_a}。假设 v_{5, F_a} = [0.4, -0.1]

  3. 交叉权重:<v_{4, F_c}, v_{5, F_a}> = (0.1*0.4) + (0.2*(-0.1)) = 0.04 - 0.02 = 0.02

这个权重非常小,说明模型从数据中学到:“广告类别”和“时间段”这个组合关系,远不如“广告类别”和“用户属性”的关系重要。

这正是FFM的强大之处:它能为不同类型的特征组合,学习到截然不同的交互强度,表征能力远超FM。

三、FFM在广告系统中的优缺点总结

优点:

  1. 建模能力更强:通过引入“域”的概念,模型对特征交叉的学习变得无比精细,效果通常显著优于FM。

  2. 可解释性(宏观):虽然参数变多,但我们仍然可以通过分析不同域间交互的总体强度,来理解哪些域的组合对业务目标更重要。

缺点:

  1. 参数量爆炸:这是FFM最致命的缺点。参数总量从FM的 n*k 个暴增到 n * f * k 个(f 是域的个数)。对于特征量大、域多的场景,模型体积会变得非常庞大。

  2. 训练速度慢:由于参数增多和计算变得复杂,FFM的训练时间通常比FM长一个数量级。

  3. 对特征Field设计敏感:模型效果很大程度上依赖于如何划分“域”。不合理的域划分可能导致效果下降或过拟合。

  4. 不适合深度学习化:其复杂的参数结构难以像FM那样轻松地嵌入到深度神经网络中作为一层使用(这也是DeepFM选择使用FM而不是FFM作为 Wide 部分的原因)。

FM与FFM的对比:

特性

FM (因子分解机)

FFM (场感知因子分解机)

​核心思想​

每个特征一个隐向量,用于所有交互。

每个特征为每个其他Field准备一个隐向量,交互时按Field取用。

​参数量​

O(n*k)

O(n*f*k)(更大,易过拟合)

​计算复杂度​

O(k*n)

O(k*n²)(更慢,无法做同样的数学优化)

​表达能力​

​更强​​,能学习更精细的特征交互模式

​数据要求​

对一般稀疏数据有效

需要大量数据,否则容易过拟合

​适用场景​

通用推荐、CTR预估

​特征Field区分度高的场景​​(如广告推荐,其特征天然可划分为用户、广告、上下文等Field)

​正则化​

需要

​极度需要​​,否则性能会下降

FFM通过引入Field-aware的概念,增强了模型的表达能力,在特征场划分清晰的问题上(如广告推荐)效果通常显著优于FM。但其代价是巨大的参数量和计算开销,需要精心调整正则化和使用早停(Early Stopping)等技巧来防止过拟合。它是CTR预估领域一个非常经典且重要的模型。

http://www.xdnf.cn/news/1372969.html

相关文章:

  • 变压器副边电流计算
  • ARP地址解析协议
  • 嵌入式C语言进阶:结构体封装函数的艺术与实践
  • Java 集合笔记
  • 宝石组合(蓝桥杯)
  • 2025最新的软件测试热点面试题(答案+解析)
  • 【Linux 34】Linux-主从复制
  • plantsimulation知识点 RGV小车前端与后端区别
  • CNN 中 3×3 卷积核等设计背后的底层逻辑
  • spring如何通过实现BeanPostProcessor接口计算并打印每一个bean的加载耗时
  • 如何下载MySQL小白指南 (以 Windows 为例)
  • 基础|Golang内存分配
  • 学习游戏制作记录(保存装备物品技能树和删除存档文件)8.26
  • 数据结构的线性表 之 链表
  • 深度学习——神经网络(PyTorch 实现 MNIST 手写数字识别案例)
  • 2026 届最新大数据专业毕设选题推荐,毕业设计题目汇总
  • typescript 中的访问修饰符
  • 工业数据消费迎来“抖音式”革命:TDengine IDMP 让数据自己开口说话
  • 利用3台机器搭建Kubernetes集群
  • 工业大模型五层架构全景解析:从算力底座到场景落地的完整链路
  • 《分布式任务调度中“任务重复执行”的隐性诱因与根治方案》
  • 算法练习-合并两个有序数组
  • Java大厂面试全真模拟:从Spring Boot到微服务架构实战
  • HTML应用指南:利用GET请求获取中国银行人民币存款利率数据
  • 【系统架构设计(二)】系统工程与信息系统基础中:信息系统基础
  • 数据结构青铜到王者第四话---LinkedList与链表(1)
  • [Mysql数据库] 知识点总结3
  • 深度学习:卷积神经网络(CNN)
  • Docker中如何记录非交互式连接ssh用户操作的所有命令记录?
  • QT(QTableWidget)