يحتوي هذا المستودع على التنفيذ الرسمي للورق وهو نموذج نشر منفصل تم إعادة تشغيله لتوليد النص.
يتم تنفيذ قاعدة كود مع فيرسيك. لتثبيت التبعيات ، قم بتشغيل (موصى بها في بيئة افتراضية) الأوامر التالية:
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 ..لاحظ أنه يتم اختبار البيئة باستخدام Python 3.8.10 و Pytorch 1.10.0/1.12.0 و CUDA 11.3. لاحظ أيضًا أن شوكة FairSeq الخاصة بنا تعدل العديد من الملفات في قاعدة الكود الأصلية ؛ قد يؤدي استخدام إصدارات أكثر حداثة من فيرسيك إلى تعارضات غير متوقعة.
نقوم بتنفيذ نماذج الانتشار المنفصلة في مكتبة قائمة بذاتها discrete_diffusion عن الاستخدام العام. توفر المكتبة تطبيقات لنماذج الانتشار المنفصلة النموذجية المختلفة ، والتي تتكون من
(Vanilla/Reparameterized) multinomial diffusion : عمليات الانتشار التي تضخ الضوضاء uniform لتسلسل الرمز المميز. يتبع تنفيذ الانتشار متعدد الحدود الفانيليا عن كثب قاعدة الشفرة للورقة الأصلية ؛(Vanilla/Reparameterized) absorbing diffusion : عمليات الانتشار حيث يمكن امتصاص الرموز داخل التسلسل إلى حالة masking ، كما هو موضح في ورقة D3PM. تشترك نماذج الانتشار هذه في نفس مجموعة الواجهات التي تسمح بالاستخدامات الخارجية. على وجه الخصوص ، يتم تعريفها على أنها فئات فرعية من فئة DiscreteDiffusion ، مع أخذ النموذج التالي:
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.
""" يمكن إنشاء إنشاء نموذج DiscreteDiffusion من خلال تكوين ما يلي:
--num-diffusion-timesteps <int> العدد الكامل لوقت الانتشار (الافتراضي: 50)--diffusion-type <str> يحدد نوع نموذج الانتشار (الخيارات: {absorbing, multinomial, reparam-absorbing, reparam-multinomial} )--noise-scheduler-type <str> جدول الضوضاء فقط في الانتشار متعدد الحدود الفانيليا/Reparam (خيارات نموذجية: {linear, cosine} ؛ الافتراضي: cosine )q_sample() ، بما في ذلك--q-sample-mode <str> يحدد استراتيجية أخذ العينات (الخيارات: {default, coupled, multi-step, multi-sample} ؛ الافتراضي: default ). نحن نقدم خيارات مختلفة لأخذ العينات من default : يتم رسم عينة واحدة كـ multi-step : عينة من خطوتين من الوقت iid multi-sample : عينة من عينتين IID coupled : المعروف أيضًا باسم التدريب المكيف ، والذي تم تفصيله في الملحق F من الورقة. يبدأ هذا بأخذ عينات من خطوتين من الوقت IID coupled يجلب تحسينات كبيرة لكل من الانتشار متعدد الفانيليا/امتصاص ، ولكن المكسب ليس كبيرًا باستمرار في المتغيرات المعاد توزيعها.--not-diffusing-special-sym إلى ما إذا كان يجب تضمين رموز خاصة أثناء عملية الانتشار (الافتراضي: خطأ)compute_losses() ، بما في ذلك--reweighting-type <str> يحدد مخطط إعادة الوزن في عائلتنا المعاد تمهيده (الخيارات: {linear, reciprocal, none} ؛ الافتراضي: linear )--label-smoothing <float> يحدد معدل تجانس التسمية (الافتراضي: 0.1)sample_step() ، بما في ذلك--argmax-decoding إلى ما إذا كان يجب استخدام فك تشفير ArgMax لإخراج المحول denoised --temperature <float> يحدد درجة الحرارة --decoding-strategy <str> يحدد استخدام الفانيليا ( default ) / إعادة صياغة ( reparam-<options> ؛ انظر التفاصيل) استراتيجية فك التشفير (الخيارات: {default, reparam-<options>} ؛ الافتراضي: default )--load-ema-weights تشير إلى ما إذا كنت تريد تحميل أوزان نموذج EMA للجيل (الافتراضي: خطأ)--iter-decode-max-iter <int> الحد الأقصى لعدد الأوقات الزمنية لفك التشفير (الافتراضي: 10)--iter-decode-with-beam <int> حجم الحزمة لفك تشفير تسلسلات متعددة بأطوال مختلفة بالتوازي (الافتراضي: 1)--iter-decode-force-max-iter إلى أن فك التشفير التكراري يجب أن يدير العدد المحدد من التكرارات ولا يخرج. الموصى بها لتعيين هذا العلم على صحيح.انظر هنا للحصول على قائمة أكثر شمولاً من الحجج.
من خلال التمرير --decoding-strategy default ، يتم استخدام مخطط أخذ عينات الفانيليا (خاص بكل عملية انتشار منفصلة).
يمكن استدعاء نهج فك التشفير الأكثر تقدماً عن طريق تمرير- --decoding-strategy reparam-<conditioning-of-v>-<topk_mode>-<schedule> . يعتمد هذا النهج على إعادة التمييز المقترح في ورقتنا ويسمح بإجراءات فك التشفير الأكثر فعالية. تحدد الخيارات خوارزمية فك التشفير عبر
<conditioning-of-v> : uncond أو cond (افتراضي uncond ): ما إذا كان يجب إنشاء متغير التوجيه <topk_mode> : stochastic<float> أو deterministic ( deterministic افتراضية): ما إذا كان يجب استخدام اختيار Stochastic أو STATINASITION $ K $. تحدد قيمة التعويم في stochastic<float> درجة العشوائية في اختيار العشوائي العشوائي $ k $ ؛<schedule> : linear أو cosine ( cosine الافتراضي): الجدول الزمني راجع التنفيذ لمزيد من التفاصيل حول الخيارات.
يرجى الاطلاع على البرامج النصية أدناه للحصول على التفاصيل.
ملحوظة
- لاحظ أن جميع المهام التي تم النظر فيها في هذا العمل تعمل على البيانات الأصلية ولا تعتمد تقطير المعرفة (KD).
نتبع المعالجة المسبقة القياسية في FairSeq/أمثلة لإعداد البيانات ذات الثنائي:
# 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 20نستخدم البيانات التي تم إصدارها في FairSeq/أمثلة لإعداد مجموعة البيانات:
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 20بالنسبة لمجموعة البيانات هذه ، نستخدم البيانات RAW WMT16.TAR.GZ كما تم تجهيزها مسبقًا في هذا المستودع.
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 نصل أولاً إلى مجلد fairseq ثم ندير الأوامر التالية لتدريب النماذج.
# ####### 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 linearملحوظة
-s <str>يستخدم لتحديد اسم التجربة.- يمكننا تمرير الحجج المخصصة التي قد تكون خاصة بالتدريب عن طريق إلحاقها بعد
-e True.
يتم التعامل مع خط أنابيب التقييم بواسطة experiments/mt_generate.sh . سيقوم البرنامج النصي بإنشاء نتائج الترجمة وتقييم درجة 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> الحجج:
-a : ما إذا كان متوسط نقاط التفتيش المتعددة-c : يشير إلى موقع نقطة التفتيش. إذا -a false (وليس إلى متوسط نقاط التفتيش) ، تمرير مسار نقطة التفتيش ؛ إذا -a true ، فمرر الدليل الذي يخزن نقاط تفتيش متعددة في خطوات تدريب مختلفة لمتوسط.-d : اسم مجموعة البياناتكما نقدم نقاط التفتيش لنماذجنا المدربة.
| مجموعة البيانات | نموذج | رابط نقطة التفتيش |
|---|---|---|
| iwslt'14 | متعدد الحدود | وصلة |
| iwslt'14 | امتصاص | وصلة |
| iwslt'14 | reparam-multinomial | وصلة |
| iwslt'14 | reparam-incorbing | وصلة |
| WMT'14 | متعدد الحدود | وصلة |
| WMT'14 | امتصاص | وصلة |
| WMT'14 | reparam-multinomial | وصلة |
| WMT'14 | reparam-incorbing | وصلة |
| WMT'16 | متعدد الحدود | وصلة |
| WMT'16 | امتصاص | وصلة |
| WMT'16 | reparam-multinomial | وصلة |
| WMT'16 | reparam-incorbing | وصلة |
نتبع الإعداد التجريبي في Diffuseq لتوليد الأسئلة وإعادة صياغة مهام.
يمكن جلب البيانات الأولية لهاتين المهامتين من مستودع Diffuseq الأصلي. ثم نقوم بتثبيط البيانات عبر البرنامج النصي المقدم.
# 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 نتبع عن كثب بروتوكولات التوليد والتقييم كما هو الحال في Diffuseq لضمان مقارنة وجها لوجه. تتم إعادة تشكيل خط الأنابيب بأكمله في fairseq/diffusion_mt/scripts/decode_diffuseq.py و fairseq/diffusion_mt/scripts/eval_diffuseq.py على التوالي لتكون متوافقة مع FairSeq. قم بتشغيل الأوامر التالية:
# 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 > الحجج:
-a : ما إذا كان متوسط نقاط التفتيش المتعددة-b : ما إذا كنت تستخدم عينات متعددة لفك تشفير MBR-c : يشير إلى موقع نقطة التفتيش. إذا -a false (وليس إلى متوسط نقاط التفتيش) ، تمرير مسار نقطة التفتيش ؛ إذا -a true ، فمرر الدليل الذي يخزن نقاط تفتيش متعددة في خطوات تدريب مختلفة لمتوسط.-d : اسم مجموعة البياناتكما نقدم نقاط التفتيش لنماذجنا المدربة.
| مجموعة البيانات | نموذج | رابط نقطة التفتيش |
|---|---|---|
| QG | متعدد الحدود | وصلة |
| QG | امتصاص | وصلة |
| QG | reparam-multinomial | وصلة |
| QG | reparam-incorbing | وصلة |
| QQP | متعدد الحدود | وصلة |
| QQP | امتصاص | وصلة |
| QQP | reparam-multinomial | وصلة |
| QQP | reparam-incorbing | وصلة |
@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 }
}