neural collaborative filtering 阅读笔记

news2024/10/7 18:20:07

本文主要介绍了一种一种基于神经网络的技术,来解决在含有隐形反馈的基础上进行推荐的关键问题————协同过滤。

2.1 Learning from Implicit Data

y u i = 1 , ( i f i n t e r a c t i o n ( u s e r u , i t e m i ) i s o b s e r v e d ) y_{ui} = 1,(if interaction (user u, item i) is observed) yui=1,(ifinteraction(useru,itemi)isobserved)
y u i = 0 , o t h e r w i s e y_{ui} = 0,otherwise yui=0,otherwise

值为1并不代表用户u对i感兴趣,同样,为0也不代表用户u对i不感兴趣,且作为缺失数据处理

2.2 Matrix Factorization

https://blog.csdn.net/SGDBS233/article/details/125838049

内积函数的缺陷

在这里插入图片描述

在这里插入图片描述
两行数据的相似度相似度可以用向量的内积来计算
我们计算前三行数据,可以得到 s 32 > s 12 > s 13 s_{32}>s_{12}>s_{13} s32>s12>s13,所以可以绘制出如 b b b图的形式
但是如果我们计算 s 4 s_4 s4,可得 s 41 > s 43 > s 42 s_{41}>s_{43}>s_{42} s41>s43>s42,会向量 p 4 p_4 p4发现不管怎么放,都无法同时满足这个要求,从而导致误差排名加大。

3. NEURAL COLLABORATIVE FILTERING

3.1 General Framework通用框架

在这里插入图片描述

  • 将user和item转化为one-hot编码作为Input Layer的输入。
  • Embedding Layer是一个全连接层。
  • NCF层被称作为神经协作过滤层,它将预测分数。

总体模型如下:
y ^ u i = f ( P T v u U , Q T v i I ∣ P , Q , Θ f ) \hat{y}_{ui}=f(P^Tv_u^U,Q^Tv_i^I|P,Q,\Theta_f) y^ui=f(PTvuU,QTviIP,Q,Θf)
其中 P , Q P,Q P,Q分别表示用户和项目的潜在因素矩阵, , Θ f ,\Theta_f ,Θf表示模型 f f f的参数。

3.1.1 NCF的学习 Learning NCF

为了学习模型参数,现有的pointwise方法大多使用了平方损失的回归。

考虑到隐性反馈的一类性质,我们可以将 y u i y_{ui} yui的值作为一个标签,1表示项目i 和用户u相关,否则为0。这样 y ^ u i \hat{y}_{ui} y^ui就是一个概率,所以我们可以用似然函数来定义误差:

  p ( y , y − ∣ P , Q , Θ f ) = Π ( u , i ) ∈ y y ^ u i Π ( u , i ) ∈ y − ( 1 − y ^ u i ) \ p(y,y^-|P,Q,\Theta_f)=\mathop{\Pi}\limits_{(u,i)\in y} \hat{y}_{ui}\mathop{\Pi}\limits_{(u,i)\in y^-}(1-\hat{y}_{ui})  p(y,yP,Q,Θf)=(u,i)yΠy^ui(u,i)yΠ(1y^ui)
取对数:
L = − ∑ ( u , i ) ∈ y ∪ y − y u i log ⁡ y ^ u i + ( 1 − y u i ) log ⁡ ( 1 − y ^ u i ) L=-\sum\limits_{(u,i)\in y\cup y^-}y_{ui}\log\hat{y}_{ui}+(1-y_{ui})\log(1-\hat{y}_{ui}) L=(u,i)yyyuilogy^ui+(1yui)log(1y^ui)

这是NCF方法需要去最小化的目标函数,并且可以通过使用随机梯度下降(SGD)来进行训练优化。

3.2 广义矩阵分解 Generalized Matrix Factorization (GMF)

输入层是一个one-hot编码,所以用 P T v u U P^Tv_u^U PTvuU表示用户的潜在向量 p u p_u pu, Q T v i I Q^Tv_i^I QTviI表示项目潜在向量 q i q_i qi
那么第一层CF层映射函数为
ϕ ( p u , q i ) = p u ⊙ q i \phi(p_u,q_i)=p_u\odot q_i ϕ(pu,qi)=puqi
其中 ⊙ \odot 表示向量逐元素累乘。
然后映射到输出层
y ^ u i = a o u t ( h T ( p u ⊙ q i ) ) \hat{y}_{ui}=a_{out}(h^T(p_u\odot q_i)) y^ui=aout(hT(puqi))
其中 a o u t a_{out} aout为激活函数,非线性情况下一般为 σ ( x ) = 1 1 + e − x \sigma(x)=\frac{1}{1+e^{-x}} σ(x)=1+ex1 h h h为连接权,通过loss function来学习它。

3.3 多层感知机 Multi-Layer Perceptron (MLP)

简单地对向量的连接不足以说明用户和项目之间的潜在特征,这对协同过滤建模来说是不够的。为了解决这个问题,我们提出在向量连接上增加隐藏层,使用标准的MLP(多层感知机)学习用户和项目潜在特征之间的相互作用。
即假设一共有 L L L
z 1 = ϕ 1 ( p u , q i ) z_1=\phi_1(p_u,q_i) z1=ϕ1(pu,qi)
ϕ 2 ( z 1 ) = a 2 ( W 2 T z 1 + b 2 ) \phi_2(z1)=a_2(W_2^Tz_1+b_2) ϕ2(z1)=a2(W2Tz1+b2)
. . . ... ...
ϕ L ( z L − 1 ) = a L ( W L T z L − 1 + b L ) \phi_L(z_{L-1})=a_L(W_L^Tz_{L-1}+b_L) ϕL(zL1)=aL(WLTzL1+bL)
y ^ u i = σ ( h T ϕ L ( z L − 1 ) ) \hat{y}_{ui}=\sigma(h^T\phi_L(z_{L-1})) y^ui=σ(hTϕL(zL1))
对于激活函数 a x a_x ax,文章表示使用ReLu效果最好。

结合GMF和MLP Fusion of GMF and MLP

在这里插入图片描述
一个直接的解决方法是让GMF和MLP共享相同的嵌入层(Embedding Layer),然后再结合它们分别对相互作用的函数输出,然而,共享GMF和MLP的嵌入层可能会限制融合模型的性能。例如,GMF和MLP必须使用的大小相同的嵌入;对于数据集,两个模型的最佳嵌入尺寸差异很大,使得这种解决方案可能无法获得最佳的组合。

所以我们让GMF和MLP学习独立的嵌入,并结合两种模型通过连接他们最后的隐层输出。
ϕ G M F = P u G ⊙ q i G \phi^{GMF}=P_u^G\odot q_i^G ϕGMF=PuGqiG
ϕ M L P = σ ( h T ϕ L ( z L − 1 ) ) \phi^{MLP}=\sigma(h^T\phi_L(z_{L-1})) ϕMLP=σ(hTϕL(zL1))
y ^ u i = σ ( h T ( ϕ G M F ⊙ ϕ M L P ) ) \hat{y}_{ui}=\sigma(h^T(\phi^{GMF}\odot\phi^{MLP})) y^ui=σ(hT(ϕGMFϕMLP))

参考文章

https://blog.csdn.net/qq_44015059/article/details/107441512

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

还在为ElementUI的原生校验方式苦恼吗,快用享受element-ui-verify插件的快乐吧(待续)

element-ui-verify 本文章意在介绍element-ui-verify插件使用&#xff0c;以及对比elementUI原生校验方式&#xff0c;突显该插件用少量代码也能实现原生的校验效果甚至更好。 1.先观察一个示例 <template><d2-container><el-form :model"ruleForm&qu…

二叉树超级经典OJ题

目录1.根据二叉树创建字符串2.二叉树的层序遍历3.二叉树的层序遍历II4.二叉树的最近公共祖先5.二叉搜索树与双向链表6.从前序与中序遍历序列构造二叉树1.根据二叉树创建字符串 根据二叉树创建字符串 给你二叉树的根节点root&#xff0c;请你采用前序遍历的方式&#xff0c;将二…

编码器M法测速仿真(Simulink)

编码器M法和T法测速的详细讲解可以参看下面的文章链接,这里不再赘述,这里主要介绍Simulink里建模仿真,带大家从另一个角度理解编码器测速原理。 PLC通过编码器反馈值计算速度的推荐做法(算法解析+ST代码)_RXXW_Dor的博客-CSDN博客_编码器计算速度程序实例PLC如何测量采集编…

Power BI中类似Vlookup的查询筛选功能如何实现

一、问题描述 在Excel中有一个非常经典的函数Vlookup&#xff0c;可以通过首列查找&#xff0c;返回相对应的其他列的值。这种功能&#xff0c;在Power BI中没有Vlookup函数&#xff0c;那么该如何实现这一功能呢&#xff1f;下面通过一个实例做分析演示。 二、数据源 已知某…

厚积薄发打卡Day114:Debug设计模式:设计原则(二)<接口隔离原则、迪米特法则>

厚积薄发打卡Day114&#xff1a;Debug设计模式&#xff1a;设计原则&#xff08;二&#xff09;<接口隔离原则、迪米特法则> 接口隔离原则 定义 用多个专门的接口&#xff0c;而不使用单一的总接口&#xff0c;客户端不应该依赖它不需要的接口 一个类对一个类的依赖应…

如何将 Spring Boot 项目提交到 Gitee 进行远程管理?

如何将初始化完成的 Spring Boot 项目&#xff0c;提交的 Gitee 仓库&#xff0c;进行远程管理&#xff1f; 目录 如何将初始化完成的Spring Boot项目&#xff0c;提交的Gitee仓库&#xff0c;进行远程管理&#xff1f; 0. 环境说明 1.创建并初始化Spring Boot项目 2.创建…

如何设计一个 70w 在线人数的弹幕系统 ?

背景 现在的抖音、快手等一系列能支持直播的软件如何做到的同一时间万人发弹幕的功能的&#xff1f; 问题分析 带宽压力&#xff1b; 弱网导致的弹幕卡顿、丢失&#xff1b; 性能与可靠性。 带宽优化 启用Http压缩 HTTP压缩是指在Web服务器和浏览器间传输压缩文本内容的方…

网络— — 二层交换机

网络— — 二层交换机 1 交换机端口 g0/3 g&#xff1a;1000M/s0&#xff1a;模块号3&#xff1a;接口号 每个端口网速&#xff1a; Ethernet 10M/s FastEthernet 100M/s GigabitEthernet 1000M/s TenGigabitEthernet 10000Mb/s 2 数据链路层&#xff08;2层&#xff09; Data…

python图像处理(opencv入门)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 前面我们讨论了fpga的基本操作,这些都是作为整个图像处理的基础部分进行学习的,本质上还是希望用fpga来对部分算法进行加速处理。当然,fpga实现的只是一部分算法,并不是所有的算…

【手写 Promise 源码】第二篇 - Promise 功能介绍与特性分析

一&#xff0c;前言 上一篇&#xff0c;对 Promise 进行了简单介绍&#xff0c;主要涉及以下几个点&#xff1a; Promise 简介和基本使用&#xff1b;Promise 和 callback 对比&#xff1b;Promise 的重要性和作用&#xff1b;Promise 使用场景&#xff1a;Promisify 封装&am…

Python Flask 框架设置响应头,一篇文章学明白

flask 响应头设置&#x1f4d6; 导读&#x1f4d6; Python Flask 设置响应头&#x1f389; response.headers 属性&#x1f389; flask.abort() 函数返回特定状态码&#x1f4d6; Flask 中可设置的响应头参数&#x1f4d6; 其他关于响应头的配置&#x1f381; 使用中间件&#…

[Python]调用pytdx的代码示例

安装pytdxpip install pytdx简单示范from pytdx.hq import TdxHq_API api TdxHq_API() # 数据获取接口一般返回list结构&#xff0c; with api.connect(119.147.212.81, 7709): # 返回普通listdata api.get_security_bars(9, 0, 000001, 0, 10) print(data)输出结果[Ordered…

康巴丝(compas)某Wi-Fi万年历无法自动校时的问题

笔者前两年购买过一块康巴丝牌的电子万年历&#xff0c;该万年历的最大特点可以通过Wi-Fi联网自动校时。 后来的某一天&#xff0c;笔者将原来的H3C AP&#xff08;11AC&#xff09;升级为锐捷AP&#xff08;11AX&#xff09;。 在之后的几个月中&#xff0c;发现这块电子万年…

Linux常用命令——setsebool命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) setsebool 修改SElinux策略内各项规则的布尔值 补充说明 setsebool命令是用来修改SElinux策略内各项规则的布尔值。setsebool命令和getsebool命令是SELinux修改和查询布尔值的一套工具组。SELinux的策略与规则…

【云原生】Prometheus 监控系统的初步了解与系统搭建

内容预知 前言 1. Prometheus的相关知识 1.1 Prometheus的认识与了解 1.2 Prometheus的特点 1.3 Prometheus存储引擎TSDB 的特点优势 1.4 Prometheus 的生态组件 &#xff08;1&#xff09;Prometheus server &#xff08;2&#xff09;Client Library &#xff08;3&a…

主流的操作系统(带你快速了解)

&#x1f4dc; “作者 久绊A” 专注记录自己所整理的Java、web、sql等&#xff0c;IT技术干货、学习经验、面试资料、刷题记录&#xff0c;以及遇到的问题和解决方案&#xff0c;记录自己成长的点滴。 &#x1f341; 操作系统【带你快速了解】对于电脑来说&#xff0c;如果说…

如何安装双系统与多系统(带你快速了解)

&#x1f4dc; “作者 久绊A” 专注记录自己所整理的Java、web、sql等&#xff0c;IT技术干货、学习经验、面试资料、刷题记录&#xff0c;以及遇到的问题和解决方案&#xff0c;记录自己成长的点滴。 &#x1f341; 操作系统【带你快速了解】对于电脑来说&#xff0c;如果说…

开放式基金净值历史数据 API 数据接口

开放式基金净值历史数据 API 数据接口 实时净值&#xff0c;历史数据&#xff0c;多维度指数参数。 1. 产品功能 支持所有开放式基金净值历史数据查询&#xff1b;可定义查询指标与时间范围&#xff1b;支持所有开放式基金净值历史数据查询&#xff1b;不同的输入指标返回不同…

java-List

java-List1. 预备知识-泛型(Generic)1.1 泛型的引入1.2 泛型的分类1.3 泛型类的定义的简单演示1.4 泛型背后作用时期和背后的简单原理1.5 泛型类的使用1.6 泛型总结2. 预备知识-包装类(Wrapper Class)2.1 基本数据类型和包装类直接的对应关系2.2 包装类的使用&#xff0c;装箱(…

Windows压缩工具 “ Bandizip与7-zip ”(带你快速了解)

&#x1f4dc; “作者 久绊A” 专注记录自己所整理的Java、web、sql等&#xff0c;IT技术干货、学习经验、面试资料、刷题记录&#xff0c;以及遇到的问题和解决方案&#xff0c;记录自己成长的点滴。 &#x1f341; 操作系统【带你快速了解】对于电脑来说&#xff0c;如果说…