DeepAPILearning 论文前半部分解读(1)

概述:

问题:当前API 序列的检索使用的是类似于单此包的形式,缺乏对查询需求的深度理解。
解决:提出DeepAPI模型。它根据自然语言描述,得到api使用序列。它使用了模型RNN。通过将自然语言编码入定长向量,并基于向量内容产生API序列。

1.引入:

使用JDK library 解析XML file 的API 使用序列举例:类名.调用方法
DocumentBuilderFactory.newInstance
DocumentBuilderFactory.newDocumentBuilder
DocumentBuilder.parse
使用不熟悉的软件框架和库四对开发人员来说是一个举足轻重的障碍。很多API方法的使用方法都没有详细文档解释。
人们大多通过搜索引擎查找和发现API。也可以通过开源库进行代码搜索,并获得api序列。但是,这种搜索引擎通常不充分不准确。
有人提出SWIM,来将自然语言翻译成一系列可能的APIs。但是,它的模型是基于单词包的,不能做更深层次的识别。比如,难以区分 convert int to string和convert string to
int.
对此问题,“我们”提出DeepAPI。将API 学习问题转化为机器翻译问题.
采用模型RNN译码-解码机制。根据给定的API序列对语料库(如,<api 序列,注释> )训练语言模型(这种模型可以将短语译码成定长向量,根据向量解码API序列)
用BLEU来衡量,DeepAPI的精确度。

2.序列生成的深度学习

用到深度学习和神经网络机器翻译技术。这些技术是基于Seq2Seq学习,即将一种序列转化成另一种序列,比如,将自然语言序列到API序列。

2.1 语言模型
语言模型是一种关于如何在一种语言中生成句子的概率模型 。它能展示出一个句子在一种语言中出现的可能性。语言模型的目的是估计其词的联合概率 。
公式:(符号与条件概率相似,暂时理解为条件概率)
在这里插入图片描述
解释:
某序列的概率 = 在某t-1个元素的子序列基础上,下一个元素是yt的概率的累乘结果(t=1,……,T)(条件概率的累乘结果)
其中每个元素的条件概率,即
在这里插入图片描述
很难预测。大部分应用使用n-gram 模型 来预测它,即,
在这里插入图片描述
2.2神经语言模型
基于神经网络的语言模型。不同于n-gram 通过定长序列预测一个单词。神经语言模型可以通过前面更长的距离预测一个单词。
论文用到的模型是RNNLM。是一种基于RNN的语言模型。RNN分为三层,输入层,递归隐藏层和输出层。
RNNLM一个一个读取单词,并预测下一可能单词。它计算下一单词的条件概率,用到以下三个步骤:
第一,当前单词可以在输入层中映射为一个向量。
在这里插入图片描述
然后,根据前面生成的隐藏层h(t-1)和当前输入y(t),可以得到当前隐藏层h(t).(隐藏层信息是根据输入动态更新的)
在这里插入图片描述
最后,下一单词y(t+1)的条件概率就可以根据h(t)得到:[括号内表示下标]
在这里插入图片描述
步骤省略公式f()和公式g()的具体运算,以及输入单词的向量化过程。

2.3RNN译码-解码模型
基础神经语言模型的拓展。假设由一种源语言和一种目标语言。
给定源语言句子x,要产生目标语言句子y。为达目的,首先,归纳源词顺序x(1),……,x(Tx)变成定长上下文向量。
在这里插入图片描述
(c 表示,最后的隐藏层计算结果——一个上下文向量)
f()是非线性运算:通过考虑之前的隐藏状态h(t−1),将源语言x(t)中的单词映射到时刻t的隐藏状态h(t)。
产生目标句子y:根据c,和前缀序列,不端预测下一单词y(t),得到目标句子y。
在这里插入图片描述
上述,f 和 p 可以用循环神经网络(递归神经网络)来解释,即,译码RNN和解码RNN。
译码RNN的译码过程与上述相同。
解码RNN 流程:它首先将上下文向量设置为解码器RNN的初始隐藏状态;每次根据解码器RNN的当前隐藏层和上下文向量产生一个单词;用产生的单词更新其隐藏层;直到生成解释词。
(可知,译码RNN和解码RNN的流程类似,区别是:译码RNN 使用的是输入层更新隐藏层而解码RNN使用生成中的结果序列更新隐藏层;译码是单词和“隐藏层”得到向量,而解码是,“隐藏层”和向量得到单词(两个隐藏层是不同的)。

RNN编码器-解码器模型可以被训练以最大化条件对数似然,也就是说,最小化下列目标函数:
在这里插入图片描述
N是训练示例总数;T每个目标序列的长度;cost(it) 是示例 i 中第t个目标单词的成本函数,它被定义为负对数似然:
在这里插入图片描述
θ 表示模型参数(如,神经网络中的权重);
在这里插入图片描述表示实例 i 中给定源序列x(i),根据模型参数θ生成第t个目标词的可能性。
通过使用梯度后代等优化算法对目标函数进行优化,可以估计出最优θ值。

3.RNN编码器-解码器模型 API学习

3.1 RNN编解码器应用于API学习
将用户查询视为源语言,将API序列视为目标语言。
以将英语 read text file 转化成APIs为例:
译码:顺次读取,read,text,file,最后生成了向量c;
解码:生成作为y0;根据c和y0得到隐藏层h1预测出第一个API ,即y1 为FileReader.new; 根据c和y1 得到h2;根据h2得到第二个API,BufferedReader.new;
重复直到结束词。
查询的不同部分对目标序列中的API可能具有不同的重要性。例如,考虑默认编码的sava file in default encoding 和目标API序列File.new FileOutputStream.new FileOutputStream.write FileOutputStream.close。对于目标API File.new。 单词file比default更重要。论文重采用了基于注意力的RNN译码-解码模型,来从输入序列中选择重要部分。不同于使用不变的向量c来得到目标词组,注意力模型为每个目标单词y(j) 定义了独立的c(j) 【打印问题,括号内为下标,不表示函数】,作为所有历史隐藏层的加权和:
在这里插入图片描述

每个
在这里插入图片描述
都是一个在隐藏层h(t)和目标词y(j)之间的权重;而α可以使用另一种神经网络进行建模,并在训练过程中进行学习

3.2 增强RNN编码器-解码器模型与API的重要性
目标序列APIs对编程任务也有不同的重要性。(比如,出现多次的API不能体现编程任务的关键步骤。)但是,典型的RNN译码-解码模型并没体现这种重要性区分。
论文中强化了RNN译码-解码模型以便通过APIs中的个体重要性预测API。“我们”定义了 基于IDF的权重来衡量API重要性:
在这里插入图片描述N为训练集中API序列的总数;
n(yt)为y(t)(API) 出现在训练集中的序列数。
使用IDF后,无处不在的api的权重较低,而不常见的api的权重较高。
论文中使用API权重作为代价函数的惩罚项。
RNN EncoderDecoder模型的新代价函数为:
在这里插入图片描述
λ为IDF权值的惩罚,是经验设置的。

4.DeepAPI: API序列生成的深度学习

包括了一个离线培训阶段和一个在线翻译阶段。在训练阶段,准备一个大规模的带注释的API序列(带有相应自然语言注释的API序列)语料库(用于训练深度学习模型)、RNN编码器-解码器语言模型(如上述第三节)。给定一个与api相关的用户查询,一个API序列排名表可以由语言模型生成。
理论上,此方法可以生成用任何编程语言编写的api。在论文中,将讨论的范围局限于JDK库。

4.1 为标注语料库收集大规模API序列
4.1.2提取注释
(略)
获取API序列时将对象变成所对应的类的方法我还不是很理解。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值