Page 36 - 《软件学报》2024年第4期
P. 36
1614 软件学报 2024 年第 35 卷第 4 期
样本. 在图 6(a)中, 向量空间的所有点是通过初始化模型 UniXcoder [32] 编码得到的, 相同颜色不同符号的点彼
此距离较远, 如红色虚线区域的紫色向量. 图 6(b)中, REcomp(U)表征的语义向量, 呈现出相同颜色不同符号
的点相互聚拢的趋势, 如红色虚线覆盖区域所示. 因为 PL 型跟原始样本都是编程语言, 而 NL 型是自然语言,
所以圆形点与菱形点的距离比其与三角形点的距离更为接近.
(a) UniXcoder 表征的语义向量 (b) REcomp(U)表征的语义向量
图 6 不同表征方法下的语义向量类别的可视化
根据上述现象得出结论: 经过多模态对比学习预训练任务后, 模型有效地学习到了编程语言 4 个不同抽
象层次的特征的语义等价性. 相比 NL 型(文本级的自然语言注释), 具有编程语言特点的 PL 型与原始样本的
空间距离更为接近, 侧面验证了编程语言与自然语言之间存在语义鸿沟.
3.5 实验环境
研究中涉及的所有实验均基于 PyTorch 框架实现, 通过使用 tree-sitter (https://github.com/tree-sitter/tree-
sitter)、apex 库(https://github.com/NVIDIA/apex)以及 Transformer (https://github.com/huggingface/transformers)
来实现 REcomp. 表 8 给出了微调时, 代码克隆检测和语义代码搜索的超参数和具体的取值, 这些取值基于已
有文献的推荐取值和我们实证研究中的实际性能. 在代码克隆检测任务中输入 1 是源代码, 输入 2 是待检测
代码; 在语义代码检索任务中, 输入 1 是代码, 输入 2 是自然语言. 优化器采用 AdmW, 并且采用了 FP16 混合
精度来加速训练. 此外, 我们根据基准方法的描述重现了这些方法, 并且这些方法的执行结果与原始文献中
的结果接近. 实验运行的计算机的配置信息是: Inter i5-8265U CPU、32 GB 内存的 Tesla V100-SXM2、Linux
操作系统.
表 8 REcomp 涉及的超参数和对应取值
任务(数据集) 模型 训练集大小 测试集大小 输入长度 1 输入长度 2 学习率 训练轮次
代码克隆检测 REcomp 8 16 400 400 1e−5 1
(POJ-104) (C/G/U)
代码克隆检测 REcomp(C/G) 16 32 512 512 2e−5 1
(BigCloneBench) REcomp(U) 16 32 512 512 5e−5 1
REcomp(C) 64 64 256 128 2e−5 8
语义代码检索 REcomp(G) 32 64 256 128 10
(CodeSearchNet) 2e−5
REcomp(U) 64 64 300 64 8e−6 10
4 总 结
大规模编程语言模型的发展, 给代码智能领域带来了机遇和挑战. 本文提出了基于多模态对比学习的预
[2]
训练方法(REcomp), 旨在增强模型代码表征的能力, 并且在公开基准数据集 CodeXGLUE 上验证了其在下
游任务——代码克隆检测和语义代码检索上的有效性. REcomp 利用对比学习对融合了源代码所有抽象层次