Page 186 - 《软件学报》2026年第2期
P. 186
张育博 等: 基于依赖感知分层神经网络的代码注释增强方法 665
的局部时序不变和长距离主题注意力特征. Ahmad 等人 [1] 将 Transformer 应用于建模代码 token 之间的成对关系.
Mou 等人 [30] 设计了一种方法, 通过在程序的抽象语法树 (AST) 上使用卷积核来捕捉结构信息. Hu 等人 [2] 提出了
DeepCom, 实现了一种名为 SBT 的新遍历方法, 用于获取结构信息, 同时考虑了通过经典遍历方法获得的序列中
信息丢失问题. Wan 等人 [3] 提出了一种 Hybrid2Seq 方法, 旨在通过在代码的 token 层次和结构层次上融合词汇和
语法信息, 最大化代码序列和结构细节的利用. 类似地, LeClair 等人 [8] 提出了 ast-attendgru, 结合基于代码的词表示
和基于 AST 的结构表示来独立学习结构信息.
随着代码理解领域中预训练和微调模型的流行, 出现了一些具有突破性的进展. 近年来, 一个有影响力的工作
是 BERT [31] , 它利用 Transformer 架构从前后上下文中学习. 基于 BERT 的成功, Kanade 等人 [32] 将其应用于源代码,
提出了 CuBERT, 通过为分词后的源代码生成预训练的上下文嵌入, 而无需显式建模代码特定的信息. 为了有效地
融合多模态数据, CodeBERT [33] 作为首个针对多种编程语言的双模态预训练模型被提出, 通过在训练过程中随机
屏蔽某些词语来增强模型的理解能力. 然而, 这些方法主要将代码片段视为 token 序列, 忽略了代码内部的结构.
GraphCodeBERT [34] 通过利用代码的语义结构并基于数据流学习代码表示来应对这一问题. 与传统的从左到
右的代码生成任务不同, Fried 等人 [35] 提出了 InCoder, 用于处理包含大量随机性的代码编辑任务. 它采用 GPT 架
构, 利用因果屏蔽填充任意左侧和右侧上下文模块, 实现双向上下文填充. Ahmad 等人 [36] 提出了 PLBART, 将
BERT 的双向编码器和 GPT 的单向解码器相结合, 能够在编码器和解码器两侧同时学习, 从而加速并提升下游任
务的性能, 同时增强生成能力. 基于 T5 [25] 的基础, Wang 等人 [37] 提出了 CodeT5, 通过预训练时融入代码结构信息,
使得模型学习更丰富的代码表示, 尤其在理解标识符和关注预测有意义的代码词上有所提升. Gao 等人 [38] 提出了
SG-Trans 方法, 将代码的结构性信息融入 Transformer 模型中. 抽象语法树 (AST) 通常比源代码大得多, 但现有方
法通过直接将整个 AST 提供给编码器, 忽视了这一大小限制. 为解决这个问题, Nagaraj 等人 [39] 提出 AST-MHSA,
利用多头自注意力机制从 AST 中提取重要的语义信息. 从整合外部知识的角度出发, Shahbazi 等人 [40] 提出了
APIContext2Com, 通过结合预定义的应用程序编程接口 (API) 上下文来提高生成摘要的效果. 详细的 API 信息阐
明了代码片段的功能, 帮助更好地生成代码摘要. 关注代码中的额外动作词, Li 等人 [41] 开发了一种方法, 通过额外
的动作词预测模块辅助代码摘要生成, 其中使用动作预测器来预测代码摘要中的主要动作, 并将其作为提示词增
强摘要生成模型的表现. 为了生成类似人工编写的摘要并保留事实细节, Sun 等人 [42] 基于抽取与生成框架实现了
一个代码摘要原型 EACS, 继承了抽取式和生成式方法的优点, 同时规避了它们各自的缺点.
近年来, 大型语言模型 (LLM) 广泛应用于各种与代码相关的任务. 例如, Wang 等人 [43] 提出了 CodeT5+, 它可
以灵活地在仅编码器、仅解码器和编码器-解码器模式中运行, 以适应不同的下游代码应用任务. Meta 公司推出了
基于 LLaMA 2 的代码生成模型 Code LLaMA [12] , 它在开源框架内增强了填充能力, 扩展了长上下文输入能力, 并
具备 zero-shot 编程任务能力. BigCode 社区推出了 StarCoder [13] , 它在 The Stack 数据集上进行训练, 具备 8k 上下
文长度、填充能力, 并通过多查询注意力实现了快速的大批量推理. 结果显示, 相较于其他代码大语言模型, StarCoder
表现出色. 在预训练阶段, DeepSeek [44] 首次尝试通过结合项目级别的代码数据, 显著提升了跨文件的代码生成能
力, 在开源和闭源模型中都实现了最先进的性能. 与这些方法不同, 本文的模型强调函数依赖关系, 而不是将其视
为单纯的字符串, 从而使其能够学习代码的更深层次特征.
2.3 基于代码的自监督预训练
预训练范式通过利用大量可用的文本数据, 使语言模型能够捕捉语言的内在模式、结构和语义. 通过这种方
式, 模型能够更深入地理解语法、句法和上下文. 这种方法在自然语言处理领域得到了广泛应用, 现在也越来越多
地被应用于代码领域.
在预训练中, 一种常见的目标是掩码语言模型 (masked language modeling, MLM) [31] , 该方法通过掩盖序列中
的某些 token, 然后让模型根据上下文信息正确预测这些被掩盖的 token. 基于 MLM, 已经有一些积极的探索, 如掩
盖连续片段 [23] , 在实体或短语级别进行掩码 [45] . 与此不同, Clark 等人 [46] 提出了替换 token 检测 (replaced token
detection, RTD) 预训练目标, 将 token 替换为合理的替代项, 而不是被掩盖. 预训练模型随后预测这些 token 是否

