Page 32 - 《软件学报》2021年第11期
P. 32
3358 Journal of Software 软件学报 Vol.32, No.11, November 2021
Fig.6 A sample of RNN Encoder-Decoder model applied to code lines
图 6 RNN 编码-解码模型应用于代码行的示例
解码器 RNN 要根据向量 c 来计算得到目标序列 string=string+string.trim(⋅)+“stringValue”.目标序列的开头,
被人为的添加一个开始标记〈START〉.在解码时,它被首先计算得到第 1 个单词 y 0 ,然后,基于上下文向量 c 和 y 0 ,
计算得到隐藏状态 h 1 ,并根据该状态预测代码行中第 1 个单词 string.然后根据前一个单词向量 y 1 和上下文向量
c 计算下一个隐藏状态 h 2 ,并预测代码行中第 2 个单词“=”.该过程一直重复,直到预测得到目标序列的结束标记
〈EOS〉,该标记是在数据处理阶段人为地添加在目标序列的结尾的.
已有的代码行上文中的不同部分,对产生目标序列(即当前代码行)的重要性是不同的.比如,代码行上下文
String string=“stringValue” for (String string: list〈String〉)和当前代码行 string=string+string.trim(⋅)+“stringValue”
比较而言,单词 String 比单词 for 对得到目标序列中的单词 string 具有更大的影响.因此在本文的方法中,我们采
用基于注意力的 RNN 编码器-解码器模型,它能够从输入序列中选择对目标序列中当前单词最重要的部分.不
同于使用相同上下文向量 c 生成目标序列,注意力模型对目标序列中每个单词 y j 使用不同的向量 c j .该向量的计
算方式如下:
x T
j ∑
c = a h (1)
jt t
t= 1
a jt 是隐藏状态 h t 对目标序列中单词 y j 的权重值,该值不需要单独计算,而是可以利用另一种神经网络进行模型
化,并在训练过程中学习到 [11] .
3.2 训练方法模型
基于注意力的循环神经网络编码-解码模型在实际应用中有很多不同的实现方法,我们使用第 1 节描述的
长短期记忆网络.作为一种性能较好的 RNN 具体应用,它在很多的实际任务中取得了较好的效果 [16,17] .本文按
照如下描述构建模型:在解码器中,使用两个 RNN 分别接收是源语句的正向和逆向语句,生成的上下文向量连
[7]
接到解码器 .解码部分使用了 attention 模型,通过上下文向量和每个时刻的上一时刻输出进行解码,进而得到
最终的预测代码行.所有 RNN 都有 1 000 个隐藏单元,词嵌入的维度设置为 120 维 [18] .因为数据集规模很大,为
了更好地对模型进行训练,本文限制词汇表大小为词频最高的 10 000 词.同时,为了兼顾效果和效率,所有模型
都使用小批量随机梯度下降算法(MBGD)来进行参数优化 [19] ,该算法自动调整学习速率.批量大小(即每批次的
实例数)设置为 100.
具体实现时,本文使用 TensorFlow,这是一个 Google 的开源的深度学习框架 [14] .该框架功能强大,并且已经
实现了大部分深度学习算法和参数优化方法.整个训练过程持续约 240 小时,并重复 100 万次.