基于Transformer和卷积神经网络的代码克隆检测.pdf
《基于Transformer和卷积神经网络的代码克隆检测.pdf》由会员分享,可在线阅读,更多相关《基于Transformer和卷积神经网络的代码克隆检测.pdf(7页珍藏版)》请在咨信网上搜索。
1、2023 年11月郑 州 大 学 学 报(工 学 版)Nov.2023第 44 卷第 6 期Journal of Zhengzhou University(Engineering Science)Vol.44No.6收稿日期:2022-11-05;修订日期:2022-12-03基金项目:“十三五”预研项目(2019333/6152)作者简介:贲可荣(1963),男,江苏海安人,海军工程大学教授,博士,博士生导师,主要从事软件工程、人工智能等方面的研究,E-mail:benkerong08 。引用本文:贲可荣,杨佳辉,张献,等.基于 Transformer 和卷积神经网络的代码克隆检测J.郑州大
2、学学报(工学版),2023,44(6):12-18.(BEN K R,YANG J H,ZHANG X,et al.Code clone detection based on Transformer and conv-olutional neural networkJ.Journal of Zhengzhou University(Engineering Science),2023,44(6):12-18.)文章编号:1671-6833(2023)06-0012-07基于 Transformer 和卷积神经网络的代码克隆检测贲可荣,杨佳辉,张献,赵翀(海军工程大学 电子工程学院,湖北 武汉 4
3、30033)摘要:基于深度学习的代码克隆检测方法往往作用在代码解析的词序列上或是整棵抽象语法树上,使用基于循环神经网络的时间序列模型提取特征,这会遗漏源代码的重要语法语义信息并诱发梯度消失。针对这一问题,提出一种基于 Transformer 和卷积神经网络的代码克隆检测方法(TCCCD)。首先,TCCCD 将源代码表示成抽象语法树,并将抽象语法树切割成语句子树输入给神经网络,其中,语句子树由先序遍历得到的语句结点序列构成,蕴含了代码的结构和层次化信息。其次,在神经网络设计方面,TCCCD 使用 Transformer 的 Encoder 部分提取代码的全局信息,再利用卷积神经网络捕获代码的局部
4、信息。再次,融合 2 个不同网络提取出的特征,学习得到蕴含词法、语法和结构信息的代码向量表示。最后,采用两段代码向量的欧氏距离表征语义关联程度,训练一个分类器检测代码克隆。实验结果表明:在 OJClone 数据集上,精度、召回率、F1 值分别能达到 98.9%、98.1%和 98.5%;在 Big-CloneBench 数据集上,精度、召回率、F1 值分别能达到 99.1%、91.5%和 94.2%。与其他方法对比,精度、召回率、F1值均有提升,所提方法能够有效检测代码克隆。关键词:代码克隆检测;抽象语法树(AST);Transformer;卷积神经网络;代码特征提取中图分类号:TP393文献
5、标志码:Adoi:10.13705/j.issn.1671-6833.2023.03.012代码克隆是软件开发中的常见现象。在软件开发和演化的过程中,程序员通过复制和粘贴代码段,或者使用框架、复用设计模式和自动工具生成代码等方式加速软件开发。以上操作导致代码库中存在2 个及以上相同或相似代码段的现象称为代码克隆1。开源社区中的代码克隆可以提高开发效率,但是也会导致缺陷传播,降低系统的可靠性。代码克隆检测技术目的在于自动检测软件系统中克隆的代码,可以帮助开发人员和管理者及时发现代码克隆造成的缺陷,更好地保证软件质量。根据相似程度的不同,Bellon 等2将代码克隆分为 4 种类型,从 type1
6、 到 type4,代码相似程度逐渐降低,检测难度也逐渐增加。传统的代码克隆检测方法基于人工定义的规则,对专家经验依赖程度较高。基于深度学习的方法能够自动学习出代码的特征,摆脱“特征工程”的难题,减少人工分析成本。Hindle 等3认为编程语言和自然语言一样,具有重复性和可预测性,能够被机器理解和分析。受 Hin-dle 等3工作的启发,许多学者将代码作为自然语言来处理。例如早期的 Nicad 方法4通过对比 2 个代码行中最长相同序列来检测代码克隆,该方法在文本层面进行分析,不能检测 type4 类型的克隆。基于词法的克隆检测中,代码被表示为 token 序列。CClearner5将程序的单词
7、分为 8 种类型,针对每个类型比较 2 个代码片段的词频序列,得到 8 维向量送入神经网络中训练。尽管代码和自然语言有很多共性的特征,都是由一系列单词组成,但是代码具有更清晰的逻辑、丰富且复杂的结构,且标识符之间存在长距离依赖,将代码视作自然语言或者 token 序列进行处理容易丢失信息。抽象语法树(abstract syntax tree,AST)是基于抽象语法结构将源代码转换为树结构的表示形式。研究表明,基于 AST 表征的模型明显优于基于序列表征的模型6-8。CDLH 模型6使用基于树的长短期记 忆 网 络(tree-structured long short-term memory,T
8、ree-LSTM)遍历 AST,为了提高效率,使用特定的哈希函数对代码向量进行哈希处理,比较散列向量之间的汉明距离来识别代码克隆。为了解决子节点数第 6 期贲可荣,等:基于 Transformer 和卷积神经网络的代码克隆检测 13 目可变的问题,将 AST 转换为全二叉树。Zeng 等9基于递归自动编码器(recursive autoencoder,RAE)模型提出了加权递归自编码器(weighted recursive autoencoder,WRAE),利用 WRAE 分析 AST,提取程序特征并将函数编码成向量。该方法在输入之前利用二叉树生成规则将 AST 转换成了完满二叉树。由于程序
9、的复杂性,AST 的结构通常又大又深,尤其是嵌套结构,这样容易产生梯度消失问题,导致AST 丢失从远程节点到根节点携带的一些语义信息。为了简化和提高效率,直接将 AST 视为二叉树或者将 AST 转换为二叉树,这种做法破坏了源代码的原始语法结构,削弱了神经网络模型捕获真实语义的能力。为了克服上述基于 AST 的神经网络的局限性,Zhang 等10提出了 ASTNN,将每个大型的AST 分割成许多语句树序列,在保留原始代码语义的基础上解决了梯度消失问题。词向量训练器将每一个语句树都编码成向量送入双向门控循环单元(bidirectional gated recurrent unit,BiGRU)中
10、,生成代码片段的向量表示。Meng 等11在 ASTNN 模型的基础上进行改进,特征提取阶段用 BiLSTM 替换原本的 BiGRU,新增加一个注意力网络层提取代码特征。在特征提取阶段,现有的大部分模型都使用基于循环神经网络(recurrent neural network,RNN)的时间序列模型。2017 年,谷歌团队12提出了完全基于自注意力的深度学习模型 Transformer。相较于 RNN,自注意力支持高度的并行化,并且还能轻松地实现长期上下文建模。1代码克隆检测方法本文提出一种基于 Transformer 和卷积神经网络(convolutional neural network,C
11、NN)的代码克隆检测(Transformer and CNN based code clone detection,TCCCD)方法。TCCCD 方法的总体架构如图 1 所示。基于 AST 的表征方式能够实现源代码的抽象表示,优于基于 token 的表征方式。为了解决 AST过大带来的梯度消失问题,先将代码解析成 AST,同时保留源代码的语法结构。本文借鉴 ASTNN 切割AST 的思想,将一段代码的 AST 切割为小型语句子树,其中,语句子树由先序遍历得到的语句节点序列构成,蕴含代码结构和层次化信息。每一组语句树通过语句编码器编码成向量,送入神经网络中。在神经网络设计方面,现有的模型大多使用
12、基于 RNN的时间序列模型,当 2 个相关性较大的时刻距离较远时,会产生较大的信息损失。本文使用 Transformer的 Encoder 部分提取代码的全局信息,Transformer能够直接对输入序列之间的更长距离的依赖关系建模。作为补充,使用 CNN 捕获代码的局部信息,学习出蕴含词法、语法和结构信息的代码向量表示。计算两段代码向量的欧氏距离表征语义关联程度,训练一个二元分类器检测代码克隆。图 1TCCCD 的总体架构Figure 1The architecture of TCCCD1.1分割 AST,编码语句树序列首先,面向函数粒度,使用现有的语法分析工具,将代码解析为 AST。为了防
13、止 AST 规模过大而导致梯度消失问题,不能直接将 AST 作为模型的输入,而是按照语句粒度对 AST 进行切割。AST 经过先序遍历,得到语句节点的集合 S,将Method Declaration 视 为 一 种 特 殊 的 语 句 节 点,故S=SMethod Declaration,集合 S中的每一个节点都对应代码中的一条语句。对于嵌套语句 C,C=FuncDef,While,DoWhile,Try,For,If,Switch,定义一系列独立节点 P=block,body。其中,block 用于拆分嵌套语句的头和主体部分;body 用于方法声明。对于所有的语句节点 s,sS,将 s 的后
14、代定义为 D(s)。节点 dD(s),如果 s 和 d 之间存在一条路径通过节点 p,pP,表明节点 d 被节点 s 中的一条语句包含,则称节点 d 为节点 s 的子语句节点。那么,以 s 为根的语句树是由 s 及其所有后代节点D(s)组成。按照语句树的定义,构造函数递归地创建语句树,并将其依次添加到语句树序列中。语句14 郑 州 大 学 学 报(工 学 版)2023 年树序列的顺序蕴含了代码结构的层次化信息。针对分割得到的语句树序列,将每棵语句树编码成向量。首先,经过 Word2Vec 训练符号嵌入向量,得到初始输入;其次,遍历语句树,并递归地将当前节点的符号作为新的输入进行计算,同时计算其
15、叶子节点的隐藏状态。对于非叶子节点来说,以节点 n 为例:vn=WTexn。(1)式中:xn表示节点 n 的 one hot 向量;We表示预训练好的词嵌入矩阵。h=(WTnvn+i1,Chi+bn)。(2)式中:WnRdk表示权重矩阵;C 表示子节点的个数;hi为叶子节点的隐藏状态;bn表示偏置;()为激活函数;h 表示更新后的隐藏状态。由于每棵语句树子节点的个数不一致,计算叶子节点的隐藏状态时,为了利用矩阵运算进行批处理,使用 ST-tree 的动态批处理样本的算法10。如式(3)所示,经过最大池化,可以得到每一个语句树最后的向量表示 et,其中,N 表示语句树的节点个数。et=max h
16、i1,max hi2,max hik,i=1,2,N。(3)1.2Transformer 的 Encoder 捕获全局信息在 RNN 中,由于信息是沿着时刻逐层传递的,因此,当 2 个相关性较大的时刻距离较远时,会产生较大的信息损失。虽然引入了门控机制,如 LSTM、GRU 等,可以部分解决这种长距离依赖问题,但是它们的记忆窗口也是有限的。CNN 善于捕获局部特征,如果想要捕获远距离特征,需要增加网络深度。Transformer 完全基于自注意力,能够直接建模输入 序 列 之 间 更 长 距 离 的 依 赖 关 系。综 合 考 虑Transformer 的性能与参数量,本文使用 Transfo
17、rmer的 Encoder 提取全局的特征。Transformer 的 Encoder 部分捕获全局信息主要包含以下 5 个步骤。步骤 1位置编码。输入为经过词嵌入后的张量,故只需对输入进行位置编码,位置编码的方法为PE(pos,2i)=sin(pos/10 0002i/d);(4)PE(pos,2i+1)=cos(pos/10 0002i/d)。(5)X 表示经过词嵌入后得到的张量,将词嵌入与位置编码相加,可以得到经过位置编码后的输出 Y:Y=X+PE(X);(6)步骤 2将向量 Y 作为输入,送入多层注意力机制层。注意力函数是基于 3 个矩阵(Q、K、V)同时计算的。YAttention=
18、softmax(QKT/dK)V。(7)步骤 3通过残差连接和层归一化,使矩阵运算维数一致。将网络中的隐藏层归一化为标准正态分布,加快模型的训练速度和收敛速度。Y=Y+YAttention;(8)Y=LayerNorm(Y)。(9)步骤 4通过前馈层和 2 个线性映射层,使用激活函数来生成向量 Yhidden。Yhidden=(Linear(Linear(Y)。(10)步骤 5进行残差连接和层归一化,得到最终向量 C1。Yhidden=Yhidden+Y;(11)C1=LayerNorm(Yhidden)。(12)1.3CNN 捕获全局信息根据文献13-15的研究,CNN 和 self-att
19、ention在特征信息的提取上存在差异。self-attention 焦点在全局上下文中决定在哪里投射更多的注意力,而CNN 更多地关注所输入的局部特征信息。不同的模型和结构通常 会学习到不 同的特征16,Trans-former 与 CNN 可以互补17。借鉴 ConvS2S18,选取其中的卷积块结构,利用级联一维卷积获得代码行局部特征信息。如式(13)所示,每个卷积层包括一个一维卷积、一个门控线性 单 元(gated linear unit,GLU)和 一 个 残 差连接。F=Y+GLU(Conv(Y)。(13)式中:Y 表示 CNN 的输入,为经过词嵌入层和位置编码得到的向量,与 Tra
20、nsformer 的 Encoder 共享。Conv 表示一维卷积层,其卷积核大小常设置为 3。最后,为了使卷积层输出的特征向量 C2与上文中的向量 C1具有相同维数,增加一个线性层网络:C2=Linear(F)。(14)1.4融合 Transformer 的 Encoder 和 CNN 学习到的特征将 Transformer 的 Encoder 学习到的全局上下文特征与 CNN 学习到的局部代码特征表示相融合,相比以往的方法大多只用到单个模型学习代码特征,本文方法能充分挖掘代码信息。Z=Concat(C1,C2)。(15)如式(15)所示,通过矩阵连接将 2 个特征向量进行合并,得到代码表示
21、向量 Z,相当于将 CNN 部分嵌入 Transformer 的 Encoder 中,通过设置 layer 的大小,可以实现 Transformer 的 Encoder 部分与 CNN的堆叠。第 6 期贲可荣,等:基于 Transformer 和卷积神经网络的代码克隆检测 15 考虑到不同语句的重要性直观上是不相等的,例如,ForStatement 语句中的 API 调用可能包含更多的函数信息,因此,使用最大池化来捕获最重要的语义。该模型最终生成一个向量 rR2m,它被视为代码片段的向量表示。表 1代码克隆检测数据集Table 1Code clone detection dataset数据集代
22、码段数量真代码克隆对占比/%最长序列长度平均序列长度AST 最大深度AST 平均深度AST 最大节点数AST 平均节点数OJClone7 5006.62 2712446013.21 624192BigCloneBench59 68895.716 2532271929.915 2172061.5计算两段代码向量的相似度经过以上步骤,两段代码分别转换成固定长度的向量表示 r1和 r2,根据 r=r1-r2计算距离,表示两段代码的语义关联程度。经过 sigmoid 函数得到输出 y,y i0,1,将输出 y 作为两段代码的相似性衡量指标。y =sigmoid(x);x =Wor+bo。(16)式中:
23、Wo R2m M为权值矩阵;bo为偏置。二元交叉熵被用作损失函数。Loss=yln y +(1-y)ln(1-y)。(17)对所有参数进行优化,存储训练后的模型。对于新的代码片段,应将其预处理为语句子树序列,然后输入重新加载的模型进行预测。输出 y i是0,1的单个值,因此,预测值 prediction 为prediction=True,y i;False,y i。(18)式中:为阈值。本文实验将 设为 0.510-11。如果相似度阈值高于 0.5,得到预测值为 True,将代码对标识为克隆。2实验与结果分析2.1实验数据与评测指标代码克隆检测使用的数据集包括 OJClone 和BigClon
24、eBench,这 2 个数据集已被许多研究人员用于代码相似性检测和克隆检测6,10-11。OJClone 数据集的标签分为 2 类;BigCloneBench 数据集的标签分为 5 类,分别表示类型 1 至类型 4 的代码克隆,其中类型 3 的代码克隆分为强 3 型和中度 3 型。数据集基础信息如表 1 所示。对于 OJClone 数据集,7 500 个代码段组合可以得到超过 2 800 万个代码对,随机选取 50 000 个代码对构成实验数据集。对于 BigCloneBench,59 688 个代码段组合可以得到超过 600 万个真代码克隆对和超过 26 万个假代码克隆对。随机抽取了 20
25、000 对假代码克隆对,抽取中度 3 型和类型 4 代码克隆对共 20 000 对,类型 1、类型 2 和强 3 型数量较少,均小于 20 000 对,以上全部加入实验数据集中。2 个实验数据集中的数据均以 3 1 1 的比例随机划分为训练集、验证集和测试集。代码克隆检测常使用混淆矩阵来评估模型的性能。所有指标的计算方式为Precision=TPTP+FP;Recall=TPTP+FN;F1=2 Precision RecallPrecision+Recall。(19)式中:Precision 表示精度;Recall 表示召回率;TP 表示被分类系统识别为克隆的克隆对数量;FP 表示被识别为克
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 Transformer 卷积 神经网络 代码 克隆 检测
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【自信****多点】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【自信****多点】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。