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