[SCI2-AIntelli代码分类]Transformer-based networks over tree structures for code classification
期刊名 | 综合评分 | 中国科学院分区 | 学科领域 | SCI收录 | 是否OA | 录用比例 | 审稿周期 | 近期 文章 | |||
---|---|---|---|---|---|---|---|---|---|---|---|
0924-669X | APPL INTELL | 7.8
| h-index:52 CiteScore:6.60 | 2区 | 大类:计算机科学 小类:计算机:人工智能 | SCI SCIE | No | 较易 | 偏慢,4-8周 | 780498 |
全文总结
这篇论文提出了一种基于Transformer的代码分类器(TBCC),用于处理树状结构的编程语言数据。
研究背景
- 背景介绍: 这篇文章的研究背景是软件工程中的代码分类和相关任务,如代码克隆检测,仍然是一个具有挑战性的问题。由于软件程序中难以捉摸的语法和复杂的语义,现有的传统软件工程方法在语义层面上区分代码片段的功能时仍然存在困难。
- 研究内容: 该问题的研究内容包括探索不同的机器/深度学习技术用于代码分类算法,并提出了一种基于Transformer的神经网络TBCC,以避免传统方法中的梯度消失问题和无法捕捉长距离依赖的问题。
- 文献综述: 该问题的相关工作有:Mou等人提出了TBCNN,一种在树结构上应用卷积计算的深度学习模型,用于C程序的代码分类;Wan等人提出使用强化学习网络从多模态表示中提取源代码的结构特征,以改进代码检索;Wei等人提出了CDLH,一种通过将AST对编码为向量对来测量相似性,从而识别功能代码克隆的模型。
研究方法
这篇论文提出了一种基于Transformer的代码分类器(TBCC)。具体来说:
- Transformer架构: Transformer网络由N个相同的层堆叠而成,每层由两个主要模块组成:多头自注意力块和位置感知的前馈神经网络。每个模块的输出都发送到一个残差网络,然后连接到一个归一化层。
- 自注意力机制: 自注意力机制是一种新颖的方法,通过分配更多的权重来突出序列中的重要元素。通过定义一个通用函数f(⋅)f(⋅)来计算元素之间的相似性得分。
- 多头注意力: 多头注意力是自注意力机制的一种扩展,通过在不同位置上同时捕捉序列输入中的几个重要元素,从而减少序列输入的维度,节省计算资源。
- 位置嵌入和前馈神经网络: 为了弥补Transformer网络忽略输入序列的顺序信息的弱点,应用了位置编码层来产生顺序信息,并使用位置感知的前馈网络进一步处理多头注意力层的输出。
实验设计
- 数据收集: 实验在两个重要的编程语言C和Java上进行,分别使用了OJ系统和BigCloneBench数据集。对于C程序,使用了pycparser解析代码片段生成ASTs;对于Java程序,使用了Antlr解析代码文本生成ASTs。
- 模型训练: 使用Transformer网络对分割后的AST子树序列进行编码,并通过池化层将输出采样为单个向量,最后使用分类器进行下游软件工程任务。
- 评估指标: 使用准确率、精确率、召回率和F1得分来评估模型的性能,并提供了Cohen's kappa值以进一步评估性能。
结果与分析
- 代码分类: 实验结果表明,基于Transformer的模型在代码分类任务中表现优异,TBCC在准确率、精确率、召回率和F1得分上均优于现有的基线方法。
- 代码克隆检测: 在代码克隆检测任务中,TBCC在召回率、F1得分和Cohen's kappa值上也表现出色,特别是在复杂的克隆类型III和IV上达到了最先进的结果。
- 不同代码表示的比较: 通过对比不同代码表示(纯文本、完整AST和分割AST)的效果,发现分割AST能够更好地反映代码片段的语义,从而提高了模型的性能。
结论
这篇论文提出了一种基于Transformer的代码分类器TBCC,并在C程序的代码分类和Java程序的代码克隆检测任务中验证了其有效性。实验结果表明,TBCC在准确率、召回率和F1得分上均优于现有的最先进方法。未来的研究可以进一步优化Transformer网络以减少计算资源消耗。
这篇论文通过引入Transformer网络和分割AST的方法,显著提高了代码分类和克隆检测任务的性能,为软件工程中的代码分析任务提供了新的解决方案。
核心速览
研究背景
- 研究问题:这篇文章要解决的问题是如何在软件工程(SE)中,利用基于Transformer的网络对代码进行分类和克隆检测。传统的SE方法在语义层面上区分代码片段的功能时存在困难,现有的机器学习和深度学习方法在处理代码文本时存在梯度消失问题和难以捕捉长距离依赖的问题。
- 研究难点:该问题的研究难点包括:
- 传统的基于RNN和CNN的方法存在梯度消失问题,无法捕捉长距离依赖。
- 直接遍历抽象语法树(AST)可能会破坏代码片段的结构,导致信息丢失。
- 图结构表示需要通过中间表示(IR)或字节码提取,这可能导致编译失败,限制了在实际应用中使用图表示。
- 相关工作:该问题的研究相关工作有:
- Mou等人提出的TBCNN模型,使用卷积计算处理树结构的AST进行C语言代码分类。
- Wan等人提出的基于强化学习的网络,从混合表示中提取源代码的结构特征以改进代码检索。
- Wei等人提出的CDLH模型,使用树-LSTM编码AST对并测量相似性以识别功能代码克隆。
研究方法
这篇论文提出了TBCC(Transformer-Based Code Classifier),用于解决代码分类和克隆检测问题。具体来说,
AST分割:首先,将深度AST分割成较小的子树,以捕捉代码片段中的重要句法特征。每个子树被解析为一个独立的子树结构。
序列编码:然后,将所有子树序列转换为向量表示。输入代码片段被解析为标准AST,每个标准AST被分割成一组小子树。所有子树序列通过嵌入层转换为向量,记为 Esub-TRi,i∈[1,t]Esub-TRi,i∈[1,t]。
Transformer编码:接下来,使用Transformer层对子树序列进行编码,并计算注意力分数。Transformer层的输出通过池化层采样为一个单一向量,代表完整的代码片段。
分类器:最后,使用分类器进行下游SE任务。对于源代码分类任务,使用Transformer网络将代码片段向量投影到潜在空间,并计算logits值。损失函数为:
L(θ)=−∑i=1N(logexp(xy^)∑c=1Cexp(xc^))L(θ)=−i=1∑N(log∑c=1Cexp(xc^)exp(xy^))
其中,θθ 是模型的可学习参数,yy 是真实标签。
对于代码克隆检测任务,使用相似度计算两个代码片段的L1距离,并使用softmax回归作为多分类器。损失函数为:
L(θ)=−∑i=1N∑k=041{yi=Tk}logp(y=Tk∣x;θ)L(θ)=−i=1∑Nk=0∑41{yi=Tk}logp(y=Tk∣x;θ)
其中,1{⋅}1{⋅} 表示条件,如果标签 yiyi 等于任何克隆类型 TiTi,则返回1,否则返回0。
实验设计
- 数据收集:实验在两个重要的编程语言C和Java上进行。对于C程序,使用开源判题系统(OJ)系统,包含104个不同的编程问题。对于Java代码克隆检测,使用IJaDataset2.0数据集,包含2.5亿行代码片段,手动标记为克隆对和方法级别。
- 数据预处理:从OJ系统中解析出C程序的AST,忽略无法解析或长度小于5行的代码片段。从IJaDataset2.0中提取Java代码片段的克隆对,忽略长度小于5行的代码片段。
- 实验设置:在C语言代码分类任务中,使用OJ系统数据集,包含52,000个方法和104个类别。在Java代码克隆检测任务中,使用IJaDataset2.0数据集,包含8,829个Java文件和635,128个克隆对。
- 参数配置:在Transformer块中,词嵌入大小为300,层数N为2,多头注意力头数为3,前馈网络维度为128,批量大小为64。所有可学习权重和参数使用随机正态分布初始化。
结果与分析
代码分类任务:在OJ系统数据集上,TBCC模型的准确率为97.6%,优于其他基线模型(如LSTM+TEXT为91.2%,TBCNN为94.0%,ASTNN为97.3%)。
代码克隆检测任务:在IJaDataset2.0数据集上,TBCC模型在精度、召回率、F1值和Cohen's kappa值方面均优于其他基线模型。例如,TBCC模型在类型IV克隆上的F1值为0.96,显著高于其他模型。
分割AST的效果:通过消融实验评估了不同代码表示(纯文本、完整AST和分割AST)的效果。结果显示,分割AST可以更好地反映代码片段的语义,TBCC模型在使用分割AST时,代码分类和代码克隆检测任务的性能分别提高了3-6%和1-3%。
总体结论
这篇论文提出了TBCC,一种基于Transformer的新型神经网络模型,用于处理分割后的AST。通过在C语言代码分类和Java代码克隆检测任务上的实验,验证了TBCC模型的有效性和优越性。实验结果表明,TBCC模型在准确率、召回率和F1值方面均优于现有的基线方法,特别是在处理长距离依赖和复杂功能克隆时表现出色。该研究展示了Transformer网络在代码分析任务中的潜力,并为未来的研究提供了新的方向。
论文评价
优点与创新
- 引入Transformer网络:论文首次将Transformer网络应用于代码分类任务,展示了如何通过强大的Transformer网络提高代码分类模型的准确性。
- 统一的管道:提出了一个通用的管道,可以从扁平化的抽象语法树(AST)中提取句法和长距离依赖信息。
- 实验验证:在两个主流编程语言(C和Java)的数据集上进行了广泛的实验,验证了TBCC在不同编程语言上的适用性和有效性。
- 分割AST:通过将深度AST分割成较小的子树,减少了嵌套结构的深度,有助于更细粒度地反映代码的句法知识。
- 长距离依赖信息的捕捉:Transformer网络能够捕捉AST中的大多数长距离依赖信息,这是RNN和CNN面临的主要挑战。
- 公开数据和代码:提供了TBCC的代码和数据集,方便后续研究人员进行复现和扩展。
不足与反思
- 参数调优:由于关注于发现Transformer网络和新的代码表示方法的能力,论文没有专注于调优参数,这可能会影响模型的精度。
- 内存消耗和训练时间:自注意力机制计算的权重矩阵大小为N×NN×N,其中N为输入的长度,这限制了长代码的实验。未来的研究可能会专注于优化Transformer网络以减少计算资源消耗。
- 基线模型复现:由于一些基线模型(如DLC和CDLH)的实验设置未在论文中详细介绍,论文使用其在论文中报告的数字进行比较。尽管收集了这些模型的成功参数,但仍有一些必要的参数缺失,影响了结果的完全复现。
关键问题及回答
问题1:TBCC模型在处理代码分类任务时,如何利用Transformer网络捕捉长距离依赖关系?
TBCC模型通过将深度抽象语法树(AST)分割成较小的子树,从而减少AST的嵌套深度,使其能够在细粒度上反映更多的句法知识。每个子树被解析为一个独立的子树结构,并通过嵌入层转换为向量表示。然后,使用Transformer层对这些子树序列进行编码,并计算注意力分数。Transformer层的输出通过池化层采样为一个单一向量,代表完整的代码片段。由于Transformer网络的自注意力机制,它能够捕捉序列中的长距离依赖关系,避免了传统RNN和CNN中的梯度消失问题。
问题2:在代码克隆检测任务中,TBCC模型如何处理不同类型的克隆,特别是功能克隆?
TBCC模型将代码克隆检测视为一个多分类问题,使用相似度计算两个代码片段的L1距离,并使用softmax回归作为多分类器。具体来说,TBCC模型首先将代码片段转换为向量表示,然后计算两个向量之间的相似度。对于不同类型的克隆(如类型I、II、III和IV),TBCC模型使用softmax回归模型进行分类。特别是对于功能克隆(类型IV),由于其语义相似但词汇和句法不同,TBCC模型通过Transformer网络捕捉长距离依赖关系,从而提高检测精度。实验结果表明,TBCC模型在处理功能克隆时表现出色,F1值达到了0.96,显著高于其他基线模型。
问题3:TBCC模型在实验中如何验证其有效性和优越性?
TBCC模型在两个重要的编程语言C和Java上进行了实验验证。对于C语言代码分类任务,使用开源判题系统(OJ)系统数据集,包含52,000个方法和104个类别。实验结果显示,TBCC模型的准确率为97.6%,优于其他基线模型(如LSTM+TEXT为91.2%,TBCNN为94.0%,ASTNN为97.3%)。对于Java代码克隆检测任务,使用IJaDataset2.0数据集,包含8,829个Java文件和635,128个克隆对。TBCC模型在精度、召回率、F1值和Cohen's kappa值方面均优于其他基线模型。例如,TBCC模型在类型IV克隆上的F1值为0.96,显著高于其他模型。此外,通过消融实验评估了不同代码表示(纯文本、完整AST和分割AST)的效果,结果显示,分割AST可以更好地反映代码片段的语义,TBCC模型在使用分割AST时,代码分类和代码克隆检测任务的性能分别提高了3-6%和1-3%。