言語の事前トレーニングでのポジショナルエンコーディングを再考するための実装。

このレポは、Tupe(解き放たれた位置エンコーディングを備えた変圧器)をデモンストレーションします。アルゴリズムの詳細は、私たちの論文に記載されています。 Tupeは、接着剤ベンチマーク上の他のベースラインを大きなマージンで上回ることができます。特に、トレーニング前の計算コストは30%しか使用しない一方で、ベースラインよりも高いスコアを達成できます。

計算リソースが限られているため、検証には最も広く使用されているプリトレーニングモデルであるBert-Baseを使用します。ただし、Roberta、Electra、Unilmのような、より大きな(そしてより良い)変圧器ベースのモデルに使用し、さらに改善するために、この方法を使用できることに注意してください。また、変更はシンプルで簡単なので、モデルにTupeを簡単に適用できます。
私たちの実装はFairSeqに基づいており、いくつかの変更があります。
fairseq/modules/transformer_sentence_encoder.pyおよびfairseq/modules/multihead_attention.pyを更新します。total-num-updateとウォームwarmup-updatesを設定する代わりに、Finetuneのwarmup-ratioを備えたmax-epochをサポートする他のいくつかのマイナーな変更。 詳細については、Fairseqを参照してください。簡単に言えば、
--cuda_extインストールオプションを備えたNVIDIAのApexライブラリ、混合精度トレーニング用ソースからインストール
ソースからTupeをインストールし、ローカルに開発するには:
git clone https://github.com/guolinke/TUPE
cd TUPE
pip install --editable . 前処理はMosesDecoderに依存しているため、次のスクリプトを実行してそれを引くことができます。
cd TUPE
git submodule update --initpreprocess/pretrain/process.shの手順を参照してください。
preprocess/glue/process.shの手順を参照してください。
DATA_DIR=./path_to_your_data/
SAVE_DIR=./your_own_save_path/
TOTAL_UPDATES=1000000
WARMUP_UPDATES=10000
PEAK_LR=0.0001
MAX_POSITIONS=512
MAX_SENTENCES=16
UPDATE_FREQ=1
SEED=your_seed
python train.py $DATA_DIR --fp16 --num-workers 16 --ddp-backend=c10d
--task masked_lm --criterion masked_lm --arch bert_base
--sample-break-mode complete --tokens-per-sample $MAX_POSITIONS
--optimizer adam --adam-betas ' (0.9, 0.999) ' --adam-eps 1e-6 --clip-norm 1.0
--lr-scheduler polynomial_decay --lr $PEAK_LR --warmup-updates $WARMUP_UPDATES --total-num-update $TOTAL_UPDATES
--dropout 0.1 --attention-dropout 0.1 --weight-decay 0.01
--max-sentences $MAX_SENTENCES --update-freq $UPDATE_FREQ --seed $SEED
--mask-prob 0.15
--embedding-normalize
--max-update $TOTAL_UPDATES --log-format simple --log-interval 100
--keep-updates-list 100000 300000 600000 1000000
--save-interval-updates 25000 --keep-interval-updates 3 --no-epoch-checkpoints --skip-invalid-size-inputs-valid-test
--save-dir $SAVE_DIR --rel-pos
上記の設定は16 V100 GPUのもので、バッチサイズは256( n_gpu * MAX_SENTENCES * UPDATE_FREQ )です。環境に応じて、 MAX_SENTENCESまたはUPDATE_FREQ変更する必要がある場合があります。相対位置を無効にするには、 --rel-posを削除できます。
DATA_DIR=./path_to_your_downstream_data
SAVE_DIR=./path_to_your_save_dir
BERT_MODEL_PATH=./path_to_your_checkpoint
BATCH_SIZE=32
N_EPOCH=10 # 5 for MNLI, QNLI, QQP
SEED=your_seed
WARMUP_RATIO=0.06
N_CLASSES=2 # 3 for MNLI, 1 for STS-B
LR=0.00005 # search from 2e-5, 3e-5, 4e-5, 5e-5
METRIC=accuracy # mcc for CoLA, pearson for STS-B
python train.py $DATA_DIR --fp16 --fp16-init-scale 4 --threshold-loss-scale 1 --fp16-scale-window 128
--restore-file $BERT_MODEL_PATH
--max-positions 512
--max-sentences $BATCH_SIZE
--max-tokens 4400
--task sentence_prediction
--reset-optimizer --reset-dataloader --reset-meters
--required-batch-size-multiple 1
--init-token 0 --separator-token 2
--arch bert_base
--criterion sentence_prediction
--num-classes $N_CLASSES
--dropout 0.1 --attention-dropout 0.1
--weight-decay 0.01 --optimizer adam --adam-betas ' (0.9, 0.999) ' --adam-eps 1e-06
--clip-norm 1.0 --validate-interval-updates 2
--lr-scheduler polynomial_decay --lr $LR --warmup-ratio $WARMUP_RATIO
--max-epoch $N_EPOCH --seed $SEED --save-dir $SAVE_DIR --no-progress-bar --log-interval 100 --no-epoch-checkpoints --no-last-checkpoints --no-best-checkpoints
--find-unused-parameters --skip-invalid-size-inputs-valid-test --truncate-sequence --embedding-normalize
--tensorboard-logdir .
--best-checkpoint-metric $METRIC --maximize-best-checkpoint-metric --rel-pos Finetuneをスピードアップするには、MNLI、QNLI、QQPの場合はN_EPOCH=5 、その他にはN_EPOCH=10設定します。 mnliの場合、 N_CLASSES=3および追加の設定--valid-subset valid,valid1 mnli-m/-mmを一緒に評価するために使用されます。 STS-Bは回帰タスクであるため、 N_CLASSES=1を設定し、追加の設定--regression-targetとMETRIC=pearson設定します。 COLAの場合、 METRIC=mccを設定します。
LRは{2e-5, 3e-5, 4e-5, 5e-5}から検索され、各LR 5つの異なる種子で実行され、その中央値をそのLRの結果として使用します。最高のLRの結果が使用されます。
注:事前削除モデルが使用されている場合は、 --rel-pos 、Finetuneで--rel-posを設定する必要があります。そうしないと、削除する必要があります。
また、再現性のために、TUPE-R( --rel-pos )のチェックポイントをリリースします。
あなたは私たちの論文を引用することができます
@inproceedings{
ke2021rethinking,
title={Rethinking Positional Encoding in Language Pre-training},
author={Guolin Ke and Di He and Tie-Yan Liu},
booktitle={International Conference on Learning Representations},
year={2021},
url={https://openreview.net/forum?id=09-528y2Fgf}
}