目录
摘要
论文阅读
1、标题和现存问题
2、矩阵分解(MF)和图神经网络
3、GNN_MF框架
4、项目聚集和社会聚集
5、实验准备和结果
2、深度学习
1、GCN
2、代码实例
总结
摘要
本周在论文阅读上,阅读了一篇基于GNN的矩阵分解推荐算法论文。该算法通过神经网络,将社交网络图以及用户项目图联系起来,学习目标用户在社会空间以及项目空间上的特征向量。通过MLP将两个特征向量串联提取用户的潜在特征向量,集成在概率矩阵分解模型上,产生预测评分。在深度学习上,学习了GNN中的GCN模型,以及进行简单的实例代码复现。
This week,in terms of thesis reading,perusaling a paper on matrix decomposition recommendation algorithm based on GNN.This algorithm connects social network graphs and user project graphs through neural networks to learn the feature vectors of target users in both social and project spaces.By concatenating two feature vectors through MLP, the user's potential feature vectors are extracted and integrated into a probability matrix decomposition model to generate predictive scores.In deep learning,studying the GCN model in GNN and performed simple instance code reproduction.
论文阅读
1、标题和现存问题
标题:基于GNN的矩阵分解推荐算法
现存问题:在推荐系统的任务中,用户-项目交互包含了用户对推荐项目的评价,是一种典型的图形数据 。 因此,有人提出了GNN来解决推荐问题 。 sRMGCNN 采用GNN提取用户和项目的图嵌入,然后结合递归神经网络进行扩散过程。尽管先前的工作取得了令人瞩目的成功,但人们对 GNN 的社会推荐关注甚少。文章提出了一种用于社会推荐的图神经网络来填补这一空白。
2、矩阵分解(MF)和图神经网络
在众多协同过滤推荐算法中,矩阵分解已成为最受欢迎的推荐算法之一,它主要是将用户和项目嵌入到一个共享的潜在空间中,将用户和项目用特征潜在向量表示,用户和项目之间的交互被建模为其潜在特征向量的内积。
矩阵分解将用户项目评分矩阵分解为两个低秩矩阵的乘法,其中可以存储用户和项目的潜在因素。因此,矩阵分解可以发现具有相似内容和隐含特征的项目。矩阵分解的主要难题是在因子向量中找到用户和项目之间的映射。为了学习因子向量pu和qi ,将评级矩阵R中的值作为训练数据,其目标函数:
GNN主要思想是如何使用神经网络迭代地从局 部图邻域聚集特征信息。同时,节点信息经过转换和聚合后可以通过图来传播。因此,GNN自然地整合了节点信息和拓扑结构,并被证明在表示学习方面具有强大的能力。另一方面,社会推荐中的数据可以用两个图来表示。这两个图包括表示用户之间关系的社交图和表示用户与项目之间交互的用户项图。用户同时参与到这两个图中。此外,社交推荐的自然方式是将社交网络信息纳入用户和项目潜在因素学习。学习项目和用户的表征是建立推荐系统的关键。
3、GNN_MF框架
模型框架图:
GNN_ MF的目标是找到用户和项目的潜在模型,其条件分布可以定义为:
对于概率矩阵分解中的用户潜在特征向量,有神经图生成的用户潜在特征向量向量来近似,如下所示:
定义一个给定W和X的U的条件分布来建模用户潜在模型:
使用两种类型的聚合 从两个图中学习潜在因子,第一个聚合表 示为项目聚合,用于从用户项目图中学习项目空间用户自身偏好潜在因子,第二种是社会聚集,从社会图中学习社会空间用户社交偏好潜在因素,然后,将这两个因素结合起来,形成最终的用户潜在因素。
4、项目聚集和社会聚集
项目聚集
项目聚合的目的是通过考虑用户ui交互过的项目和用户对这些项目的评分意见,来学习项目空间用户潜在因素,具体聚合函数如下:
在用户-项目交互过程中,用户可以表达他/她的观点(或评分分数),用r表示。这些对项目的看法可以捕捉到用户对项目的偏好,有助于对项目空间用户潜在因 素进行建模。为了建立观点模型,对于每一类意见r,引入一个意见嵌入向量er。针对用户ui与项目va之间的意见r交互,通过多层感知器(MLP)将意见交互表示建模为项目嵌入qa和意见嵌入er的组合。
形式上,注意力网络被定义为:
最后的注意权重通过使用Softmax函数对上述注意得分进行归一化得到:
社会聚集
为了从这个社会化的角度来表达用户的潜在因素, 提出了社交空间用户潜在因素,即从社交图中聚合相邻用户的项目空间用户潜在因素。具体而言,ui 的社交空间用户潜因子,是将用户在ui的邻居N(i)中的项目空间用户潜因子聚合起来,如下所示:
用一个双层神经网络来执行一个注意力机制,通过将社会注意力和目标用户嵌入pi相关联,提取出这些对ui有重要影响的用户,并 对其关联强度进行建模:
为了更好地了解用户潜在因素,需要将项目空间用户潜在因素和社会空间用户潜在因素结合起来考虑,因为社会图和用户项目图从不同的角度提供了关于用户的信息。通过一个标准的MLP将这两个潜在因素结合 成最终用户潜在因素,用户潜在因素定义为:
5、实验准备和结果
实验采用两个具有代表性的数据集Ciao和Epinions:
采用五折交叉验证来对推荐模型进行训练与测试。把数据集中用户对项目的评分数据平均分成5等份,在每次实验中,随机选取1组作为测试集,其余4组作为训练集。5次实验确保每 一组都被测试,最终实验结果为5次实验结果的平均值。利用两个指标来衡量预测精度,即均方根误差(RMSE)和平均绝对误差(MAE):
文章提出的算法和PMF、SocislMF、NeuMF以及DeepSoR等经典推荐算法进行比较
SocialMF和DeepSoR的表现总是优于PMF。所有这些方法都是基于矩阵分解的。SocialMF和DeepSoR同时利用评级和社交网络信息;而PMF只使用评级信息。 这些结果支持社会网络信息是对推荐的评级信息的补充。
NeuMF的性能比PMF好得多。两种方法都只利用评级信息。然而,NeuMF是基于神经网络结构的,这表明了神经网络模型在推荐系统中的强大作用。
DeepSoR的性能优于SocialMF。它们都利用了评级和社交网络信息。然而,DeepSoR是基于神经网络体系结构的,这进一步表明了神经网络模型在推荐中的作用。
文章方法GNN_MF始终优于所有对比方法。与 DeepSoR 相比,GNN_MF提供了先进的模型组件来集成评级和社会网络信息。此外,还提供了一种在用户项图中同时考虑交互和意见的方法
2、深度学习
1、GCN
GCN是图卷积神经网络(Graph Convolutional Network)的缩写,是一种基于图结构数据的神经网络,主要用于节点分类、图分类和链接预测等任务。GCN是GNN(Graph Neural Network)的一种特殊形式,属于其中的一种。相对于GNN中的其他模型,GCN有以下优势:
-
参数共享:GCN在计算邻居节点的信息时,采用的是一致的卷积操作,这意味着模型中不同节点的参数是共享的,从而大大减少了模型参数量,避免了过拟合的问题。
-
可解释性:GCN的卷积操作采用的是邻接矩阵和输入特征矩阵的矩阵乘法,这种方式比较直观,容易理解,也方便对模型进行可视化和解释。
-
适用范围广:GCN适用于各种类型的图数据,包括稠密图、稀疏图和带权图等等,而且对于一些小规模的图,GCN的效果也很好。
-
鲁棒性:GCN在处理不完整的图时也有一定的鲁棒性,即便是在有少量的节点和边缺失的情况下,GCN仍然能够保持一定的准确率。
-
易于实现:相对于其他GNN模型,GCN的实现较为简单,只需要进行一些简单的矩阵乘法即可,这也使得GCN成为一种较为常用的图神经网络模型。
一些 GCN 的缺点如下:
-
局限性:GCN 对于图数据的处理主要是基于节点和边的局部信息,而忽略了全局信息,因此在处理大规模的图数据时可能存在一些局限性。
-
过拟合:GCN 容易出现过拟合问题,特别是在小数据集上进行训练时,因为 GCN 模型本身的复杂度较高,而小数据集可能无法提供足够的信息进行模型的训练,这样就容易出现过拟合。
-
过于依赖图结构:GCN 对于图结构的依赖性很高,如果输入的图结构出现错误或者异常,那么就可能导致模型的性能下降或者无法正确处理。
-
计算效率:GCN 计算时需要进行大量的矩阵计算和向量乘法,因此在处理大规模图数据时,可能需要较长的计算时间和较高的计算资源。
-
对于每个节点 i,需要聚合其相邻节点的信息 h_j,其中 j\in N(i)表示节点i的邻居节点集合。聚合的过程可以用以下公式表示:
其中,W表示权重矩阵,sigma表示非线性激活函数,c{ij}是归一化因子,可以定义为节点i和节点 j的度数的乘积,即 c{ij}=\sqrt{d_i} \sqrt{d_j},其中d_i和d_j分别是节点i和节点j的度数。
该公式中,{c_{ij}可以将节点j对节点i的信息传递进行归一化,使得每个节点的信息权重相同。在实际实现中,这一操作可以通过对邻接矩阵进行标准化来实现。
2、代码实例
使用PyTorch Geometric在KarateClub数据集上训练图卷积网络(GCN)。KarateClub数据集是一个社交网络数据集,该代码实现了一个包含三个GCN层和一个线性分类器的GCN模型,并使用交叉熵损失函数和Adam优化器来训练模型。通过可视化工具展示了训练过程中嵌入向量的变化情况,并在每100个epoch后进行更新。最后,使用NetworkX和Matplotlib库将KarateClub数据集以图形的形式展示出来。
import torch
import networkx as nx
import matplotlib.pyplot as plt
from torch_geometric.datasets import KarateClub
from torch_geometric.utils import to_networkx
from torch.nn import Linear
from torch_geometric.nn import GCNConv
import time
def visualize_graph(G,color):
plt.figure(figsize=(7,7))
plt.xticks()
plt.yticks()
nx.draw_networkx(G,pos=nx.spring_layout(G,seed=42), with_labels=False,node_color=color,cmap="Set2")
plt.show()
def visualize_embedding(h,color, epoch=None, loss=None):
plt.figure(figsize=(7,7))
plt.xticks()
plt.yticks()
h = h.detach().cpu().numpy()
plt.scatter(h[:,0],h[:,1],s=140, c=color, cmap="Set2")
if epoch is not None and loss is not None:
plt.xlabel(f'Epoch:{epoch},Loss: {loss.item():.4f}', fontsize = 16)
plt.show()
datset = KarateClub();
# print(f'Dataset:{datset}')
# print('===========')
# print(f'Number of graphs:{len(datset)}')
# print(f'Number of feature:{datset.num_features}')
# print(f'Number of classes:{datset.num_classes}')
data = datset[0]
# print(data)
#以矩阵的形式展示图之间的关系(邻接矩阵)
edge_index = data.edge_index
print(datset.num_classes)
# print(edge_index.t())
print(data)
class GCN(torch.nn.Module):
def __init__(self):
super().__init__()
torch.manual_seed(1234)
self.conv1 = GCNConv(datset.num_features, 4) #定义好输入特征和输出特征
self.conv2 = GCNConv(4,4)
self.conv3 = GCNConv(4,2)
self.classifier = Linear(2, datset.num_classes)
def forward(self, x, edge_index):
h = self.conv1(x, edge_index)#输入特征和邻接矩阵
h = h.tanh()
h = self.conv2(h, edge_index)
h = h.tanh()
h = self.conv3(h, edge_index)
h = h.tanh()
out = self.classifier(h)
return out,h
model = GCN()
criterion = torch.nn.CrossEntropyLoss() #损失函数
optimizer = torch.optim.Adam(model.parameters(), lr=0.01) #优化器
def train(data):
optimizer.zero_grad() #梯度清零
out, h = model(data.x, data.edge_index) #通过模型前向传播
loss = criterion(out[data.train_mask], data.y[data.train_mask])#通过train_mask来计算损失
loss.backward()
optimizer.step()
return loss,h
for epoch in range(401):
loss, h = train(data)
if epoch % 100 ==0:
visualize_embedding(h, color=data.y, epoch=epoch, loss=loss)
time.sleep(0.3)
#将数据集以图的形式表现出来
G = to_networkx(data, to_undirected=True)
visualize_graph(G, color = data.y)
总结
本周仍旧继续对GNN的相关知识展开学习,GCN作为GNN中的一种模型,通过卷积操作来处理图形数据,在非规则的图像数据上能有很好的效果,除此之外GCN通过在图形中考虑局部和全局信息来提高其表现以及利用卷积的参数共享和稀疏性质来提高计算效率