Conditional Graph Attention Networks for Distilling and Refining Knowledge Graphs in Recommendation

Conditional Graph Attention Networks for Distilling and Refining Knowledge Graphs in Recommendation


由于知识图的泛化和规模, 大多数知识关系对目标用户-物品的预测没有帮助。为了利用知识图谱捕获推荐系统中特定目标的知识关系,需要对知识图谱进行提炼以保留有用的信息,并对知识图谱进行提炼以捕获用户的偏好。KCAN是将知识图谱整合到推荐任务中的端到端的模型。

知识图蒸馏:从完整的海量知识图谱中提取出与目标任务相关的小子结构的知识图。值得注意的是,知识图谱蒸馏描述的是将完整的知识图谱转化为一个小型的集中图谱,以准确捕捉用户偏好的过程,而不是像知识蒸馏那样,用一个小型的学生模型来模仿一个预先训练好的较大的教师模型。

知识图提炼:对不同的目标用户给与不同的知识边权重,例如在图1中,我们的目标是为目标用户User1和User2推荐。边< Movie2, genre, Comedy >的权重仅基于节点Movie2和Comedy,与User1和User2无关。但是用户1和用户2可能对电影类型有不同的偏好。也就是说,对于User1和User2来说,边的权重可能不同。

在这里插入图片描述
**模型既能保持全局语义相似度,又能动态生成目标特定的子图,**对知识图进行提炼和细化,从而准确推断局部用户偏好。

模型

在这里插入图片描述

Knowledge Graph Distillation

Knowledge Graph Embedding

将user点击item作为一种关系,因为一个user会点击多个item,因此存在一对多,使用可以建模一对多的TransH,生成实体的嵌入向量e,关系的嵌入向量r

Knowledge-Aware Graph Covolutional Network

但是上述的只是图嵌入只关注单独的知识三元组,无法捕获实体之间的高阶相似性,因此利用图卷积网络对知识嵌入进行聚合来捕获实体的高阶相似度,为了区分知识图中不同类型关系的影响,我们建议在传播过程中使用知识感知的注意机制:
在这里插入图片描述
其中注意力因子 π r ( v , t ) \pi_{r}(v,t) πr(v,t)是特定于关系,衡量了在关系r空间下,实体v对t的重要性,在关系r空间下,如果实体t和v相近,那么应该要传播更多的信息:
在这里插入图片描述
最后,将实体表示 e v e_{v} ev和邻域表示 e N ( v ) e_{N(v)} eN(v)结合起来,将实体表示更新为 e v ( 1 ) e^{(1)}_{v} ev(1)
在这里插入图片描述

Target-specific Sampling

对于给定的user-item对(u,v),KAGCN的注意力依赖于知识边,和目标无关。为了捕获目标的局部影响,我们利用子图而不是整个庞大的知识图。和随机游走等方法相比,子图保留有多样性。 T = v 1 , … , v k \mathcal T={v_{1},…,v_{k}} T=v1,,vk,其中k=2, T \mathcal T T是user-item对。由于每个节点的邻居节点的数目不固定,因此我们对其固定大小M采样。未用GraphSAGE的对邻居节点统一采样,因为知识图通常是有噪声的,并且充满了与目标无关的信息。考虑到我们已经获得了衡量实体相似性的全局注意力值(𝑣,𝑡),我们以其注意力值(𝑣,𝑡)作为采样概率,对相邻节点进行采样。对每个节点𝑣得到采样的𝐾-hop邻域为 S ^ K ( v ) \hat S_{K}(v) S^K(v)后,我们可以将它们合并得到目标集的接受域:
在这里插入图片描述

Knowledge Graph Refinement

知识图蒸馏模块将知识图提炼为目标特定的子图,作为目标集的接受域。

这一部分对知识进行重新加权,以细化知识图。将实体的信息传播到经过提炼的特定于目标的子图上。为了捕获目标对知识关系的偏好,我们建议使用一种条件注意传播机制来细化子图:
在这里插入图片描述
其中 α ( v , r , t ∣ T ) \alpha(v,r,t|\mathcal T) α(v,r,tT)是依赖于目标 T \mathcal T T的条件注意力。 N T ( v ) N^{\mathcal T}(v) NT(v)是目标集接受域 S ^ K ( T ) \hat S_{K}(\mathcal T) S^K(T)中实体v的邻居节点集。为了更好的基于目标提炼子图,条件概率包括两个方面:(1)知识关系(v,r,t)的重要性 α 1 ( v , r , t ) \alpha_{1}(v,r,t) α1(v,r,t)重,这部分独立于目标,衡量的是知识关系本身对任务的重要性,令 α 1 = π ^ r ( v , t ) \alpha_{1}=\hat \pi_{r}(v,t) α1=π^r(v,t)。(2)实体对目标集的重要性 α 2 ( t ∣ T ) \alpha_{2}(t|\mathcal T) α2(tT)。这个术语衡量的是目标相对于尾部实体的局部偏好。与目标更相似的实体应该对目标更重要。

为了使目标集和实体兼容,将目标集的表征定义为目标集包含是所有实体向量的拼接:
在这里插入图片描述
然后衡量实体对所设定目标的重要性:
在这里插入图片描述
结合这两个重要分数,我们得到条件注意:
在这里插入图片描述
注意力越大,表明与目标相关的知识越重要。通过条件关注,将局部知识图细化为随目标变化的加权图。

KAGCN类似,可以得到目标实体表示如下:
在这里插入图片描述
为了捕获高阶偏好,进一步堆叠更多的LCSAN层。以确保每个节点的信息可以在所有子图上传播,设置i最大为2:
在这里插入图片描述

Multi-layer Perceptron Prediction

为了有效地保持局部相似性和局部偏好,提高嵌入的可表示性,将LAGCN输出的特定于目标的表征向量 e v ∣ T K + 1 e_{v|\mathcal T}^{K+1} evTK+1以及KAGCN的输出 e v 1 e_{v}^{1} ev1拼接起来,为了平衡这两个向量,将拼接起来的向量送入MLP获得最终的输出表示:
在这里插入图片描述
对于具有user-item对预测的推荐,预测的分数是在给定目标 T u i = { u , i } \mathcal T_{ui}=\{u,i\} Tui={u,i}后,用户和项目表示的内积:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
image-to-Image Translation with Conditional Adversarial Networks(条件对抗网络的图像到图像转换)是一种用于图像转换的深度学习方法。它通过训练一个生成器网络和一个判别器网络来实现图像的转换。生成器网络将输入图像转换为目标图像,而判别器网络则试图区分生成的图像和真实的目标图像。 这种方法的关键是使用对抗性训练。生成器网络和判别器网络相互竞争,以提高生成器网络生成逼真图像的能力。生成器网络通过最小化判别器网络对生成的图像的判别误差来学习生成逼真的图像。判别器网络则通过最大化对生成的图像和真实图像的判别能力来学习区分真实图像和生成图像。 在条件对抗网络中,生成器网络和判别器网络都接收额外的条件输入,以指导图像转换的过程。这个条件输入可以是任何与图像转换任务相关的信息,例如标签、语义分割图或其他图像。 通过训练生成器网络和判别器网络,条件对抗网络可以实现各种图像转换任务,例如将黑白图像转换为彩色图像、将马的图像转换为斑马的图像等。 这是一个使用条件对抗网络进行图像到图像转换的示例代码: ```python import tensorflow as tf from tensorflow.keras import layers # 定义生成器网络 def build_generator(): # 定义生成器网络结构 generator = tf.keras.Sequential() generator.add(layers.Conv2DTranspose(64, (4, 4), strides=(2, 2), padding='same', input_shape=(256, 256, 3))) generator.add(layers.BatchNormalization()) generator.add(layers.ReLU()) generator.add(layers.Conv2DTranspose(32, (4, 4), strides=(2, 2), padding='same')) generator.add(layers.BatchNormalization()) generator.add(layers.ReLU()) generator.add(layers.Conv2DTranspose(3, (4, 4), strides=(2, 2), padding='same', activation='tanh')) return generator # 定义判别器网络 def build_discriminator(): # 定义判别器网络结构 discriminator = tf.keras.Sequential() discriminator.add(layers.Conv2D(64, (4, 4), strides=(2, 2), padding='same', input_shape=(256, 256, 3))) discriminator.add(layers.LeakyReLU()) discriminator.add(layers.Conv2D(128, (4, 4), strides=(2, 2), padding='same')) discriminator.add(layers.BatchNormalization()) discriminator.add(layers.LeakyReLU()) discriminator.add(layers.Conv2D(256, (4, 4), strides=(2, 2), padding='same')) discriminator.add(layers.BatchNormalization()) discriminator.add(layers.LeakyReLU()) discriminator.add(layers.Conv2D(1, (4, 4), strides=(1, 1), padding='same')) return discriminator # 定义条件对抗网络 class cGAN(tf.keras.Model): def __init__(self, generator, discriminator): super(cGAN, self).__init__() self.generator = generator self.discriminator = discriminator def compile(self, g_optimizer, d_optimizer, loss_fn): super(cGAN, self).compile() self.g_optimizer = g_optimizer self.d_optimizer = d_optimizer self.loss_fn = loss_fn def train_step(self, real_images, labels): # 生成器网络生成假图像 with tf.GradientTape() as tape: fake_images = self.generator([real_images, labels], training=True) # 判别器网络判别真实图像和假图像 real_output = self.discriminator([real_images, labels], training=True) fake_output = self.discriminator([fake_images, labels], training=True) # 计算生成器和判别器的损失 g_loss = self.loss_fn(fake_output, tf.ones_like(fake_output)) d_loss_real = self.loss_fn(real_output, tf.ones_like(real_output)) d_loss_fake = self.loss_fn(fake_output, tf.zeros_like(fake_output)) d_loss = d_loss_real + d_loss_fake # 更新生成器和判别器的参数 g_gradients = tape.gradient(g_loss, self.generator.trainable_variables) d_gradients = tape.gradient(d_loss, self.discriminator.trainable_variables) self.g_optimizer.apply_gradients(zip(g_gradients, self.generator.trainable_variables)) self.d_optimizer.apply_gradients(zip(d_gradients, self.discriminator.trainable_variables)) return {"g_loss": g_loss, "d_loss": d_loss} # 创建生成器和判别器 generator = build_generator() discriminator = build_discriminator() # 创建条件对抗网络 cgan = cGAN(generator, discriminator) # 编译条件对抗网络 cgan.compile( g_optimizer=tf.keras.optimizers.Adam(learning_rate=0.0002, beta_1=0.5), d_optimizer=tf.keras.optimizers.Adam(learning_rate=0.0002, beta_1=0.5), loss_fn=tf.keras.losses.BinaryCrossentropy(from_logits=True) ) # 训练条件对抗网络 cgan.fit(dataset, epochs=100) # 使用生成器网络进行图像转换 input_image = ... label = ... output_image = generator([input_image, label]) ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值