xlxwalex / FCGEC

The Corpus & Code for EMNLP 2022 paper "FCGEC: Fine-Grained Corpus for Chinese Grammatical Error Correction" | FCGEC中文语法纠错语料及STG模型
https://aclanthology.org/2022.findings-emnlp.137
Apache License 2.0
104 stars 12 forks source link

joint_stg.py #11

Closed Lj4040 closed 1 year ago

xlxwalex commented 1 year ago

似乎像是Transformer依赖的包版本低了

Lj4040 commented 1 year ago

谢谢您的回答,我解决了这个问题

xlxwalex commented 1 year ago

客气啦:)

Lj4040 commented 1 year ago

您好,我刚刚运行完joint_evaluate.py文件,看到输出是xlsx格式有uuid,sentence,label,...,但是我发现在您给出的测试网站上面是需要提交zip文件,里面是包含一个预测的json文件的.最后给出提交的json文件的的例子和一开始下载的训练文件差不多 ,例子有error_flag,error_type,correction。这和我的输出文件是不一致的。 这是需要自己写一个文件将输出的文件转换成json文件吗?还是需要怎么进行处理,这个地方需要您的帮助。真诚地感谢您的回答

xlxwalex commented 1 year ago

您好, 由于我们的数据集包含三个任务,但是代码主要针对Correction,所以没有包含前两个任务的标签输出。如果你只需要Correction的指标的话可以自己构建json文件,然后error_flag,error_type可以随意设置(例如rror_flag=1,error_type=IWO),之后再上传上去计算就可以了。

如果你需要error_flag,error_type的指标,可以用PLM加全连接层训练一下!

Lj4040 commented 1 year ago

好的,我明白了,谢谢您的回答!

xlxwalex commented 1 year ago

客气啦:)

Lj4040 commented 1 year ago

不好意思,我在使用您给的检查点使用joint_evaluate.py文件试着尝试运行几条数据看看学习下您的工作,在自己的电脑上跑,因为没有gpu所以我就把参数gpu_id参数改成0,当我使用自己训练的模型时,并没错误,成功输出了。于是我想试下用您的检查点去跑下看看,运行时我一直报错误, image image 于是我按照提示将load函数中的 image 最初load=None,改完之后运行在这给位置又报错了。 image 错误为 image 可能我的问题有点不太相关,因为自己尝试了许多次修改,仍然没有成功,所以才在再次打扰下您,如果方便的话希望您可以帮助下我。抱歉打扰到您了!

xlxwalex commented 1 year ago

您好, 我看了你的报错,似乎可能是由于transformers版本造成的。因为过去的版本Layernorm它是用weight和bias来区分的似乎,新版本改成了gamma和beta,不知道是不是这个差异,你可以将你的model创建后(Load前)打印一下params,看看Layernorm具体是怎么样的名称,然后做一个转换或者更新一下版本

Lj4040 commented 1 year ago

transformers我是按照您给的版本安装的4.3.3,那我尝试升级下试试谢谢您的回答

xlxwalex commented 1 year ago

不客气,如果之后有问题,可以回复该Issue

Lj4040 commented 1 year ago

image

这个是我自己电脑上的模型跑的,可以顺利过去,然后您给的检查dia点 image 我发现俩个都是weight和bias .同时刚才我也试了将transformers升级了最新的4.27.2也没有成功还是报同样的错误

xlxwalex commented 1 year ago

你看一个generator的是长什么样,看上面报错图里不是switch的

Lj4040 commented 1 year ago

image 这是您的检查点,然后transformers是4.27.2 image 这个是我自己电脑跑的, 还是weight和bias 然后这是transformers4.3.3 第一个自己跑的 image 第二个是您给的检查点 image

仍然是weight和bias

Lj4040 commented 1 year ago

自己的训练的直接就能过去,是否是因为我自己训练的也是使用的cpu所以就能成功,而您给的检查点是使用gpu训练好的?但是那个gpu_id我也给调了0

xlxwalex commented 1 year ago

你用了map_location的话应该是一致的

Lj4040 commented 1 year ago

但是我如果不在这个位置上使用map_location=torch.device('cpu')的话,就会在 image这个位置报 image 这个错误,

xlxwalex commented 1 year ago

我的意思是你在cpu上的话,是应该map_location=cpu的,这不会产生差异。

4 7DTY_4N(VPUW(6PQ F6DS 我这里mode的 lnorm是 gamma和beta

这是我checkpoints里的lnorm BV74S(6PXH%9R D`YAA}}7E 看得出他们是一致的,你看看你那里的是一样的吗

Lj4040 commented 1 year ago

image

image 这个是model image 我的model下面的inorm没有那个gamma和beta

这个是检查点的 image

xlxwalex commented 1 year ago

ummm有点奇怪,你检查一下generator_model.py里看看是否有Layernorm?然后Layernorm是否是Model/Layer/LayerNorm.py的?

Lj4040 commented 1 year ago

我刚刚看了下我自己跑的下面是 image, 模型 image model同样也没有, 自己的和您给的不一致。自己跑的最后没有inorm.beta

Lj4040 commented 1 year ago

我看了有

image

image

xlxwalex commented 1 year ago

image 可能是你误删了else里的_lnorm的Layernorm?你可以发现他是个tuple而不是Module

$52J}CUQBG{EAB3BHUCBAD7

Lj4040 commented 1 year ago

终于解决了,真的非常非常非常感谢您,祝您生活愉快,万事顺利。太谢谢您了!!!,抱歉打扰您这么久,问了一些无关的问题。再次感谢您!

xlxwalex commented 1 year ago

:)客气啦,没事的,也祝你生活愉快!

Lj4040 commented 1 year ago

您好,在您给出的网页测评结果,我提交了好多次但是一直失败。我试了好多次 image

image,而且我也按照给出的例子,改成了相应的json文件。 这个是我将生成的文件改成json文件 image 提交的也是一个zip里面就只有一个压缩包predict.json image 这个还需要怎么处理,能在帮助帮助我吗,谢谢您,抱歉又打扰到您了

xlxwalex commented 1 year ago

我看了一下你的提交,问题出在json文件的名字应该是predict.json,详情请见Codalab的Evaluate: https://codalab.lisn.upsaclay.fr/competitions/8020#learn_the_details-evaluation

Lj4040 commented 1 year ago

谢谢您,已经解决了

xlxwalex commented 1 year ago

好的:)

Lj4040 commented 1 year ago

您好,我有一个疑惑,在indep_generator.py文件下的GeneratorDataset.py数据处理部分,self.sentences, self.labels = self._extract_gendata(sentences, labels) image 这一行,这样就只会将含有 I / MI标签的句子提取出来,但是只含有M标签的句子并没有提取出来,但是在generator模块不正是需要对修改和插入的token进行预测吗?

Lj4040 commented 1 year ago

好的,谢谢您的回答。

xlxwalex commented 1 year ago

好的,谢谢您的回答。

我稍晚一点再更新一下代码测试一下,因为Modify的样本都应该被包含进去(包括MD)。因为有点久了,我有点忘了之前写的时候为什么加这个限制了,要再看一下。 不过应该只有Indep模型的性能会受到影响,Joint是另一种处理模式,等我确认更新后会在这里回复,再次感谢指出这个问题!

Lj4040 commented 1 year ago

收到,谢谢您。

Lj4040 commented 1 year ago

您好,我在复现您的工作时,我在服务器上跑了几次,最终在您发布的网上评估上面结果是f0.5只有44,但是用您的检查点跑的有46,于是我将训练时每次的精度都保存了下看了看,我发现在Generator模块并没有达到论文中,char-level的0.71,sentence-level 0.68 ,我自己跑的时候最好的结果分别是0.58 和 0.76 ,这个地方和您论文中的结果相差比较大,我实验设置基本上是按照您代码中的给的设置的,但是epoch我设置的是50,但是论文附录上介绍的是100,batch_size我设置的是10,是这个主要影响的吗?还有在训练的过程中我发现偶尔在计算generaotr的loss是nan,好像是因为有些数据并不需要生成token,这个您也有发生吗?还有就是我加载的模型是hfl/chinese-roberta-wwm-ext,是在您代码脚本中的链接 https://github.com/ymcui/Chinese-BERT-wwm上找到的,我看见,他说这个预训练语言模型好像没有MLM的权重,如果需要做MLM任务需要自己二次训练。我想问问您,您是做了二次训练吗?而我没有做二次训练导致我复现的时候,在生成模块的准确率比较低。 如果在您方便的时候,希望您可以帮助下我,谢谢您的回复!

xlxwalex commented 1 year ago

您好,我在复现您的工作时,我在服务器上跑了几次,最终在您发布的网上评估上面结果是f0.5只有44,但是用您的检查点跑的有46,于是我将训练时每次的精度都保存了下看了看,我发现在Generator模块并没有达到论文中,char-level的0.71,sentence-level 0.68 ,我自己跑的时候最好的结果分别是0.58 和 0.76 ,这个地方和您论文中的结果相差比较大,我实验设置基本上是按照您代码中的给的设置的,但是epoch我设置的是50,但是论文附录上介绍的是100,batch_size我设置的是10,是这个主要影响的吗?还有在训练的过程中我发现偶尔在计算generaotr的loss是nan,好像是因为有些数据并不需要生成token,这个您也有发生吗?还有就是我加载的模型是hfl/chinese-roberta-wwm-ext,是在您代码脚本中的链接 https://github.com/ymcui/Chinese-BERT-wwm上找到的,我看见,他说这个预训练语言模型好像没有MLM的权重,如果需要做MLM任务需要自己二次训练。我想问问您,您是做了二次训练吗?而我没有做二次训练导致我复现的时候,在生成模块的准确率比较低。 如果在您方便的时候,希望您可以帮助下我,谢谢您的回复!

您好,感谢对我们工作的关注!针对问题回答如下:

  1. Q: 复现Generator结果不一致的原因;A: 我们没有对预训练模型继续预训练(虽然我们也注意到了权重的问题,但是考虑到论文主要贡献在数据集,模型只是一个Baseline,因此这方面没有做到最优,但是理论上是需要继续预训练的)。正因为权重的问题,所以Generator是三个组件最需要被训练的一个,然而它也是相对最难训练(词表很大),所以需要更多的epoch,因此您如果epoch上去应该还是会有提升的,我推测一方面差异可能是出现在这里。另一方面,考虑到生成答案会更丰富,因此我们的指标计算时并不是按照一对一的形式而是在gt中匹配到就计算为正确,这也是差异可能出现的原因
  2. Q: Generator的Loss为Nan; A:如您所说问题出在很多数据不需要生成,因此当你的batch_size比较小的情况,我推测很可能整个batch都没有用到生成器的样本,因此在计算loss时会出现NaN。由于我们的batch_size开的比较大所以相对没有遇到这样的情况,这可能也会导致模型性能出现问题(但实际上还能训练可能是因为梯度裁剪的原因),您可以通过调大batch_size或者稍微改一下JointLoss Module(如:在Joint Loss中判定一下Loss是否为NaN,是的话就不参与加和)。该问题的复现如下例子:
    import torch
    criterion = torch.nn.NLLLoss()
    hidden = torch.randn((3, 2))
    label = torch.LongTensor([0, 1, 2])
    inds = torch.zeros(3)
    print(criterion(hidden [inds>0], label[inds>0]))

    输出: tensor(nan)

xlxwalex commented 1 year ago

另外抱歉由于最近手头有一点点忙,之前说的那个修Bug的问题可能还要再晚一点:)

Lj4040 commented 1 year ago

没有关系,不着急,非常感谢您的帮助和回复!

xlxwalex commented 1 year ago

你好,

对于GeneratorDataset.py我已经查看了代码,确实是之前可能哪里想错了。现在代码里已经把额外的判断注释掉了,应该没有问题了。另外JointLoss我也进行了改动,会判断loss_mlm是否为nan,是的话就不会加到total_loss里,应该就不会在小batch_size下出现错误了。

Lj4040 commented 1 year ago

您好,最近我有个问题一直想问您,我在测试自己的方法时,发现验证集最后的平均精度和网站最后的结果似乎不太匹配,比如我这个方法验证集结果平均准确率有0.62 但是要比另一个方法最后的验证集打印的平均准确率0.63要低(这个要比第一个在最后的验证集打印的所有结果都要好或者有的持平,switch,tagger,generator三个模块的性能都好),但是网上评估最后的结果要比平均0.63的模型结果好,我想请问您遇到过这样的问题吗?

xlxwalex commented 1 year ago

您好,

这是正常的,这是因为验证集和测试集上Label的分布不一定是一样的,我们随机地对数据进行了划分。只要波动不是很大我认为都是比较正常的现象。模型保存的依据也是训练集上训练几个step后,在验证集上验证,当结果达到验证集上的最优性能表现后保存。但由于分布的问题所以参数不一定能在测试集上也能达到最优。这在所有任务上都是通用的现象。

Lj4040 commented 1 year ago

好的谢谢您回复!

xlxwalex commented 1 year ago

客气啦