Page 27 - 《软件学报》2021年第11期
P. 27
陶传奇 等:编程现场上下文深度感知的代码行推荐 3353
对推荐结果进行排序,使得开发人员需要的推荐项在 n 个推荐结果中更加靠前的位置.
本文第 1 节介绍本文用到的模型基础,即基于深度学习的自然语言处理所使用的模型和一些重要方法.第 2
节描述本文数据来源及数据处理方法.第 3 节描述编程现场上下文深度感知代码行推荐方法.第 4 节对方法模
型进行实验评估,主要根据设计的问题展示方法的实例化测试结果以及通过问卷调查的形式评估推荐结果的
实用性.第 5 节主要介绍会对本文方法有效性产生影响的一些威胁因素.第 6 节主要介绍相关工作研究现状.文
章最后对本文工作进行总结并展望未来工作.
1 模型基础
本文方法使用深度学习,主要启发性的灵感来自于深度学习在多个领域的成功应用,尤其是自然语言处
理 [11,12] .从软件开发人员角度来看,编程语言和自然语言的差距并不显著.在编程语言(比如 Java)中也有单词(关
键字、变量名)和句子(一条编程语句),并且用单词组成句子同样需要遵循特殊的语法结构.编程语言和自然语
言的这些相似性,意味着自然语言中成功的方法在编程语言中可能也同样适用.
1.1 RNN模型
循环神经网络(recurrent neural networks,简称 RNN)最大的优势是用来处理序列数据 [12] .传统的神经网络模
型,层与层之间是全连接的,每层之间的节点是无连接的.这种结构的神经网络解决问题的能力有限.RNN 的独
特结构,使得一个序列当前的输出与之前的输出相联系.如图 1 所示(左边是使用循环连接绘制的 RNN,右边是
展开的结构图),具体的表现形式为网络会对前面的信息进行记忆并应用于当前输出的计算中,并且隐藏层的输
入不仅包括输入层的输出,还包括上一时刻隐藏层的输出.理论上,RNN 能够对任何长度的序列数据进行处理.
但是在实践中,为了降低复杂性,往往假设当前的状态只与前面的几个状态相关.
Fig.1 Structure of recurrent neural network
图 1 循环神经网络结构图
实际应用中比较有效的序列模型是门控 RNN [12,13] ,包括基于长短期记忆(long short-term memory,简称
LSTM)和基于门控循环单元(gated recurrent unit,简称 GRU)的网络.本文的方法采用 LSTM 结构,下面将会对
LSTM 进行详细介绍.
1.2 LSTM
循环神经网络能够利用已有的序列信息解决实际需要,但需要解决长期依赖问题.这是深层网络在优化阶
段遇到的常见问题.因为深层的结构使得模型缺乏学习到先前信息的能力.
长短期记忆(long short-term memory,简称 LSTM)网络,即 LSTM,是一种特殊的 RNN 类型.LSTM 的特点就
是在 RNN 结构以外添加了各层的阀门节点.单元彼此循环连接,类似于一般循环网络中普通的隐藏单元.阀门
有 3 类:遗忘阀门(forget gate)、输入阀门(input gate)和输出阀门(output gate).这些阀门可以打开或关闭,用于判