이 저장소에는 소수의 샷 텍스트 분류 및 자연어 추론에 대한 클로즈 질문을 악용하기위한 코드가 포함되어 있으며 중요한 크기는 아닙니다. 소규모 언어 모델도 소수의 학습자입니다. 이 논문은 입력 예제를 클로즈 스타일의 문구로 재구성하는 반 감독 훈련 절차 인 PET (Pattern-Exploiting Training)를 소개합니다. 저주적 환경에서 PET와 IPET는 정기적 인 감독 훈련, 다양한 반 감독 기준 및 심지어 GPT-3이 99.9% 적은 매개 변수를 필요로 함에도 불구하고 상당히 능가합니다. PET (IPET)의 반복 변형은 여러 세대의 모델을 훈련 시키며 훈련 데이터 없이도 사용할 수 있습니다.
| #예방 | 훈련 모드 | Yelp (Full) | AG의 뉴스 | 야후 질문 | mnli |
|---|---|---|---|---|---|
| 0 | 감독되지 않은 | 33.8 | 69.5 | 44.0 | 39.1 |
| IPET | 56.7 | 87.5 | 70.7 | 53.6 | |
| 100 | 감독 | 53.0 | 86.0 | 62.9 | 47.9 |
| 애완 동물 | 61.9 | 88.3 | 69.2 | 74.7 | |
| IPET | 62.9 | 89.6 | 71.2 | 78.4 |
참고 : 위의 결과를 정확하게 재현하려면 v1.1.0 ( --branch v1.1.0 )을 사용해야합니다.
? 설정
CLI 사용
API 사용
? 자신의 애완 동물을 훈련하십시오
소환
애완 동물에 대한 모든 요구 사항은 requirements.txt 에서 찾을 수 있습니다 .txt. pip install -r requirements.txt 사용하여 필요한 모든 패키지를 설치할 수 있습니다.
이 저장소의 Command Line Interface cli.py 는 현재 세 가지 다른 교육 모드 (PET, IPET, 감독 교육), 두 가지 추가 평가 방법 (비 감독 및 프라이밍) 및 13 개의 다른 작업을 지원합니다. Yelp Reviews, AG의 뉴스, Yahoo 질문, MNLI 및 X-Stance는 자세한 내용은 원본 논문을 참조하십시오. 8 개의 SuperGlue 작업은이 논문을 참조하십시오.
지원되는 작업 중 하나에 대한 PET 모델을 교육하고 평가하려면 다음 명령을 실행하십시오.
python3 cli.py
--method pet
--pattern_ids $PATTERN_IDS
--data_dir $DATA_DIR
--model_type $MODEL_TYPE
--model_name_or_path $MODEL_NAME_OR_PATH
--task_name $TASK
--output_dir $OUTPUT_DIR
--do_train
--do_eval
어디
$PATTERN_IDS 사용할 PVP를 지정합니다. 예를 들어, 모든 패턴을 사용하려면 AG의 뉴스 및 Yahoo 질문에 PATTERN_IDS 0 1 2 3 PATTERN_IDS 0 1 2 3 4 지정하십시오.$DATA_DIR 는 열차 및 테스트 파일이 포함 된 디렉토리입니다 (이 파일을 각 작업마다 이름을 지정하고 형식화하는 방법을 확인하려면 tasks.py 확인하십시오).$MODEL_TYPE Albert, bert 또는 Roberta (예 : albert , Bert 또는 roberta 의 이름입니다.$MODEL_NAME 은 사전 취소 모델 (예 : roberta-large 또는 albert-xxlarge-v2 ) 또는 사전 여분의 모델로가는 경로의 이름입니다.$TASK_NAME 훈련하고 평가하는 작업의 이름입니다.$OUTPUT_DIR 훈련 된 모델 및 평가 결과가 저장되는 디렉토리의 이름입니다. 개별 PVP (Prefix --pet_ )에 해당하는 PET 모델의 앙상블과 최종 시퀀스 분류 모델 (접두사 --sc_ )에 대한 다양한 교육 매개 변수를 추가로 지정할 수 있습니다. 예를 들어, SuperGlue 평가에 사용되는 기본 매개 변수는 다음과 같습니다.
--pet_per_gpu_eval_batch_size 8
--pet_per_gpu_train_batch_size 2
--pet_gradient_accumulation_steps 8
--pet_max_steps 250
--pet_max_seq_length 256
--pet_repetitions 3
--sc_per_gpu_train_batch_size 2
--sc_per_gpu_unlabeled_batch_size 2
--sc_gradient_accumulation_steps 8
--sc_max_steps 5000
--sc_max_seq_length 256
--sc_repetitions 1
각 패턴 $P 및 반복 $I 에 대해 위 명령을 실행하면 다음 파일이 포함 된 디렉토리 $OUTPUT_DIR/p$Pi$I 를 만듭니다.
pytorch_model.bin : 일부 모델 별 파일 (예 : spiece.model , special_tokens_map.json )과 함께 Finetuned 모델.wrapper_config.json : 사용중인 모델의 구성train_config.json : 교육에 사용되는 구성eval_config.json : 평가에 사용되는 구성logits.txt : 표지되지 않은 데이터에 대한 모델의 예측eval_logits.txt : 평가 데이터에 대한 모델의 예측results.json : 모델의 최종 정확도와 같은 결과를 포함하는 JSON 파일predictions.jsonl : superglue 형식으로 설정된 평가에 대한 예측 파일 각 반복에 대한 최종 (증류) 모델 $I $OUTPUT_DIR/final/p0-i$I 에서 찾을 수 있으며, 여기에는 위에서 설명한 것과 동일한 파일이 포함되어 있습니다.
훈련 중에 GPU가 메모리가 부족한 경우 pet_per_gpu_train_batch_size 와 sc_per_gpu_unlabeled_batch_size 모두 줄이면서 pet_gradient_accumulation_steps 및 sc_gradient_accumulation_steps 모두 증가시킬 수 있습니다.
지원되는 작업 중 하나에 대한 IPET 모델을 교육하고 평가하려면 위와 동일한 명령을 실행하되 --method pet --method ipet 로 교체하십시오. 수정할 수있는 다양한 추가 IPET 매개 변수가 있습니다. 그들 모두는 --ipet_ 로 접두사가 있습니다.
각 생성 $G , pattern $P 및 반복 $I 에 대해, 이것은 일반 PET와 같이 구성된 디렉토리 $OUTPUT_DIR/g$G/p$Pi$I 만듭니다. 최종 (증류) 모델은 다시 $OUTPUT_DIR/final/p0-i$I 로 찾을 수 있습니다.
제로 훈련 예제와 함께 IPET를 사용하는 경우 1 세대에서 각 레이블에 대해 얼마나 많은 예제를 선택 해야하는지 지정해야하며, 감소 전략을 의미하기 위해 감소 전략을 변경해야합니다. --ipet_n_most_likely 100 --reduction mean .
감독 된 방식으로 정기 시퀀스 분류기를 교육하고 평가하려면 위와 동일한 명령을 실행하지만 --method pet --method sequence_classifier 로 교체하십시오. 수정할 수있는 시퀀스 분류기에 대한 다양한 추가 매개 변수가 있습니다. 그들 모두는 --sc_ 로 접두사가 있습니다.
기본 PET 패턴 및 언어화물로 사전에 사전 된 언어 모델을 평가하려면 미세 조정 없이는 최종 증류가 수행되지 않도록 인수 --do_train 및 add --no_distillation 제거하십시오.
프라이밍을 사용하려면 인수 --do_train 인수를 제거하고 인수 --priming --no_distillation 추가하여 모든 훈련 예제가 프라이밍에 사용되며 최종 증류가 수행되지 않도록합니다.
최대 시퀀스 길이를 훨씬 더 큰 값 (예 : --pet_max_seq_length 5000 으로 늘려야 할 수도 있습니다. 이것은 이러한 긴 시퀀스와 같은 언어 모델과 함께 작동합니다. xlnet을 사용하려면 --model_type xlnet --model_name_or_path xlnet-large-cased --wrapper_type plm 지정할 수 있습니다.
명령 줄 인터페이스를 사용하는 대신 PET API를 직접 사용할 수 있으며 대부분은 pet.modeling 에 정의됩니다. import pet 포함하여 train_pet , train_ipet 및 train_classifier 와 같은 방법에 액세스 할 수 있습니다. 자세한 내용은 문서를 확인하십시오.
맞춤형 작업에 PET를 사용하려면 두 가지를 정의해야합니다.
examples/custom_task_processor.py 참조하십시오.examples/custom_task_pvp.py 참조하십시오.데이터 프로세서와 PVP를 구현 한 후 위에서 설명한대로 명령 줄을 사용하여 PET 모델을 교육 할 수 있습니다. 아래에서는 PVP의 두 구성 요소, 언어 제 및 패턴을 정의하는 방법에 대한 추가 정보를 찾을 수 있습니다.
언어 화기는 작업 라벨을 자연 언어로 단어에 매핑하는 데 사용됩니다. 예를 들어, 이진 감정 분류 작업에서 양수 레이블 ( +1 )을 Word good 와 음수 레이블 ( -1 )을 bad 단어에 매핑 할 수 있습니다. 언어 화기는 PVP의 verbalize() 방법을 통해 실현됩니다. 언어 제를 정의하는 가장 간단한 방법은 사전을 사용하는 것입니다.
VERBALIZER = { "+1" : [ "good" ], "-1" : [ "bad" ]}
def verbalize ( self , label ) -> List [ str ]:
return self . VERBALIZER [ label ] 중요하게도, PET의 현재 버전에서, 언어화물은 기본적으로 기본 LMS 어휘의 단일 토큰 으로 제한되어 있습니다 (하나 이상의 토큰을 사용하려면 아래 참조). 언어 모델의 토큰 화기가 주어지면 len(tokenizer.tokenize(word)) == 1 확인하여 단어가 단일 토큰에 해당하는지 쉽게 확인할 수 있습니다.
단일 레이블에 대한 다중 언어 화를 정의 할 수도 있습니다. 예를 들어, 바이너리 감정 분류 작업에서 라벨을 가장 잘 나타내는 단어가 확실하지 않은 경우, 구두 제를 다음과 같이 정의 할 수 있습니다.
VERBALIZER = { "+1" : [ "great" , "good" , "wonderful" , "perfect" ], "-1" : [ "bad" , "terrible" , "horrible" ]} 패턴은 언어 모델이 주어진 작업을 이해하도록하는 데 사용됩니다. 여기에는 정확히 하나의 <MASK> 토큰이 포함되어 있어야하며, 이는 언어화물을 사용하여 채워야합니다. 리뷰의 요약 ( <A> ) 및 Body ( <B> )를 기반으로 한 이진 감정 분류의 경우, 적절한 패턴은 <A>. <B>. Overall, it was <MASK>. 패턴은 PVP의 get_parts() 메소드를 통해 실현되며,이 텍스트 시퀀스 쌍을 반환합니다 (여기서 각 시퀀스는 문자열 목록으로 표시).
def get_parts ( self , example : InputExample ):
return [ example . text_a , '.' , example . text_b , '.' ], [ 'Overall, it was ' , self . mask ]한 쌍의 시퀀스를 사용하지 않으려면 두 번째 시퀀스를 비워 둘 수 있습니다.
def get_parts ( self , example : InputExample ):
return [ example . text_a , '.' , example . text_b , '. Overall, it was ' , self . mask ], [] 여러 패턴을 정의하려면 PVP S pattern_id 속성을 사용하기 만하면됩니다.
def get_parts ( self , example : InputExample ):
if self . pattern_id == 1 :
return [ example . text_a , '.' , example . text_b , '.' ], [ 'Overall, it was ' , self . mask ]
elif self . pattern_id == 2 :
return [ 'It was just ' , self . mask , '!' , example . text_a , '.' , example . text_b , '.' ], [] 명령 줄을 사용하여 모델을 훈련 할 때 사용할 모든 패턴 (예 : --pattern_ids 1 2 )을 지정하십시오.
중요하게도, 시퀀스가 기본 LM의 지정된 최대 시퀀스 길이보다 긴 경우, PET는 입력의 어떤 부분이 단축 될 수 있고 어떤 부분이 할 수 없는지 알아야합니다 (예 : 마스크 토큰이 항상 존재해야 함). 따라서 PVP shortenable() 메소드를 제공하여 텍스트 조각이 단축 될 수 있음을 나타냅니다.
def get_parts ( self , example : InputExample ):
text_a = self . shortenable ( example . text_a )
text_b = self . shortenable ( example . text_b )
return [ text_a , '.' , text_b , '. Overall, it was ' , self . mask ], []기본적으로 PET 및 IPET의 현재 구현은 단일 토큰에 해당하는 모든 예제 및 언어 화기에서 공유되는 고정 된 라벨 세트 만 지원합니다. 그러나 일부 작업의 경우 여러 토큰에 해당하는 언어 화기를 사용해야 할 수도 있습니다 (여기에 설명 된대로). 그렇게하려면 다음 두 가지 수정이 필요합니다.
작업의 데이터 프로세서 에 다음 줄을 추가하십시오 ( examples/custom_task_processor.py 참조) :
from pet . tasks import TASK_HELPERS
from pet . task_helpers import MultiMaskTaskHelper
TASK_HELPERS [ 'my_task' ] = MultiMaskTaskHelper 여기서 'my_task' 작업의 이름입니다.
PVP 에서 get_parts() 메소드가 구두화에 필요한 최대 마스크 토큰 수를 항상 삽입해야합니다. 예를 들어, 언어 제가 +1 에 "정말 굉장한", -1 에서 "끔찍한"것에 +1을 맵핑하고 ["really", "awe", "##some"] 및 ["terrible"] 로 토큰 화 된 경우 get_parts() 메소드가 항상 3 마스크 토큰을 포함하는 시퀀스를 반환해야합니다.
이 수정을 사용하면 이제 여러 토큰으로 구성된 언어 화기를 사용할 수 있습니다.
VERBALIZER = { "+1" : [ "really good" ], "-1" : [ "just bad" ]}그러나 고려해야 할 몇 가지 제한 사항이 있습니다.
MultiMaskTaskHelper 사용하는 경우 평가의 최대 배치 크기는 1입니다.MultiMaskTaskHelper 클래스는 철저히 테스트되지 않은 실험 기능입니다. 특히,이 기능은 IPET가 아닌 PET에 대한 테스트되었습니다. 이상한 것을 관찰하면 문제를 제기하십시오. 더 많은 유연성을 위해 사용자 정의 TaskHelper 작성할 수도 있습니다. 시작점으로 pet/task_helpers.py 에서 CopaTaskHelper , WscTaskHelper 및 RecordTaskHelper 클래스를 확인할 수 있습니다.
이 저장소에서 코드를 사용하는 경우 다음 논문을 인용하십시오.
@article{schick2020exploiting,
title={Exploiting Cloze Questions for Few-Shot Text Classification and Natural Language Inference},
author={Timo Schick and Hinrich Schütze},
journal={Computing Research Repository},
volume={arXiv:2001.07676},
url={http://arxiv.org/abs/2001.07676},
year={2020}
}
@article{schick2020small,
title={It's Not Just Size That Matters: Small Language Models Are Also Few-Shot Learners},
author={Timo Schick and Hinrich Schütze},
journal={Computing Research Repository},
volume={arXiv:2009.07118},
url={http://arxiv.org/abs/2009.07118},
year={2020}
}