HillZhang1999 / SynGEC

Code & data for our EMNLP2022 paper "SynGEC: Syntax-Enhanced Grammatical Error Correction with a Tailored GEC-Oriented Parser"
https://arxiv.org/abs/2210.12484
MIT License
79 stars 14 forks source link

训练Chinese Bart纠错模型 #12

Closed li-aolong closed 1 year ago

li-aolong commented 1 year ago

CPT给的chinese bart是基于huggingface的,要用fairseq跑的话是需要转化一下吗,想问下有没有转换好的模型

HillZhang1999 commented 1 year ago

我们的代码在训练前会自动转换huggingface格式到fairseq https://github.com/HillZhang1999/SynGEC/blob/main/bash/chinese_exp/train_syngec_bart.sh#L28

li-aolong commented 1 year ago

好的,还想问一下如果只想训练一个bart baseline,不带有syngec的,应该怎么调整脚本呢

HillZhang1999 commented 1 year ago

https://github.com/HillZhang1999/SynGEC/blob/main/bash/chinese_exp/train_syngec_bart.sh 只训练上述脚本的上半部分即可。

li-aolong commented 1 year ago

好的,非常感谢

li-aolong commented 1 year ago

你好,还想问下,训练bart模型之前的预处理,只需要对原始文本preprocess就行么,还是需要专门用bart的dict进行处理一下

HillZhang1999 commented 1 year ago

https://github.com/HillZhang1999/SynGEC/blob/main/bash/chinese_exp/preprocess_baseline.sh 参考这个脚本文件即可

li-aolong commented 1 year ago

好的,多谢

li-aolong commented 1 year ago

我用bash/chinese_exp/generate_syngec_bart.sh去生成结果,但这个是需要逐句输入的 image

然后我改用generate.py去生成,又有报错 image

这是生成脚本 CUDA_VISIBLE_DEVICES=7 python -u ${FAIRSEQ_DIR}/generate.py $data_bin \ --user-dir ../../src/src_syngec/syngec_model \ --task syntax-enhanced-translation \ --path ${MODEL_DIR}/checkpoint_best.pt \ --beam ${BEAM} \ --nbest ${N_BEST} \ --gen-subset test \ -s src \ -t tgt \ --batch-size 32 \ --num-workers 12 \ --remove-bpe \ --fp16 \ --results-path $OUTPUT_DIR

HillZhang1999 commented 1 year ago

generate.py没有适配我们的模型,可能有问题。 interactive.py可以使用<命令,对整个文件进行推理,不需要手动逐行输入。

li-aolong commented 1 year ago

好的,我再试试

li-aolong commented 1 year ago

还有想问一下评测nlpcc_test用的gold m2文件是哪个呢,test_gold.01,test_gold.0,test_gold.1

HillZhang1999 commented 1 year ago

一般都是两位标注者的,test_gold.01 记得用pkuseg分词,具体可以参考我的MuCGEC仓库:https://github.com/HillZhang1999/MuCGEC/tree/main/tools/segment

li-aolong commented 1 year ago

好的,我用bart跑了一个nplcc的baseline结果,P: 53.07, R: 28.59, F: 45.31,这个结果已经和论文里syngec的45.32相当了

一开始我看loss以为跑出问题了,但是结果挺高 image

image

HillZhang1999 commented 1 year ago

正如我们论文里汇报的,使用BART后再加入句法,确实效果比较微弱(~0.5),一方面是基线太高了,另一方面是预训练模型很有可能已经学会了很多句法信息。 不过虽然F0.5结果接近,你的Precision/Recall和我跑出来的差异还挺大的,估计是参数的原因,可以再探索探索。

li-aolong commented 1 year ago

嗯是,这个结果是baseline的还没有加句法信息,论文里是44.64,加句法的还没跑

li-aolong commented 1 year ago

你好,想再问一下,训练transformer和训练bart前对数据的preprocess是一样的吧,也就是可以共用同一个data-bin文件

HillZhang1999 commented 1 year ago

对的

li-aolong commented 1 year ago

问一下,训练transformer对数据的preprocess所用的ditct也是chinese_vocab.count.txt这个么,还是要自动生成的

我跑transformer_big,验证集上的loss不降反升,因为--patience=5,在6个epoch就停了。用跑了6个epoch的ckpt去generate,结果还是乱句,这是因为还跑的不够么

preprocess:

python $FAIRSEQ_DIR/preprocess.py --source-lang src --target-lang tgt \
       --user-dir ../../src/src_syngec/syngec_model \
       --task syntax-enhanced-translation \
       --trainpref ${data_path}/train/train.char \
       --validpref ${data_path}/valid/valid.char \
       --testpref ${data_path}/test/test.char \
       --destdir $data_bin \
       --workers $WORKER_NUM \
       --labeldict ../../data/dicts/syntax_label_gec.dict \
       --srcdict ../../data/dicts/chinese_vocab.count.txt \
       --tgtdict ../../data/dicts/chinese_vocab.count.txt

train:

CUDA_VISIBLE_DEVICES=8 python -u $FAIRSEQ_CLI_PATH/train.py $data_bin \
    --save-dir $model_dir \
    --tensorboard-logdir $log_dir \
    --user-dir ../../src/src_syngec/syngec_model \
    --task syntax-enhanced-translation \
    --arch syntax_enhanced_transformer_big \
    --skip-invalid-size-inputs-valid-test \
    --max-tokens 8192 \
    --optimizer adam \
    --max-source-positions 256 \
    --max-target-positions 256 \
    --lr 5e-04 \
    --warmup-init-lr 1e-07 \
    --warmup-updates 4000 \
    -s src \
    -t tgt \
    --lr-scheduler inverse_sqrt \
    --clip-norm 1.0 \
    --criterion label_smoothed_cross_entropy \
    --label-smoothing 0.1 \
    --max-epoch 60 \
    --share-all-embeddings \
    --adam-betas '(0.9,0.98)' \
    --log-format tqdm \
    --log-interval 500 \
    --find-unused-parameters \
    --fp16 \
    --keep-last-epochs 10 \
    --patience 5 \
    --seed $SEED

generate:

CUDA_VISIBLE_DEVICES=8 python -u ${FAIRSEQ_DIR}/interactive.py $data_bin \
    --user-dir ../../src/src_syngec/syngec_model \
    --task syntax-enhanced-translation \
    --path ${MODEL_DIR}/checkpoint6.pt \
    --beam $BEAM \
    --nbest 1 \
    -s src \
    -t tgt \
    --buffer-size 10000 \
    --batch-size $batch_size \
    --num-workers 12 \
    --log-format tqdm \
    --remove-bpe \
    --fp16 \
    --output_file $output_file \
    < $input_file

results:

朝菜是。
首先,,,,,,,。
这是我你人人。
另外,,人欢。
这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这
不是是。
随国国国国国国。
HillZhang1999 commented 1 year ago

用chinese_vocab.count.txt; 这个问题我没有遇见过,因为我是8卡训练的,可能参数和你不一样,我这里重新调参了下,如下的设置在单卡训练可以取得和论文中较为接近的结果:

CUDA_VISIBLE_DEVICES=6 nohup python -u $FAIRSEQ_CLI_PATH/train.py $PROCESSED_DIR_STAGE1/bin \
    --save-dir $MODEL_DIR_STAGE1 \
    --user-dir ../../src/src_syngec/syngec_model \
    --task syntax-enhanced-translation \
    --arch syntax_enhanced_transformer_big \
    --skip-invalid-size-inputs-valid-test \
    --max-tokens 10240 \
    --optimizer adam \
    --max-source-positions 128 \
    --max-target-positions 128 \
    --lr 8e-05 \
    --warmup-init-lr 1e-08 \
    --warmup-updates 4000 \
    -s src \
    -t tgt \
    --lr-scheduler inverse_sqrt \
    --clip-norm 1.0 \
    --criterion label_smoothed_cross_entropy \
    --label-smoothing 0.1 \
    --max-epoch 100 \
    --share-all-embeddings \
    --adam-betas '(0.9,0.98)' \
    --log-format tqdm \
    --find-unused-parameters \
    --fp16 \
    --keep-last-epochs 10 \
    --patience 5 \
    --seed $SEED >${MODEL_DIR_STAGE1}/nohup.log 2>&1 &