[代码分析]小组论文阅读笔记
(题目):《Language-agnostic representation learning of source code from structure and context》
(论文URL):论文地址:https://paperswithcode.com/paper/language-agnostic-representation-learning-of-1
(总结):我们提出了一个新模型:code transformer,它联合学习源代码的上下文和结构。传统上,机器学习模型的设计者主要依赖于结构或上下文。源代码表示自然适合来自自然语言处理(NLP)的模型,例如长期短期记忆网络。另一方面,利用结构表示的模型通常基于图神经网络(GNN)。与以前的方法相比,我们的模型仅使用与语言无感的特征,即可以直接从AST计算的源代码和特征。通过对transformer的自注意力进行改进,将绝对位置信息换成相对位置信息,而相对位置则通过token之间的不同距离(例如AST或个性化PageRank上的最短路径)来推断。为了结合上下文和结构信息,我们将序列中的每个token分配给一个AST节点,方法是选择源代码中包含token的范围最短的AST节点。我们将(子)token嵌入与token的指定AST节点类型以及token化返回的token类型的嵌入串联在一起作为注意力层的输入。除了在这项工作中考虑的所有五种编程语言上获得最先进的单语言代码摘要外,我们还提出了第一个多语言代码摘要模型。结果表明,对来自多种编程语言的非并行数据进行联合训练可以提高所有单个语言的结果,其中最强的收益是在低资源语言上。值得注意的是,仅来自 Context 的多语言训练并没有带来相同的改进,突出了结合 Structure 和 Context 进行代码表示学习的好处。
(附图):
自注意力公式改进,采用相对位置替换绝对位置信息
自注意力公式改进
代码AST结构中节点对的各种距离表示和PPR,通过各种距离得到节点对的相对距离
整体模型图
方法
左:输入代码片段的序列(上下文)和AST(结构)表示。
中心:代码transformer联合利用token序列和抽象语法树来学习源代码的表示形式。除了输入token和节点嵌入之外,该模型还使用token之间的不同距离(例如AST或个性化PageRank上的最短路径)来推断它们的相对位置。输出嵌入可用于下游任务,如代码汇总(右)。
为了结合上下文和结构信息,我们将序列中的每个token分配给一个AST节点,方法是选择源代码中包含token的范围最短的AST节点。我们将(子)token嵌入与token的指定AST节点类型以及token化返回的token类型的嵌入串联在一起。在所有内部节点中,我们只使用与序列中的token相对应的节点作为输入;但是,剩余的内部节点可以由模型使用,因为它们的存在会影响其余AST节点之间的距离。
实验结果:
消融实验:分析指针网络、上下文和结构信息的重要性,实验结果表明在使用指针网络的情况下,上下文和结构信息相结合对模型的提升效果最为明显。
定性分析:
虽然来自同一语言的代码片段往往组合在一起,但不同编程语言之间存在有趣的交集。以parse开头的代码片段主要位于Python和Javascript的交集区域。
示例代码段以parse开始(左)及其与其他语言的最佳嵌入匹配(右)。这两种方法都会解析输入字符串,将其转换为布尔值。尽管它们在语义上非常相似,但它们的方法名称不同;它们在代码transformer编码器中的表示反映了它们的语义相似性。
报告人:匡江玲 20级研究生
评论0