【CS224W】(task9)图神经网络的表示能力(更新中!!)

news2025/1/22 20:45:40

note

  • 基于图同构网络(GIN)的图表征网络。为了得到图表征首先需要做节点表征,然后做图读出。GIN中节点表征的计算遵循WL Test算法中节点标签的更新方法,因此它的上界是WL Test算法。
    在图读出中,我们对所有的节点表征(加权,如果用Attention的话)求和,这会造成节点分布信息的丢失。
  • 为了研究图神经网络的表达力问题,产生一个重要模型——图同构模型,Weisfeiler-Lehman测试就是检测两个图是否在拓扑结构上图同构的近似方法;该测试最大的特点是:对每个节点的子树的聚合函数采用的是单射(Injective)的散列函数
    ——由该特点我们可以通过设计一个单射聚合聚合函数来设计与WL一样强大的图卷积网络(同时,图同构网络有强大的图区分能力,适合图分类任务)。

文章目录

  • note
  • 零、Recap部分
  • 一、GIN图同构网络
    • 1.1 WL Graph Kernel
    • 1.2 基于图同构网络(GIN)的图表征网络的实现
      • 1.基于图同构网络的图表征模块(GINGraphRepr Module)
        • 图表征模块运行流程
      • 2.基于图同构网络的节点嵌入模块(GINNodeEmbedding Module)
      • 3.GINConv--图同构卷积层
      • 4.AtomEncoder 与 BondEncoder
    • 1.3 The power of pooling
    • 1.4 dgl中的GIN层代码
  • 二、Expressive of Power GNNs
      • 1.Motivation
      • 2.文章内容
      • 3.背景:Weisfeiler-Lehman Test (WL Test)
        • (1)图同构性测试算法WL Test
          • 背景介绍
          • WL举例说明(以一维为栗子)
      • 第一步:聚合
      • 第二步:标签散列(哈希)
        • 注:怎样的聚合函数是一个单射函数?
      • 第三步:给节点重新打上标签。
      • 第四步:数标签
      • 第五步:判断同构性
        • (2)WL Subtree Kernel图相似性评估(定量化)
      • 4.小结
  • 三、General Tips
  • 附:时间安排
  • Reference

零、Recap部分

一、GIN图同构网络

1.1 WL Graph Kernel

对节点颜色进行更新:
c ( k + 1 ) ( v ) = HASH ⁡ ( c ( k ) ( v ) , { c ( k ) ( u ) } u ∈ N ( v ) ) c^{(k+1)}(v)=\operatorname{HASH}\left(c^{(k)}(v),\left\{c^{(k)}(u)\right\}_{u \in N(v)}\right) c(k+1)(v)=HASH(c(k)(v),{c(k)(u)}uN(v))

1.2 基于图同构网络(GIN)的图表征网络的实现

基于图同构网络的图表征学习主要包含以下两个过程

  1. 首先计算得到节点表征;
  2. 其次对图上各个节点的表征做图池化(Graph Pooling),或称为图读出(Graph Readout),得到图的表征(Graph Representation)。

自顶向下的学习顺序:GIN图表征—>节点表征

1.基于图同构网络的图表征模块(GINGraphRepr Module)

GIN图同构网络模型的构建

  • 能实现判断图同构性的图神经网络需要满足,只在两个节点自身标签一样且它们的邻接节点一样时,图神经网络将这两个节点映射到相同的表征,即映射是单射性的。
  • 可重复集合/多重集(Multisets):元素可重复的集合,元素在集合中没有顺序关系 。一个节点的所有邻接节点是一个可重复集合,一个节点可以有重复的邻接节点,邻接节点没有顺序关系。因此GIN模型中生成节点表征的方法遵循WL Test算法更新节点标签的过程。

在生成节点的表征后仍需要执行图池化(或称为图读出)操作得到图表征,最简单的图读出操作是做求和。由于每一层的节点表征都可能是重要的,因此在图同构网络中,不同层的节点表征在求和后被拼接,其数学定义如下,
h G = CONCAT ( READOUT ( { h v ( k ) ∣ v ∈ G } ) ∣ k = 0 , 1 , ⋯   , K ) h_{G} = \text{CONCAT}(\text{READOUT}\left(\{h_{v}^{(k)}|v\in G\}\right)|k=0,1,\cdots, K) hG=CONCAT(READOUT({hv(k)vG})k=0,1,,K)
采用拼接而不是相加的原因在于不同层节点的表征属于不同的特征空间。未做严格的证明,这样得到的图的表示与WL Subtree Kernel得到的图的表征是等价的。

图表征模块运行流程

(1)首先采用GINNodeEmbedding模块对图上每一个节点做节点嵌入(Node Embedding),得到节点表征;
(2)然后对节点表征做图池化得到图的表征;
(3)最后用一层线性变换对图表征转换为对图的预测。

2.基于图同构网络的节点嵌入模块(GINNodeEmbedding Module)

此节点嵌入模块基于多层GINConv实现结点嵌入的计算。此处我们先忽略GINConv的实现。输入到此节点嵌入模块的节点属性为类别型向量,
在这里插入图片描述

3.GINConv–图同构卷积层

图同构卷积层的数学定义如下:
x i ′ = h Θ ( ( 1 + ϵ ) ⋅ x i + ∑ j ∈ N ( i ) x j ) \mathbf{x}^{\prime}_i = h_{\mathbf{\Theta}} \left( (1 + \epsilon) \cdot \mathbf{x}_i + \sum_{j \in \mathcal{N}(i)} \mathbf{x}_j \right) xi=hΘ (1+ϵ)xi+jN(i)xj

由于输入的边属性为类别型,因此我们需要先将类别型边属性转换为边表征。我们定义的GINConv模块遵循“消息传递、消息聚合、消息更新”这一过程

4.AtomEncoder 与 BondEncoder

由于在当前的例子中,节点(原子)和边(化学键)的属性都为离散值,它们属于不同的空间,无法直接将它们融合在一起。通过嵌入(Embedding),我们可以将节点属性和边属性分别映射到一个新的空间,在这个新的空间中,我们就可以对节点和边进行信息融合

1.3 The power of pooling

  • use element-wise sum pooling, instead of mean-/max-pooling

1.4 dgl中的GIN层代码

dglGINConv层:在这里插入代码片

"""Torch Module for Graph Isomorphism Network layer"""
# pylint: disable= no-member, arguments-differ, invalid-name
import torch as th
from torch import nn

from .... import function as fn
from ....utils import expand_as_pair


class GINConv(nn.Module):
    def __init__(self,
                 apply_func,
                 aggregator_type,
                 init_eps=0,
                 learn_eps=False):
        super(GINConv, self).__init__()
        self.apply_func = apply_func
        self._aggregator_type = aggregator_type
        if aggregator_type == 'sum':
            self._reducer = fn.sum
        elif aggregator_type == 'max':
            self._reducer = fn.max
        elif aggregator_type == 'mean':
            self._reducer = fn.mean
        else:
            raise KeyError('Aggregator type {} not recognized.'.format(aggregator_type))
        # to specify whether eps is trainable or not.
        if learn_eps:
            self.eps = th.nn.Parameter(th.FloatTensor([init_eps]))
        else:
            self.register_buffer('eps', th.FloatTensor([init_eps]))

    def forward(self, graph, feat, edge_weight=None):
        r"""

        Description
        -----------
        Compute Graph Isomorphism Network layer.

        Parameters
        ----------
        graph : DGLGraph
            The graph.
        feat : torch.Tensor or pair of torch.Tensor
            If a torch.Tensor is given, the input feature of shape :math:`(N, D_{in})` where
            :math:`D_{in}` is size of input feature, :math:`N` is the number of nodes.
            If a pair of torch.Tensor is given, the pair must contain two tensors of shape
            :math:`(N_{in}, D_{in})` and :math:`(N_{out}, D_{in})`.
            If ``apply_func`` is not None, :math:`D_{in}` should
            fit the input dimensionality requirement of ``apply_func``.
        edge_weight : torch.Tensor, optional
            Optional tensor on the edge. If given, the convolution will weight
            with regard to the message.

        Returns
        -------
        torch.Tensor
            The output feature of shape :math:`(N, D_{out})` where
            :math:`D_{out}` is the output dimensionality of ``apply_func``.
            If ``apply_func`` is None, :math:`D_{out}` should be the same
            as input dimensionality.
        """
        with graph.local_scope():
            aggregate_fn = fn.copy_src('h', 'm')
            if edge_weight is not None:
                assert edge_weight.shape[0] == graph.number_of_edges()
                graph.edata['_edge_weight'] = edge_weight
                # message function
                aggregate_fn = fn.u_mul_e('h', '_edge_weight', 'm')

            feat_src, feat_dst = expand_as_pair(feat, graph)
            graph.srcdata['h'] = feat_src
            # aggregate function: neighbor info + self info
            graph.update_all(aggregate_fn, self._reducer('m', 'neigh'))
            # self info
            rst = (1 + self.eps) * feat_dst + graph.dstdata['neigh']
            if self.apply_func is not None:
                rst = self.apply_func(rst)
            return rst

二、Expressive of Power GNNs

在这里插入图片描述

提出图同构网络的论文:How Powerful are Graph Neural Networks?

1.Motivation

新的图神经网络的设计大多基于经验性的直觉、启发式的方法和实验性的试错。人们对图神经网络的特性和局限性了解甚少,对图神经网络的表征能力学习的正式分析也很有限。

2.文章内容

  1. (理论上)图神经网络在区分图结构方面最高能达到与WL Test一样的能力。
  2. 确定了邻接节点聚合方法和图池化方法应具备的条件,在这些条件下,所产生的图神经网络能达到与WL Test一样的能力。
  3. 分析过去流行的图神经网络变体(如GCN和GraphSAGE)无法区分一些结构的图。
  4. 开发了一个简单的图神经网络模型–图同构网络(Graph Isomorphism Network, GIN),并证明其分辨同构图的能力和表示图的能力与WL Test相当。

3.背景:Weisfeiler-Lehman Test (WL Test)

(1)图同构性测试算法WL Test

背景介绍

两个图是同构的,意思是两个图拥有一样的拓扑结构,也就是说,我们可以通过重新标记节点从一个图转换到另外一个图。Weisfeiler-Lehman 图的同构性测试算法,简称WL Test,是一种用于测试两个图是否同构的算法。

WL Test 的一维形式,类似于图神经网络中的邻接节点聚合。WL Test
1)迭代地聚合节点及其邻接节点的标签,然后 2)将聚合的标签散列(hash)成新标签,该过程形式化为下方的公式,
L u h ← hash ⁡ ( L u h − 1 + ∑ v ∈ N ( U ) L v h − 1 ) L^{h}_{u} \leftarrow \operatorname{hash}\left(L^{h-1}_{u} + \sum_{v \in \mathcal{N}(U)} L^{h-1}_{v}\right) Luhhash Luh1+vN(U)Lvh1
符号: L u h L^{h}_{u} Luh表示节点 u u u的第 h h h次迭代的标签,第 0 0 0次迭代的标签为节点原始标签。

在迭代过程中,发现两个图之间的节点的标签不同时,就可以确定这两个图是非同构的。需要注意的是节点标签可能的取值只能是有限个数。
在这里插入图片描述

WL举例说明(以一维为栗子)

给定两个图 G G G G ′ G^{\prime} G,每个节点拥有标签(实际中,一些图没有节点标签,我们可以以节点的度作为标签)。

在这里插入图片描述

Weisfeiler-Leman Test 算法通过重复执行以下给节点打标签的过程来实现图是否同构的判断

第一步:聚合

聚合自身与邻接节点的标签得到一串字符串,自身标签与邻接节点的标签中间用,分隔,邻接节点的标签按升序排序。排序的原因在于要保证单射性,即保证输出的结果不因邻接节点的顺序改变而改变。

如下图就是,每个节点有个一个label(此处表示节点的度)。
在这里插入图片描述
如下图,做标签的扩展:做一阶BFS,即只遍历自己的邻居,比如在下图中G中原5号节点变成(5,234),这是因为原(5)节点的一阶邻居有2、3、4。
在这里插入图片描述

第二步:标签散列(哈希)

即标签压缩,将较长的字符串映射到一个简短的标签。
如下图,仅仅是把扩展标签映射成一个新标签,如5,234映射为13
在这里插入图片描述

注:怎样的聚合函数是一个单射函数?

什么是单射函数?

单射指不同的输入值一定会对应到不同的函数值。如果对于每一个y存在最多一个定义域内的x,有f(x)=y,则函数f被称为单射函数。

看一个栗子:

两个节点v1和v2,其中v1的邻接点是1个黄球和1个蓝球,v2的邻接点是2个邻接点是2个黄球和2个蓝球。最常用的聚合函数包含图卷积网络中所使用的均值聚合,以及GraphSAGE中常用的均值聚合或最大值聚合。

(1)如果使用均值聚合或者最大值聚合,聚合后v1的状态是(黄,蓝),而v2的状态也是(黄,蓝),显然它们把本应不同的2个节点映射到了同一个状态,这不满足单射的定义。
(2)如果使用求和函数,v1的状态是(黄,蓝),而v2的状态是(2×黄,2×蓝),也就分开了。
在这里插入图片描述
可以看出WL测试最大的特点是:对每个节点的子树的聚合函数采用的是单射(Injective)的散列函数。

第三步:给节点重新打上标签。

继续一开始的栗子,
在这里插入图片描述

第四步:数标签

如下图,在G网络中,含有1号标签2个,那么第一个数字就是1。这些标签的个数作为整个网络的新特征。
在这里插入图片描述
每重复一次以上的过程,就完成一次节点自身标签与邻接节点标签的聚合。

第五步:判断同构性

当出现两个图相同节点标签的出现次数不一致时,即可判断两个图不相似。如果上述的步骤重复一定的次数后,没有发现有相同节点标签的出现次数不一致的情况,那么我们无法判断两个图是否同构。

当两个节点的 h h h层的标签一样时,表示分别以这两个节点为根节点的WL子树是一致的。WL子树与普通子树不同WL子树包含重复的节点。下图展示了一棵以1节点为根节点高为2的WL子树。

在这里插入图片描述

(2)WL Subtree Kernel图相似性评估(定量化)

此方法来自于Weisfeiler-Lehman Graph Kernels。

  • WL测试不能保证对所有图都有效,特别是对于具有高度对称性的图,如链式图、完全图、环图和星图,它会判断错误
  • WL测试只能判断两个图的相似性,无法衡量图之间的相似性。要衡量两个图的相似性,我们用WL Subtree Kernel方法

Weisfeiler-Lehman Graph Kernels 方法提出用WL子树核衡量图之间相似性。该方法使用WL Test不同迭代中的节点标签计数作为图的表征向量,它具有与WL Test相同的判别能力。在WL Test的第 k k k次迭代中,一个节点的标签代表了以该节点为根的高度为 k k k的子树结构

该方法的思想是用WL Test算法得到节点的多层的标签,然后我们可以分别统计图中各类标签出现的次数,存于一个向量,这个向量可以作为图的表征。两个图的表征向量的内积,即可作为这两个图的相似性估计,内积越大表示相似性越高
在这里插入图片描述

4.小结

大部分空域图神经网络的更新步骤,和WL测试非常类似。就像消息传递网络中归纳的框架,大部分基于空域的图神经网络都可以归结为2个步骤:聚合邻接点信息(aggregate),更新节点信息(combine)。 a v k = Aggregate ⁡ ( { h u k − 1 : u ∈ N ( v ) } ) , h v k = Combine ⁡ ( h v k − 1 , a v k ) a_{v}^{k}=\operatorname{Aggregate}\left(\left\{\boldsymbol{h}_{u}^{k-1}: u \in \mathcal{N}(v)\right\}\right), \boldsymbol{h}_{v}^{k}=\operatorname{Combine}\left(\boldsymbol{h}_{v}^{k-1}, \boldsymbol{a}_{v}^{k}\right) avk=Aggregate({huk1:uN(v)}),hvk=Combine(hvk1,avk)
与WL测试一样,在表达网络结果时,一个节点的表征会由该结点的父结点的子树信息聚合而成。

正如上面提到的栗子中(下图),均值聚合或者最大值聚合把栗子中的v1和v2两个节点映射到了同一个状态(错误),而如果使用求和函数则能正确分开两者状态。WL测试最大的特点是:对每个节点的子树的聚合函数采用的是单射(Injective)的散列函数
——由该特点我们可以通过设计一个单射聚合聚合函数来设计与WL一样强大的图卷积网络(同时,图同构网络有强大的图区分能力,适合图分类任务)。
在这里插入图片描述

三、General Tips

在这里插入图片描述

附:时间安排

任务任务内容截止时间注意事项
2月11日开始
task1图机器学习导论2月14日周二完成
task2图的表示和特征工程2月15、16日周四完成
task3NetworkX工具包实践2月17、18日周六完成
task4图嵌入表示2月19、20日周一完成
task5deepwalk、Node2vec论文精读2月21、22、23、24日周五完成
task6PageRank2月25、26日周日完成
task7标签传播与节点分类2月27、28日周二完成
task8图神经网络基础3月1、2日周四完成
task9图神经网络的表示能力3月3日周五完成
task10图卷积神经网络GCN3月4日周六
task11图神经网络GraphSAGE3月5日周七
task12图神经网络GAT3月6日周一

Reference

[2] CS224W官网:https://web.stanford.edu/class/cs224w/index.html
[3] https://github.com/TommyZihao/zihao_course/tree/main/CS224W
[4] cs224w(图机器学习)2021冬季课程学习笔记11 Theory of Graph Neural Networks

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/386731.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

线程基础复习

线程基础复习 程序:一段静态的代码 进程:正在执行的程序,是操作系统资源分配的最小单位 线程:进程可进一步细分为线程,是进程内部最小的执行单元,是操作系统进行任务调度的最小单元,属于进程 线程与进程的关系 一个进程可以包含多个线程,…

Python3-循环语句

Python3 循环语句 本章节将为大家介绍 Python 循环语句的使用。 Python 中的循环语句有 for 和 while。 Python 循环语句的控制结构图如下所示: while 循环 Python 中 while 语句的一般形式: while 判断条件(condition):执行语句(stat…

Mysql是怎样运行的——B+树索引

💥 前章回顾: 💥 前面我们详细唠叨了InnnoDB数据页的7个组成部分,知道了各个数据页可以组成一个双向链表,而每个数据页中的记录会按照主键值从小到大的顺序组成一个单向链表,每个数据页都会为存储在它里边的…

构建“以客户为中心”的新型商业模式

很难想象一个ERP系统能帮助企业变得更加以客户为中心。然而,如果采用正确的方法,ERP系统确实可以帮助你的企业把客户置于其所有规划、产品开发和运营的中心。 什么是以客户为中心的业务方法? 以客户为中心的业务方法将客户旅程放在每个行动…

图表控件LightningChart.NET 系列教程(九):LightningChart 组件——从工具箱添加至 WPF 项目

LightningChart.NET LightningChart.NET 是一款高性能 WPF 和 Winforms 图表,可以实时可视化多达1万亿个数据点。可有效利用CPU和内存资源,实时监控数据流。同时,LightningChart使用突破性创新技术,以实时优化为前提,大大提升了实…

将字符串生成艺术字pyfiglet.figlet_format

【小白从小学Python、C、Java】【计算机等级考试500强双证书】【Python-数据分析】将字符串生成艺术字pyfiglet.figlet_format选择题以下关于python代码表述错误的一项是?import pyfigletmyText"python"print("【执行】pyfiglet.figlet_format")resultpyf…

第一篇:1.3Inch ISP Screen简介

1.简介官方连接: http://www.lcdwiki.com/zh/1.3inch_IPS_Module我在淘宝买的这款,其驱动IC是st7789,这款的分辨率是相对来说最高的,因此买的时候可能看到比他大的屏幕比这个还便宜.1.1产品介绍1.3寸IPS彩屏,支持 RGB 65K色显示,显示色彩丰富240X240分辨…

Vue2.0开发之——购物车案例-案例说明及导入Header(44)

一 概述 初始项目预览最终项目预览二 案例说明 2.1 初始项目代码结构 2.2 Components组件与项目的对应关系 对应关系: components/Counter:物品数量components/Footer:购物车底部components/Goods:购物车商品components/Header…

第二大脑应用程序Cogito

本文软件是网友 Juijote 推荐; 什么是 Cogito ? 官方号称是 又一个第二大脑应用程序,其实就是一个普通的笔记软件,但既不支持块操作、也不支持双链,更不具备现在流行的白板交互。 先来张官方图片感受一下 安装 在群晖…

Java之反射

反射机制1. Java反射机制的概念1.1 静态&动态语言1.2 反射机制概念1.3 反射机制研究与应用1.4 反射机制的优缺点2. 理解Class类并获取Class实例2.1 Class类介绍2.2 获取Class类的实例2.3 那些类型可以有Class对象?3. 类的加载与CassLoader3.1 Java内存分析3.2 类…

【Azure 架构师学习笔记】-Azure Storage Account(1)-类型简介

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Storage Account】系列。 前言 大数据引起了存储革命, 云计算又为大容量高速存储提供了可能的方案,每个商业云供应商都会提供特殊的云存储。而Azure 对应的云存储则称为存储帐户(Storage accou…

附录4-大事件项目后端-四个模块

目录 1 注册与登陆 1.1 代码 1.2 Bearer token 2 个人中心 3 文章分类 3.1 代码 3.2 添加/更新文章分类确保名称唯一性 3.2.1 两条数据占用 3.2.2 被一条数据同时占用 3.2.3 只有名称被占用 3.2.4 只有别名被占用 4 文章列表 4.1 代码 4.2 筛选文…

电子技术——CMOS反相器

电子技术——CMOS反相器 在本节,我们深入学习CMOS反相器。 电路原理 下图是我们要研究的CMOS反相器的原理图: 下图展示了当输入 vIVDDv_I V_{DD}vI​VDD​ 时的 iD−vDSi_D-v_{DS}iD​−vDS​ 曲线: 我们把 QNQ_NQN​ 当做是驱动源&#…

[AI助力] CS143学习笔记1

CS143, Compilers Lecture01 Course Overview notes 文章目录CS143, Compilers Lecture01 Course Overview notesAI summaryAI notes👇Introduction:Interpreters:Compilers:History:Conclusion:AI flowchart流程图AI flashcards抽认卡AI费曼学习法workflow 总结关于…

Linux 利用 qemu-system-aarch64 实现 x86 机器安装 arm64 的操作系统

文章目录[toc]遇到的问题安装 qemu-system-aarch64创建 aarch64 操作系统准备 aarch64 的 iso 镜像下载 aarch64 的 UEFI 固件创建虚拟磁盘创建虚拟机语言设置时区设置安装来源软件选择磁盘分区Kdump 配置网络配置root 用户密码创建用户安装操作系统遇到的问题 qemu-system-aar…

问题三十五:傅立叶变换——带通滤波

傅里叶变换(Fourier Transform)是一种用于分析信号的数学工具,它将信号分解成若干个不同频率的正弦和余弦函数。在图像处理中,傅里叶变换可以用来分析图像中各个频率的成分,从而进行滤波、增强等操作。 在傅里叶变换中…

电商项目后端框架SpringBoot、MybatisPlus

后端框架基础 1.代码自动生成工具 mybatis-plus &#xff08;1&#xff09;首先需要添加依赖文件 <dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.2</version></dependency><de…

【markdown】markdown语法

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…

亿华通寻路:“氢”能之火,何以燎原?

氢&#xff0c;是能满足人类一切幻想的终极能源。以氢作为燃料的燃料电池&#xff0c;虽然还没有锂电池行业那样风光&#xff0c;但也在新能源战略布局中占有不可撼动的地位。近两年各界玩家跨界入局&#xff0c;更是掀起了持续的投资浪潮。在国内&#xff0c;政策依然是氢能发…

JAVA进阶--->JVM

文章目录JVM--java Virtual MachineJVM当时学习的存在位置JVM概述(什么是JVM)为什么学习JVM&#xff1f;虚拟机JVM作用JVM组成部分类加器作用类加载过程类什么时候会被加载&#xff08;初始化&#xff09;类加载器双亲委派机制打破双亲委派机制运行时数据区1.程序计数器2.本地方…