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 万次.
   27   28   29   30   31   32   33   34   35   36   37