Page 211 - 《软件学报》2021年第7期
P. 211

陈翔  等:代码注释自动生成方法综述                                                              2129


                 将该问题视为 NMT 问题,其编码器和解码器均基于 RNN.除此之外,他们还实现了质量保证过滤器,该过滤器可
                 以自动识别出难以生成高质量提交消息的代码变更,并直接返回警告信息.Xu 等人                          [64] 针对已有工作忽略了代码
                 结构信息和 OOV 问题,提出了 CODISUM 方法.具体来说,首先,他们从代码变更中抽取代码结构信息和代码语
                 义信息.随后,他们基于上述两类信息源进行联合建模,以更好地学习代码变更的表示.此外,他们使用复制机制
                 对模型进行扩充以缓解 OOV 问题.Jiang 等人          [65] 从数据集质量入手,借助代码语义分析方法对数据集进行预处
                 理,结果表明,上述预处理方法可以有效地提升已有方法                  [46] 的性能.Liu 等人 [66] 提出 ATOM 方法,该方法基于 AST
                 对代码变更进行编码,随后使用了一个混合排序模块,可以用迭代的方式,从已生成的或已检索的提交消息中选
                 取出最为相关的提交消息.
                    Liu 等人 [15] 针对 Pull Request(PR)来生成代码注释.一个 PR 一般包含一个或多个相关代码变更.为了创建一
                 个 PR,开发人员同样需要提供标题和描述,描述中的内容主要包括 PR 的目的和这次 PR 包含的具体变更内容.
                 与代码变更一样,很多项目的 PR 描述经常不包含任何文本.例如,Liu 等人发现在搜集的 1 000 个项目 333 001
                 个 PR 中,超过 34%的 PR 描述中不包含任何文本.他们的方法主要基于 PR 内的提交消息和新增的代码注释,同
                 时,借助指针生成网络(pointer generator network)来缓解 OOV 问题并直接针对 ROUGE 指标进行优化.
                 4.2.2  综合使用其他类型的学习算法
                    除了上述经典的基于编码器-解码器模型的方法,研究人员最近也尝试综合使用其他类型的学习算法(例如
                 图神经网络、强化学习和对偶学习等)来进一步提升性能.
                    一些研究人员考虑使用图神经网络.Shido 等人              [67] 认为代码本身具有结构性,即含有循环和条件分支等结
                 构.但传统的 Tree-LSTM 难以有效处理上述结构,因此他们提出了扩展的 Tree-LSTM.LeClair 等人                  [68] 使用图神
                 经网络(graph neural network,简称 GNN),通过分析 AST 以更好地生成代码注释.具体来说,他们方法的特点是使
                 用 graph2seq 中的基于 GNN 的编码器来对每个函数的 AST 进行建模,同时使用基于 RNN 的编码器对每个函数
                 的代码序列进行建模.Liu 等人        [69] 将多种不同的代码表示方法(例如 AST、控制依赖图和程序依赖图)合并成联
                 合代码属性图(joint code property graph).随后,为了更好地从联合代码属性图中学习代码语义,他们设计了基于
                 检索的增强机制,通过引入外部知识来增强代码语义.最后,他们基于上述联合代码属性图和基于检索的增强机
                 制,设计出一种新的 GNN 模型,以对代码进行编码.
                    一些研究人员考虑使用强化学习.Wan 等人             [70] 提出 Hybrid-DRL 方法,该方法同时考虑了混合代码表示和深
                 度强化学习.在混合代码表示中,他们认为基于序列的 LSTM 可以捕获代码内的序列内容,而基于 AST 的 LSTM
                 则可以捕获代码内的结构信息,因此综合使用这两类 LSTM 可以更好地表示目标代码.随后进一步使用深度强
                 化学习框架(即 actor-critic network)来解决解码时面临的曝光偏差(exposure bias)问题,以获取更好的性能.其中,
                 演员网络(actor network)可以根据当前状态给出预测出的下一个单词的置信度,可以视为局部指导.而评论者网
                 络(critic network)可以根据当前状态的所有可能扩展对奖励价值进行评估,可以视为全局指导.为了更加有效地
                 训练这两个网络,他们使用标准的有监督学习和交叉熵损失来预训练演员网络,同时使用均方损失来预训练评
                 论者网络.随后,基于 BLEU 评测指标的优势奖励(advantage reward)和策略梯度(policy gradient)来训练这两个网
                 络.之后,Wang 等人  [71] 对上述方法进行了扩展.首先使用类型增强的 AST 序列对代码进行表示.然后,使用分层注
                 意力网络(hierarchical attention network)对序列进行编码.
                    一些研究人员借助对偶学习(dual learning),通过利用两个任务之间的对称性,通过互相反馈,以进一步提升
                 模型性能.Chen 等人    [72] 同时关注代码检索和注释生成任务,他们提出了一种框架 BVAE,可以允许代码和自然语
                 言的双向映射.该方法尝试着构建两个 VAEs(variational autoencoders),其中,C-VAE 主要针对代码进行建模,而
                 L-VAE 主要针对注释中的自然语言进行建模.该方法联合训练这两个 VAEs,以学习代码和自然语言的语义向量
                 表示.Ye 等人  [73] 设计了简单、有效的端对端模型,可以同时解决代码检索和代码注释生成任务.其主要引入代码
                 生成任务,并同时借助对偶学习和多任务学习(multi-task learning)以充分利用这些任务之间的内在联系.Wang
                 等人 [74] 同样同时考虑了上述两个任务,他们提出了基于 Transformer 的框架以集成上述两个任务.具体来说,针
                 对代码注释生成,他们借助了演员-评论者网络.在演员网络中,他们基于 Transformer 和 tree-Transformer 的编码
   206   207   208   209   210   211   212   213   214   215   216