💻
QMMMS的笔记
博客
  • QMMMS的笔记
  • agent
    • MCP的背景、原理和开发
    • Agent 历史与背景
    • Agentic Workflows
    • 环境检查与基础工具
    • Tool Call
    • 工具与运行时的值
    • temp
    • 处理 Tool Call error
    • trick
  • algorithm
    • 线性结构
    • 二叉树
    • 图
    • 查找
    • 排序
    • 动态规划
    • 优化方法
    • 数学
    • 迁移至Java
  • computer_composition
    • 系统总线
    • 存储器
    • 输入输出系统
    • 计算机的运算方法
    • 指令系统
    • 补充
  • computer_network
    • 引入
    • 应用层
    • 传输层
    • 网络层(数据平面)
    • 网络层(控制平面)
    • 链路层
    • 常见问答
    • 实验
  • database
    • SQL实战
    • 关系代数
    • 数据库设计
    • 规范化
    • 数据库基本概念
    • 查询原理
    • 数据库恢复技术
    • 并发控制
  • dev_tools
    • Git
    • Nginx
    • Spring
    • LangChain
    • PyTorch Cheat Sheet
    • MyBatis
    • MySQL Cheat Sheet
    • MySQL 补充
    • Redis
    • Docker
    • RocketMQ
    • Chrome
  • linux
    • Linux基础命令与使用
    • 文件与权限
    • 文件与目录操作
    • 权限属性高级
    • 命令与文件的查找
    • 文件压缩和打包
    • vim编辑器
    • shell变量
    • 命令补充
    • 数据流重定向
    • 管道命令
    • shell脚本
    • 用户管理
    • 用户间交流
    • 计划任务
    • 进程管理
    • 软件管理
    • 认识系统服务
    • 运维常用命令
    • 常用命令
  • llm
    • 大规模语言模型概述
    • 分布式训练概述
    • 有监督微调概述
    • 强化学习与LLM
    • LLM评估概述
    • 大模型应用
    • 理解大模型
    • 量化
    • 预训练
    • 上下文学习
  • machine_learning
    • 引入
    • 大致正确学习
    • 一致收敛
    • 偏差还是过拟合?
    • 可学习的充要条件
    • 非均匀可学习性
    • 计算复杂性
  • mathematics
    • 概率与统计基础
    • 线性代数基础
  • operating_system
    • 操作系统基本概念
    • 进程和线程
    • 同步,互斥与死锁
    • 内存管理
    • 文件系统
    • I/O系统
    • 保护与安全
    • 《现代操作系统》
  • statistical_learning
    • 统计学习引入
    • 线性回归
    • 分类
    • 重抽样方法
    • 线性模型选择与正则化
    • 非线性模型
    • 基于树的方法
    • 支持向量机
    • 无指导学习
    • 马尔科夫链和蒙托卡罗方法简明理解
    • R语言速查
  • deep_learning
    • basic_concepts
      • 逻辑回归与损失函数
      • 神经网络
      • 正则化、预处理、权重初始化
      • 优化算法
      • 机器学习策略
      • 复习:从计算机视觉的角度
      • 卷积神经网络
      • 深度卷积网络示例
      • 计算机视觉任务
      • 循环神经网络
      • 自然语言处理任务
      • 注意力
      • Transformers 家族
      • 显卡扫盲
      • 强化学习概述
    • semi-supervise
      • 半监督学习简介
      • Consistency Regularization
      • Proxy-label Methods
      • Holistic Methods
      • Generative Models
      • Graph-Based SSL
      • Self-Supervision for SSL
      • Other SSL methods
  • programming
    • cpp
      • STL
      • C++基础
      • 内存管理
      • 面向对象
    • java
      • 环境和介绍
      • 注释
      • String
      • 面向对象思想
      • Object
      • 包
      • 访问权限修饰符
      • 初始化块
      • 接口
      • 内部类
      • 注解
      • 枚举
      • 集合框架
      • List
      • Map
      • 泛型
      • 迭代
      • IO与流
      • 序列化
      • 异常
      • Lambda
      • Stream流
      • Socket
      • 缓冲
      • 命名规范
      • 拆箱装箱
      • 值传递
      • 深拷贝
      • 反射
      • JVM
      • 并发编程基础
    • python
      • 并发编程
      • 环境管理
  • software_engineering
    • basic_concepts
      • 系统分析与设计概述
      • 规划
      • 需求分析与原型设计
      • 项目管理
      • 建模
      • 数据库设计
      • 架构
      • 配置管理
      • 测试管理
      • 安全
      • 编码原则
      • 微服务
      • 补充内容
    • software_testing
      • CMMI基础
      • PPQA与SQA
      • 软件测试基础
      • 黑盒测试
      • 白盒测试
      • 集成测试
      • 系统测试
      • 测开面试补充
由 GitBook 提供支持
在本页
  • Graph Construction
  • Label Propagation
  • Graph Embedding
  • Random Walks
  • Graph Neural Networks
在GitHub上编辑
  1. deep_learning
  2. semi-supervise

Graph-Based SSL

上一页Generative Models下一页Self-Supervision for SSL

最后更新于2个月前

图可以对实体和关系进行建模,能从全局和局部理解系统。

  • 图 G(V,E)G(V,E)G(V,E) 是由 V={x1,…,xn}V=\{x_{1},\ldots,x_{n}\}V={x1​,…,xn​} 点以及 E={eij}i,j=1nE=\{e_{i j}\}_{i,j = 1}^{n}E={eij​}i,j=1n​ 边组成的集合

  • 每个数据点 xix_{i}xi​,无论是有标签的还是无标签的,都表示为图中的一个节点,连接每对节点的边反映了它们的相似性。

  • 图 G 的 n×nn×nn×n 邻接矩阵 AAA 描述了图的结构,每个元素是与每条边相关联的非负权重,如果两个节点 xix_{i}xi​ 和 xjx_{j}xj​没有相互连接,则 Aij=0A_{i j}=0Aij​=0

  • 邻接矩阵 A 可以使用数据点之间的相似性度量得出,也可以从外部数据(如知识图谱)中明确得出

基于图的任务可以大致分为四类:节点分类、链接预测、聚类和可视化。

在本节中,我们将讨论节点分类方法,因为半监督学习的目标是为无标签示例分配标签。节点分类方法可以大致分为两类:

  • 一类是基于附近节点往往具有相同标签的假设,将标签从有标签节点传播到无标签节点的方法

  • 另一类是基于附近节点在向量空间中应该具有相似嵌入的假设,学习节点嵌入,然后在学习到的嵌入上应用分类器的方法

Graph Construction

如何建图?一个有用的图应该反映我们对领域的先验知识,方法包括

  • 全连接图。所有数据对之间都有带权重的边。可以计算图的导数以更新边的权重。计算成本很高

  • 稀疏图。每个节点仅与少数相似节点相连。这些图可以使用原始数据或从经过训练的网络中提取的表示来创建,并进行迭代更新

稀疏图的例子

  • kNN 图,每个节点只与最近邻的 K 个节点连接

  • 获得节点间的边权重 AijA_{ij}Aij​ 的一种方法是使用高斯核函数 Wij=exp⁡{−∥xi−xj∥2/2σ2}W_{ij}=\exp\{-\|x_i - x_j\|^2/2\sigma^2\}Wij​=exp{−∥xi​−xj​∥2/2σ2},其中 σ 是一个超参数

  • 另一种稀疏图是 ϵNN 图,其中如果距离 d(i,j)≤ϵd (i,j)\leq \epsilond(i,j)≤ϵ,则节点 i 和 j 相连

Label Propagation

标签传播 Label Propagation 的主要假设是,同一流形中的数据点很可能具有相同的语义标签。标签传播根据数据流形结构和节点间的相似性,将有标签数据点的标签传播到无标签数据点。

在标签传播中,标记分数 labeling scores 被定义为使损失函数最小化的最优解。损失函数是:

上面的损失函数最优解为

标签分数的计算涉及矩阵求逆操作,而对于大型图来说,这种操作计算量较大。作为替代,另一种迭代方法能够收敛到相同的解:

  1. 从第 1 步重复,直到收敛

另一种类似的标签传播算法中,除了节点 i 从其邻居 j 接收到的贡献,还引入了一个小的自反馈贡献,提供了更稳定的传播过程。此时的损失函数为:

与第一个算法类似,也有计算成本较低的迭代方法:

  1. 重复步骤 1,直至收敛。

尽管迭代方法是标签传播的标准方法,但它输出的结果与最优解并不相同。

Graph Embedding

Graph Embedding 图嵌入这一术语在文献中有两种使用方式:一是在向量空间中表示整个图,二是在向量空间中表示每个单独的节点。我们对学习节点嵌入感兴趣,因为这种表示可用于SSL任务,如节点分类

节点嵌入的目标是将节点编码为低维向量,这些向量能反映节点的位置及其局部邻域结构。这些低维嵌入可被视为将节点编码或投影到一个潜在空间中,在这个潜在空间里的几何关系对应于原始图中的边。基于因式分解的方法,如拉普拉斯特征映射和局部线性嵌入(LLE),都是基于此原理的算法示例,但它们对于大型图存在可扩展性问题

因此,人们提出了其他更具可扩展性的嵌入技术,这些技术利用了现实世界网络的稀疏性。例如,LINE 和 HOPE 试图保留高阶邻近性(例如,给定节点的边权重,以及每对节点的边权重的相似性)。直观地说,这些方法的目标仅仅是为每个节点学习嵌入,使得学习到的嵌入向量近似于图邻近性的某种确定性度量

另一类方法是随机游走及其变体。与基于因式分解的方法使用图邻近性的确定性度量不同,这些方法对嵌入进行优化,使得如果节点在图上的短随机游走中倾向于同时出现,那么它们就具有相似的嵌入,这使得它们在只能部分观察图或者图太大而无法整体测量的情况下特别有用。

Random Walks

评估该损失的成本极高,因为计算分母需要对图的所有节点进行计算。因此,不同的方法使用不同的优化方式来近似损失,例如,DeepWalk 使用层次 softmax 来计算分母,而 node2vec 使用类似于 word2vec 的负采样来近似。

对于 SSL,学习到的嵌入随后可以用作输入,在有标签节点上训练分类器,然后应用于无标签节点。或者,对于基于随机游走的半监督学习,可以在损失的无监督损失中添加一个交叉熵项,以便在有标签节点的节点嵌入之上联合训练分类器。

嵌入是使用监督和无监督损失进行训练的,而分类器仅在监督损失上进行训练

Graph Neural Networks

随机游走的优点包括:结合了局部和高阶邻域信息,并且训练时无需考虑所有节点对。缺点包括:嵌入仅为训练期间看到的节点生成,对于不断更新的图的大规模图来说,无法完全存在内存中,或者在训练后需要泛化到新图的域

为了解决这些问题,许多方法使用基于深度神经网络的图方法。DNGR和 SDNE 通过使用深度自动编码器,首次提出将深度网络应用于图。

最近的一些节点嵌入方法,旨在通过设计依赖于节点局部邻域的函数(而不一定是整个图),来解决随机游走和基于自动编码器方法的主要局限性。与之前讨论的方法不同,图神经网络使用节点特征,例如前一个网络甚至简单统计(如节点度或独热向量)来生成嵌入。这些方法通常被称为卷积方法,因为它们将节点表示为其周围邻居的函数,类似于 CNN。

然后,使用类似于基于随机游走方法的无监督损失来训练权重。对于 SSL,在节点嵌入(即最终隐藏状态)的基础上训练一个分类器,以预测有标签节点的类别标签,然后该分类器可应用于无标签节点进行节点分类。

L=12∑i,j=1nAij(y^i−y^j)2=Y^TLY^\mathcal{L}=\frac{1}{2} \sum_{i, j=1}^{n} A_{i j}\left(\hat{y}_{i}-\hat{y}_{j}\right)^{2}=\hat{Y}^{T} L \hat{Y}L=21​i,j=1∑n​Aij​(y^​i​−y^​j​)2=Y^TLY^

n×Cn×Cn×C 的矩阵 Y^\hat{Y}Y^ ,其中每一行 Y^i\hat{Y}_{i}Y^i​ 是 C 个类别上的概率分布

n×Cn×Cn×C 的矩阵 YYY,包含已标记数据点的标签。如果 xix_{i}xi​ 是已标记数据点,则每一行 YiY_{i}Yi​ 是一个独热向量,否则是零向量

L=D−AL = D - AL=D−A是图的拉普拉斯矩阵(Laplacian Matrix),用于测量图的平滑度,D=∑j=1nAijD=\sum_{j=1}^n A_{ij}D=∑j=1n​Aij​ 是度矩阵(Degree Matrix)

这个损失函数可以看作是一个图拉普拉斯正则化,当具有较大权重 AijA_{ij}Aij​ 的相邻节点被预测为不同的标签时,会产生较大的惩罚

通过定义 n×nn \times nn×n 的概率转移矩阵 P=D−1AP = D^{-1}AP=D−1A,其中 PijP_{ij}Pij​ 表示从节点 i 转移到节点 j 的概率,并将矩阵 P、Y 和 Y^\hat{Y}Y^ 分解为有标注和无标注的子矩阵:

P=(PllPluPulPuu)Y=(YlYu)Y^=(Y^lY^u)P = \begin{pmatrix} P_{ll} & P_{lu} \\ P_{ul} & P_{uu} \end{pmatrix} \quad Y = \begin{pmatrix} Y_l \\ Y_u \end{pmatrix} \quad \hat{Y} = \begin{pmatrix} \hat{Y}_l \\ \hat{Y}_u \end{pmatrix}P=(Pll​Pul​​Plu​Puu​​)Y=(Yl​Yu​​)Y^=(Y^l​Y^u​​)
Y^l=YlY^u=(I−Puu)−1PulYl\begin{align*} \hat{Y}_l&=Y_l\\ \hat{Y}_u&=(I - P_{uu})^{-1}P_{ul}Y_l \end{align*}Y^l​Y^u​​=Yl​=(I−Puu​)−1Pul​Yl​​

之后,标签传播算法的下一步就是利用这些“软标签”来为每个未标注样本确定最终的离散标签。在归一化之后,对于每个未标注样本 xix_ixi​,label(xi)=arg⁡max⁡c Y^u(i,c)\text{label}(x_i) = \arg\max_{c} \ \hat{Y}_u(i, c)label(xi​)=argmaxc​ Y^u​(i,c) ,标签为概率最高的那一类

传播 Y^←PY^\hat{Y} \leftarrow P \hat{Y}Y^←PY^

保留标注数据:Y^l=Yl\hat{Y}_l = Y_lY^l​=Yl​

L=12∑i,j=1nAij∥Y^iDii−Y^jDjj∥2+(1/α−1)∑i=1n∥Y^i−Yi∥2\mathcal{L} = \frac{1}{2}\sum_{i,j = 1}^{n} A_{ij}\left\|\frac{\hat{Y}_i}{\sqrt{D_{ii}}} - \frac{\hat{Y}_j}{\sqrt{D_{jj}}}\right\|^2 + (1/\alpha-1)\sum_{i = 1}^{n} \|\hat{Y}_i - Y_i\|^2L=21​i,j=1∑n​Aij​​Dii​​Y^i​​−Djj​​Y^j​​​2+(1/α−1)i=1∑n​∥Y^i​−Yi​∥2

损失函数中的第一项和第二项分别对应平滑约束和拟合约束。平滑约束使得相邻点之间的标签变化不会太大,而拟合约束则迫使有标签节点的最终标签与其初始值相似。使损失函数最小化的最优解如下,其中 S=D−1/2AD−1/2S = D^{-1/2}AD^{-1/2}S=D−1/2AD−1/2

Y^=(I−αS)−1Y\hat{Y} = (I - \alpha S)^{-1}YY^=(I−αS)−1Y

传播 Y^←αSY^+(1−α)Y\hat{Y} \leftarrow \alpha S\hat{Y} + (1 - \alpha)YY^←αSY^+(1−α)Y

随机游走从一个随机采样的节点 x0∈sample(V)x_0 \in \text{sample}(V)x0​∈sample(V) 开始,然后反复采样一条边以转移到下一个节点 xi+1=sample(N(xi))x_{i + 1} = \text{sample}(\mathcal{N}(x_i))xi+1​=sample(N(xi​)),其中 N(xi)\mathcal{N}(x_i)N(xi​) 是 xix_ixi​ 的邻居节点。得到的随机游走序列 x0→x1→x2→⋯x_0 \to x_1 \to x_2 \to \cdotsx0​→x1​→x2​→⋯ 然后可以传递给 word2vec 算法,目标是将随机游走序列中的每个节点 xix_ixi​ 嵌入到与它的邻居节点在向量空间中接近的位置。

使用大小为 TTT 的上下文窗口,通常定义为 T∈{2,⋯ ,10}T \in \{2, \cdots, 10\}T∈{2,⋯,10},锚节点 xix_ixi​ 的表示会更接近其下一个邻居节点 ${x_{i - T/2}, \cdots, x_i, \cdots, x_{i + T/2}}$ 的嵌入,令 pT(xj∣xi)p_T(x_j|x_i)pT​(xj​∣xi​) 是从 xix_ixi​ 出发的长度为 TTT 的随机游走中访问 xjx_jxj​ 的概率,随机游走方法学习给定节点 xix_ixi​ 的嵌入 ziz_izi​,使得:

pT(xj∣xi)≈eziTzj∑xk∈VeziTzkp_T(x_j|x_i) \approx \frac{e^{z_i^T z_j}}{\sum_{x_k \in V} e^{z_i^T z_k}}pT​(xj​∣xi​)≈∑xk​∈V​eziT​zk​eziT​zj​​

ziTzk{z_i^T z_k}ziT​zk​ 反映了节点嵌入向量之间的相似性。当两个节点在图结构中具有紧密的联系(例如在随机游走中经常相邻出现)时,我们希望它们的嵌入向量在低维空间中也比较相似,即 ziTzk{z_i^T z_k}ziT​zk​ 较大

为了学习这样的嵌入,优化以下损失,其中 RW\mathcal{R}WRW 是生成的长度为 TTT 的随机游走集合:

L=∑(xi,xj)∈RW−log⁡(eziTzj∑xk∈VeziTzk)\mathcal{L} = \sum_{(x_i, x_j) \in \mathcal{R}W} -\log \left( \frac{e^{z_i^T z_j}}{\sum_{x_k \in V} e^{z_i^T z_k}} \right)L=(xi​,xj​)∈RW∑​−log(∑xk​∈V​eziT​zk​eziT​zj​​)

不同方法在随机游走的构建上也有所不同,DeepWalk 在图上使用简单的无偏随机游走,而 node2vec 引入了两个随机游走超参数 ppp 和 qqq,以便在更类似于广度优先搜索或深度优先搜索的游走之间进行平滑插值,超参数 ppp 控制立即重新访问一个节点的可能性,而 qqq 控制重新访问其邻居的可能性

例如,可以引入一个超参数 rrr 来控制给定训练迭代的采样实例,

如果 r<randomr < \text{random}r<random,则从给定随机游走中采样随机对用于无监督损失

如果 r≥randomr \geq \text{random}r≥random,则采样一对具有相同标签的附近有标签节点用于监督损失

为了压缩节点 xix_ixi​ 的局部邻域信息,首先提取一个高维表示 si∈R∣V∣s_i \in \mathbb{R}^{|V|}si​∈R∣V∣,它描述了节点 xix_ixi​ 与图中所有其他节点的邻近程度。然后通过自编码器降维,使用重构损失对其进行训练。训练后,自编码器的低维表示随后被用作 xix_ixi​ 的嵌入。然而,这些方法与随机游走方法存在类似的局限性,输入大小为 ∣V∣|V|∣V∣,对于大型图来说可能极其昂贵,甚至难以处理。

训练过程从初始化第一个隐藏状态 hi0h^0_ihi0​ 开始,使用节点特征 xix_ixi​:hi0←xi,∀xi∈Vh^0_i \leftarrow x_i, \forall x_i \in Vhi0​←xi​,∀xi​∈V

在 KKK 次训练迭代中,在每一步,隐藏状态通过聚合邻居节点的隐藏状态进行更新,使用聚合函数(AGGREGATE)、组合函数(COMBINE)、非线性函数 σ\sigmaσ 和归一化函数(NORMALIZE),如下所示:

最后,节点 xix_ixi​ 的嵌入 ziz_izi​ 是最终的隐藏状态:zi←hiKz_i \leftarrow h_i^Kzi​←hiK​

聚合函数和可训练参数集 Wk,∀k∈[1,K]W^k, \forall k \in [1, K]Wk,∀k∈[1,K] 具体说明了如何聚合局部邻域信息。不同的方法,如 GCN 、GraphSAGE 和 GAT 遵循相同的过程,但主要在聚合、组合和归一化的执行方式上有所不同。