레이블 이름 만 사용하여 텍스트 분류에 사용되는 소스 코드 : EMNLP 2020에 게시 된 언어 모델 자체 훈련 접근법 .
코드를 실행하려면 하나 이상의 GPU가 필요합니다.
실행하기 전에 다음 명령을 입력하여 필요한 패키지를 먼저 설치해야합니다.
$ pip3 install -r requirements.txt
또한 NLTK 라이브러리에서 스톱워드를 다운로드해야합니다.
import nltk
nltk.download('stopwords')
파이썬 3.6 이상이 강력하게 권장됩니다. 이전 파이썬 버전을 사용하면 패키지 비 호환성 문제가 발생할 수 있습니다.
우리는 4 개의 데이터 세트에서 모델을 실행하기 위해 datasets 아래에서 용지에 사용 된 데이터 세트 imdb.sh 다운로드하기위한 4 agnews.sh get_data.sh 스크립트 amazon.sh 제공 dbpedia.sh .
참고 : 우리 모델은 교육 레이블을 사용하지 않습니다. 우리는 완전성과 평가를 위해서만 교육/테스트 세트 지상 진실 레이블을 제공합니다.
훈련 배쉬 스크립트는 2 개의 10GB GPU가 있다고 가정합니다. 다른 메모리 크기의 GPU 또는 GPU의 수가 다른 경우 다음 섹션을 참조하십시오. 다음 섹션을 참조하십시오. 다음 명령 줄 인수를 적절하게 변경하는 방법 (다른 인수를 변경하지 않고) : train_batch_size , accum_steps , eval_batch_size 및 gpus .
명령 줄 인수의 의미는 입력시 표시됩니다.
python src/train.py -h
다음 인수는 모델의 성능에 직접적인 영향을 미치며 신중하게 설정해야합니다.
train_batch_size , accum_steps , gpus :이 세 가지 인수는 함께 설정되어야합니다. train_batch_size * accum_steps * gpus 로 계산 된 효과적인 교육 배치 크기가 약 128 인지 확인해야합니다. 예를 들어, 4 개의 GPU가있는 경우 train_batch_size = 32, accum_steps = 1, gpus = 4 설정할 수 있습니다. GPU 1 개가 있으면 train_batch_size = 32, accum_steps = 4, gpus = 1 설정할 수 있습니다. GPU의 메모리 크기가 다르면 accum_steps 및 gpus 동시에 조정하여 효과적인 교육 배치 크기를 약 128 로 유지하면서 train_batch_size 변경해야 할 수도 있습니다.eval_batch_size :이 인수는 알고리즘의 속도에만 영향을 미칩니다. GPU가 보유 할 수있는 큰 평가 배치 크기를 사용하십시오.max_len :이 인수는 모델에 공급 된 최대 문서 길이를 제어합니다 (더 긴 문서는 잘려옵니다). 이상적으로는 max_len 가장 긴 문서의 길이로 설정해야하지만 (Bert Architecture에서 max_len 512 보다 클 수는 없지만) max_len 더 많이 사용하면 더 많은 GPU 메모리가 소비되어 배치 크기가 작고 교육 시간이 더 길어집니다. 따라서 max_len 줄임으로써 더 빠른 교육을 위해 모델 정확도를 거래 할 수 있습니다.mcp_epochs , self_train_epochs : 그들은 각각 마스크 된 카테고리 예측 작업 및 자체 훈련 작업에서 모델을 훈련시키기위한 에포크 수를 제어합니다. mcp_epochs = 3, self_train_epochs = 1 설정하는 것은 대부분의 데이터 세트에서 좋은 출발점이되지만 데이터 세트가 작 으면 늘릴 수 있습니다 ( 100,000 문서 미만).다른 인수는 기본값으로 유지 될 수 있습니다.
새 데이터 세트에서 코드를 실행하려면
datasets 에서 your_dataset 이라는 디렉토리를 만듭니다.your_dataset train.txt Text (라인 당 하나의 문서)를 준비하십시오 (문서 레이블이 필요하지 않음).your_dataset 아래에서 레이블 이름 파일 label_names.txt 준비하십시오 (각 줄은 하나의 범주의 레이블 이름이 포함되어 있습니다. 여러 단어가 카테고리의 레이블 이름으로 사용되면 같은 줄에 넣고 공백 문자로 분리하십시오).test_labels.txt 와 함께 테스트 코퍼스 test.txt (라인 당 하나의 문서)를 제공하도록 선택할 수 있습니다 (각 줄에는 해당 문서의 범주 인덱스를 나타내는 정수가 포함되어 있으며 인덱스는 0 부터 시작해야하며 순서는 label_names.txt 의 범주 순서와 일치해야합니다. 테스트 코퍼스가 제공되면 코드는 훈련이 완료되면 your_dataset 아래에서 분류 결과를 out.txt 으로 작성합니다. 테스트 코퍼스의 지상 진실 레이블이 제공되면 자체 훈련 중에 테스트 정확도가 표시되며, 이는 소규모 테스트 세트를 사용하여 하이퍼 파라미터 튜닝 및 모델 체리 고정에 유용합니다.your_dataset 에서 final_model.pt 로 저장됩니다.참고 : 코드는 지속적인 교육을 위해 중간 데이터 및 모델 체크 포인트를 데이터 세트 디렉토리의 .pt 파일로 캐시합니다. 교육 코퍼스 또는 레이블 이름을 변경하고 코드를 다시 실행하는 경우 코드가 이전 결과를로드하지 못하도록 모든 .pt 파일을 먼저 삭제해야합니다.
자신의 데이터 세트를 준비 할 때 언제든지 예제 데이터 세트를 참조 할 수 있습니다.
코드가 연구에 도움이된다면 다음 논문을 인용하십시오.
@inproceedings{meng2020text,
title={Text Classification Using Label Names Only: A Language Model Self-Training Approach},
author={Meng, Yu and Zhang, Yunyi and Huang, Jiaxin and Xiong, Chenyan and Ji, Heng and Zhang, Chao and Han, Jiawei},
booktitle={Proceedings of the 2020 Conference on Empirical Methods in Natural Language Processing},
year={2020},
}