当前位置: 首页 > 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.dtcms.com/a/351212.html

相关文章:

  • 机器人 - 无人机基础(6) - 状态估计(ing)
  • 1 线性模型
  • 支持向量机(SVM)
  • Java 大视界 -- Java 大数据机器学习模型在金融市场波动预测与资产配置动态调整中的应用
  • 网站开发用什么语言好
  • CentOS扩容非LVM分区
  • PortSwigger靶场之Blind SQL injection with out-of-band interaction通关秘籍
  • Redis--2
  • 在 TencentOS 3 上部署 OpenTenBase:从底层原理到生产级实践的深度指南
  • DBeaver下载安装使用
  • 支持向量机(SVM)算法总结
  • 大数据毕业设计选题:基于大数据的用户贷款行为数据分析系统Spark SQL核心技术
  • 迷你版Shell:源码详解与行为解析
  • 【Linux 34】Linux-主从复制
  • 嵌入式学习日记(34)HTTP协议
  • 支持向量机核心知识总结
  • 读懂支持向量机(SVM)
  • CI/CD 全链路实践:从 Git 基础到 Jenkins + GitLab 企业级部署
  • Flask 之上下文详解:从原理到实战
  • IDEA-Maven和Tomcat乱码问题
  • 2025改版:npm 新淘宝镜像域名地址
  • Uniapp(Vue2)Api请求封装
  • 企业级集群部署gpmall商城:MyCat+ZooKeeper+Kafka 环境部署与商城应用上线流程
  • VxWorks 核心数据结构详解 【消息队列、环形缓冲区、管道、FIFO、双缓冲区、共享内存】
  • Debian Buster 软件源失效问题
  • 在分布式环境下正确使用MyBatis二级缓存
  • 虚拟滚动优化——js技能提升
  • zookeeper-保姆级配置说明
  • http与https配置
  • 使用分流电阻器时的注意事项--PCB 设计对电阻温度系数的影响