Comments: 12 pages, SANER 2022
Subjects: Computation and Language (cs.CL); Software Engineering (cs.SE)
Cite as: arXiv:2202.06521 [cs.CL]
(or arXiv:2202.06521v1 [cs.CL] for this version)
https://doi.org/10.48550/arXiv.2202.06521
源代码摘要旨在为编程语言生成简洁、清晰的自然语言描述。写得好的代码摘要有利于程序员参与软件开发和维护过程。为了学习源代码的语义表示,最近的工作重点是将代码的语法结构合并到 Transformer 等神经网络中。
提出问题:
下图展示了 SCRIPT 的整体架构。
普通的 Transformer 编码器最初平等地对待任何 token 之间的关系,并通过训练隐式地学习“真实”关系。如果我们利用 AST 中节点之间的相对距离来显式加权结构依赖性,模型将学习两个 token 之间的程序语义相关性。
直观上,源代码的 AST 中两个 token 之间的距离可以反映程序语义相关性的相关性,即距离与语义相关性成反比。因此,我们引入了 AST 中节点的最短路径长度,它代表了 token 之间的结构相对位置。然后我们构造相对距离加权变换器(RDW-Transformer),如上图 Transformer 编码器的左侧部分所示。
首先,我们将源代码的 AST 视为无向图,因为它对于确保每两个节点在有限距离上的可访问性是必不可少的。然后我们将 AST 中节点之间的最短路径长度视为结构相对位置。我们将 AST 的最短路径长度表示为结构相对位置矩阵 M,如下图 (b) 所示。这样的表示有一个好处,就是位置矩阵 M 可以很容易地集成到 Transformer 中,而无需改变 Transformer 的架构。具体来说,我们将 AST 中令牌 i i i 和令牌 j j j 之间的最短路径长度定义为 s p l ( i , j ) spl(i, j) spl(i,j)。给定源代码片段的 AST,我们将位置矩阵 M 第 i i i 行第 j j j 列的元素 M i j M_{ij} Mij 定义为:
我们认为,源代码的 AST 中两个 token 越接近,它们的语义相关性就越强。然后,我们在对所有非零元素取倒数后对矩阵 M 进行归一化。归一化位置矩阵 M ˉ \bar{M} Mˉ 的公式为:
给定 Transformer 编码器第 n 层的原始输入 H n − 1 H^{n-1} Hn−1,即前一层的输出,我们将结构位置矩阵 M ˉ \bar{M} Mˉ 融合到原始输入中,得到结构距离加权表示为:
其中 σ 指的是sigmoid激活函数, F C n 1 FC_n^1 FCn1 和 F C n 2 FC_n^2 FCn2 指的是Transformer编码器第 n 层中的全连接层。表达式 M ˉ H n − 1 \bar{M}H^{n-1} MˉHn−1 有助于根据 归一化矩阵 M ˉ \bar{M} Mˉ 提供的结构相对位置信息 对 token之间的结构依赖关系进行加权。对于 AST 中越接近的 token,它们之间的依赖关系权重越大,反之亦然。通过这种方式,我们可以直接向 RDW-Transformer 提供 token 之间的程序语义关联。
最后,我们将结构距离加权表示 H n ^ \hat{H^n} Hn^ 合并到原始输入 H n − 1 H^{n-1} Hn−1 中,作为最终输入:
其中 H n H^n Hn 是当前 Transformer 编码器层的输出。每个 Transformer 层 T r a n s f o r m e r n Transformer_n Transformern 都包含一个架构相同的 Transformer 块,该块由多头自注意力 M u l t i A t t n MultiAttn MultiAttn 和前馈网络 F F N FFN FFN 组成。
提出了一个扩展的 Transformer 模型,该模型考虑输入元素之间的成对关系。在该方法中,他们将顺序相对位置表示添加到 K 和 V 的投影中。他们不仅在计算自注意力分数时考虑标记之间的相对位置关系,而且还在计算上下文向量过程中传播关系。该方法假设相对位置信息在超过一定距离后没有用处。他们将最大相对位置定义为常数 k,并剪裁最大距离以概括模型。详细可以参考 Self-Attention with Relative Position Representations
尽管顺序相对位置编码可以捕获序列化标记之间的相对位置依赖性,但它忽略了对结构相对位置相关性进行建模。为此,我们再次利用 AST 中节点的最短路径长度。然后我们解释如何将 AST 相对位置编码到 Transformer 中。
遵循 Sequential Relative Positional Encoding 的想法,将输入序列中 x i x_i xi 和 x j x_j xj 之间的顺序相对位置表示定义为 a i j V , a i j K a_{ij}^V,a_{ij}^K aijV,aijK ,AST中节点 n i n_i ni 和 n j n_j nj 之间的结构相对位置嵌入为 b i j V , b i j K b_{ij}^V,b_{ij}^K bijV,bijK。将顺序和结构相对位置表示添加到 V 的投影中,以将两种类型的相对位置信息传播为:
并将两种类型的相对位置表示添加到 K 的投影钟,以便在计算 e i j e_{ij} eij 时考虑标记之间的相对位置关系:
假设当最短路径长度超过某个阈值时,结构相对位置信息没有用处。因此,我们将最大距离定义为常数 l l l,并引入裁剪操作来限制最大距离。我们将 l + 1 l + 1 l+1 个独特的结构相对位置标签视为:
其中 $d_{ij} $是 AST 中节点 n i n_i ni 和 n j n_j nj 之间的最短路径长度。
基于代码语义的不同邻接矩阵来提取多视图图矩阵,这些邻接矩阵是抽象语法矩阵(Aast)、控制流矩阵(Afl)和数据依赖矩阵(Adp)。我们将其表述为:
其中 α、β、γ 指的是每个代码语义矩阵对应的权重。 A m v A_{mv} Amv 能够掩盖冗余注意力并增强模型的鲁棒性。我们将结构 RPE 诱导的自注意力网络 (SRPEi-SAN) 表述为:
其中 $X = (x_1, …, x_s) $ 表示输入序列的表示,s 表示序列的长度, d k d_k dk 表示每个注意力头的维度。 Q、K 和 V 分别是查询、键和值的投影。
然后我们将 AST 相对位置编码纳入自注意力分数和上下文向量的计算过程中。具体来说,我们将 AST 相对位置表示 b V b_V bV 和 b K b_K bK 分别添加到 V 和 K 中,如下所示:
然后我们将前馈层 F F N FFN FFN 连接到 S R P E i − S A N SRPEi-SAN SRPEi−SAN 的后面来构建 SRPEi-Transformer。通过这种方式,SRPEi-Transformer 可以同时捕获文本和结构相对位置依赖性,以学习源代码的更多信息表示。值得注意的是,我们只为 SRPEi-Transformer 编码器层配备 AST 相对位置编码,而不是其他 Transformer 编码器层。
为了利用这两种 Transformer 编码器,我们引入了 SCRIPT 编码器模块,它是两种类型 Transformer 的堆栈,即 RDW-Transformer 和 SRPEi-Transformer。在编码器模块中,RDW-Transformer 层后面是 SRPEi-Transformer 层,模块的输出 H ˉ \bar{H} Hˉ 是两层输出的组合:
其中 H H H 指的是RDW-Transformer的输出, H ′ H′ H′ 指的是SRPEi-Transformer的输出,我们使用简单的位置求和作为聚合。
最后两行是关于前面提到的两个组件的消融研究。我们证明我们的方法比所有基线都更强。
我们的方法的有效性面临以下三个主要威胁:
在本文中,我们提出了一种名为 SCRIPT 的基于 Transformer 的神经方法,它可以很好地学习代码的结构语义以进行源代码摘要。我们在两个新颖的 Transformer 上构建 SCRIPT,它们都利用 AST 相对位置来增强代码标记之间的结构相关性。我们通过大量实验评估了 SCRIPT 的有效性,结果表明我们提出的方法优于竞争基线。未来,我们希望通过将其扩展到更多的代码到文本数据集来评估我们提出的方法 SCRIPT 的有效性。我们计划将我们的方法转移到与源代码表示学习相关的其他任务,例如源代码搜索。