Page 296 - 《软件学报》2024年第6期
P. 296
2872 软件学报 2024 年第 35 卷第 6 期
词嵌入的维度为 300. 对于无法从 GloVe 初始化的单词, 如代码图中的 CamelCase, 一般先分割成子标记 Camel 和
Case, 再用 GloVe 预训练的子标记嵌入的平均值进行初始化. 在节点层面的匹配模块中, 多视角匹配函数的参数 d ˜
设置为 150. 在图层面的匹配模块中, NTN 中双线性张量网络的切片参数 k 设置为 50.
模型参数设置如下: 损失函数的 margin 值 δ 设为 0.5, batch size 设为 10, 并使用学习率 (learning-rate) 为 0.000 1
的 Adam 优化器 [30] . 为了使模型有更好的泛化能力, dropout 参数值设为 0.1. 我们在深度学习框架 PyTorch 和图神
经网络库 PyTorch_Geometric 上搭建模型, 并在配备有两颗 Nvidia RTX A5000 GPU 的服务器上训练模型. 这些参
数都是在验证集上得出的最好结果, 关键的参数值如表 3 所示.
表 3 参数介绍
关键参数名称 参数数值
图节点词嵌入维度 300
RGCN输出节点维度 100
多视角匹配函数参数 d ˜ 150
神经张量网络切片参数k 50
7
batch size 10
margin 0.5
dropout 0.1
GraphCS 模型的时间复杂度主要取决于节点层面的匹配策略, 即计算公式 (7) 和公式 (8). 假设 M 和 N 分别代
表文本图和代码图的节点个数, d 代表每个节点的维度, d ˜ 代表多视角匹配函数的视角, GraphCS 整体的时间复杂
˜
˜
度为 O(NMd +(N + M)d +(N + M)dd) .
3.3 评价指标
为了进行公平比较, 本文参考以往工作 [22−24] 的惯例, 将测试集的大小设置为 1 000, batch size 设置为 10, 每个
批次中有 100 个候选代码片段. 对于测试数据集中的每一对代码片段和文本描述, 一般将文本描述看作真实查询,
并将对应的代码片段和其他 99 个随机选取的代码片段一起作为代码搜索任务的候选片段. 本文使用信息检索中
常用的两种评价指标平均倒数排名 MRR 和在 k 处的成功率 S @k 来衡量提出的模型和基线模型的性能. 具体来说,
MRR 是一组查询结果 Q 的倒数排名的平均值. FRank 指的是在给定长度的返回结果列表中首次出现符合要求的
结果.
|Q|
1 ∑ 1
MRR = (16)
|Q| FRank q
q=1
其中, FRank q 指的是第 q 次查询的第 1 个命中结果的排名位置, |Q| 是 Q 中的查询数量. 此外, S @k 表示在排名靠
Γ 值为 1, 否则值为 0.
前的 k 个排名结果中存在一个以上正确结果的百分比. 如果查询为真,
|Q|
1 ∑ ( )
S @k = FRank q ⩽ k (17)
|Q|
q=1
对于这两个评价指标, 指标值越高说明代码搜索的结果越好, 也即模型的性能更好, 能够符合实际代码搜索场
景的查询要求.
3.4 基线模型
为了评估提出的模型的有效性, 我们选择了 个基于深度神经网络的先进模型作为基线模型进行比较. 代表
性的中文论文如文献 [7,12,14] 等, 代码未开源不便开展实验与之对比. 考虑的 7 个基线模型如下.
(1) NBoW (neural bag of words)、BiRNN、1D-CNN 和 self-attention 是文献 [23] 提供的 4 种基线模型. NBoW
使用词袋模型嵌入代码令牌, BiRNN 使用 GRU 作为代码序列的编码器, 1D-CNN 使用一维的卷积神经网络表征
输入的代码令牌, self-attention 运用多头注意力机制计算代码序列中 token 的表示. 为了避免过度调优, 一般遵循
作者的原始实验参数设置.