이 저장소에는 다음 논문의 코드 및 데이터가 포함되어 있습니다.
Mixce : 전방 및 역수를 혼합하여 자동 회귀 언어 모델을 훈련
@inproceedings{zhang2023mixce,
title={MixCE: Training Autoregressive Language Models by Mixing Forward and Reverse Cross-Entropies},
author={Zhang, Shiyue and Wu, Shijie and İrsoy, Ozan and Lu, Steven and Bansal, Mohit and Dredze, Mark and Rosenberg, David},
booktitle={Proceedings of the 61th Annual Meeting of the Association for Computational Linguistics},
year={2023}
}
코드 저자 : Shiyue Zhang
python -m pip install -r requirements.txt선택 사항 : 기존 패키지와의 충돌을 피하려면 가상 환경에서 설치를 수행 할 수 있습니다.
python -m venv yourenv
. yourenv/bin/activate # for bash, might be something else for your particular shell
python -m pip install -r requirements.txtsynthetic.py 는 합성 실험을 실행하기위한 스크립트입니다. 실험 실험은 매우 간단합니다.
python synthetic.py
구성 (종자, 어휘 크기 등)을 지정하고 스크립트 내에서 if __name__ == '__main__':
Synthetic.py에는 어떤 종류의 합성 실험을 실행할 수 있는지 결정하는 몇 가지 중요한 구성이 있습니다.
Real_dataset : None 전이 행렬이 무작위로 초기화됩니다. 또는 'webtext' 인 경우 WebText의 사전 계산 된 전환 행렬에서 전환 매트릭스가 초기화됩니다.
ZERO_PERCENT : 전이 행렬의 값이 0인지 결정합니다. 예를 들어, zero_percent==0.5 인 경우 전이 행렬의 50% 확률은 0입니다.
vocab_size : 어휘 크기. 우리는 21, 51, 101, 501 또는 1001을 테스트합니다. 21은 20 개의 일반 토큰 (EOS 포함)과 1 개의 패드 토큰이 있음을 의미합니다.
씨앗 : 우리는 각 실험에 대해 5 개의 씨앗 (7, 42, 777, 4222, 99999)을 실행합니다.
LOSS_FUNC : 우리는 4 가지 손실 함수를 테스트합니다. (1) 'two_xens' : 우리 논문에서 Mixce*로 표시되며 금 데이터 배포 P 및 Gumbel SoftMax를 사용합니다. (2) 'qlogq_mix' : 그것은 우리의 근사한 Mixce 손실 함수입니다. (3) 'two_kls' : 두 KL 발산의 혼합물; (4) 'js' : JS Divergence.
TRAIN_ETA : 해당 손실 기능의 혼합 비율. 'two_xens' 의 경우 train_eta==1.0 경우 MLE입니다. 'two_kls' 의 경우 train_eta==1.0 경우 전방 KL (MLE와 동일)입니다. 'two_kls' 의 경우 train_eta==0.0 경우 리버스 kl입니다. 우리는 JS의 일반적인 정의를 사용하고 (자세한 내용은이 논문 참조), train_eta 0.0 또는 1.0에 가까워지면 JS는 0으로 수렴합니다. Train_eta = 0.5 인 경우 JS 분기의 정상 정의입니다.
우리는 학습 된 전이 행렬을 금 전이 매트릭스와 비교하여 합성 적으로 훈련 된 Bigram LMS를 평가합니다. 우리는 두 가지 메트릭을 사용합니다.
(1) AVG. JS : 우리는 금의 각 행 사이의 JS 발산과 배운 전이 행렬과 평균 행을 계산합니다.
(2) AVG. 0S : 우리는 배운 매트릭스에서 금 확률 = 0 위치에서 값을 얻은 다음 평균입니다.
synthetic.py의 compare_parameters() 함수는이 두 가지 메트릭을 계산하는 데 사용됩니다.
모델은 모두 synthetic_logs/ directory에 저장됩니다. 각 모델 디렉토리의 이름은 실험이 실행 된 DateTime으로 시작합니다. 모델 디렉토리에서도 Tensorboard 이벤트 파일과 각 혼합 비율에 대한 최상의 메트릭 스코어를 저장하는 all_best_metrics.json 도 찾을 수 있습니다. synthetic_logs/의 예를 참조하십시오.
모델 평가는 각 신기원 후에 수행되며 최상의 체크 포인트는 개발자 세트의 손실에 따라 선택됩니다.
결국, 각 실험에 대해, 우리는 5 개의 씨앗의 결과를 평균화합니다. 각 목표에 대해 AVG를 기준으로 최상의 믹싱 비율을 선택합니다. JS.
get_synthetic_results() renucts.py의 get_synthetic_results ()는 5 개의 씨앗에서 평균 결과를 얻는 데 사용되는 기능이며 AVG에 대한 다른 혼합 비율의 다른 결과를 분류합니다. JS.
get_synthetic_results() 사용하려면 먼저 모델 디렉토리를 지정하려면 synthetic_models.json을 준비해야합니다. 예제는 synthetic_models.json에 표시됩니다. 그런 다음 get_synthetic_results('webtext', '20', 'two_kls') 실행하여 WebText 초기화 전환 매트릭스, vocab = 20 및 객관적인 = 2_kls를 사용하는 실험 결과를 얻을 수 있습니다.
detokenizer. 먼저 Moses에서 detokenizer.perl 다운로드하고 다음 Python 스크립트가 그것에 의존하기 때문에 Path data/detokenizer.perl 아래에 배치해야합니다.
그 다음에:
cd data
python wikitext_data.py
python webtext_data.py
curl https://dl.fbaipublicfiles.com/fairseq/data/writingPrompts.tar.gz | tar xvzf -
python writingprompts_data.py
전처리 데이터는 data/wikitext , data/webtext 및 data/writingPrompts 에 저장됩니다.
Hugging Face가 제공 한 지침에 따라 git lfs 사용하는 복제 GPT-2 모델.
git lfs install
git clone https://huggingface.co/gpt2
GPT2는 가장 작은 GPT-2 모델입니다. 우리는 또한 GPT2-medium 및 gpt2-large를 실험합니다. GPT2-LARGE는 Mauve 컴퓨팅에 사용되므로 다음에도 다운로드하십시오.
git clone https://huggingface.co/gpt2-medium
git clone https://huggingface.co/gpt2-large
Mauve 용 GPT2-LARGE 사본을 만드십시오.
cp -r gpt2-large gpt2-large-mauve
우리는 GPT2-LARGE에 직접 편지를 보내기 때문에 Mauve 계산에 영향을 미칩니다.
다음을 통해 실험 실행을 시작할 수 있습니다.
python run.py
구성은 run.py 내에서 수동으로 지정할 수 있습니다. if __name__ == '__main__' 의 예를 참조하십시오.
run.py 에는 몇 가지 중요한 구성이 있습니다.
Training_Size : 교육 데이터 크기, 우리는 '10K' , '25K' , '50K' 및 '100K' 테스트합니다. 기본적으로 우리는 '50K' 사용합니다.
모델 : 'gpt2' , 'gpt2-meidum' 또는 'gpt2-large' 일 수 있습니다.
데이터 세트 : "wikitext" , "webtext" 또는 "writingPrompts" 일 수 있습니다.
Mixing_ratio : [0.0, 0.01, 0.1, 0.3, 0.5, 0.7, 0.9, 0.99, 1.0] 검색하고 Dev Set Mauve Score를 기반으로 최상의 mixing_ratio 선택합니다.
Train_batch_size, Accumulation, Eval_batch_size :이 구성은 사용하는 플랫폼에서 결정해야합니다. 하나의 단일 Tesla V100 GPU (32g 메모리)를 사용 하고이 설정에서 권장 구성은 run.py 에 있습니다.
run.py 에는 하나의 덕트와 세 가지 기능이 있습니다.
data_sets {} : 데이터 파일의 경로를 저장합니다.
run_no_trainer () : 모델 교육 및 평가에 사용되는 기능.
run_no_trainer_eval () : 모델 평가에만 사용되는 함수.
run_no_trainer_turn_topp () : Top-P 샘플링의 p.
run.py 외에도 모델 교육 및 평가를위한 다른 중요한 Python 스크립트를 여기에 소개합니다.
gpt2.py (가장 필수 파일)에는 Mixce 손실 함수를 구현하는 gpt2mixmodel 모델 클래스가 포함되어 있습니다.
run_clm_no_trainer.py는 GPT-2 모델을 교육하고 평가하는 스크립트입니다.
run_clm_no_trainer_tune_topp.py 는 run_clm_no_trainer.py 와 유사하지만 상단 P 샘플링의 하이퍼 파라미터 P를 조정하는 데만 사용됩니다.
metircs.py 에는 모델 세대를 평가하는 데 사용하는 메트릭이 포함되어 있습니다.
모델은 train/ 디렉토리에 저장됩니다.
각 모델 디렉토리의 이름은 실험이 실행 된 DateTime으로 시작합니다. 모델 디렉토리에서 최상의 체크 포인트 (DEV 손실에 따라 선택)를 저장합니다.
dev/test.sample , dev/test.sample1 , dev/test.sample2 및 dev/test.human 은 3 개의 편견없는 샘플링 세대와 인간 텍스트입니다.
dev/test_results.json 당황, 다양성 및 반복의 결과를 저장하십시오.
Top-P 샘플링의 경우 P를 조정 한 후 dev/test.topp(p=*) P 값이 다른 상위 P 샘플링 세대입니다.
Mauve 및 일관성을 계산 한 후 (자세한 내용은 다음 섹션 참조) dev/test_mauve_coherence_*.json
제어 된 연마 및 일관성을 계산 한 후 (자세한 내용은 다음 섹션 참조), dev/test_controlled_mauve_coherence_*.json
우리는 우리 논문에서 6 개의 메트릭 점수를보고합니다.
Perplexity 는 모델 교육/평가와 함께 계산됩니다 ( run_clm_no_trainer.py 참조).
다양성은 metircs.py 의 diversity() 함수에 의해 구현되며, run_clm_no_trainer.py 에서 compute_diversity_repetition() 함수를 호출하여 모델 교육/평가와 함께 계산됩니다. 반복은 우리가 구현 한 또 다른 메트릭이지만 논문에서보고하지 않았다는 점에 유의하십시오. 텍스트의 백분율이 반복 루프인지 확인하고 반복적 인 문구 길이를 반환합니다.
Mauve 와 Coherence는 저장된 생성 파일을 사용하여 사후 방식으로 계산됩니다. metrics.py 의 compute_mauve() 및 compute_coherence() 는 연기 및 일관성을 계산하기위한 두 가지 도우미 함수입니다. results.py 에서 compute_mauve_coherence() 함수에 의해 호출됩니다. compute_mauve_coherence() 사용하려면 먼저 Models.json을 준비하여 평가를 위해 모델 디렉토리 이름을 지정해야합니다.
마찬가지로, results.py 에서 compute_controlled_mauve_coherence() 함수에 의해 제어-매력 및 제어 작업 이 사후 방식으로 계산 될 수 있습니다.
| 데이터 세트 | 모델 크기 | 교육 데이터 크기 | 목적 | 포옹 얼굴 허브 이름 |
|---|---|---|---|---|
| Wikitext | GPT2-LARGE | 50k | mle | Shiyue/wikitext_train50k_gpt2-large_mix1.0 |
| Wikitext | GPT2-LARGE | 50k | Mixce (ETA = 0.1) | Shiyue/wikitext_train50k_gpt2-large_mix0.1 |
| 웹 텍스트 | GPT2-LARGE | 50k | mle | Shiyue/webtext_train50k_gpt2-large_mix1.0 |
| 웹 텍스트 | GPT2-LARGE | 50k | Mixce (ETA = 0.3) | Shiyue/webtext_train50k_gpt2-large_mix0.3 |
| WritingPrompts | GPT2-LARGE | 50k | mle | Shiyue/writingprompts_train50k_gpt2-large_mix1.0 |
| WritingPrompts | GPT2-LARGE | 50k | Mixce (ETA = 0.7) | Shiyue/writingprompts_train50k_gpt2-large_mix0.7 |
다음과 같은 방법으로 사전에 사전 모델을 사용해보십시오.
>>> from gpt2 import GPT2MIXModel
>>> from transformers import GPT2Tokenizer
>>> model = GPT2MIXModel.from_pretrained("shiyue/wikitext_train50K_gpt2-large_mix1.0")
>>> tokenizer = GPT2Tokenizer.from_pretrained('shiyue/wikitext_train50K_gpt2-large_mix1.0')
>>> text = "Hey, how are you?"
>>> encoded_input = tokenizer(text, return_tensors='pt')
>>> model.eval()
>>> out_ids = model.lm.generate(inputs=encoded_input["input_ids"], max_length=50, do_sample=True)
>>> print(tokenizer.batch_decode(out_ids, skip_special_tokens=True))
우리는 .️ 기여입니다.
이 프로젝트에 대한 좋은 경험을 했습니까? 사랑을 공유하고 코드를 공헌하지 않거나 그 문제에 대해 알려주십시오.
여기에서 문제 보고서를 환영합니다. 필요한 정보를 제공하여 문제에 대한 적절한 문제 템플릿을 선택하십시오.
풀 요청을 보내기 전에 기여 가이드 라인을 읽으십시오.
다음 두 파일은 transformers 저장소에서 빌려서 채택되므로 원래 저작권을 유지합니다.
이것은 원래 https://github.com/huggingface/transformers/blob/main/examples/pytorch/language-modeling/run_clm_no_trainer.py에서 픽업되었습니다. 또한 다음 수정 사항을 적용했습니다.
--test_file--reduction--mixing_ratio--max_length--prompt_length--eval_prompt_length--cache_dir--do_train--do_evalpush_to_hub "옵션에 대해 사용하지 않은 코드 블록을 언급했습니다.DataCollatorWithPadding 사용하십시오.do_eval "옵션에 대한 평가 로직을 추가하십시오. 대부분은 새로운 함수 ' evaluate() '에 들어갑니다. 이 파일은 generate() 함수가 호출되는 방법을 변경하여 run_clm_no_trainer.py (위 참조)에서 추가 top_p 수정되었습니다.
이 프로젝트는 행동 강령을 채택했습니다. 코드 또는 프로젝트에서 경험 한 행동에 대한 우려 사항이 있으시면 [email protected]으로 문의하십시오.