DeepFM

news/2024/11/15 12:07:57/文章来源:https://www.cnblogs.com/EIPsilly/p/18423029

参考资料:

  • https://blog.csdn.net/u012328159/article/details/122938925
  • https://blog.csdn.net/u012328159/article/details/120684544?spm=1001.2014.3001.5501

DeepFM

FM部分

目前在模型层面做交叉特征的难点主要有以下两个方面:

  • 交叉特征的参数独立,强依赖于在样本中的共现信息,如果交叉特征值没有出现,那么参数无法学习。
  • 时间复杂度问题,直接做二阶交叉,时间复杂度为O(N^2),复杂度过高。

FM 则解决了上面两个问题,直接上 FM 的模型公式:

\[\hat{y}(x) = w_0 + \sum_{i=1}^nw_ix_i + \sum_{i=1}^n\sum_{j=i+1}^n<v_i, v_j>x_ix_j \tag{7} \]

其中 \(<\cdot,\cdot>\) 为两个 k 维的向量的点积,即数量积。 \(v_i\) 表示第 \(i\) 个特征的向量。

\[<v_i, v_j>=\sum_{f=1}^k v_{i,f} \cdot v_{j,f} \tag{8} \]

因此,公式(7)完整的为:

\[\hat{y}(x) = w_0 + \sum_{i=1}^nw_ix_i + \sum_{i=1}^n\sum_{j=i+1}^n\sum_{f=1}^kv_{i,f} \cdot v_{j,f} x_ix_j \tag{9} \]

因此,公式 (7) 这里实际可分为三部分,第一部分一个偏置单元 \(w_0\) ,一阶部分 \(\sum_{i=1}^nw_ix_i\) ,二阶部分

\[\sum_{i=1}^{n}\sum_{j=i+1}^n<v_i, v_j>x_ix_j \tag{10} \]

FM 这里巧妙的把公式 (2) 中的独立参数 \(w_{ij}\) 分解成了 \(<v_i,v_j>\) ,实际上是通过学习每一个特征对应的隐向量(现在大家熟知的 embedding 向量),这样就不再依赖于交叉特征 \(x_ix_j\) 的共现信息,因为即使 \(x_ix_j\) 没有共现,假如 \(x_ix_k\) 有共现,那么 \(x_i\) 对应的隐向量 \(v_i\) 依然能够得到训练。

那么问题来了,这种方法是 FM 独创的吗,答案是:NO。这种思想来源于一个古老且有效的方法矩阵分解 MF(matrix factorization),在推荐系统里,每个用户对每个物品的评分,可以构建出一个 user-item 矩阵,而矩阵分解的核心思想是用一个用户 embedding 矩阵和一个物品 embedding 矩阵的乘积来近似这个大矩阵,这两个 embedding 矩阵是可训练学习的。上一张图来形象的表示矩阵分解

img

到这里,可以看到 FM 解决了我们前面抛出的两个问题中的第一个问题(交叉特征参数独立,依赖于交叉特征的共现),下面来看看 FM 如何解决第二个问题(时间复杂度问题),再来看看公式(7)中的二阶部分,时间复杂度为 O ( N 2 ) O(N^2) O(N2),FM 把这部分做了个公式推导,把时间复杂度降到了 O ( K N ) O(KN) O(KN),下面来看看 FM 的推到过程:

\[\begin{aligned} \sum_{i=1}^{n}\sum_{j=i+1}^n<v_i, v_j>x_ix_j &= \frac{1}{2} [\sum_{i=1}^{n}\sum_{j=1}^n<v_i, v_j>x_ix_j - \sum_{i=1}^{n}<v_i, v_i>x_ix_i] \\ &= \frac{1}{2}(\sum_{i=1}^n\sum_{j=1}^n\sum_{f=1}^kv_{i,f} \cdot v_{j,f} x_ix_j - \sum_{i=1}^n\sum_{f=1}^kv_{i,f} \cdot v_{i,f} x_ix_i) \\ &=\frac{1}{2}\sum_{f=1}^k((\sum_{i=1}^nv_{i,f}x_i)(\sum_{j=1}^nv_{j,f}x_j) - \sum_{i=1}^nv_{i,f}^2x_i^2) \\ &=\frac{1}{2}\sum_{f=1}^k((\sum_{i=1}^n v_{i,f}x_i)^2 -\sum_{i=1}^nv_{i,f}^2x_i^2) \end{aligned} \tag{11} \]

关于上面这个公式,第一步到第二步,大家想象一个矩阵,行和列都是 \(x_1,....,x_n\) ,第一步为矩阵的上三角,所以等于全矩阵减去对角线,再折半,这样就比较好理解了。

tensorflow版本

网上实现的版本比较杂,挑了一个实现比较好的tensorflow版本DeepFM,参见:https://github.com/ChenglongChen/tensorflow-DeepFM,可以看看FM部分的实现。

# modelself.embeddings = tf.nn.embedding_lookup(self.weights["feature_embeddings"],self.feat_index)  # None * F * Kfeat_value = tf.reshape(self.feat_value, shape=[-1, self.field_size, 1])self.embeddings = tf.multiply(self.embeddings, feat_value)# ---------- first order term ----------self.y_first_order = tf.nn.embedding_lookup(self.weights["feature_bias"], self.feat_index) # None * F * 1self.y_first_order = tf.reduce_sum(tf.multiply(self.y_first_order, feat_value), 2)  # None * Fself.y_first_order = tf.nn.dropout(self.y_first_order, self.dropout_keep_fm[0]) # None * F# ---------- second order term ---------------# sum_square partself.summed_features_emb = tf.reduce_sum(self.embeddings, 1)  # None * Kself.summed_features_emb_square = tf.square(self.summed_features_emb)  # None * K# square_sum partself.squared_features_emb = tf.square(self.embeddings)self.squared_sum_features_emb = tf.reduce_sum(self.squared_features_emb, 1)  # None * K# second orderself.y_second_order = 0.5 * tf.subtract(self.summed_features_emb_square, self.squared_sum_features_emb)  # None * Kself.y_second_order = tf.nn.dropout(self.y_second_order, self.dropout_keep_fm[1])  # None * K

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/800643.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

米尔STM32MP2核心板首发新品上市!高性能+多接口+边缘算力

米尔发布基于STM32MP257设计的嵌入式处理器模块MYC-LD25X核心板及开发板。核心板基于STM32MP2系列是意法半导体推出最新一代工业级64位微处理器,采用LGA 252 PIN设计,存储配置1GB/2GB LPDDR4、8GB eMMC,具有丰富的通讯接口,适用于高端工业HMI、边缘计算网关、新能源充电桩、…

Fork+GIT操作

上传分支,在主干,上传完成代码之后,点击新建分支,去一个名字,如1.0.9,双击分支,点击“push”即可将主干所以代码上传到分支上备份一个 合并分支,,双击进入分支,选中要合并的部分,右键点击“Cherry-pick”,再次点击“Push”

影像测试技能

主要分三种职业:3A算法开发、图像tuning,图像测试这三种。 3a算法:AE/AWB/AF的开发,入门难一些,资料很少。 图像tuning:在理解3A算法的基础上,调试3A参数,当前需求量还是比较大的,学习起来也不太难,难在实践积累,多看多调。 1、 AWB auto white balance 自动白平衡 …

Camstar建模表格弹出编辑

大部分都是用行内编辑,但是如果由弹出编辑的需求,也需要了解下。 以工单建模为例子。自己搞个VP。Grid是MaterialList。 此时,表格并不具备,弹出编辑的能力。改下表格的属性,DataSubmissionMode=Changed 添加WebPart编辑框开始修改,每个属性控件的,属性!不然会报错!!…

在 ASP.NET Core Web API 中使用异常筛选器捕获和统一处理异常

异常筛选器可以捕获和处理 ASP.NET Core Web API 中发生的异常,当系统中出现未经处理的异常的时候,异常筛选器就会执行,我们可以在异常筛选器中对异常进行处理,例如记录日志、返回自定义错误信息等。前言 在 ASP.NET Core Web API 中,异常筛选器(Exception Filter)是一…

js实现网页端录音功能

1、代码 首先安装依赖包:recorderxnpm install recorderx -S<template><div class="container"><div class="mt-30"><el-button @click="onStartRecord">开始录音</el-button><el-button @click="onStop…

教你几招,轻松设置Win11右键恢复旧版模样

大家好!今天要教大家如何把 Win11 右键菜单变回完整的展开模式哦!其实很简单,只要在 Windows 开始图标下面的运行里输入一段代码就可以啦!接下来就让我来详细地跟大家分享一下这个方法吧!Win11右键菜单恢复为完整展开模式的方法1、首先,按键盘上的【 Win + X 】组合键,或…

第三周《密码系统设计》学习总结思维导图

marmaid代码为:graph LRA[密码系统设计第三周] --> B[《Windows C/C++ 加密解密实战》]B --> C[第四章]C --> T[4.2 加密基础]W --> U[CryptoAPI介绍]T --> V[加密概念]T --> X[加密类型]X --> d[对称加密]X --> e[非对称加密]T --> f[加密场景]C …

从虚拟到现实:数字孪生与数字样机的进化之路

​数字化技术高速发展的当下,计算机辅助技术已成为产品设计研发中不可或缺的一环,数字样机(Digital Prototype, DP)与数字孪生技术便是产品研发数字化的典型方法。本文将主要介绍数字样机与数字孪生在国内外的发展,并针对其技术痛点提出一种基于国产自研仿真工具进行虚拟模…

WPF 数据模板Data Template

数据模板 DataTemplate 控件模板决定了数据的展示形式和用户体检,在软件UI设计中非常重要。同样数据的展示形式越来越多样化,正所谓:横看成岭侧成峰,远近高低各不同。同样的数据内容,在DataGrid中的展示是文本的列表形式,在ComboBox中是下拉框的形式。给数据披上外衣,将…

性能测试之链接服务器实操

一、项目背景 因公司业务发展用户量增多,一些重要的接口请求也随着增多,导致接口响应变慢,需要优化接口的性能,所以团队里面就开始针对这些接口进行性能压力测试。二、前期准备工作 1、性能测试的服务器(不能在生产的机器上进行测试) 2、Jmeter压测工具三、操作流程 1、从…

记录一次fs配置导致串线的问题

概述 freeswitch是一款简单好用的VOIP开源软交换平台。 fs在实际的使用过程中也会经常碰到莫名其妙的问题,大部分都是配置问题。 环境 CentOS 7.9 freeswitch 1.10.7 docker 26.1.1 问题描述 组网方案如下。其中的fs-reg是注册服务器,fs1和fs2是业务媒体服务器,B1B2是俩个B路…