SCRIPT
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
1 Introduction
源代码摘要旨在为编程语言生成简洁、清晰的自然语言描述。写得好的代码摘要有利于程序员参与软件开发和维护过程。为了学习源代码的语义表示,最近的工作重点是将代码的语法结构合并到 Transformer 等神经网络中。
提出问题:
- 目前基于 Transformer 方法的研究工作,仅利用了代码标记之间的顺序相对位置。在本文,我们假设 token 之间的结构相对位置(即 AST 中节点的相对位置)对于学习代码语义也至关重要。
- 首先从源代码的 AST 中提取标记之间的结构相对位置。然后设计两种类型的 Transformer 编码器来生成任务源代码的结构表示。
- 一个 Transformer 根据结构相对位置直接调整输入以增强结构依赖性。
- 另一个基于 Transformer 创新地将结构相对位置纳入自注意力分数的计算中。这样可以进一步增强AST中相近的token之间的依赖关系。
- 两种Transformer的区别在于学习代码结构信息的方式。我们最终将两种类型的 Transformer 编码器堆叠为 SCRIPT 编码器模块。
- 论文代码:https://github.com/GoneZ5/SCRIPT.
2 Proposed Approach
下图展示了 SCRIPT 的整体架构。
- 采用源代码的 tokens 序列和提取的结构信息作为输入。
- 编码器部分由两种类型的 Transformer 编码器组成,包括相对距离加权的 Transformer(Relative Distance Weighted Transformer)和 结构 RPE 感应 Transformer(Structural RPE-induced Transformer),他们帮助模型很好地学习结构相对位置知识。
- 解码器使用带有掩码多头注意力和交叉注意力的原始 Transformer 解码器。最后,通过自回归解码生成相应的输入代码摘要。
A. Relative Distance Weighted Transformer
普通的 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 组成。
B. Structural RPE-Induced Transformer
Self-Attention
Sequential Relative Positional Encoding
提出了一个扩展的 Transformer 模型,该模型考虑输入元素之间的成对关系。在该方法中,他们将顺序相对位置表示添加到 K 和 V 的投影中。他们不仅在计算自注意力分数时考虑标记之间的相对位置关系,而且还在计算上下文向量过程中传播关系。该方法假设相对位置信息在超过一定距离后没有用处。他们将最大相对位置定义为常数 k,并剪裁最大距离以概括模型。详细可以参考 Self-Attention with Relative Position Representations
AST Relative Positional Encoding
尽管顺序相对位置编码可以捕获序列化标记之间的相对位置依赖性,但它忽略了对结构相对位置相关性进行建模。为此,我们再次利用 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 之间的最短路径长度。
Structural RPE-induced Transformer
基于代码语义的不同邻接矩阵来提取多视图图矩阵,这些邻接矩阵是抽象语法矩阵(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 编码器层。
C. SCRIPT Encoder Module
为了利用这两种 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的输出,我们使用简单的位置求和作为聚合。
3 Experiments Setup
A. Baselines
- CODE-NN
- Tree2Seq
- RL+Hybrid2Seq
- DeepCom
- API+Code
- Dual Model
- Transformer
- SiT
B. Evaluation Metrics
- BLEU:是源代码摘要工作中的标准评估指标。 BLEU 可以被认为是一个精度分数:生成的文本有多少出现在参考文本中。在本文中,我们选择 BLEU-4 作为我们的指标。
- ROUGE-L:主要用于 NLP 文献中的文本摘要任务。该分数允许多个参考,因为文本可能有多个正确的摘要。该度量被定义为生成的句子和参考之间的最长公共子序列的长度,并且基于召回分数。 ROUGE-L 可以被认为是召回分数:有多少参考文献出现在生成的文本中。
- METEOR:是机器翻译任务的评估指标,我们将其视为源代码摘要。该指标基于一元精度和召回率的调和平均值,召回率的权重高于精度。 METEOR 可以在句子或片段级别与人类判断产生良好的相关性。
C. Datasets
4 Experimental Results
最后两行是关于前面提到的两个组件的消融研究。我们证明我们的方法比所有基线都更强。
5 Discussion
我们的方法的有效性面临以下三个主要威胁:
- 本文有效性的主要威胁是我们使用的数据集。首先,可能存在一些写得不好的源代码摘要,例如不相关和不可读的摘要。其次,我们没有在其他编程语言(例如 C 和 C#)的数据集上验证 SCRIPT 的有效性。我们将尝试以更多不同的语言构建高质量的数据集,以便在未来的工作中进行评估。
- 我们使用的自动化指标对有效性构成了另一个潜在威胁,因为它们可能无法代表人类判断。 BLEU、ROUGE 和 METEOR 指标可以计算生成的摘要和参考文献之间的文本差异。然而,在某些情况下,模型可能会生成与事实真相不一致的有效摘要,即度量无法真正反映语义相似性。因此,我们额外进行手动评估以减轻威胁。
- 对有效性的另一个威胁是我们没有考虑其他结构相对位置信息,例如数据流图(DFG)和控制流图(CFG)。我们将在未来的工作中尝试利用这些信息来更好地学习代码语义。
6 Conclusion
在本文中,我们提出了一种名为 SCRIPT 的基于 Transformer 的神经方法,它可以很好地学习代码的结构语义以进行源代码摘要。我们在两个新颖的 Transformer 上构建 SCRIPT,它们都利用 AST 相对位置来增强代码标记之间的结构相关性。我们通过大量实验评估了 SCRIPT 的有效性,结果表明我们提出的方法优于竞争基线。未来,我们希望通过将其扩展到更多的代码到文本数据集来评估我们提出的方法 SCRIPT 的有效性。我们计划将我们的方法转移到与源代码表示学习相关的其他任务,例如源代码搜索。