论文地址:HELoC:Hierarchical Contrastive Learning of Source Code Representation
HELoC:层级比对学习+GCN编码
Abstract
作者提出一种多层次对比学习模型来学习代码表示,允许网络去预测AST结点层次和学习结点间的层级关系,同时设计了一种新的GNN,残差自注意力图神经网络(RSGNN),使得HELoC能够抓取全局结构信息的同时关注AST的局部嵌入信息。可以使用在很多相关的下游任务上,比如代码分类,克隆检测,代码聚类等。
Introduction
先有的方法很难学习这种多层次的AST结构,特别是结点增加,链接变多,层数变深的情况下
作者提出的HELoC创新如下:
- 对于AST结构的对比学习:采用两个学习目标训练HELoC预测AST节点水平,学习节点之间的三种层次关系,使嵌入空间中AST水平差异较大的节点的表示向量距离更远
- 一个针对AST多层次结构的特定GNN:尽管GNN能够更好的建模AST的局部信息,但是很难有效对很深的树建模长距离依赖,所以用GCN捕捉局部信息,用self-attention捕捉全局信息
Background and Motivation
AST Hierarchy
三种多层次结构:
- 邻居:同一级结点间的拓扑关系
- 相邻层次结构:层次差异为1和3的节点之间的拓扑关系
- 非相邻层次结构:差异大于1的节点之间的拓扑关系
比如下图里面,ABC是邻居,AD是相邻,AE是不相邻
The Limitations of the Existing Work
- 高度依赖标注数据
- 对AST层次结构的学习不足:只关注邻居或相邻结点,对不相邻的拓扑结构没法学
- 语义破碎:比如code2vec和code2seq都把AST降解了,这就导致丢失长距离依赖和破坏了全局语义信息
- 额外的数据工作:像Corder和Contracode虽然语义不破碎,但是对比学习的负代码级样本的方法使得需要大量的程序变换操作,获得这种语义相似的样本并不容易
Proposed Model
Input Representation
把一条路径的嵌入添加到相应的节点嵌入中得到增强结点表征
RSGNN (Residual Self-Attention GNN)
每个RSGNN由两块组成,RSM和GCN
Hierarchical Contrastive Learning
假设图1中的A是锚点,假设三元组样本格式为{anc,pos,neg},可以得到三元组样本{A,B,D}和{A,C,E},那正样本对是<A,B>,<A,C>,负样本对是<A,D>,<A,E>。但其实<A,E>的距离应该比<A,D>的距离更大,由于最初的对比学习目标不足以学习到AST的层次结构,所以提出了两个目标函数,节点层次预测(NEP):预测结点所在的AST级别;结点关系优化(NRO):学习结点间的三元拓扑关系
AST pseudo-label construction:使用DFS算法,根节点标为0,L层结点标记为L
Hierarchy representation learning:对比学习预训练就用了NEP和NRO两个目标函数,前者采用交叉熵损失函数,后者使用三元损失函数,使用联合损失函数来平衡两种损失得到最终的损失函数
具体的损失函数和公式看原文
Applications of The Proposed Model
- 微调,在有监督任务上微调
- 生成代码向量,作为一种特征提取器直接用作模型输入和特定的下游任务中
Experiments
数据集
代码分类
代码克隆检测和代码聚类
消融实验