Parsing with compositional vector grammars 实现

来源:互联网 发布:网络预警机制 编辑:程序博客网 时间:2024/05/22 04:30

Parsing with compositional vector grammars 实现

本文主要就《parsing with compositional vector grammars》关于这篇论文中的一部分内容,介绍其实现的具体代码细节。代码源于组内师兄,为了方便自己下一次看代码时不用那么费劲。所以就将里面的一些东西记录下来,希望能够对自己对别人有帮助。本人才学疏浅,有错误的地方希望大家能够指出。

首先 论文的主要工作是用一个Recursive NN 为一课句法树打分。其中比较新颖的地方时,以前打分的时候,节点合并的时候,计算得分的时候都是用的同一组参数,本文作者采用,根据节点类型使用不同的参数。具体内容还是去认真读读论文吧。

接下来介绍一下代码的实现
首先,在main函数中第一个出现的是
genTestData(),获得开发集,这是我们判断迭代到多久才收敛,也就是判断是否需要继续训练的指示。

    SURecursiveNetworkModel surnnModel = generateSURNNModelOnline(...);

然后得到主要的model对象,其中主要过程和上面的函数一样,都是读文件,转换成CFGRerankingTree(这种树是设计来方便RNN 计算得分梯度等得,由传统的CFGTree转换而来),然后把树中有的参数插入到相应的map中去(由于论文的思想是根据节点的类别,设置不同的参数,所以map里面有很多参数),

 gradientSquareMap = surnnModel.createAdaGradSquare(config.adaAlpha);

根据前面的model建立AdaGrad,要用到adagrad更新,就要用这样的结构保存历史梯度。

 SURecursiveNetworkModel emptyGradients = surnnModel.createGradients();

接下来根据model建立一个梯度对象,里面所有参数的梯度全都为0;

前面的surnnModel包含了dev gold k-best的所有参数,所以在建立adagrad和梯度之前要先得到它

接下来就是一个得到batch的过程,就是将所有的训练数据分成份(50/份),调用
batchTraining()来训练。

batchTraining()中调用了MulticoreWrapper这种机制,这是一种迭代,我们只需要知道,它重复某个迭代过程(这里就是ScoringProcessor()),得到的结果可以通过wrapper.peek()取出来。

 进入到ScoringProcessor()这个函数中,其大致过程就是k-best中得分最高的和gold分别做一个前向传播算得分,比较得分,如果gold得分不是最高的话,将两个树做后向传播,返回两个梯度

回到batchTraining()中,将后向传播的梯度merge到emptyGradients中去。等多次迭代的梯度merge以后就回到train中。

surnn.updateGradients(emptyGradients, gradientSquareMap, config.batchSize, config.regParameter);

根据emptyGradients去更新参数toBeUpdated,表示要更新参数的值,这种结果有点奇怪,直接getValue()以后改变它的值,原来的对象的参数也变了。

如此迭代到收敛即可。

主要是下面论文的工作:
Socher R, Bauer J, Manning C D, et al. Parsing with Compositional Vector Grammars[C]// Meeting of the Association for Computational Linguistics. 2013:455-465.

代码如果有需要请留言。

0 0
原创粉丝点击