Page 188 - 《软件学报》2026年第2期
P. 188
张育博 等: 基于依赖感知分层神经网络的代码注释增强方法 667
ˆ
ˆ
ˆ H = [h 1 ,...,h l ] = SubEncoder(e( ˆ X i )) (4)
其中, SubEncoder 表示子函数编码器的编码过程, 它采用 12 层的 Transformer 编码器, 且其参数由基于代码的预训
ˆ H 转换为统一的
练语言模型初始化. 此外, 本文在其输出层上添加了一个额外的均值操作层, 并将特征向量序列
∗
′
向量表示 H , 以便它们符合目标函数编码器的表示, 其表示如公式 (5), 其中 H (i = 1,3) 的解释见第 4.3.1 节.
i
1 l ∑
H = ˆ h i (5)
′
l
i=1
(b) 主题感知复制解码器
… … … …
h 1 h 2 h 3 h 4 h 5 h m p v
目标函数编码器 p gate
融合
解码器
X ˆ … … … … … ˆ
X j
X 1
1−p gate
p y
1 1 1 1 j j j … j
h 1 h 2 h 3 … h l h 1 h 2 h 3 h l p topic
ˆ
1 ˆ 1 ˆ 1 ˆ … ˆ 1 ˆ j ˆ j ˆ j … ˆ j h 1 H 1 * <mask> h 1
h 1 h 2 h 3 h l h 1 h 2 h 3 h l
ˆ
h ˆ H 2 ′ X 2 h 2
… 2 目标函数编码器 msp
子函数编码器 子函数编码器 ˆ … … h 3
h l 掩码 H 3 * <mask> …
ˆ
ˆ
ˆ
ˆ x 1 1 ˆ x 2 1 x 3 ˆ 1 … x l ˆ 1 x 1 j x 2 j x 3 j … x l ˆ j … ′ H j X j ˆ h j
(a) 分层编码器 (c) 掩码子函数预测
图 2 DHCS 的整体框架
4.1.2 目标函数编码器
X 作为输入. 它采用与子函数编码器相同的分词工具、结构和参数初
目标函数编码器接收目标函数的源代码
X, 在
始化. 因此, 它可以与子函数编码器共享相同的参数, 从而加速训练收敛. 具体来说, 给定目标函数代码片段
分词和添加特殊 token 后, 本文首先生成一个 token 序列 [x 1 , x 2 ,..., x m ]. 然后, 执行与子函数 ˆ X 编码器相同的操作,
通过嵌入层和编码器获得目标函数的上下文语义表示 H, 具体表示如下:
e(X) = [e(x 1 ),...,e(x m )] = EmbeddingLayer(X) (6)
H = [h 1 ,...,h m ] = TargetEncoder(e(X)) (7)
其中, TargetEncoder 表示目标函数编码器的编码过程. 需要注意的是, 调用的子函数在 X 中仅以函数名称的字符
串形式出现, 这无法完全体现子函数的逻辑或目的. 为了更有效地将子函数包含到目标函数中, 本文采用了以下两
种特征融合方式.
● 合并融合 (Sum-fusion). 将子函数编码器学习的特征向量加到目标函数 X 中相应 token 的嵌入向量上. 以输
入序列 [x 1 , x 2 ,..., x m ] 为例, 如果 x j 对应一个子函数, 那么 x j 的嵌入将按公式 (8) 更新:
( ) ( )
′
e x j ← H +e x j (8)
● 替换融合 (Replace-fusion). 直接将子函数名称对应的 token 嵌入替换为子函数的向量表示, 并将更新后的向
量表示作为输入:
( )
e x j ← H ′ (9)
合并融合的方法能够有效保持目标函数原始的 token 信息, 同时引入子函数的特征表示, 从而更全面地增强
目标函数的表示能力. 相比之下, 替换融合的方法简化了处理流程, 但牺牲了目标函数原始信息的表达能力. 为了
更全面地增强目标函数的表示能力, 最大限度地保留目标函数自身的关键特征 (即同时保持原始 token 信息和引

