이 저장소에는 텍스트 생성을위한 용지 A의 공식적인 구현이 포함되어 있습니다.
Codebase는 FairSeq에서 구현됩니다. 종속성을 설치하려면 다음 명령을 실행 (가상 환경에서 권장) : 다음 명령을 실행하십시오.
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의 포크는 원래 코드베이스에서 여러 파일을 수정합니다. 보다 최근 버전의 FairSeQ를 사용하면 예기치 않은 의존성 충돌이 발생할 수 있습니다.
우리는 일반적인 용도를 위해 자체 포함 된 라이브러리 개별 discrete_diffusion 에서 개별 확산 모델을 구현합니다. 라이브러리는 다양한 전형적인 이산 확산 모델의 구현을 제공합니다.
(Vanilla/Reparameterized) multinomial diffusion : 토큰 시퀀스에 uniform 노이즈를 주입하는 확산 과정. 바닐라 다중 생물 확산의 구현은 원래 논문의 코드베이스를 밀접하게 따릅니다.(Vanilla/Reparameterized) absorbing diffusion : 확산 과정은 D3pm 용지에 설명 된 바와 같이 시퀀스 내의 토큰이 masking 상태로 흡수 될 수있는 곳을 가공 할 수있는 과정. 이 확산 모델은 외부 용도로 사용하는 동일한 인터페이스 세트를 공유합니다. 특히, 이들은 다음과 같은 양식을 취하는 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> 소음 일정을 바닐라/리파 람 다중 연체 확산 (일반적인 선택 : {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 확산 과정에서 특수 기호를 포함할지 여부를 나타냅니다 (기본값 : false)compute_losses() 의 손실 목적 계산과 관련된 중요한 인수--reweighting-type <str> 재가자 화 된 패밀리 에서 재 체중 감축 체계를 지정합니다 (선택 : {linear, reciprocal, none} ; default : linear )--label-smoothing <float> 라벨 스무딩 속도를 지정합니다 (기본값 : 0.1)sample_step() 의 디코딩 루틴과 관련된 중요한 인수--argmax-decoding denoised 변압기 출력에 Argmax 디코딩을 사용할지 여부를 나타냅니다. --temperature <float> 온도를 지정합니다 default --decoding-strategy <str> 바닐라 ( default ) / reparameterized ( reparam-<options> {default, reparam-<options>} 세부 사항 참조) 디코딩 전략의 사용을 지정합니다.--load-ema-weights 생성에 EMA 모델 가중치를로드할지 여부 (기본값 : False)--iter-decode-max-iter <int> 디코딩에 대한 최대 타임 스텝 수를 지정합니다 (기본값 : 10)--iter-decode-with-beam <int> 길이가 다른 길이를 병렬로 디코딩하기위한 빔 크기를 지정합니다 (기본값 : 1)--iter-decode-force-max-iter 반복 디코딩이 지정된 반복 수를 실행하고 종료되지 않아야 함을 나타냅니다. 이 깃발을 true로 설정하는 것이 좋습니다.보다 포괄적 인 인수 목록은 여기를 참조하십시오.
--decoding-strategy default 통과시킴으로써 바닐라 샘플링 체계 (각 이산 확산 프로세스에 특유)가 사용됩니다.
--decoding-strategy reparam-<conditioning-of-v>-<topk_mode>-<schedule> 통과함으로써보다 진보 된 디코딩 접근법을 호출 할 수있다. 이 접근법은 우리 논문에서 제안 된 재파 매거진을 기반으로하며보다 효과적인 디코딩 절차를 허용합니다. 옵션은 디코딩 알고리즘을 통해 지정합니다
<conditioning-of-v> : uncond 또는 cond (기본 uncond ) : 라우팅 변수 생성 여부 <topk_mode> : stochastic<float> 또는 deterministic (기본 deterministic ) : 확률 론적 또는 결정 론적 Top- $ k $ 선택 여부. stochastic<float> 의 플로트 값은 확률 적 Top- $ 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 20FairSeQ/예제에서 릴리스 된 데이터를 사용하여 데이터 세트를 준비합니다.
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이 데이터 세트의 경우이 저장소에서 미리 처리 된 원시 데이터 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 | 리파 람-흡수 | 링크 |
| wmt'14 | 다국적 | 링크 |
| wmt'14 | 흡수 | 링크 |
| wmt'14 | Reparam-multinomial | 링크 |
| wmt'14 | 리파 람-흡수 | 링크 |
| wmt'16 | 다국적 | 링크 |
| wmt'16 | 흡수 | 링크 |
| wmt'16 | Reparam-multinomial | 링크 |
| wmt'16 | 리파 람-흡수 | 링크 |
우리는 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 | 리파 람-흡수 | 링크 |
| QQP | 다국적 | 링크 |
| QQP | 흡수 | 링크 |
| QQP | Reparam-multinomial | 링크 |
| QQP | 리파 람-흡수 | 링크 |
@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 }
}