一种面向语法树解码器的代码生成方法

文档序号:26003369发布日期:2021-07-23 21:21阅读:128来源:国知局
一种面向语法树解码器的代码生成方法

本发明涉及代码生成技术领域,尤其涉及一种面向语法树解码器的代码生成方法。



背景技术:

随着神经网络技术的发展,利用自然语言与其他符号编写的描述规范,自动生成可执行文件编程语言的源代码成为了可能。其中语法树解码器的实现,现有方法主要依靠递归神经网络(rnn)编码器,再到seq2seq模型,再到cnn,模型既能学习到长序列的长短期记忆,又能捕获到描述规范中更多的特征。而随着描述规范语义的加深,逻辑的复杂,导致cnn的加深,基于语法的结构cnn解码器在训练中出现了梯度消失与退化等问题,导致难以拟合复杂逻辑的代码生成场景。

目前语法树解码解决方案,主要依靠循环神经网络(rnn)编码器与卷积神经网络(cnn)编码器。rnn能解决长时依赖问题,而真实场景存在一个程序包含比自然语言句子更多的标记,于是运用多个cnn基于树的卷积和预卷积,能有效地捕获不同位置的特征。但还存在复杂逻辑程序的场景,因此特征需要加深cnn,随身网络变得越来越深,一个新的问题出现了:当梯度信息经过许多层时,便就会消失及发生退化的现象。

如申请号为cn202010468473.x的专利公开了一种代码生成方法、装置、设备及存储介质,具体实现方案为,在第一语言环境下编写第一业务逻辑的代码,所述第一业务逻辑的代码用于描述第一业务逻辑对应的功能,其中,所述第一业务逻辑的代码是按照预设的声明式应用程序接口api的描述方式进行编写的,编写完成后得到第一具体语法树;基于预定的语法分析算法,将所述第一具体语法树转换为第一抽象语法树;通过解释器将所述第一抽象语法树转换为第二语言代码,所述第二语言代码用于执行所述第一业务逻辑对应的功能。利用该申请方案虽然能够实现对目标代码的动态描述,但是不能减少参数的数量且也不能缓解网络加深带来的梯度消失问题。



技术实现要素:

本发明的目的在于克服现有技术的不足,提供一种面向语法树解码器的代码生成方法,方法直接将所有层连接起来,保留前向传播的特性,每个层从前面的所有层获得附加输入,并将其自身的特征映射传递到所有后续层。

本发明的目的是通过以下技术方案来实现的:

一种面向语法树解码器的代码生成方法,包括以下步骤:

步骤一:将数据通过编码器解析生成ast,在ast结构上应用滑动窗口提取出ast结构特征,并对ast进行深层次节点进行遍历,获得ast中子父节点及兄弟节点的顺序关系;

步骤二:在ast中加入多层连接,设计稠密网络块结构,利用稠密连接方法对深层卷积网络进行训练形成稠密的卷积神经网络;

步骤三:设计过渡层结构,将设计的过渡层加入稠密的卷积神经网络中并进行卷积和池化操作,对稠密的卷积神经网络进行优化,输出特征图,生成代码。

具体的,所述步骤一具体包括以下子步骤:

s101,利用编码器生成ast表示代码语法结构,并根据语法逻辑生成相应的节点层级关系;

s102,构建一个具有固定深度的局部特征检测器,在ast上应用滑动窗口提取结构特征;

s103,构建预遍历cnn模块,将预遍历cnn模块应用到要生成节点的根节点,对ast的深层次节点进行遍历,捕获不同ast中不同位置的信息,获得ast中子父节点及兄弟节点的顺序关系。

具体的,所述步骤二具体包括以下子步骤:

s201,构建具有l层卷积神经网络,每层网络均进行一个非线性变换是层的编号;

s202,在l层卷积神经网络中任何层以直接连接的方式连接所有后续层,第层接收所有前面的层x0,…,特征图作为输入,利用稠密连接方法对深层卷积网络进行训练形成稠密的卷积神经网络。

具体的,所述步骤三具体包括以下子步骤:

s301,设计过渡层结构,过渡层结构由batchnormalization层、1x1卷积层和2x2平均池化层组成;

s302,设稠密的卷积神经网络每个稠密块接收的特征图数量为m个,设置一个范围在(0,1]区间的压缩率θ,将每个稠密块接收的特征图数量控制为θ*m个;

s303,使用1x1卷积操作对特征图进行降采样,代替3x3卷积输入特征图的数量进行降维;

s304,利用2x2平均池化层在featuremap上以窗口的形式进行滑动,取滑动窗口内的平均值作为结果进行降采样,对稠密的卷积神经网络进行优化,输出特征图,生成代码。

具体的,所述子步骤s102具体包括以下子步骤:

s1021,假设节点ni有一个父节点pi和一个祖先节点gi,向量表示为ni,pi,gi;

s1022,基于ast的局部特征检测器利用特征提取公式分别提取结构特征特征提取公式如下式所示:其中,w(ast)为基于树卷积的核。

具体的,方法还包括特征共享机制的设计过程,具体包括:在denseblock中,基于cnn核权重进行特征共享,采用复用前层网络特征作为输入,denseblock中各个层的特征图在保证大小一致的条件下在通道维度上连接,所有denseblock中各个层进行卷积之后均输出k个特征图。

本发明的有益效果:本发明确保了网络中各层之间的最大信息流,创建了从前面层到后续层的短路径,随着程序逻辑的复杂,语法树解码器的网络加深,梯度消失问题得到缓解,能捕获到更多的特征。同时本发明在语法树解码中缩短各个网络层的连接,增加各个网络层的连接,缓解了网络加深带来的梯度消失问题,增强特征传播,促进特征共享,有效的减少了参数的数量。

附图说明

图1是本发明的方法流程图。

图2是本发明的树卷积结构图。

图3是本发明的稠密网络结构图。

图4是本发明的过渡层结构图。

具体实施方式

为了对本发明的技术特征、目的和效果有更加清楚的理解,现对照附图说明本发明的具体实施方式。

本实施例中,如图1所示,一种面向语法树解码器的代码生成方法,包括以下步骤:

步骤一:将数据通过编码器解析生成ast,在ast结构上应用滑动窗口提取出ast结构特征,并对ast进行深层次节点进行遍历,获得ast中子父节点及兄弟节点的顺序关系;

步骤二:在ast中加入多层连接,设计稠密网络块结构,利用稠密连接方法对深层卷积网络进行训练形成稠密的卷积神经网络;

步骤三:设计过渡层结构,将设计的过渡层加入稠密的卷积神经网络中并进行卷积和池化操作,对稠密的卷积神经网络进行优化,输出特征图,生成代码。

本发明的实施例中,具体代码生成过程包括以下流程:

s1,树卷积与预遍历卷积。由于ast解码器将使用self-attention机制,因此需要表示使用语法规则的位置。首先采用等式pb,i[2j+1]=sin((i+b)/(100002j/d))中的位置嵌入,表示何时在序列r1,...,rp中使用规则。位置嵌入用p1(r),...,pp(r)表示。但是,这种位置嵌入不能捕获ast中规则的位置。因此通过深度嵌入进一步对此类信息进行编码。如果通过规则r扩展符号α:α→β1···βk,将通过其父节点即α表示规则的深度。通过这种方式,将查找表深度嵌入的另一序列d1,...,dp与使用的语法规则r1,...,rp的序列相关联。经过编码器生成了抽象语法树(ast)表示代码语法结构,根据逻辑生成相应的节点层级关系。随着逻辑的复杂,节点层级关系随之增加,在解码器参与的解码过程中变得异常难以实现与训练,例如“灾难性遗忘”问题。本次解码器中加入基于树的卷积思想(tree-cnn),借鉴了层分类器。树卷积神经网络由节点构成,和数据结构中的树一样,每个节点都有自己的id、父亲(parent)及孩子(children),网络(net,卷积神经网络),lt(labeltransform,每个节点所对应的标签,对于根节点和枝节点来说,可以是对最终分类类别的一种划分,对于叶节点来说,就是最终的分类类别),其中最顶部为树的根节点。结构见图2,具体的设计一个固定深度的局部特征检测器,在树上滑动提取结构特征。假设节点ni有一个父节点pi和一个祖先节点gi,向量表示为ni,pi,gi。基于树的cnn提取特征的计算:

w(ast)为基于树卷积的核,并为顶层两层没有父级或祖先级的填充特殊token,基于语法的生成通过应用特定规则一次性获取所有同级。根据节点得到概率值分布,分为三种情况:

(1)当输出概率中最大概率大于设置的阈值,那就说明该类别和该位置对应的子节点有很大的关系,因此将该类别加到该子节点上。

(2)若输出概率中有多个概率值大于设置的阈值,就联合多个子节点来共同组成新的子节点。

(3)如果所有的输出概率值都小于阈值,那么就为新类别增加新的子节点,这个节点是一个叶节点。

然后设计另一个cnn模块-预遍历卷积,用于对深层次节点进行遍历抽象树(ast),为增强“自回归”,将预遍历cnn模块应用到要生成节点的祖先,因此网络知道在哪里生成到某个步骤。将两类的卷积思想结合来捕获不同的信息,树卷积思想实现相邻节点信息融合,而预遍历卷积思想实现抽象树(ast)子父节点及兄弟节点的顺序关系对应。

s2,稠密块结构设计。单纯依赖基于树的卷积拥有更深的窗口,不考虑同级信息,但随着深度的增长,卷积计算变得难以处理。考虑将树卷积与预遍历卷积加入多层连接,利用稠密连接思想优化深层卷积网络难以训练问题。具体通过一个卷积神经网络,这个网络有l层,每层实现一个非线性变换是层的编号,可以是批量归一化的复合函数(例如batchnormalization),rectified线性单元(relu),池化或者卷积,作为层的输出。为了进一步改善层之间的信息流,引入从任何层到所有后续层的直接连接,第层接收所有前面的层x0,…,特征图作为输入:

其中是指在层0,...,中产生的特征图的拼接。图3所示即为一个稠密网络块结构,图中一共可以看到5层网络,其中最左上方是输入层(inputlayer),剩下4层是隐藏层(hiddenlayer)。输入层会输出数据,隐藏层会输出特征图(featuremap)。对于每个隐层来说,之前的所有层的输出会作为本层输入的一部分。从图3可以看到,每个隐藏层都会产生4个特征图,稠密网络把每个隐藏层都称为一个稠密块(denseblock),而隐藏层产生的特征图的数量被定义为生长率(growthrate),用小写字母k表示,每个隐层产生4个特征图就是k=4。从上面我们知道,稠密网络的每一层需要处理的输入数据非常多,不仅有来自于输入层的数据,还有之前的每个隐层的特征图。例如对于图1中的最右下角的隐层,它不仅要接收输入层数据,还要接收前面3个隐层产生的一共12个特征图。这样将树卷积与预遍历卷积当作子操作嵌入到稠密块中,从而运用稠密连接思想训练。但这存在两个问题,第一是特征图的数量太多,第二是每个特征图的大小也不一致。

s3,过渡层结构设计。接下来针对denseblock中两个问题进行优化。在同一个denseblock中要求featuresize保持相同大小,引用串联操作,如图4所示,denseblock之间加入过渡层,并对它们做卷积和池化,具体由batchnormalization层和1x1卷积层,2x2平均层组成。首先,对于特征图的数量问题,我们可以设置一个在(0,1]区间的压缩率θ,原来每个稠密块(denseblock)有m个特征图,现在只接收其中θ*m个特征图。其次,对于特征图的大小问题,使用1x1卷积操作对特征图进行降采样(downsampling),代替3x3卷积输入特征图的数量从而得到了减少,达到降维的目的;除此之外,2x2平均池化层在featuremap上以窗口的形式进行滑动,操作为取窗口内的平均值作为结果,经过操作后,featuremap同样达到降采样目的。而池化层所串联的网络结构参数示意如下列部分代码所示。

[denseblock]

batch_normalize=1filters=32size=1stride=1pad=1

activation=leaky

[convolutional]

batch_normalize=1size=7stride=2pad=1activation=relu

[pooling]

size=3stride=2

[denseblock]

batch_normalize=1filters=32size=1stride=1pad=1activation=leaky

s4,特征共享机制设计。在denseblock中,基于cnn核权重进行特征共享。与传统cnn区别为denseblock采用复用前层网络特征作为输入;降低特征数量;及压缩特征的方式高效率的特征共享机制。denseblock各个层的特征图大小一致,在通道维度上连接,其中非线性组合函数h(.)采用的是bn+relu+3x3conv的结构,所有denseblock中各个层卷积之后均输出k个特征图,即得到的特征图的通道数为k,或者说采用k个卷积核。k是一个超参数。一般情况下使用较小的k,就可以得到较佳的性能。假定输入层的特征图的通道数为k0,那么l层输入的通道数为k0+k(l,1),因此随着层数增加,尽管k设定得较小,denseblock的输入会非常多,不过这是由于特征共享所造成的,每个层仅有k个特征是自己独有的。由于后面层的输入会非常大,denseblock内部可以采用bottleneck层来减少计算量,主要是原有的结构中增加1x1conv,即bn+relu+1x1conv+bn+relu+3x3conv,其中1x1conv得到4k个特征图它起到的作用是降低特征数量,从而提升计算效率。对于transition层,它主要是连接两个相邻的denseblock,并且降低特征图大小。transition层包括一个1x1的卷积和2x2的avgpooling,结构为bn+relu+1x1conv+2x2avgpooling。transition层可以起到压缩模型的作用,假定transition的上接denseblock得到的特征图通道数为m,transition层可以产生(θm)个特征,其中θ是压缩系数(compressionrate)。当θ=1时,特征个数经过transition层没有变化,即无压缩,而当θ<1时,将特征按比例压缩,从而达到特征压缩的效果。

以上显示和描述了本发明的基本原理、主要特征和本发明的优点。本行业的技术人员应该了解,本发明不受上述实施例的限制,上述实施例和说明书中描述的只是说明本发明的原理,在不脱离本发明精神和范围的前提下,本发明还会有各种变化和改进,这些变化和改进都落入要求保护的本发明范围内。本发明要求保护的范围由所附的权利要求书及其等效物界定。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1