码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 推荐系统 | 基础推荐模型 | 特征交叉 | FM | FFM | PyTorch实现



    基础推荐模型——传送门:

    • 推荐系统 | 基础推荐模型 | 协同过滤 | UserCF与ItemCF的Python实现及优化
    • 推荐系统 | 基础推荐模型 | 矩阵分解模型 | 隐语义模型 | PyTorch实现
    • 推荐系统 | 基础推荐模型 | 逻辑回归模型 | LS-PLM | PyTorch实现
    • 推荐系统 | 基础推荐模型 | 特征交叉 | FM | FFM | PyTorch实现
    • 推荐系统 | 基础推荐模型 | GBDT+LR模型 | Python实现

    文章目录

      • 一、因子分解机
        • 1.POLY2——二项特征交叉
        • 2.FM 模型一一隐向量特征交叉
          • 2.1 数理推导
          • 2.2 模型比较
        • 3.FFM——引入特征域概念
        • 4.从POLY2到FFM的模型演变过程
      • 二、FM模型在criteo数据集上的实验
        • 1.数据集介绍
        • 2.PyTorch实现
          • 2.1 数据预处理
          • 2.2 数据加载
          • 2.3 模型搭建
          • 2.4 训练及预测
      • 三、FFM模型在criteo数据集上的实验
        • 1.数据集介绍
        • 2.PyTorch实现
          • 2.1 数据预处理
          • 2.2 数据加载
          • 2.3 模型搭建
          • 2.4 训练及预测

    一、因子分解机

      因子分解机在传统逻辑回归的基础上,加入了二阶部分,使模型具备了进行特征组合的能力 。更进一步,在因子分解机基础上发展出来的域感知因子分解机( Field-aware Factorization Machine, FFM) 则通过加入特征域的概念,进一步加强了因子分解机特征交叉的能力。
    在这里插入图片描述

    逻辑回归模型表达能力不强的问题,会不可避免地造成有效信息的损失,仅利用单特征而非交叉特征进行判断的情况下,有时不仅是信息损失的问题,甚至会得出错误的结论,比如:“辛普森悖论”。此时,就需要特征交叉。

    1.POLY2——二项特征交叉

      针对特征交叉的问题,算法工程师经常采用先手动组合特征,再通过各种分析手段筛选特征的方法,但该方法无疑是低效的。更遗憾的是,人类的经验往往有局限性,程序员的时间和精力也无法支撑其找到最优的特征组合。因此,采用POLY2 模型进行特征的"暴力"组合成了可行的选择。
      POLY2 模型的数学形式如下:
    ϕ P O L Y 2 ( w , x ) = ∑ j 1 = 1 n ∑ j 2 = j 1 + 1 n w h ( j 1 , j 2 ) x j 1 x j 2 \phi{POLY2}(w,x)=\sum_{j_1=1}^{n}\sum_{j_2=j_1+1}^{n}w_{h_(j_1,j_2)}x_{j_1}x_{j_2} ϕPOLY2(w,x)=j1​=1∑n​j2​=j1​+1∑n​wh(​j1​,j2​)​xj1​​xj2​​

    可以看到,该模型对所有特征进行了两两交叉(特征 x j 1 x j 2 x_{j_1}x_{j_2} xj1​​xj2​​),并对所有的特征组合赋予权重 w h ( j 1 , j 2 ) w_{h_(j_1,j_2)} wh(​j1​,j2​)​。POLY2 通过暴力组合特征的方式,在一定程度上解决了特征组合的问题。POLY2 模型本质上仍是线性模型,其训练方法与逻辑回归并无区别,因此便于工程上的兼容。
    POLY2 模型存在两个缺陷:

    1. 在处理互联网数据时,经常采用 one-hot 编码的方法处理类别型数据,致使特征向量极度稀疏, POLY2 进行无选择的特征交叉——原本就非常稀疏的特征向量更加稀疏,导致大部分交叉特征的权重缺乏有效的数据进行训练,无法收敛。
    2. 权重参数的数量由 n n n直接上升到 n 2 n^2 n2 ,极大地增加了训练复杂度。

    2.FM 模型一一隐向量特征交叉

      为了解决 POLY2 模型的缺陷,提出了FM模型。

    2.1 数理推导

      FM的原始模型方程为:
    y ^ ( x ) = w 0 + ∑ i = 1 n w i x i + ∑ i = 1 n ∑ j = i + 1 n < w i , w j > x i x j \hat{y}(x)=w_0+\sum_{i=1}^{n}w_ix_i+\sum_{i=1}^{n}\sum_{j=i+1}^{n}x_{i}x_{j} y^​(x)=w0​+i=1∑n​wi​xi​+i=1∑n​j=i+1∑n​<wi​,wj​>xi​xj​
    这个式子的前两项就是一个简单的线性函数。主要分析二阶部分。
      FM的二阶部分学习形式为:
    ϕ F M ( w , x ) = ∑ i = 1 n ∑ j = i + 1 n < w i , w j > x i x j \phi{FM(w,x)}=\sum_{i=1}^{n}\sum_{j=i+1}^{n}x_{i}x_{j} ϕFM(w,x)=i=1∑n​j=i+1∑n​<wi​,wj​>xi​xj​
    如果直接按照上面这个公式计算的话,复杂度就是 O ( n 2 ) O(n^2) O(n2)。可以对其进行化解,优化成复杂度为 O ( k n ) O(kn) O(kn)的线性复杂度,推导过程如下:
    ∑ i = 1 n ∑ j = i + 1 n < w i , w j > x i x j = 1 2 ∑ i = 1 n ∑ j = 1 n < w i , w j > x i x j − 1 2 ∑ i = 1 n < w i , w i > x i x i = 1 2 ( ∑ i = 1 n ∑ j = 1 n ∑ f = 1 k w i f w j f x i x j − ∑ i = 1 n ∑ f = 1 k w i f , w i f x i x i ) = 1 2 ∑ f = 1 k [ ( ∑ i = 1 n w i f x i ) ( ∑ j = 1 n w j f x j ) − ∑ i = 1 n w i f 2 x i 2 ] = 1 2 ∑ f = 1 k [ ( ∑ i = 1 n w i f x i ) 2 − ∑ i = 1 n w i f 2 x i 2 ] \sum_{i=1}^{n}\sum_{j=i+1}^{n}x_{i}x_{j}\\=\frac{1}{2}\sum_{i=1}^{n}\sum_{j=1}^{n}x_{i}x_{j}-\frac{1}{2}\sum_{i=1}^{n}x_{i}x_{i}\\=\frac{1}{2}(\sum_{i=1}^{n}\sum_{j=1}^{n}\sum_{f=1}^{k}w_{if}w_{jf}x_{i}x_{j}-\sum_{i=1}^{n}\sum_{f=1}^{k}w_{if},w_{if}x_{i}x_{i})\\=\frac{1}{2}\sum_{f=1}^{k}[(\sum_{i=1}^{n}w_{if}x_i)(\sum_{j=1}^{n}w_{jf}x_j)-\sum_{i=1}^{n}w_{if}^{2}x_{i}^{2}]\\=\frac{1}{2}\sum_{f=1}^{k}[(\sum_{i=1}^{n}w_{if}x_i)^2-\sum_{i=1}^{n}w_{if}^{2}x_{i}^{2}] i=1∑n​j=i+1∑n​<wi​,wj​>xi​xj​=21​i=1∑n​j=1∑n​<wi​,wj​>xi​xj​−21​i=1∑n​<wi​

  • 相关阅读:
    【数据结构】线性表(三)循环链表的各种操作(创建、插入、查找、删除、修改、遍历打印、释放内存空间)
    JAVA多线程基础篇--守护线程(Daemon Thread)
    读HDF5格式的文件
    Presto 之 explain and explain analyze的实现
    多目标鳟海鞘算法(Multi-objective Salp Swarm Algorithm,MSSA)求解微电网优化MATLAB
    使用密集预测变压器的图像语义分割--附源码下载
    vue中websocket使用(客户端)
    swagger-03-文档注释使用
    【深度学习】——损失函数(均方差损失和交叉熵损失)
    清华计算几何大作业(十):CG2017 PA5-2 FruitNinja(水果忍者)· 上
  • 原文地址:https://blog.csdn.net/liujiesxs/article/details/126540769
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号