在語言預訓練中重新思考文章的位置編碼的實施。

此存儲庫是要演示TUPE(帶有未接觸位置編碼的變壓器)。算法細節可以在我們的論文中找到。 Tupe可以通過較大的邊距在膠水基准上勝過其他基準。特別是,它可以比基線獲得更高的分數,而僅使用30%的培訓預計算成本。

由於計算資源有限,我們使用最廣泛使用的預訓練模型BERT-BASE進行驗證。但是,請注意,我們的方法可用於較大(和更好的)基於變壓器的模型,例如Roberta,Electra和Unilm,並進一步改善它們。此外,由於修改非常簡單易用,因此您可以輕鬆地在模型中應用Tupe。
我們的實施是基於Fairseq的,有幾個更改:
fairseq/modules/transformer_sentence_encoder.py fairseq/modules/multihead_attention.py用於未接觸的位置編碼。warmup-ratio其他一些小改動以支持max-epoch ,而不是為不同的任務設置不同的total-num-update和warmup-updates 。 更多詳細信息請參閱Fairseq。簡要地,
--cuda_ext安裝選項,用於混合精確培訓從源安裝
要從源安裝Tupe並在本地開發:
git clone https://github.com/guolinke/TUPE
cd TUPE
pip install --editable . 預處理依賴於MosesDecoder,您可以運行以下腳本將其拉動。
cd TUPE
git submodule update --init請參閱preprocess/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設置為5,而N_EPOCH=10對於其他。對於MNLI, N_CLASSES=3和其他設置--valid-subset valid,valid1用於評估mnli-m/-mm。 STS-B是一個回歸任務,因此我們將N_CLASSES=1設置,並具有其他設置--regression-target and METRIC=pearson 。對於可樂,我們設置了METRIC=mcc 。
從{2e-5, 3e-5, 4e-5, 5e-5}搜索LR ,每個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}
}