Repositori ini berisi implementasi resmi kertas model difusi diskrit yang direparameterisasi untuk pembuatan teks.
Basis kode diimplementasikan dengan Fairseq. Untuk menginstal dependensi, jalankan (direkomendasikan dalam lingkungan virtual) perintah berikut:
pip install -r requirements.txt
# install our package of discrete diffusion models
pip install -e discrete_diffusion
# install our fork of fairseq
cd fairseq
python3 setup.py build develop
cd ..Catatan Lingkungan diuji dengan Python 3.8.10, Pytorch 1.10.0/1.12.0, dan CUDA 11.3. Perhatikan juga Forks Fairseq kami memodifikasi beberapa file dalam basis kode asli; Menggunakan versi Fairseq yang lebih baru dapat menyebabkan konflik ketergantungan yang tidak terduga.
Kami menerapkan model difusi diskrit dalam perpustakaan mandiri discrete_diffusion untuk penggunaan umum. Perpustakaan menyediakan implementasi berbagai model difusi diskrit khas, yang terdiri dari
(Vanilla/Reparameterized) multinomial diffusion : Proses difusi yang menyuntikkan noise uniform ke urutan token. Implementasi difusi multinomial vanilla dengan cermat mengikuti basis kode dari makalah asli;(Vanilla/Reparameterized) absorbing diffusion : Proses difusi di mana token dalam urutan dapat diserap ke keadaan masking , seperti yang dijelaskan dalam kertas D3pm. Model difusi ini berbagi set antarmuka yang sama yang memungkinkan untuk penggunaan eksternal. Secara khusus, mereka didefinisikan sebagai subkelas dari kelas DiscreteDiffusion , mengambil bentuk berikut:
class DiscreteDiffusion ( nn . Module ):
"""
The parent class for discrete denoising diffusion probabilistic models.
It supports the following methods:
- q_sample()
Sample x_t ~ q(x_t | x_0) to construct noisy Transformer inputs.
- compute_losses()
Compute the loss L_t = KL(q||p) at t-th time step.
- sample_step()
Sample x_t ~ p(x_{t-1} | x_t, x_0) at t-th time step.
"""
def __init__ ( self , num_timesteps ):
super (). __init__ ()
self . num_timesteps = num_timesteps
def q_sample ( self , x_0 , t , ** kwargs ):
"""
Sample from q(x_t | x_0), which is used as the model inputs.
Args:
x_0: token ids with shape [B, N]
t: current time step, tensor with shape [B]
Returns:
return a dict of relevant outputs including x_t.
"""
def compute_losses ( self , inputs , ** kwargs ):
"""
Compute the loss objective KL(q||p) to train our generative process.
Args:
inputs: a dict that contains input types specific to different diffusion processes, containing
- x_t: token ids with shape [B, N]
- t: scalar timesteps, with shape [B]
Returns:
possibly return a dict of relevant outputs, including the loss used for training.
"""
def sample_step ( self , decoder_out , denoising_fn , ** kwargs ):
"""
Given a time step t, start from x_t and sample x_{t-k} from q(x_{t-k} | x_t).
Args:
decoder_out: a namedtuple that contains decoding info, including
- x_t: token ids with shape [B, N]
- t: scalar timesteps
- max_steps: the maximum number of decoding steps
- ...
denoising_fn: a function that takes in x_t and t and returns model logits
kwargs: other arguments that are used to control decoding.
Returns:
return a new decoder_out namedtuple.
""" Model DiscreteDiffusion dapat dipakai dengan mengonfigurasi yang berikut:
--num-diffusion-timesteps <int> Menentukan seluruh jumlah langkah waktu difusi (default: 50)--diffusion-type <str> menentukan tipe model difusi (pilihan: {absorbing, multinomial, reparam-absorbing, reparam-multinomial} )--noise-scheduler-type <str> Menentukan jadwal kebisingan hanya dalam difusi multinomial vanilla/reparam (pilihan khas: {linear, cosine} ; default: cosine )q_sample() , termasuk--q-sample-mode <str> menentukan strategi pengambilan sampel (pilihan: {default, coupled, multi-step, multi-sample} ; default: default ). Kami menyediakan berbagai pilihan untuk pengambilan sampel default : Sebuah sampel tunggal ditarik sebagai multi-step : Contoh Dua Langkah Waktu IID multi-sample : Contoh Dua Sampel IID coupled : Juga dikenal sebagai pelatihan terkondisi, yang dirinci dalam Lampiran F dari makalah ini. Ini dimulai dengan mencicipi dua langkah waktu IID coupled membawa perbaikan yang signifikan untuk difusi vanilla multinomial/penyerap, tetapi gainnya tidak secara konsisten substansial dalam varian yang direparameterisasi.--not-diffusing-special-sym menunjukkan apakah akan memasukkan simbol khusus selama proses difusi (default: false)compute_losses() , termasuk--reweighting-type <str> menentukan skema pembobotan ulang dalam keluarga kami yang direparameter (pilihan: {linear, reciprocal, none} ; default: linear )--label-smoothing <float> Menentukan laju label smoothing (default: 0.1)sample_step() , termasuk--argmax-decoding menunjukkan apakah akan menggunakan decoding argmax untuk output transformator denoised --temperature <float> Menentukan suhu --decoding-strategy <str> menentukan penggunaan vanilla ( default ) / reparameterized ( reparam-<options> ; lihat detailnya) strategi decoding (pilihan: {default, reparam-<options>} ; default: default )--load-ema-weights menunjukkan apakah akan memuat bobot model EMA untuk generasi (default: false)--iter-decode-max-iter <int> Menentukan jumlah maksimum waktu untuk decoding (default: 10)--iter-decode-with-beam <int> Menentukan ukuran balok untuk mendekodekan beberapa urutan dengan panjang yang berbeda secara paralel (default: 1)--iter-decode-force-max-iter Menunjukkan decoding iteratif harus menjalankan jumlah iterasi yang ditentukan dan tidak keluar. Direkomendasikan untuk mengatur bendera ini ke True.Lihat di sini untuk daftar argumen yang lebih komprehensif.
Dengan memberikan --decoding-strategy default , skema pengambilan sampel vanilla (khusus untuk setiap proses difusi diskrit) digunakan.
Pendekatan decoding yang lebih canggih dapat dipanggil dengan lewat --decoding-strategy reparam-<conditioning-of-v>-<topk_mode>-<schedule> . Pendekatan ini didasarkan pada reparameterisasi yang diusulkan dalam makalah kami dan memungkinkan untuk prosedur decoding yang lebih efektif. Opsi menentukan algoritma decoding melalui
<conditioning-of-v> : uncond atau cond (default uncond ): apakah akan menghasilkan variabel perutean <topk_mode> : stochastic<float> atau deterministic (default deterministic ): Apakah akan menggunakan stochastic atau deterministik top- $ k $ seleksi. Nilai float dalam stochastic<float> menentukan tingkat keacakan dalam pemilihan $ k $ stochastic;<schedule> : linear atau cosine ( cosine default): jadwal untuk Lihat implementasi untuk detail lebih lanjut tentang opsi.
Silakan lihat skrip di bawah ini untuk detailnya.
Catatan
- Perhatikan bahwa semua tugas yang dipertimbangkan dalam pekerjaan ini beroperasi pada data asli dan tidak mengadopsi distilasi pengetahuan (KD).
Kami mengikuti pra-pemrosesan standar di Fairseq/Contoh untuk menyiapkan data binarized:
# fetch and preprocess the data to BPE codes
cd examples/translation/
bash prepare-iwslt14.sh
cd ../..
# binarize the data
TEXT=examples/translation/iwslt14.tokenized.de-en
fairseq-preprocess --joined-dictionary --source-lang de --target-lang en
--trainpref $TEXT /train --validpref $TEXT /valid --testpref $TEXT /test
--destdir data-bin/iwslt14.tokenized.de-en
--workers 20Kami menggunakan data yang dirilis di Fairseq/Contoh untuk menyiapkan dataset:
wget http://dl.fbaipublicfiles.com/nat/original_dataset.zip
unzip original_dataset.zip
TEXT=wmt14_ende
fairseq-preprocess --joined-dictionary
--source-lang en --target-lang de
--trainpref $TEXT /train.en-de --validpref $TEXT /valid.en-de --testpref $TEXT /test.en-de
--destdir data-bin/wmt14_ende --thresholdtgt 0 --thresholdsrc 0
--workers 20Untuk dataset ini, kami menggunakan data mentah wmt16.tar.gz sebagai pra-diproses dalam repositori ini.
tar xzvf wmt16.tar.gz
TEXT=wmt16/en-ro
# move train/ dev/ test/ bpe codes into the $TEXT folder
mv $TEXT /train/corpus.bpe.en $TEXT /train.bpe.en
mv $TEXT /train/corpus.bpe.ro $TEXT /train.bpe.ro
mv $TEXT /dev/dev.bpe.en $TEXT /dev.bpe.en
mv $TEXT /dev/dev.bpe.ro $TEXT /dev.bpe.ro
mv $TEXT /test/test.bpe.en $TEXT /test.bpe.en
mv $TEXT /test/test.bpe.ro $TEXT /test.bpe.ro
# binarize the data
fairseq-preprocess --joined-dictionary
--source-lang en --target-lang ro
--trainpref $TEXT /train.bpe --validpref $TEXT /dev.bpe --testpref $TEXT /test.bpe
--destdir data-bin/wmt16_enro --thresholdtgt 0 --thresholdsrc 0
--workers 20 Kami pertama -tama masuk ke folder fairseq dan kemudian menjalankan perintah berikut untuk melatih model.
# ####### training scripts for IWSLT'14 , WMT'14, and WMT'16
# first cd to fairseq
# we use 1 GPU for IWSLT'14, 4 GPUs for WMT'14 and 2 GPUs for WMT'16 datasets respectively.
CUDA_VISIBLE_DEVICES=0 bash experiments/mt_train.sh -m absorbing -d < iwslt/wmt14/wmt 16> -s default -e True --store-ema --label-smoothing 0.1
CUDA_VISIBLE_DEVICES=1 bash experiments/mt_train.sh -m multinomial -d < iwslt/wmt14/wmt 16> -s default -e True --not-diffusing-special-sym --store-ema --label-smoothing 0.0
CUDA_VISIBLE_DEVICES=2 bash experiments/mt_train.sh -m reparam-absorbing -d < iwslt/wmt14/wmt 16> -s default -e True --q-sample-mode coupled --store-ema --label-smoothing 0.1 --reweighting-type linear
CUDA_VISIBLE_DEVICES=3 bash experiments/mt_train.sh -m reparam-multinomial -d < iwslt/wmt14/wmt 16> -s default -e True --not-diffusing-special-sym --q-sample-mode coupled --store-ema --label-smoothing 0.1 --reweighting-type linearCatatan
-s <str>digunakan untuk menentukan nama percobaan.- Kami dapat memberikan argumen khusus yang mungkin spesifik untuk pelatihan dengan menambahkannya setelah
-e True.
Pipa evaluasi ditangani oleh experiments/mt_generate.sh . Script akan menghasilkan hasil terjemahan dan mengevaluasi skor BLEU.
# ########## IWLS'14, WMT'14, and WMT'16 datasets
# we recommend putting each checkpoint into a separate folder
# since the script will put the decoded results into a file under the same folder of each checkpoint.
CUDA_VISIBLE_DEVICES=0 bash experiments/mt_generate.sh -a false -c < checkpoint_path > -d < iwslt/wmt14/wmt 16> Argumen:
-a : Apakah rata -rata beberapa pos pemeriksaan-c : Menunjukkan lokasi pos pemeriksaan. Jika -a false (tidak ke pos pemeriksaan rata -rata), lewati jalur pos pemeriksaan; Jika -a true , lewati direktori yang menyimpan beberapa pos pemeriksaan pada langkah pelatihan yang berbeda untuk rata -rata.-d : Nama datasetKami juga menyediakan pos pemeriksaan model terlatih kami.
| Dataset | Model | Tautan pos pemeriksaan |
|---|---|---|
| Iwslt'14 | Multinomial | link |
| Iwslt'14 | Mengasyikkan | link |
| Iwslt'14 | Reparam-multinomial | link |
| Iwslt'14 | Penyerap reparam | link |
| Wmt'14 | Multinomial | link |
| Wmt'14 | Mengasyikkan | link |
| Wmt'14 | Reparam-multinomial | link |
| Wmt'14 | Penyerap reparam | link |
| Wmt'16 | Multinomial | link |
| Wmt'16 | Mengasyikkan | link |
| Wmt'16 | Reparam-multinomial | link |
| Wmt'16 | Penyerap reparam | link |
Kami mengikuti pengaturan eksperimental di DiffuseQ untuk pembuatan pertanyaan dan parafrase tugas.
Data mentah dari kedua tugas ini dapat diambil dari repositori DiffuseQ asli. Kami kemudian memasukkan data melalui skrip yang disediakan.
# put the raw data in the directory ``diffuseq_data/QG``
# Preprocess the question generation dataset
bash diffusion_mt/scripts/preprocess_diffuseq_datasets.sh QG
# put the raw data in the directory ``diffuseq_data/QQP``
# Preprocess the paraphrasing dataset
bash diffusion_mt/scripts/preprocess_diffuseq_datasets.sh QQP # QQP or QG datasets
# first cd to fairseq
CUDA_VISIBLE_DEVICES=0,1 bash experiments/diffuseq_train.sh -m absorbing -d < qqp/qg > -s default -e True --store-ema --label-smoothing 0.1
CUDA_VISIBLE_DEVICES=2,3 bash experiments/diffuseq_train.sh -m multinomial -d < qqp/qg > -s default -e True --not-diffusing-special-sym --store-ema --label-smoothing 0.0
CUDA_VISIBLE_DEVICES=0,1 bash experiments/diffuseq_train.sh -m reparam-multinomial -d < qqp/qg > -s default -e True --not-diffusing-special-sym --q-sample-mode coupled --store-ema --label-smoothing 0.1 --reweighting-type linear
CUDA_VISIBLE_DEVICES=2,3 bash experiments/diffuseq_train.sh -m reparam-absorbing -d < qqp/qg > -s default -e True --q-sample-mode coupled --store-ema --label-smoothing 0.1 --reweighting-type linear Kami dengan cermat mengikuti protokol generasi & evaluasi seperti di DiffuseQ untuk memastikan perbandingan head-to-head. Seluruh pipa diimplementasikan kembali dalam fairseq/diffusion_mt/scripts/decode_diffuseq.py dan fairseq/diffusion_mt/scripts/eval_diffuseq.py masing-masing untuk kompatibel dengan fairseq. Jalankan perintah berikut:
# we recommend putting each checkpoint into a separate folder
# since the script will put the decoded results into a file under the same folder of each checkpoint.
CUDA_VISIBLE_DEVICES=0 bash experiments/diffuseq_generate.sh -a false -b true -c < checkpoint_path > -d < qqp/qg > Argumen:
-a : Apakah rata -rata beberapa pos pemeriksaan-b : Apakah akan menggunakan beberapa sampel untuk decoding MBR-c : Menunjukkan lokasi pos pemeriksaan. Jika -a false (tidak ke pos pemeriksaan rata -rata), lewati jalur pos pemeriksaan; Jika -a true , lewati direktori yang menyimpan beberapa pos pemeriksaan pada langkah pelatihan yang berbeda untuk rata -rata.-d : Nama datasetKami juga menyediakan pos pemeriksaan model terlatih kami.
| Dataset | Model | Tautan pos pemeriksaan |
|---|---|---|
| Qg | Multinomial | link |
| Qg | Mengasyikkan | link |
| Qg | Reparam-multinomial | link |
| Qg | Penyerap reparam | link |
| QQP | Multinomial | link |
| QQP | Mengasyikkan | link |
| QQP | Reparam-multinomial | link |
| QQP | Penyerap reparam | link |
@article { zheng2023rdm ,
title = { A Reparameterized Discrete Diffusion Model for Text Generation } ,
author = { Zheng, Lin and Yuan, Jianbo and Yu, Lei and Kong, Lingpeng } ,
journal = { arXiv preprint arXiv:2302.05737 } ,
year = { 2023 }
}