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  的表示. 为了避免过度调优, 一般遵循
                 作者的原始实验参数设置.
   291   292   293   294   295   296   297   298   299   300   301