DePA: Improving Non-autoregressive Machine Translation with Dependency-Aware Decoder

June 1, 2023 ยท View on GitHub

The code for IWSLT 2023 paper DePA: Improving Non-autoregressive Machine Translation with Dependency-Aware Decoder

Some codes are borrowed from GLAT (https://github.com/FLC777/GLAT).

Requirements

  • Python >= 3.7
  • Pytorch >= 1.5.0
  • Fairseq 1.0.0a0

Data Preparation

Download distilled training data

For WMT14EN-DE, the dataset can be downloaded at WMT14EN-DE.

For WMT16EN-RO and IWSLT16DE-EN, the datasets can be downloaded at IWSLT16EN-DE and WMT16EN-RO

Create a new folder "data-bin" and download the datasets into it.

Binarize the distilled training data

Take the WMT14En-De dataset as example:

input_dir=data-bin/wmt14ende
data_dir=data-bin/wmt14ende/bin
src=en
tgt=de
python3 fairseq_cli/preprocess.py --source-lang ${src} --target-lang ${tgt} --trainpref ${input_dir}/train \
    --validpref ${input_dir}/valid --testpref ${input_dir}/test --destdir ${data_dir}/ \
    --workers 32 --src-dict ${input_dir}/dict.${src}.txt --tgt-dict {input_dir}/dict.${tgt}.txt

Model Training

Training VanillaNAT w/ DePA

The parameter "--input-transform" means using our method "Input Transformation".

The parameter "curriculum-type" refers to the choice of different training phase in our method "Forward Backward Dependency Modeling", which can be set to "at-forward", "at-backward", and "nat" sequentially. Except for the first phase, the parameter "--reset-optimizer" should be set in other training phases.

python train.py ${data_dir} --arch vanilla_nat --noise full_mask --share-all-embeddings \
   --criterion nat_loss --label-smoothing 0.1 --lr 5e-4 --warmup-init-lr 1e-7 --stop-min-lr 1e-9 \
   --lr-scheduler inverse_sqrt --warmup-updates 4000 --optimizer adam --adam-betas '(0.9, 0.999)' \
   --adam-eps 1e-6 --task translation_lev --max-tokens 8192 --weight-decay 0.01 --dropout 0.1 \
   --encoder-layers 6 --encoder-embed-dim 512 --decoder-layers 6 --decoder-embed-dim 512 --fp16 \
   --max-source-positions 1000 --max-target-positions 1000 --max-update 300000 \
   --save-dir ${save_path} --src-embedding-copy --pred-length-offset --log-interval 1000 \
   --eval-bleu --eval-bleu-args '{"iter_decode_max_iter": 0, "iter_decode_winth_beam": 1}' \
   --eval-tokenized-bleu --eval-bleu-remove-bpe --best-checkpoint-metric bleu \
   --maximize-best-checkpoint-metric --decoder-learned-pos --encoder-learned-pos \
   --apply-bert-init --activation-fn gelu --user-dir DePA_plugins \
   --curriculum-type nat --choose-data ende --input-transform

Training GLAT w/ DePA

python3 train.py ${data_dir} --arch glat --noise full_mask --share-all-embeddings \
    --criterion glat_loss --label-smoothing 0.1 --lr 5e-4 --warmup-init-lr 1e-7 --stop-min-lr 1e-9 \
    --lr-scheduler inverse_sqrt --warmup-updates 4000 --optimizer adam --adam-betas '(0.9, 0.999)' \
    --adam-eps 1e-6 --task translation_lev_modified --max-tokens 8192 --weight-decay 0.01 --dropout 0.1 \
    --encoder-layers 6 --encoder-embed-dim 512 --decoder-layers 6 --decoder-embed-dim 512 --fp16 \
    --max-source-positions 1000 --max-target-positions 1000 --max-update 300000 --seed 0 --clip-norm 5\
    --save-dir ${save_path} --src-embedding-copy --length-loss-factor 0.05 --log-interval 1000 \
    --eval-bleu --eval-bleu-args '{"iter_decode_max_iter": 0, "iter_decode_winth_beam": 1}' \
    --eval-tokenized-bleu --eval-bleu-remove-bpe --best-checkpoint-metric bleu \
    --maximize-best-checkpoint-metric --decoder-learned-pos --encoder-learned-pos \
    --apply-bert-init --activation-fn gelu --user-dir DePA_plugins \
    --curriculum-type nat --choose-data ende --input-transform

Inference

  • VanillaNAT w/ DePA
checkpoint_path=path_t_checkpoint
python3 fairseq_cli/generate.py ${data_dir} --path ${checkpoint_path} --user-dir DePA_plugins \
    --task translation_lev --remove-bpe --max-sentences 20 --source-lang ${src} --target-lang ${tgt} \
    --quiet --iter-decode-max-iter 0 --iter-decode-eos-penalty 0 --iter-decode-with-beam 1 --gen-subset test
  • GLAT w/ DePA
checkpoint_path=path_t_checkpoint
python3 fairseq_cli/generate.py ${data_dir} --path ${checkpoint_path} --user-dir DePA_plugins \
    --task translation_lev_modified --remove-bpe --max-sentences 20 --source-lang ${src} --target-lang ${tgt} \
    --quiet --iter-decode-max-iter 0 --iter-decode-eos-penalty 0 --iter-decode-with-beam 1 --gen-subset test