Page 235 - 《软件学报》2021年第7期
P. 235
牛长安 等:基于指针生成网络的代码注释自动生成模型 2153
图 3 显示了将指针生成网络的模型加入到图 2 中的模型后,在相同时刻下进行解码的示意图,从图中可以
看出,加入指针生成网络之后,引入了最终扩展词库概率分布(final extended vocabulary distribution),最终扩展词
库概率分布由两部分组成,一部分是在输出词库中的词(vocabulary word),这些词的概率乘以 p gen 后得到最终概
率分布,如果其也在输入序列中出现的话,还会加上输入序列中该词的注意力权重乘以(1p gen )的概率;另一部分
是扩展出的同时出现在输入输出序列中的 OOV 词(extended word),由于它们不在输出词库中,最终的概率分布
仅为对应的注意力权重乘以(1p gen ).因此,尽管图 2 所示的输出词库的概率分布与图 1 中相同,但在指针生成网
络将其与注意力权重加权相加后得到的最终扩展词库概率分布中,OOV 词“whitelabelwallet”的概率最高,因此,
当前时刻的输出是“whitelabelwallet”而不是“UNK”.由此看出,可以在解码阶段生成 OOV 词是指针生成网络
的一个主要的优势.
最后,通过将 P vocab (w)替换为 P(w),可以使指针生成网络相关参数参与到损失函数的计算中,从而在之后的
优化步骤中对相关参数进行优化.
3 实 验
本节将加入指针生成网络前后的 CodePtr 和 Hybrid-DeepCom 在大型数据集上进行了实验,我们将主要关
注以下 3 个研究问题.
RQ1:加入 Source Encoder 是否可以提升模型的性能?
RQ2:指针生成网络能否解决输出端的 OOV 问题?
RQ3:词库大小对模型性能的影响有什么规律?
我们首先在第 3.1 节介绍实验所使用的数据集以及对数据进行预处理,第 3.2 节介绍实验的模型、环境以
及参数等设置,第 3.3 节介绍评估方法,第 3.4 节给出实验结果并对研究问题进行回答.
3.1 数据集
[6]
本文采用了 Hu 等人 创建的数据集(https://github.com/xing-hu/EMSE-DeepCom),该数据集由 Hu 等人从
GitHub 上收集到的创建于 2015 年~2016 年的 Java 项目组成,为了保证数据集的质量,过滤掉了 10 星以下的项
目.然后从项目中提取到 Java 方法以及对应的 Javadoc,他们依据 Javadoc 的编写规范,提取了其中第 1 句作为该
Java 方法的注释.接着过滤掉了 getter、setter 以及有@Test 等标注的测试方法,因为 Hu 等人认为并没有必要为
这些方法添加注释.同时,为了避免冗余,过滤掉了重载方法,因为重载方法往往都实现了相似的功能.在至此得
到的数据集中,我们分别随机选取了 20 000 份样本作为验证集和测试集,剩下的 445 812 份样本作为训练集.
最后,在输入模型前,为了使 RNN 发挥出更好的性能,需要限制数据集的最大长度,由于源代码在分解前的
长度一定小于等于分解后的长度,因此过滤掉分解后源代码序列长度超过 200 的样本,并且过滤掉注释长度大
于 30 的样本.同时,由于在对结果进行评分时,使用的 BLEU 评分标准需要使用 4-gram,因此也过滤掉了注释长
度小于 4 的样本.
3.2 实验设置
为了对比 CodePtr 和 Hybrid-DeepCom 以及指针生成网络的有效性,我们对 Hybrid-DeepCom、无指针生成
网络的 CodePtr(CodePtr-PGN)和 CodePtr 进行了实验,3 个模型的异同在第 2 节开始既已进行了说明.
考虑到 OOV 问题与词库大小密切相关,我们分别将 3 个模型在词库大小为 5 000、10 000、30 000、50 000
下进行了实验.实验中,最大训练轮数(epoch)为 30 轮,模型将在每 5 000 个 batch 和每轮结束时进行验证,同时使
用了早停法(early stop),最低验证损失如果连续 20 次没有被刷新,则终止训练.验证集上的损失用来表示模型的
泛化能力,训练结束后,验证损失最低的模型为最佳模型,最佳模型将在测试集上进行测试,测试时使用 corpus-
level BLEU、sentence-level BLEU 和 METEOR 这 3 个常用于机器翻译、文本摘要等领域的评分标准进行评估,
评估方法将在第 3.3 节进行介绍.
模型使用开源的 Python 机器学习框架 PyTorch 实现,实验在 NVIDIA GeForce RTX 2080 Ti 上进行,模型相