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

牛长安  等:基于指针生成网络的代码注释自动生成模型                                                      2151


                 其中,T x 表示 Source Encoder 的输入序列的长度,output si 、output sj 分别表示 Source Encoder 在 i 和 j 时刻的隐藏
                 状态,score 函数的计算方法使用了文献[20]中的 concat 方法,即
                                              score (s t  1 ,output si ) W  a [s T t  1 ;output si ]  (9)
                     [s t T 1   ;output si ] 表示将 s T t  1   和 output si 进行拼接,W a 为可学习参数.将式(7)中的 output s 分别替换为 output c 和
                                                                                           a
                                                                                       c
                                                                                            .
                 output a ,可以分别得到对于 Code Encoder 和 AST Encoder 的输入序列的注意力权重矩阵 a 和 a 然后将对应的
                                                                                       t
                                                                                           t
                 编码器的全部隐藏状态的注意力权重加权平均,得到各自的上下文向量,然后再将这些上下文向量相加,得到最
                 终的上下文向量 c t ,即
                                                                    a a
                                                c   t   s T  a h   ti i   s  s  c T  a h   ti i   c c  a T  a h  (10)
                                                                    ti i
                                                   i  1  i  1  i  1
                                                                                           s
                                                                                                   a
                                                                                               c
                 其中,T s 、T c 、T a 分别表示 Source Encoder、Code Encoder 和 AST Encoder 的输入序列的长度, h 、 h 、h 分别
                                                                                           i
                                                                                                   i
                                                                                               i
                 为 3 个编码器在 i 时刻的隐藏状态.通过将 c t 与当前解码器的状态 s t 拼接起来,再经过维度映射和激活之后,就
                 得到了 Attention 机制下的解码器状态 ˆ . s
                                                t
                                                     ˆ s   tanh(Wc s                                (11)
                                                             [ ; ])
                                                     t       c  t  t
                 其中,W c 为可学习参数,[c t ;s t ]为两个向量的拼接,tanh 为双曲正切激活函数.得到 ˆ s 后,将公式(6)中的 s t 替换为 ˆ , s
                                                                                t                      t
                 即可得到 Attention 机制下每个单词的输出概率.
                    引入 Attention 机制后的 seq2seq 模型虽然可以使解码器关注到输入序列中的每个元素,但是仍然没有解决
                 输出序列中的 OOV 问题,图 2 所示为在只有 seq2seq 和 Attention 机制下进行代码注释自动生成任务的示意图,
                 这里,为了表示简便,只显示 Source Encoder 一个编码器.可以看到,解码器当前正在生成“the”之后的输出,由于
                 词库大小的限制,变量名“whitelabelwallet”(已预处理为小写)在词库中被裁剪掉了,因此生成注释时,对于目标序
                 列中“whitelabelwallet”单词出现的地方,尽管 Attention 机制对于源代码中的单词“whitelabelwallet”分配的注意
                 力权重很大,但是由于其是 OOV 词,模型只能生成“UNK”标签,这样就极大地降低了注释的准确性和可读性,
                 针对这一问题,我们引入了指针生成网络.






















                                Fig.2    Seq2seq model with Attention is still unable to generate OOV words
                                  图 2   引入了 Attention 机制的 seq2seq 模型仍然无法生成 OOV 词
                 2.6    指针生成网络
                    为了解决生成式文本摘要(abstractive text summarization)任务中,模型无法从源文本中复制内容的缺点,See
   228   229   230   231   232   233   234   235   236   237   238