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 利用对比学习对融合了源代码所有抽象层次
   31   32   33   34   35   36   37   38   39   40   41