AntNLP/gnn-dep-parsing

关于论文中公式(9)代码实现的问题

TimeLessLing opened this issue · 7 comments

您好:
我对graph_nn_decoder.py中的两处代码有一些疑问:
首先是94行中,arc_mat = self.arc_attn_mat[k](head_arc, dept_arc)-1e9*(1-masks_2D),这里的1e9*(1-masks_2D)的作用是什么呢?通过biaffine获得的矩阵不能直接用于计算概率吗?
其次是GNN的逐层传播过程中,110行~112行,以110行为例,HX = head_arc * arc_prob,这里是做了哈达玛积,那么HX矩阵中就只由h_11alpha_11,h_12alpha_12这样形如h_ijalpha_ij的元素构成,而根据论文中的公式(9),存在这么一项——alpha_jih_j,也即是说除了alpha_jih_ji之外,HX矩阵中还应该存在alpha_jih_j1, alpha_jih_j2, ..., alpha_jih_jn这些元素,我认为根据代码来看,HX中是缺少它们的,不知我的理解是否存在问题,还请您指正

您好~
masks_2D的作用是计算概率时mask掉padding token.
HX = head_arc * arc_prob 这里的乘法在dynet里不是哈达玛积是矩阵乘法. 可以看下dynet的API

您好~
masks_2D的作用是计算概率时mask掉padding token.
HX = head_arc * arc_prob 这里的乘法在dynet里不是哈达玛积是矩阵乘法. 可以看下dynet的API

谢谢您的回复,但是对于公式(9),我依然无法计算将代码中的矩阵运算与公式中的元素表示相拟合,我在自己复现的PyTorch版模型中发现效果很差,所以怀疑是我在GNN Layer的运算过程中出现了差错,但是我对比了相应的代码,又觉得我在那部分写的和DyNet中的运算过程应该是一样的,所以还是想推出来这部分的矩阵运算和公式是怎么对应的,但是失败了

您好~
masks_2D的作用是计算概率时mask掉padding token.
HX = head_arc * arc_prob 这里的乘法在dynet里不是哈达玛积是矩阵乘法. 可以看下dynet的API

谢谢您的回复,但是对于公式(9),我依然无法计算将代码中的矩阵运算与公式中的元素表示相拟合,我在自己复现的PyTorch版模型中发现效果很差,所以怀疑是我在GNN Layer的运算过程中出现了差错,但是我对比了相应的代码,又觉得我在那部分写的和DyNet中的运算过程应该是一样的,所以还是想推出来这部分的矩阵运算和公式是怎么对应的,但是失败了

公式和代码里的运算是对应的, 只是优化成了矩阵形式方便GPU运算(减掉了for循环). Dynet和Pytorch的运算规则有一些差异(比如pytorch默认行向量, Dynet默认列向量), 你可以仔细检查一下, 不介意的话可以贴一下代码我帮忙看看

您好~
masks_2D的作用是计算概率时mask掉padding token.
HX = head_arc * arc_prob 这里的乘法在dynet里不是哈达玛积是矩阵乘法. 可以看下dynet的API

谢谢您的回复,但是对于公式(9),我依然无法计算将代码中的矩阵运算与公式中的元素表示相拟合,我在自己复现的PyTorch版模型中发现效果很差,所以怀疑是我在GNN Layer的运算过程中出现了差错,但是我对比了相应的代码,又觉得我在那部分写的和DyNet中的运算过程应该是一样的,所以还是想推出来这部分的矩阵运算和公式是怎么对应的,但是失败了

公式和代码里的运算是对应的, 只是优化成了矩阵形式方便GPU运算(减掉了for循环). Dynet和Pytorch的运算规则有一些差异(比如pytorch默认行向量, Dynet默认列向量), 你可以仔细检查一下, 不介意的话可以贴一下代码我帮忙看看

我已经推明白了,现在我觉得我的代码也的确是符合公式的,但是在训练过程中,loss往往降到1左右就不行了,而且LAS和UAS异常的低。我实在不清楚是哪里出了问题,想请您帮忙看看,请问我是直接发全部代码的链接呢还是直接贴对应的核心代码?

您好~
masks_2D的作用是计算概率时mask掉padding token.
HX = head_arc * arc_prob 这里的乘法在dynet里不是哈达玛积是矩阵乘法. 可以看下dynet的API

谢谢您的回复,但是对于公式(9),我依然无法计算将代码中的矩阵运算与公式中的元素表示相拟合,我在自己复现的PyTorch版模型中发现效果很差,所以怀疑是我在GNN Layer的运算过程中出现了差错,但是我对比了相应的代码,又觉得我在那部分写的和DyNet中的运算过程应该是一样的,所以还是想推出来这部分的矩阵运算和公式是怎么对应的,但是失败了

公式和代码里的运算是对应的, 只是优化成了矩阵形式方便GPU运算(减掉了for循环). Dynet和Pytorch的运算规则有一些差异(比如pytorch默认行向量, Dynet默认列向量), 你可以仔细检查一下, 不介意的话可以贴一下代码我帮忙看看

我已经推明白了,现在我觉得我的代码也的确是符合公式的,但是在训练过程中,loss往往降到1左右就不行了,而且LAS和UAS异常的低。我实在不清楚是哪里出了问题,想请您帮忙看看,请问我是直接发全部代码的链接呢还是直接贴对应的核心代码?

如果现象是loss降不下来 LAS和UAS异常的低, 我觉得不一定是GNN部分的代码有问题. 你有试过下面两组实验的结果吗?

  1. GNN layer = 0
  2. GNN layer > 0, train dev都在一个相同的小于10句的Debug集上 (LAS 和 UAS能否拟合到100?)

您好~
masks_2D的作用是计算概率时mask掉padding token.
HX = head_arc * arc_prob 这里的乘法在dynet里不是哈达玛积是矩阵乘法. 可以看下dynet的API

谢谢您的回复,但是对于公式(9),我依然无法计算将代码中的矩阵运算与公式中的元素表示相拟合,我在自己复现的PyTorch版模型中发现效果很差,所以怀疑是我在GNN Layer的运算过程中出现了差错,但是我对比了相应的代码,又觉得我在那部分写的和DyNet中的运算过程应该是一样的,所以还是想推出来这部分的矩阵运算和公式是怎么对应的,但是失败了

公式和代码里的运算是对应的, 只是优化成了矩阵形式方便GPU运算(减掉了for循环). Dynet和Pytorch的运算规则有一些差异(比如pytorch默认行向量, Dynet默认列向量), 你可以仔细检查一下, 不介意的话可以贴一下代码我帮忙看看

我已经推明白了,现在我觉得我的代码也的确是符合公式的,但是在训练过程中,loss往往降到1左右就不行了,而且LAS和UAS异常的低。我实在不清楚是哪里出了问题,想请您帮忙看看,请问我是直接发全部代码的链接呢还是直接贴对应的核心代码?

如果现象是loss降不下来 LAS和UAS异常的低, 我觉得不一定是GNN部分的代码有问题. 你有试过下面两组实验的结果吗?

  1. GNN layer = 0
  2. GNN layer > 0, train dev都在一个相同的小于10句的Debug集上 (LAS 和 UAS能否拟合到100?)

是这样的,我之前是在Github上找了一份PyTorch版本的Biaffine代码,之前也用这份代码跑了一些实验,都是没有问题的,效果也很好。同样的数据集,加上了我写的GNN layer之后就出现了上述情况,去掉就很正常,所以我才确定是我写的GNN出了问题

您好~
masks_2D的作用是计算概率时mask掉padding token.
HX = head_arc * arc_prob 这里的乘法在dynet里不是哈达玛积是矩阵乘法. 可以看下dynet的API

谢谢您的回复,但是对于公式(9),我依然无法计算将代码中的矩阵运算与公式中的元素表示相拟合,我在自己复现的PyTorch版模型中发现效果很差,所以怀疑是我在GNN Layer的运算过程中出现了差错,但是我对比了相应的代码,又觉得我在那部分写的和DyNet中的运算过程应该是一样的,所以还是想推出来这部分的矩阵运算和公式是怎么对应的,但是失败了

公式和代码里的运算是对应的, 只是优化成了矩阵形式方便GPU运算(减掉了for循环). Dynet和Pytorch的运算规则有一些差异(比如pytorch默认行向量, Dynet默认列向量), 你可以仔细检查一下, 不介意的话可以贴一下代码我帮忙看看

我已经推明白了,现在我觉得我的代码也的确是符合公式的,但是在训练过程中,loss往往降到1左右就不行了,而且LAS和UAS异常的低。我实在不清楚是哪里出了问题,想请您帮忙看看,请问我是直接发全部代码的链接呢还是直接贴对应的核心代码?

如果现象是loss降不下来 LAS和UAS异常的低, 我觉得不一定是GNN部分的代码有问题. 你有试过下面两组实验的结果吗?

  1. GNN layer = 0
  2. GNN layer > 0, train dev都在一个相同的小于10句的Debug集上 (LAS 和 UAS能否拟合到100?)

您好,我现在已经解决了之前的问题,非常感谢您的帮助。
另外您在论文中提到了在UD2.2上进行实验,不过我目前只能找到UD2.2的完整数据集,却找不到train和dev的划分标准,我想问一下UD2.2中的train and dev划分标准是什么呢?