Page 34 - 《软件学报》2024年第4期
P. 34
1612 软件学报 2024 年第 35 卷第 4 期
有自然语言特点的代码特征的影响. 此外还可以发现, REcomp(U)是强 NL 型敏感的, 因为 REcomp(U,NL)在
MRR 上比 REcomp(U)高了 0.2%.
(2) PL 型的有效性
在代码克隆检测任务上, 以 POJ-104 数据集为例, 其结果见表 5, 仅使用 PL 型进行预训练, 即 REcomp
(C/G,-w/o NL), 在 MAP@R 上分别高出基准模型 CodeBERT, GraphCodeBERT 和 UniXcoder 约 7.1%, 3.1%和
0.54%. 并且去掉 PL 型后, REcomp(C/G)的准确率有所下降. 因此可以得出, CodeBERT 和 GraphCodeBERT 是
PL 型敏感的, 即它们会受到具有编程语言特点的代码特征的影响.
表 5 语义代码检索任务上的消融实验的结果 (%)
模型 Ruby JavaScript Go Python Java PHP 平均
REcomp(c) 71.5 64.6 90.4 68.5 69.8 64.1 71.5
-w/o PL 71.7 64.8 90.3 68.4 69.6 63.8 71.4
-w/o NL 67.7 61.9 89.9 67.5 68.1 63.1 69.7
-w/o MCL 67.9 62.0 88.2 67.2 67.6 62.8 69.3
REcomp(G) 75.3 67.5 91.5 71.4 71.8 66.5 74.0
-w/o PL 75.0 67.5 91.2 71.4 71.7 66.5 73.9
-w/o NL 71.7 65.8 90.8 70.7 70.4 66.0 72.6
-w/o MCL 70.3 64.4 89.7 69.2 69.1 64.9 71.3
REcomp(U) 76.4 68.9 91.9 72.6 72.8 67.8 75.1
-w/o PL 76.6 69.9 92.1 72.4 73.2 67.6 75.3
-w/o NL 74.2 68.4 91.5 72.4 72.3 67.6 74.4
-w/o MCL 74.0 68.4 91.5 72.0 72.6 67.6 74.4
在语义代码检索任务上, REcomp 去掉 NL 型正样本的结果如表 6 所示, 即 REcomp 只使用 PL 型正样本进
行预训练 REcomp(C/G/, -w/o NL), 其性能仍然高出基准的 CodeBERT 和 GraphCodeBERT 约 0.4%和 1.3%. 从
NL 型与 PL+NL 组合型的结果比较的角度来验证, 去掉 PL 型组件后, REcomp(C/G)总体性能下降了约 0.1%.
表 6 代码克隆检测(POJ-104)消融实验的 MAP@R(%)结果
REcomp(G) -w/o PL -w/o NL -w/o MCL
88.63 88.54 88.24 85.16
REcomp(U) -w/o PL -w/o NL -w/o MCL
91.91 92.92 91.06 90.52
REcomp(C) -w/o PL -w/o NL -w/o MCL
89.89 89.80 89.75 82.67
(3) PL 与 NL 组合型的有效性
PL 与 NL 组合型的有效性就是本文第 3.4.1 节主要实验的内容, 在第 3.4.1 节中, 已经证实了多模态对比
学习模块(PL 与 NL 组合型)的有效性.
总结: 模型对 PL 型的敏感程度不及 NL 型, NL 型起到了主要作用, 特别是在 REcomp(C/U)中, 去掉 PL
型后, 模型在 Ruby, JavaScript, Go 和 Java 上进一步提升了, 但在 Python 和 PHP 上, 仍是 PL+NL 强于 NL. 总
体来说, 增加 PL 型的 REcomp 的性能都是优于其初始化模型的. 因为初始化模型、编程语言和数据集的不同,
REcomp 对 NL 型和 PL 型正样本的敏感程度不一样, 所以存在少数 PL 型或者 NL 型优于 PL 与 NL 组合型的
现象.
3.4.3 预训练资源对比实验
本文罗列了基准方法中预训练模型在预训练阶段的计算资源的使用详情, 见表 7. 从表 7 中可以看出,
REcomp 仅使用极少的计算资源和小批量训练集就在较短的时间迅速收敛. 因此可以看出, 多模态对比学习
是一种环保、低碳的学习方法, 它通过共享学习和特征融合等方式来减少模型推理和训练的过程, 进而降低
能源消耗和环境压力, 为可持续发展提供了一种新的解决方案.