【推荐系统】NCF神经协同过滤

NCF框架

NCF框架是本文要实现的3个模型的主体结构。

首先是输入层,分别包含两个特征向量 v u v_u vu v i v_i vi,描述了用户u和物品i。输入仅由一个用户向量和一个物品向量构成,它们分别是以one-hot编码的二值化稀疏向量。

接着是Embedding层,这是一个全连接层,用于将输入层的系数向量表示成一个稠密向量。

接着用户和物品的embedding向量被送入多层神经网络架结构中,这一层叫做神经协同过滤层(Neural CF Layer),它用于将潜在特征向量映射成预测分数(Score)。

在这里插入图片描述

class NCF(object):def __init__(self, config, latent_dim_gmf=8, latent_dim_mlp=8):self._config = configself._num_users = config['num_users']self._num_items = config['num_items']self._latent_dim_gmf = latent_dim_gmfself._latent_dim_mlp = latent_dim_mlpself._embedding_user_mlp =  torch.nn.Embedding(num_embeddings=self._num_users,embedding_dim=self._latent_dim_mlp)self._embedding_item_mlp =  torch.nn.Embedding(num_embeddings=self._num_items,embedding_dim=self._latent_dim_mlp)# 建立GMP模型的user Embedding层和item Embedding层,输入的向量长度分别为用户的数量,item的数量,输出都是隐式空间的维度latent dimself._embedding_user_gmf = torch.nn.Embedding(num_embeddings=self._num_users, embedding_dim=self._latent_dim_gmf)self._embedding_item_gmf = torch.nn.Embedding(num_embeddings=self._num_items, embedding_dim=self._latent_dim_gmf)# 全连接层self._fc_layers = torch.nn.ModuleList()for idx, (in_size, out_size) in enumerate(zip(config['layers'][:-1], config['layers'][1:])):self._fc_layers.append(torch.nn.Linear(in_size, out_size))# 激活函数self._logistic = nn.Sigmoid()@propertydef fc_layers(self):return self._fc_layers@propertydef embedding_user_gmf(self):return self._embedding_user_gmf@propertydef embedding_item_gmf(self):return self._embedding_item_gmf@propertydef embedding_user_mlp(self):return self._embedding_user_mlp@propertydef embedding_item_mlp(self):return self._embedding_item_mlpdef saveModel(self):torch.save(self.state_dict(), self._config['model_name'])@abstractmethoddef load_preTrained_weights(self):pass

GMF模型(广义矩阵分解)

p u p_u pu为用户u的潜在向量,$q_i为物品i的潜在向量。
则,神经协同网络的第一层映射函数为:
ϕ 1 ( p u , q i ) = p u ⊙ q i \phi_1(p_u,q_i) = p_u \odot q_i ϕ1(pu,qi)=puqi
然后将此向量映射到输出层:
y ^ u , i = a o u t ( h T ( p u ⊙ q i ) ) \hat{y} _{u,i} =a_{out}(h^T( p_u \odot q_i)) y^u,i=aout(hT(puqi))
如果把 a o u t a_{out} aout看作恒等函数, h h h全为1的单位向量,就变成了MF模型。

在这里插入图片描述

class GMF(NCF,nn.Module):def __init__(self, config, latent_dim_gmf):nn.Module.__init__(self)NCF.__init__(self, config = config, latent_dim_gmf=latent_dim_gmf)# 创建线性模型,输入:潜在特征向量, 输出:len =1self._affine_output = nn.Linear(in_features=self.latent_dim_gmf, out_features=1)@propertydef affine_output(self):return self._affine_outputdef forward(self, user_indices, item_indices):user_embedding = self._embedding_user_gmf(user_indices)item_embedding = self._embedding_item_gmf(item_indices)# 将user_embedding和user_embedding进行逐元素相乘element_product = torch.mul(user_embedding, item_embedding)# 通过s神经元logits = self._affine_output(element_product)rating = self._logistic(logits)def load_preTrained_weights(self):pass

MLP模型

简单的结合是不足以说明用户和物品之间的潜在特征。为了解决这个问题,我们需要向量连接的基础上增加隐藏层,可以使用标准的MLP来学习用户和物品潜在特征之间的相互作用。

在经过Embedding层后,将得到的用户和物品的潜在向量做连接(concatenation),即:
z 1 = ϕ 1 ( p u , q i ) = [ p u q i ] z_1 = \phi_1(p_u, q_i) = \begin{bmatrix} p_u \\ q_i \end{bmatrix} z1=ϕ1(pu,qi)=[puqi]
接着将模型通过一层层感知层,激活函数选择ReLU函数。
ϕ 2 ( z 1 ) = a 2 ( W 2 T z 1 + b 2 ) \phi_2(z_1) = a_2(W_2^{T}z_1 + b_2) ϕ2(z1)=a2(W2Tz1+b2)
以此类推。
到最后:
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))

在这里插入图片描述

class MLP(NCF, nn.Module):def __init__(self, config, latent_dim_mlp):nn.Module.__init__(self)NCF.__init__(self, config = config, latent_dim_mlp= latent_dim_mlp)self._affine_output = torch.nn.Linear(in_features=config['layers'][-1], out_features=1)@propertydef affine_output(self):return self._affine_outputdef forward(self, user_indices, item_indices):user_embedding = self._embedding_user_mlp(user_indices)item_embedding = self._embedding_item_mlp(item_indices)# 把潜在向量进行连接vector = torch.cat([user_embedding, item_embedding],dim=-1)for idx, _ in enumerate(range(len(self._fc_layers))):vector = self._fc_layers[idx](vector)vector = torch.nn.ReLU()(vector)logits = self._affine_output(vector)rating = self._logistic(logits)return ratingdef load_preTrained_weights(self):config = self._configgmf_model = GMF(config, config['latent_dim_gmf'])if config['use_cuda'] is True:gmf_model.cuda()# 加载GMF模型参数到指定的GPU上state_dict = torch.load(self._config['pretrain_gmf'])#map_location=lambda storage, loc: storage.cuda(device=self._config['device_id']))#map_location = {'cuda:0': 'cpu'})gmf_model.load_state_dict(state_dict, strict=False)self._embedding_item_mlp.weight.data = gmf_model.embedding_item_gmf.weight.dataself._embedding_user_mlp.weight.data = gmf_model.embedding_user_gmf.weight.data

NeuMF模型

GMF应用了线性内核来模拟潜在的特征交互;MLP使用了非线性内核从数据中学习潜在特征,那么自然而然地想到,我们可以将这两个模型融合在NCF框架下。
为了使得融合模型具有更大的灵活性,我们允许GMF和MLP学习独立的Embedding,并结合两种模型的最后的输出。

对左边的GMF模型:
ϕ G M F = p u G ⊙ q i G \phi^{GMF} = p_u^G \odot q_i^G ϕGMF=puGqiG
即 GMF模型的用户潜在向量和物品潜在向量做内积

对右边的MLP模型:
ϕ M L P = a L ( W L T ( a L − 1 ( . . . a 2 ( W 2 T [ p u M q i M ] + b 2 ) . . . ) ) + b L ) \phi^{MLP} = a_L(W_L^T(a_{L-1}(...a_2(W_2^T\begin{bmatrix} p_u^M \\ q_i^M \end{bmatrix} + b_2)...)) + b_L) ϕMLP=aL(WLT(aL1(...a2(W2T[puMqiM]+b2)...))+bL)

综合MLP和GMF模型得到:
y ^ u i = σ ( h T [ ϕ G M F ϕ M L P ] ) \hat{y}_{ui} = \sigma(h^T \begin{bmatrix} \phi^{GMF} \\ \phi^{MLP} \end{bmatrix} ) y^ui=σ(hT[ϕGMFϕMLP])

在这里插入图片描述

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

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

相关文章

RocketMQ学习

1.下载安装jdk1.8和rocketmq 下载linux 64位 jdk1.8(自行百度资源) 下载 | RocketMQ (apache.org) ## 解压 tar -zxvf jdk-8u144-linux-x64.tar.gz ## 删除安装包 rm -rf jdk-8u144-linux-x64.tar.gz ##安装jdk环境变量自行百度 解压rocketmq二进制包 ## 解压 unzip rocket…

IT系统可观测性

什么是可观测性 可观测性(Observability)是指能够从系统的外部输出推断出系统内部状态的能力。在IT和云计算领域,它涉及使用软件工具和实践来收集、关联和分析分布式应用程序以及运行这些应用程序的硬件和网络产生的性能数据流。这样做可以更…

达梦如何备份以及导入

启动达梦服务 右键选择管理服务器 点击系统管理,点击配置,点击转换 归档配置点击归档 创建文件夹,选择文件夹目录点击确定 命令方式 逻辑备份与还原 逻辑导出(dexp)和逻辑导入(dimp)支持如下四种级别操作: 数据库级(FULL)&#…

【人工智能】英文学习材料03(每日一句)

🌻个人主页:相洋同学 🥇学习在于行动、总结和坚持,共勉! 目录 Chain Rule (链式法则) Dimensionality Reduction (降维) Long Short-Term Memory (LSTM) (长短期记忆网络) Gradient Explosion (梯度爆炸) Gradie…

线程池详解

线程池详解 一,为什么要用线程池 ① Java的线程模型是基于操作系统的原生线程模型实现的,所以说Java线程实际上是基于内核实现的,创建,析构,同步都需要从用户态切换至内核态,这样带来的性能损耗是很大的。…

数据库事务中“锁”的分类

数据库事务中的锁可以按照不同的维度进行分类。以下是一些常见的分类方式: 1、按锁的粒度分类: 行锁(Row-level lock):锁定单个或少量的数据行。这种锁粒度小,允许高度的并发,但管理开销大。页…

《1w实盘and大盘基金预测 day6》

昨日预测完美,点位基本符合,我预测3052,实际最低3055。 走势也符合高平开,冲高回落,再反震荡上涨 大家可以观察我准不准哟~后面有我的一些写笔记、分享的网站。 关注公众号,了解各种理财预测内…

【Windows 常用工具系列 15 -- VMWARE ubuntu 安装教程】

文章目录 安装教程镜像下载 工具安装 安装教程 安装教程参考链接:https://blog.csdn.net/Python_0011/article/details/131619864 https://linux.cn/article-15472-1.html 激活码 VMware 激活码连接:https://www.haozhuangji.com/xtjc/180037874.html…

STM32实验DMA数据搬运小助手

本次实验做的是将一个数组的内容利用DMA数据搬运小助手搬运到另外一个数组中去。 最后的实验结果: 可以看到第四行的数据就都不是0了,成功搬运了过来。 DMA实现搬运的步骤其实不是很复杂,复杂的是结构体参数: 整个步骤为&#xf…

三级等保技术建议书

1信息系统详细设计方案 1.1安全建设需求分析 1.1.1网络结构安全 1.1.2边界安全风险与需求分析 1.1.3运维风险需求分析 1.1.4关键服务器管理风险分析 1.1.5关键服务器用户操作管理风险分析 1.1.6数据库敏感数据运维风险分析 1.1.7“人机”运维操作行为风险综合分析 1.2…

JEDI:变形下分子和周期系统应变分析的通用代码

JEDI:变形下分子和周期系统应变分析的通用代码 拉伸或压缩会引起材料显着的能量、几何和光谱变化。为了在机械或压致变色材料、自修复聚合物和其他机械响应装置的设计中充分利用这些效应,必须详细了解材料中机械应变的分布。在过去的十年中,能…

PSCA系统控制集成之复位层次结构

PPU 提供以下对复位控制的支持。 • 复位信号Reset signals:PPU 提供冷复位和热复位输出信号。PPU 还为实现部分保留的电源域管理提供了额外的热复位输出信号。 • 电源模式控制Power mode control:PPU 硬件适当地管理每个支持的电源模式转换的复位信号…