KGPolicy中遇到的问题

KGPolicy

1、

P ( s t + 1 = ( u , e t + 1 ) ∣ s t = ( u , e t ) , a t = ( e t → e t ′ → e t + 1 ) ) = 1 \mathbb{P}\big(\mathrm{s}_{t+1}=(\mathrm{u},\mathrm{e}_{t+1})|\mathrm{s}_t=(\mathrm{u,e_t}),\mathrm{a}_t=\big(\mathrm{e}_t\to\mathrm{e}_t^{\prime}\to\mathrm{e}_{t+1}^{}\big)\big)=1 P(st+1=(u,et+1)st=(u,et),at=(etetet+1))=1

  1. 这个数学公式表示的是在一个条件概率之下,事件 s t + 1 = ( u , e t + 1 ) \mathrm{s}_{t+1}=(\mathrm{u},\mathrm{e}_{t+1}) st+1=(u,et+1) 发生的概率为 1 1 1。其中, s t \mathrm{s}_t st s t + 1 \mathrm{s}_{t+1} st+1 分别表示时间步 t t t 和时间步 t + 1 t+1 t+1 时的状态, ( u , e t ) (\mathrm{u,e_t}) (u,et) ( u , e t + 1 ) (\mathrm{u},\mathrm{e}_{t+1}) (u,et+1) 分别表示两个状态, a t = ( e t → e t ′ → e t + 1 ) \mathrm{a}_t=\big(\mathrm{e}_t\to\mathrm{e}_t^{\prime}\to\mathrm{e}_{t+1}^{}\big) at=(etetet+1) 表示在时间步 t t t 时采取的动作。因此,这个公式可以被解释为:在当前状态 s t = ( u , e t ) \mathrm{s}_t=(\mathrm{u,e_t}) st=(u,et) 下,采取动作 a t = ( e t → e t ′ → e t + 1 ) \mathrm{a}_t=\big(\mathrm{e}_t\to\mathrm{e}_t^{\prime}\to\mathrm{e}_{t+1}^{}\big) at=(etetet+1) 的情况下,下一个状态 s t + 1 \mathrm{s}_{t+1} st+1 一定是 ( u , e t + 1 ) (\mathrm{u},\mathrm{e}_{t+1}) (u,et+1),也就是说这个事件一定会发生。其中, P \mathbb{P} P 表示概率。
2、

在这里插入图片描述

3、

P ( ( e t , e t ′ ) ∣ s t ) = exp ⁡ ( p ( e t , e t ′ ) ) ∑ e t ′ ′ ∈ N e t exp ⁡ ( p ( e t , e t ′ ′ ) ) \mathbb{P}((\mathrm{e}_{\mathrm{t}},\mathrm{e}_{\mathrm{t}}^{\prime})|\mathrm{s}_{\mathrm{t}})=\dfrac{\exp(\mathrm{p(e}_{\mathrm{t}},\mathrm{e}_{\mathrm{t}}^{\prime}))}{\sum_{\mathrm{e}_{\mathrm{t}}^{''}\in\mathcal{N}_{\mathrm{et}^{}}}\exp\left(\mathrm{p}\left({\mathrm{e}_t},\mathrm{e}_t^{''}\right)\right)} P((et,et)st)=et′′Netexp(p(et,et′′))exp(p(et,et))

这个公式表示了一个图神经网络中计算边的条件概率分布的过程。其中,

  • P ( ( e t , e t ′ ) ∣ s t ) \mathbb{P}\bigl((\mathrm{e}_{\mathrm{t}},\mathrm{e}_{\mathrm{t}}^{\prime})\vert\mathrm{s}_{\mathrm{t}}\bigr) P((et,et)st) 表示在当前状态 s t \mathrm{s}_{\mathrm{t}} st 下,节点 e t \mathrm{e}_{\mathrm{t}} et e t ′ \mathrm{e}_{\mathrm{t}}^{\prime} et 之间建立连接的条件概率;
  • p ( e t , e t ′ ) \mathrm{p}(\mathrm{e}_t,\mathrm{e}_t^{\prime}) p(et,et) 表示节点 e t \mathrm{e}_t et e t ′ \mathrm{e}_t^{\prime} et 之间的连接权重,可以看作是边的权重;
  • N e t \mathcal{N}_{\mathrm{et}} Net 表示节点 e t \mathrm{e}_{\mathrm{t}} et 的邻居节点集合;
  • exp ⁡ ( ⋅ ) \exp(\cdot) exp() 表示自然指数函数。

因此,这个公式可以被解释为:在当前状态 s t \mathrm{s}_{\mathrm{t}} st 下,节点 e t \mathrm{e}_{\mathrm{t}} et 与其邻居节点之间建立连边的条件概率是由节点 e t \mathrm{e}_{\mathrm{t}} et 与其邻居节点之间的连接权重 p ( e t , e t ′ ) \mathrm{p}(\mathrm{e}_t,\mathrm{e}_t^{\prime}) p(et,et) 决定的。同时,这个条件概率也受到其他邻居节点之间建立连边的影响,这个影响通过分母中的指数函数表示。具体来说,分母中对所有邻居节点进行求和并进行指数函数变换,可以得到一个归一化的概率分布,用来描述当前节点与其他邻居节点之间建立连接的可能性大小关系。

4、

由于①用KG来指导负采样的探索路径的规模急剧增加和②缺乏事实、需要采样器区分探索携带的负信号(更具体的说,区分KG实体暴露给用户的置信度并估计可能的项目为负的概率)。需要一种智能采样器来有效遍历KG。

​ 为此提出了KGPolicy(knowledge Graph Policy Network),使用强化学习代理来探索KG以发现高质量的样本。

​ 核心操作是探索操作。从正item出发选择两个连续的邻居(例如.一个KG 实体和一个item)进行访问。这样的两跳路径捕获知识感知的负面信号。设计了一个邻居注意模块来实现这一目标,指定正用户-item对为条件的一跳和两跳的邻居不同的重要性。

5、关于知识感知负采样如何促进推荐系统学习的两个方面:

  • 信息信。关于训练过程中的梯度下降和稀疏性的表现。
  • 反应个人品味。
  • KGPolicy和推荐器无关可以作为一个即插即用的采样器。
6、公式3 min ⁡ Θ R ∑ ( u , i ) ∈ O + E j ∼ f S ( u , i , G ) [ − ln ⁡ σ ( f R ( u , i ) − f R ( u , j ) ) ] \min\limits_{\Theta_R} \sum_{(u,i)\in O^+}\mathbb{E}_{j\sim f_S(u,i,G)}[-\ln\sigma(f_R(u,i)-f_R(u,j))] ΘRmin(u,i)O+EjfS(u,i,G)[lnσ(fR(u,i)fR(u,j))]

这个公式是一个损失函数,用于推荐系统中的矩阵分解模型。下面是每个符号的解释:

  • Θ R \Theta_R ΘR:表示矩阵分解模型的参数集合。

  • O + O^+ O+:表示训练数据集,包含了用户和物品之间的正样本。

  • E j ∼ f S ( u , i , G ) \mathbb{E}_{j\sim f_S(u,i,G)} EjfS(u,i,G):表示对所有可能的负样本 j j j 取期望,其中 f S ( u , i , G ) f_S(u,i,G) fS(u,i,G) 是根据图谱 G G G 构建的用户 u u u 和物品 i i i 之间的相似度函数。

  • σ ( x ) = 1 1 + e − x \sigma(x) = \frac{1}{1+e^{-x}} σ(x)=1+ex1:表示 sigmoid 函数,将输入值映射到 (0,1) 的范围内。

  • f R ( u , i ) f_R(u,i) fR(u,i):表示预测用户 u u u 对物品 i i i 的评分,即矩阵分解模型的输出值。

  • f R ( u , j ) f_R(u,j) fR(u,j):表示预测用户 u u u 对负样本 j j j 的评分,也是矩阵分解模型的输出值。

  • 该公式的目标是最小化对数损失函数:
    min ⁡ Θ R ∑ ( u , i ) ∈ O + E j ∼ f S ( u , i , G ) [ − ln ⁡ σ ( f R ( u , i ) − f R ( u , j ) ) ] \min_{\Theta_R} \sum_{(u,i)\in O^+}\mathbb{E}_{j\sim f_S(u,i,G)}[-\ln\sigma(f_R(u,i)-f_R(u,j))] ΘRmin(u,i)O+EjfS(u,i,G)[lnσ(fR(u,i)fR(u,j))]
    直观上来看,该损失函数的目标是使得模型在预测用户对正样本的评分时,得到更高的得分,同时在预测用户对负样本的评分时,得到更低的得分。通过最小化该损失函数,矩阵分解模型能够更好地学习到用户和物品之间的关系,从而提高推荐系统的精度。

7、公式4 Δ u , i , j = 1 − σ ( f R ( u , i ) − f R ( u , j ) ) \Delta_{u,i,j} =1-\sigma(f_{R}(u,i)-f_{R}(u,j)) Δu,i,j=1σ(fR(u,i)fR(u,j))

这个公式是用于计算梯度下降法中的损失函数对模型参数 f R ( u , i ) f_R(u,i) fR(u,i) f R ( u , j ) f_R(u,j) fR(u,j) 的偏导数。下面是每个符号的解释:

  • Δ u , i , j \Delta_{u,i,j} Δu,i,j:表示损失函数对 f R ( u , i ) f_R(u,i) fR(u,i) f R ( u , j ) f_R(u,j) fR(u,j) 的偏导数,其实际上是一个向量。

  • σ ( x ) = 1 1 + e − x \sigma(x) = \frac{1}{1+e^{-x}} σ(x)=1+ex1:表示 sigmoid 函数,将输入值映射到 (0,1) 的范围内。

  • f R ( u , i ) f_R(u,i) fR(u,i):表示预测用户 u u u 对物品 i i i 的评分,即矩阵分解模型的输出值。

  • f R ( u , j ) f_R(u,j) fR(u,j):表示预测用户 u u u 对负样本 j j j 的评分,也是矩阵分解模型的输出值。

    该公式的意义是计算在训练数据集中给定 ( u , i ) (u,i) (u,i) 正样本和 j j j 负样本的情况下,当前模型预测评分与真实评分之间的差异。 Δ u , i , j \Delta_{u,i,j} Δu,i,j 表示了这个差异对模型参数 f R ( u , i ) f_R(u,i) fR(u,i) f R ( u , j ) f_R(u,j) fR(u,j) 的影响,可以用于更新模型参数以减小损失函数的值。

8、公式8 max ⁡ Θ S ∑ ( u , i ) ∈ O + E π [ ∑ t = 1 T λ t − 1 R ( e t ) ] \max\limits_{\Theta_S}\sum\limits_{(u,i)\in O^+}\mathbb{E}_\pi[\sum\limits_{t=1}^T\lambda^{t-1}\mathcal{R}(e_t)] ΘSmax(u,i)O+Eπ[t=1Tλt1R(et)]

这个公式是一个优化目标,用于推荐系统中的序列推荐模型。下面是每个符号的解释:

  • Θ S \Theta_S ΘS:表示序列推荐模型的参数集合。
  • O + O^+ O+:表示训练数据集,包含了用户和物品之间的正样本。
  • E π \mathbb{E}_\pi Eπ:表示对所有可能的购买序列 π \pi π 取期望。
  • T T T:表示探索操作的数量。
  • λ \lambda λ:表示折扣因子,用于计算不同时间点的奖励权重。
  • R ( e t ) \mathcal{R}(e_t) R(et):表示在时间步 t t t 的奖励函数,用于评估给定事件 e t e_t et 的好坏程度。
  • E π \mathbb{E}_\pi Eπ 表示在强化学习中,根据策略 π \pi π 对期望值进行求解的操作符。它表示对于所有可能的状态和动作序列,按照策略 π \pi π 选择动作并获得奖励的期望值。

该公式的目标是最大化用户购买行为序列的总体奖励。序列推荐模型的任务是预测用户在未来若干个时间步内可能购买的物品,以最大化累积奖励。通过最大化该公式,序列推荐模型能够更好地学习到用户的购买行为规律,从而提高推荐系统的精度。

具体来说,在每个时间步 t t t,模型会根据当前已经购买的物品历史,以及一些其他上下文信息,预测用户在下一个时间步可能购买的物品,并且根据奖励函数 R ( e t ) \mathcal{R}(e_t) R(et) 给出对该预测结果的评估。在不同的时间步上,奖励权重会随着时间的推移而逐渐减小,从而使得越近期的购买行为对累积奖励的贡献更大。序列推荐模型的目标是在给定训练数据集和购买历史信息的情况下,找到一个参数集合 Θ S \Theta_S ΘS,使得最大化用户购买行为序列的总体奖励。

9、公式13 P ( ( e t , e t ′ ) ∣ s t ) = exp ⁡ ( p ( e t , e t ′ ) ) ∑ e t ′ ′ ∈ N e t exp ⁡ ( p ( e t , e t ′ ′ ) ) \mathbb{P}((e_{t},e_{t}^{\prime})|s_{t})=\frac{\exp(p(e_t,e_t^{\prime}))}{\sum_{e_t^{\prime\prime}\in\mathcal{N}_{e_t}}\exp(p(e_t,e_t^{{\prime\prime}}))} P((et,et)st)=et′′Netexp(p(et,et′′))exp(p(et,et))

一个正样本比上所有的正样本的和。

在上述公式中, e t ′ ′ ∈ N e t e_t''\in\mathcal{N}_{e_t} et′′Net表示从与正样本边 e t e_t et相邻的边集合 N e t \mathcal{N}_{e_t} Net中随机选择一条邻居边作为负样本边;而 e t ′ e_t' et则表示经过采样得到的具体负样本边,可能是 e t ′ ′ e_t'' et′′,也可能是其他与 e t e_t et不同的边。因此, e t ′ e_t^{'} et e t ′ ′ e_t^{''} et′′在定义上是不同的。

具体来说,在GraphSAGE算法中,我们需要为每条正样本边 e t e_t et构造若干个负样本边,以增加模型的泛化能力和鲁棒性。为了实现负样本的构造,我们可以使用类似于负采样(negative sampling)的方法,从每个节点的邻居边集合中随机选择一些边作为负样本边。具体来说,对于每条正样本边 e t e_t et,我们会从其邻居边集合 N e t \mathcal{N}_{e_t} Net中抽取若干个负样本边 e t ( 1 ) , e t ( 2 ) , ⋯   , e t ( k ) e_t^{(1)}, e_t^{(2)}, \cdots, e_t^{(k)} et(1),et(2),,et(k),然后将这些边作为输入,参与图神经网络的训练过程。由于每个节点的邻居边集合不同,因此每条正样本边 e t e_t et对应的负样本集合也会不同,从而保证了模型的多样性和泛化能力。

代码运行相关问题

1、torch版本不匹配

torch历史版本下载链接:https://download.pytorch.org/whl/torch_stable.html

教程:https://blog.csdn.net/m0_37847767/article/details/103160616

2、报错 undefined symbol: _ZN6caffe26detail36_typeMetaDataInstance_preallocated_7E

教程:https://blog.csdn.net/weixin_41790566/article/details/111468237

https://blog.csdn.net/weixin_39505820/article/details/123007419

3、kgpolicy.py中kg_step报错

indexerror: tensors used as indices must be long, byte or bool tensors

		u_e = gcn_embedding[user]
        u_e = u_e.unsqueeze(dim=2)
        pos_e = gcn_embedding[pos]
        pos_e = pos_e.unsqueeze(dim=1)
        
#改为
		user=user.type(torch.long)
        u_e = gcn_embedding[user]
        u_e = u_e.unsqueeze(dim=2)
        pos=pos.type(torch.long)
        pos_e = gcn_embedding[pos]
        pos_e = pos_e.unsqueeze(dim=1)
MF.py中rank方法:
		添加
   		users=users.type(torch.long)
        items = items.type(torch.long)
main.py中train_one_epoch方法中:
		在train_set = train_data[users]前
		添加
		users=users.type(torch.long)
        neg = neg.type(torch.long)
        pos = pos.type(torch.long)
4、从MF改到KGAT
KGAT.py中rank方法:
		添加
   		users=users.type(torch.long)
        items = items.type(torch.long)
main.py中
		添加from modules.recommender import KGAT
    
rocommender\__init__中
		添加from .KGAT import KGAT
    
train_one_epoch方法中
 	#base_loss_batch, reg_loss_batch = recommender(users, pos, selected_neg_items)
	#loss_batch = base_loss_batch + reg_loss_batch
		改为
		#KGAT多加了最后一个参数
        base_loss_batch, bpr_loss_batch,reg_loss_batch = recommender(users, pos, selected_neg_items,edge_matrix)
        loss_batch = base_loss_batch +bpr_loss_batch+ reg_loss_batch
        
    	#reinforce_loss = -1 * torch.matmul(reward_batch, selected_neg_prob_list)
        改为(不确定,不改可能也行)
        reinforce_loss = -1 * torch.sum(selected_neg_prob_list*reward_batch)

test.py中
	test_v2方法中添加
		n_nodes = ckg.entity_range[1] + 1
        
        #score_matrix = get_score(model, n_users, n_items, train_user_dict, s, t)
       改为
        score_matrix = get_score(model, n_users, n_items, n_nodes,train_user_dict, s, t)
    get_score方法中添加参数n_nodes
    	# u_e, i_e = torch.split(model.all_embed, [n_users, n_items])
    	# u_e, i_e = torch.split(model.all_embed, [n_users, n_items,n_nodes])
	改为
    	num_entity = n_nodes - n_users - n_items
    	u_e, i_e, _ = torch.split(model.all_embed, [n_users, n_items, num_entity])
    	u_e = u_e[s:t, :]	
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值