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
108 stars 12 forks source link

使用自定义数据集训练 #16

Closed yuan-cherish closed 1 year ago

yuan-cherish commented 1 year ago

我使用自己的数据按照FCGEC的格式构造了一些数据集,但是在加载数据会报错,所以导致一些句子无法加载,我查看了代码发现是convert_tagger2generator函数中的tokens和tagger的长度不对,继续往上我发现了在构造TaggerConverter的时候会有一些句子发生错误,打印出error之后发现只出现了pos的错误,但是pos错误指的是什么错误并不知道,于是我截取了tagger,但是导致tagger的loss爆炸增长,请问这应该怎么解决? try: tagger = TaggerConverter(self.args, auto=True, **kwargs) except Exception as e: print("发生了错误: {}".format(e)) print("发生错误的句子: {}".format(sentences[idx])) tagger = tagger[:len(tokens)] # 截取tagger 另外我还想知道怎么看这个模型的效果,joint模型好像是只记录 The best performances of three modules in STG

xlxwalex commented 1 year ago

这个的话情况可能很多,可以把print("发生错误的句子: {}".format(sentences[idx]))这个输出的句子贴上来让我debug一下吗?

yuan-cherish commented 1 year ago

这个问题应该是我的数据集构造的问题,我应该已经解决了,现在我想知道使用哪些指标来判断训练出的模型对于语法纠纠错能力具有参考价值,这是保存的best performance,是否需要参考其他指标呢?我认为这个结果应该是消融的结果。

image
xlxwalex commented 1 year ago

因为我不确定你的指标指的是训练过程中保存模型的指标依据还是最终纠错能力的体现,因此我分开来回答:

1. 训练过程中 在训练过程中,对于我们的STG模型而言,由于是一个Pipeline的形式,因此它需要每一级都有较高的准确定,并且错误会一级一累积。理论上Switch和Tagger的Acc对于模型会有较大的影响,而Generator由于答案并不唯一,但训练的时候只是会考虑一种修改的方式,所以可能会出现比实际低的情况,因此相对来说可能影响会更小一点。

在代码中,我们按照Switch、Tagger的Sentence级别的acc以及Generator的Token级别的Acc来保存模型,代码在JointTrainer.py的collect_metric(Line54):

 train_acc_refer = [ret['switch']['acc_sent'], ret['tagger']['sentence']['tagger'], ret['tagger']['sentence']['comb'], ret['generate']['token']]

这几个指标的大小会直接影响到保存模型的纠错能力。对于这些指标的选择而言,我们在这个工作中主要是Corpus,STG只是我们提出的针对我们这个corpus上的一个Baseline,希望能作为一个可参考的解决纠错的思路。因此实际上很多设置上我们都相对比较随意,没有做消融以及其他更多的实验。

但同时我也觉得就STG而言,用这些acc来评价应该是足够的。更好的是对指标包括loss进行重要性加权来对抗错误累积可能带来的问题。

2. 最终的纠错能力 模型最终的纠错能力的指标其实F0.5也是character级别的,因此对到我们的STG模型上其实就是各个层级编辑操作的正确性,因此我暂时也想不到有什么可以参考的其他指标。

由于我可能对你问题理解的不是很到位,因此如果你是别的问题的话欢迎进一步补充

yuan-cherish commented 1 year ago

是的,我指的就是类似于F0.5这些指标,但是我好像没有在训练的输出日志上看到,请问是没有输出这些指标吗?

image
xlxwalex commented 1 year ago

是的,训练的时候是不会进行计算输出的。因为F0.5的计算是比较慢的 ChERRANT。如果每个print_step都输出并作为模型保存的依据的话肯定会对最终性能有益,但是也会造成训练时间变得很长。

yuan-cherish commented 1 year ago

好的了解了,谢谢解答,非常感谢!

xlxwalex commented 1 year ago

客气了:)