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  信息和引
   183   184   185   186   187   188   189   190   191   192   193