深度推荐模型之DeepFM

2024-01-28 10:12
文章标签 推荐 深度 模型 deepfm

本文主要是介绍深度推荐模型之DeepFM,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、FM

背景:主要解决大规模稀疏数据下的特征组合遇到的问题:1. 二阶特征参数数据呈指数增长
怎么做的:对每个特征引入大小为k的隐向量,两两特征的权重值通过计算对应特征的隐向量内积
在这里插入图片描述

而特征之间计算点积的复杂度原本为
实际应用:在推荐场景中,用户特征和物品特征可以相互组合,例如用户性别男经过onehot编码之后为[0,1],物品颜色蓝色经过onehot编码之后为[1,0],那么组合特征[用户性别=男,物品颜色=蓝]可能会很有用。此时可以用FM模型,对用户性别和物品颜色特征进行组合。

二、wide & deep

https://arxiv.org/abs/1606.07792 2016年
参考:https://blog.csdn.net/google19890102/article/details/78171283
核心思想是结合线性模型的记忆能力和DNN模型的泛化能力,从而提升整体模型性能。
wide 模型:可用线性模型如LR模型,起记忆作用,即从历史数据中发现特征之间的相关性。缺点:1.需要更多人工设计;2.可能出现过拟合;3.无法捕捉训练数据中未曾出现过的特征对。
deep模型:深度学习模型,起泛化作用,即相关性的传递,发现在历史数据中很少或者没有出现过的特征组合,寻找用户的新偏好。当user-item矩阵比较稀疏时,模型会过分泛化,即使部分user-item应该是没有关联的,但模型仍旧可以得到user-item的非零预测,导致推荐并不相关的物品,这时准确性不能得到保证。
将这两个模型结合起来可以更好地在用户的历史兴趣和探索新的兴趣点之间做到平衡。
模型结构:
在这里插入图片描述

特征处理:以文章中的场景用户app推荐为例,每一条训练数据的特征包括用户数据和曝光数据,label是用户是否下载。
wide的输入:离散特征以及离散特征之间的组合特征。
deep的输入:1. 连续特征,通过归一化到区间[0,1]后直接输入到DNN中;2.类别特征,通过词典映射成32维稠密向量,词典根据模型训练调整参数。
wide & deep联合训练,输出通过加权方式合并到一起,通过sigmoid激活函数输出。
wide部分对deep模型进行记忆能力的补充,因此小规模的交叉特征即可。

三、DeepFM

https://arxiv.org/pdf/1703.04247.pdf 2017年
在这里插入图片描述

将Deep和FM相结合。FM做特征见低阶组合,Deep部分做特征间高阶组合。
DeepFM相对于wide & deep的改进就是将wide人工建立交叉特征变为自动获取交叉特征权重,并且FM和Deep模块共享feature embedding的部分,可以更快的训练。
连续变量可以直接作为单个值输入,或者离散化作为一个向量输入。标准代码中是将它直接作为DNN的输入。

以“看点日报”优化算法为例:
输入分为如下4组:

  1. 连续型特征:这部分特征的典型代表为文章CTR,文章点赞数,评论数等。
  2. 单值离散特征,这部分将进行embedding操作,典型代表为文章分类信息,用户收入等级,学历等级等。
  3. 多值离散特征:这部分将进行加权embedding操作,典型代表为用户画像信息,假设用户有多个分类的兴趣爱好,如动漫与娱乐,在lookup table中其向量分别为v33与v3,其中动漫点击10次,娱乐点击2次,那么最终以点击加权的embedding特征为(10/12)v33+(2/12)v3
  4. 向量特征:通过PCA等手段将向量特征进行维度变换后作为embedding输入模型,典型代表为文章的TFIDF向量,用户预训练向量等。
    优化后的DeepFM主要由三部分组成,分别为
  5. FM部分:该部分接受全部的embedding特征,进行二交叉,输出结果至concat层
  6. Deep部分:该部分接受全部的embedding展开特征与连续特征,经过多层的全连接网络,输出结果至concat层
  7. Wide部分:该部分接受离散特征进行LR,将最终结果输出concat层

推荐领域中的向量召回之双塔DSSM
Deep Structured Semantic Models
LSA 潜在语义分析
分布式假设:一个单词的属性是由它所处的环境刻画的。如果两个单词在含义上比较接近,那么他们也会出现在相似的文本中,也就是说具有相似的上下文。
构建一个“单词-文档”矩阵:矩阵的每一行表示一个单词,矩阵的每一列表示一个文章,第i行第j列的值表示第i个单词在第j个段落里面出现了几次或者表示该单词的tf-idf值。
将这个矩阵基于奇艺值分解SVD:
优点:对文本特征维度降低到一个低维语义空间,减轻一词多义和一义多词问题。
缺点:无监督模型,没有利用点击信息。

DSSM 2013年

在这里插入图片描述

总体分为三层结构:输入层、表示层和匹配层。
输入层:将文本映射到低维向量空间转化成向量提供给深度学习网络。主要的技术点是Word Hashing。方法:将每个单词word表示成n-gram形式,例如将每个单词写成trigram的形式:good -> “#go”,“goo”,“ood”,“od#”。这样原本500K的vocab_size能够简化为30k的Token size。
表示层:即图中的Multi-layer nonlinear projection 和 semantic feature。
匹配层:即图中计算query和
训练方法:选择query和文档集合D,其中
应用时可以离线计算item/doc/广告的embedding,线上计算query/user的embedding,线上计算相关性。
优点:

  • 有监督,使用最大似然函数进行优化
  • 使用word-hashing方法解决大规模且稀疏的词典问题
  • 将用户的Query行为和Document映射到同一语义空间中,通过余弦相似度计算相关性。
    缺点:
  • word hash可能造成词语冲突;
  • 因为表示层用的是词袋模型BOW,不考虑词序信息,损失了上下文语序信息
  • 仅用点击来判断正负样本,没有考虑到position偏差,产生的噪声较大
    因为cos的表达是有限的,很难提取交叉特征,所以双塔还是比较适用于召回场景。
    DSSM双塔由很多种变形,例如CNN-DSSM、LSTM-DSSM,sentence BERT,其本质只在于所使用的特征抽取器的不同。

这篇关于深度推荐模型之DeepFM的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/653331

相关文章

Spring Boot spring-boot-maven-plugin 参数配置详解(最新推荐)

《SpringBootspring-boot-maven-plugin参数配置详解(最新推荐)》文章介绍了SpringBootMaven插件的5个核心目标(repackage、run、start... 目录一 spring-boot-maven-plugin 插件的5个Goals二 应用场景1 重新打包应用

Knife4j+Axios+Redis前后端分离架构下的 API 管理与会话方案(最新推荐)

《Knife4j+Axios+Redis前后端分离架构下的API管理与会话方案(最新推荐)》本文主要介绍了Swagger与Knife4j的配置要点、前后端对接方法以及分布式Session实现原理,... 目录一、Swagger 与 Knife4j 的深度理解及配置要点Knife4j 配置关键要点1.Spri

Qt QCustomPlot库简介(最新推荐)

《QtQCustomPlot库简介(最新推荐)》QCustomPlot是一款基于Qt的高性能C++绘图库,专为二维数据可视化设计,它具有轻量级、实时处理百万级数据和多图层支持等特点,适用于科学计算、... 目录核心特性概览核心组件解析1.绘图核心 (QCustomPlot类)2.数据容器 (QCPDataC

Java内存分配与JVM参数详解(推荐)

《Java内存分配与JVM参数详解(推荐)》本文详解JVM内存结构与参数调整,涵盖堆分代、元空间、GC选择及优化策略,帮助开发者提升性能、避免内存泄漏,本文给大家介绍Java内存分配与JVM参数详解,... 目录引言JVM内存结构JVM参数概述堆内存分配年轻代与老年代调整堆内存大小调整年轻代与老年代比例元空

深度解析Java DTO(最新推荐)

《深度解析JavaDTO(最新推荐)》DTO(DataTransferObject)是一种用于在不同层(如Controller层、Service层)之间传输数据的对象设计模式,其核心目的是封装数据,... 目录一、什么是DTO?DTO的核心特点:二、为什么需要DTO?(对比Entity)三、实际应用场景解析

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

Go语言中nil判断的注意事项(最新推荐)

《Go语言中nil判断的注意事项(最新推荐)》本文给大家介绍Go语言中nil判断的注意事项,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.接口变量的特殊行为2.nil的合法类型3.nil值的实用行为4.自定义类型与nil5.反射判断nil6.函数返回的

深度解析Python装饰器常见用法与进阶技巧

《深度解析Python装饰器常见用法与进阶技巧》Python装饰器(Decorator)是提升代码可读性与复用性的强大工具,本文将深入解析Python装饰器的原理,常见用法,进阶技巧与最佳实践,希望可... 目录装饰器的基本原理函数装饰器的常见用法带参数的装饰器类装饰器与方法装饰器装饰器的嵌套与组合进阶技巧

深度解析Spring Boot拦截器Interceptor与过滤器Filter的区别与实战指南

《深度解析SpringBoot拦截器Interceptor与过滤器Filter的区别与实战指南》本文深度解析SpringBoot中拦截器与过滤器的区别,涵盖执行顺序、依赖关系、异常处理等核心差异,并... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现

深度解析Spring AOP @Aspect 原理、实战与最佳实践教程

《深度解析SpringAOP@Aspect原理、实战与最佳实践教程》文章系统讲解了SpringAOP核心概念、实现方式及原理,涵盖横切关注点分离、代理机制(JDK/CGLIB)、切入点类型、性能... 目录1. @ASPect 核心概念1.1 AOP 编程范式1.2 @Aspect 关键特性2. 完整代码实