【图神经网络】图神经网络(GNN)学习笔记:表示学习

本文探讨了表示学习的概念及意义,介绍了离散表示与分布式表示的区别,并详细阐述了端到端学习的优势。文中还深入讲解了自编码器、去噪自编码器、稀疏自编码器和变分自编码器的工作原理。此外,还讨论了基于对比损失的Word2vec模型,包括Skip-gram模型和负采样技术。


如果有一类方法可以 自动地从数据中去学习“有用”的特征,并可以直接用于后续的具体任务,这类方法称为 表示学习

1. 表示学习

1.1 表示学习的意义

传统机器学习中,需要在数据处理和转换上花费大量精力才能保证特征工程选取的特征使得机器学习算法更有效。如果存在一种可以从数据中得到有判别性特征的方法,就会减少机器学习算法对特征工程的依赖。从而可以将机器学习应用到更多的领域,这就是表示学习的价值。

那么对于表示学习来说,要回答3个问题:
(1)如何判断一个表示比另一个表示更好?
(2)如何挖掘这些表示?
(3)使用什么样的目标去得到一个好的表示?

举一个例子就是一个图像,计算机能够得到的知识一个个像素点这样的原始数据,只关注像素点是无法得到一些具体信息的;而人在看到一个图像的时候自然会通过高层的抽象语义来判断,这之间的差距称为语义鸿沟,它指的是低层次特征和高层次抽象之间的差异。一个好的表示就应该尽可能减小这个语义鸿沟,提供一些高层次的有价值的特征。

1.2 离散表示与分布式表示

机器学习中,对一个对象的表示有两种常见的方式:独热编码(one-hot)分布式表示

  • 独热码将研究的对象表示成一个向量,只在某个维度上为1,其余全为0。有多少种类型,向量的长度就有多长。举例:自然语言处理中的词袋模型
  • 分布式表示就是通过某种方式得到一个低维稠密的向量来表示研究对象,典型的例子就是颜色,可以用RGB值的三元组来表示。

独热码表示起来非常简单,只需要列出所有可能的值就可以得到,但它会使得所有不同的表示都是相互独立(正交)的,这会让它表示起来丢失大量的语义信息,此外独热向量的维度可能非常高且非常稀疏。
而分布式表示就能够保留这些语义信息,而且维度可以很低,当然相应的也会比独热码实现起来更复杂一点。

1.3 端到端学习是一种强大的表示学习方法

所谓端到端学习(end-to-end learning)就是以原始输入作为输入,并直接输出想要得到结果(比如分类)。相应的,传统的机器学习模型中,一些工作都是先处理输入,通过特征工程提取出特征,之后再交由分类器进行判断。

由此端到端学习可以看作是表示学习与任务学习的结合(提取特征+分类),它们不是完全分裂的,而是联合优化的,一次反向传播更新的不只是基于特征给出分类结果的参数,还更新了提取特征的参数使得整个模型的效果会更好,这体现了深度学习模型的优越性。

深度学习模型另一个优势是能够学习到数据的层次化表达低层次的特征更加通用,高层次的特征则更贴近具体任务,所以对于一些比较相近的任务,其实是可以使用相同的低层次特征的,这让深度学习可以进行迁移学习

表示学习的任务通常是学习这样一个映射: f : X → R d f:X\rightarrow R^d f:XRd,即将输入映射到一个稠密的低维向量空间中。这里介绍两种典型的表示学习方法:基于重构损失的方法基于对比损失的方法

2. 基于重构损失的方法——自编码器

自编码器是一种无监督表示学习模型,以输入数据为参考,可以用于数据降维特征提取

2.1 自编码器

自编码器的思路是:将输入映射到某个特征空间,再从这个特征空间映射回输入空间进行重构。结构上看它由编码器解码器组成,编码器用于从输入中提取特征,解码器则用于从特征重构出输入数据。在训练完成后,使用编码器进行特征提取。
自编码器结构图
最简单的自编码器有3层组成:1个输入层、1个隐藏层、1个输出层。从输入到隐藏层就是编码器,从隐藏层到输出层就是解码器。
给定输入 x ∈ R n x\in R^n xRn,假设从输入层到隐藏层的变换矩阵为 W e n c ∈ R d × n W_{enc}\in R^{d\times n} WencRd×n d d d为隐藏层的神经元数目,经过变换 h = σ ( W e n c x + b e n c ) h=\sigma (W_{enc}x+b_{enc}) h=σ(Wencx+benc)得到编码后的特征为 h ∈ R d h\in R^{d} hRd。解码器将编码特征 h h h映射回输入空间,假设从隐藏层到输出层的编码矩阵为 W d e c ∈ R n × d W_{dec}\in R^{n\times d} WdecRn×d,经过变换 x ~ = σ ( W d e c h + b d e c ) \tilde{x}=\sigma(W_{dec}h+b_{dec}) x~=σ(Wdech+bdec)得到重构的输入为 x ~ \tilde{x} x~

自编码器不需要额外的标签信息进行监督学习,它是通过不断最小化输入和输出之间的重构误差进行训练的。基于损失函数 L = 1 N ∑ i ∣ ∣ x i − x i ~ ∣ ∣ 2 2 L=\frac{1}{N} \sum_i {||x_i-\tilde{x_i}||_2^2} L=N1ixixi~22,通过反向传播计算梯度,利用梯度下降算法不断优化参数 W e n c , W d e c , b e n c , b d e c W_{enc},W_{dec},b_{enc},b_{dec} WencWdecbencbdec

一般来说编码器的结构不局限于只有一个隐藏层的全连接网络,一般来说,编码器和解码器可以是更复杂的模型,分别用 f f f g g g来表示,损失函数可以表示为 L = 1 N ∑ i ∣ ∣ x i − g ( f ( x i ) ) ∣ ∣ 2 2 L=\frac{1}{N}\sum_i {||x_i-g(f(x_i))||_2^2} L=N1ixig(f(xi))22,其中N为样本数量。

通过训练编码器得到数据中的一些有用特征,最常用的一种方式是通过限定 h h h的维度比 x x x的维度小,即 d < n d<n d<n,符合这种条件的编码器称为欠完备自编码器。这种自编码器在一定的条件下可以得到类似于主成分分析(PCA)的效果。使用非线性的编码器和解码器可以得到更强大的效果。

比较容易混淆的一点是:这个自编码器先编码再解码,最后得到的不还是原始输入或者逼近原始输入的东西吗?所以要特别注意,自编码器训练完后,是直接拿输入过一个编码器进行特征提取再放到后面的神经网络里去的,解码器就用不到了,有种GAN的思想。

2.2 正则自编码器

如果编码器的维度大于等于输入的维度 d ≥ n d\ge n dn,那么就被称为过完备自编码器。如果不对过完备自编码器进行一些限制,那么其可能会更倾向于将输入拷贝到输出,从而得不到特征。因此通常会对模型进行一些正则化的约束。

2.2.1 去噪自编码器

去噪自编码器的改进在于在原始输入的基础上加入了一些噪声作为编码器的输入。解码器需要重构出不加噪声的原始输入 x x x,通过施加这个约束,迫使编码器不能简单地学习一个恒等变换,而必须从加噪的数据中提取出有用信息用于恢复原始数据。
具体做法是:随机将输入x的一部分置为0,这样就得到了加入噪声的输入 x δ x_\delta xδ作为编码器的输入,解码器需要重构出不带噪声的数据x,因此损失函数为:
L = 1 N ∑ i = 1 ∣ ∣ x − g ( f ( x δ ) ) ∣ ∣ L=\frac{1}{N}\sum_{i=1}||x-g(f(x_\delta))|| L=N1i=1xg(f(xδ))

2.2.2 稀疏自编码器

在损失函数上加入正则项使得模型学习到有用的特征,比如隐藏层使用Sigmoid激活函数,我们认为神经元的输出接近1时是活跃的,而接近0时是不活跃的,稀疏自编码器就是限制神经元的活跃度来约束模型,尽可能使大多数神经元处于不活跃的状态

定义一个神经元的活跃度为它在所有样本上取值的平均值,用 ρ i ^ \hat{\rho_i} ρi^表示。限制 ρ i ^ = ρ i \hat{\rho_i}=\rho_i ρi<

### 图神经网络 (GNN) 学习资源 对于希望深入了解图神经网络(Graph Neural Networks, GNNs)的学习者来说,有多种高质量的教程、论文和技术博客可以作为参考资料。 #### 论文阅读 一些重要的研究工作奠定了现代GNN的基础。例如,《DeepWalk: Online Learning of Social Representations》探讨了如何通过随机游走的方式捕捉社交网络中的节点特征[^1];《node2vec: Scalable Feature Learning for Networks》则进一步扩展了这一思路,提出了更灵活的方法来生成节点嵌入表示;而《Semi-Supervised Classification with Graph Convolutional Networks》引入了一种基于卷积操作处理图形数据的新框架——GCN(Graph Convolutional Network),它能够有效地利用未标记的数据进行半监督分类任务。 #### 教程视频 除了学术文章外,在线教育平台也提供了许多易于理解的教学材料。比如B站上有一个名为“GNN从入门到精通”的系列课程,该课程由浅入深地讲解了有关GNN的知识点,并配有实际案例分析和编程练习[^3]。 #### 技术文档与笔记整理 为了帮助初学者更好地掌握理论概念并应用于实践当中,“【GNN图神经网络学习小结and笔记汇总”这份总结性的资料非常有价值。这里不仅包含了对核心算法原理详尽解释的文字描述,还有配套代码实现供读者参考学习[^2]。 ```python import torch from torch_geometric.nn import GCNConv class Net(torch.nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = GCNConv(dataset.num_node_features, 16) self.conv2 = GCNConv(16, dataset.num_classes) def forward(self, data): x, edge_index = data.x, data.edge_index x = self.conv1(x, edge_index) x = F.relu(x) x = F.dropout(x, training=self.training) x = self.conv2(x, edge_index) return F.log_softmax(x, dim=1) ``` 上述Python代码片段展示了如何使用PyTorch Geometric库构建简单的两层GCN模型来进行节点分类预测。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

镰刀韭菜

看在我不断努力的份上,支持我吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值