우리는 NLPER가 항상 만나는 작업을 태깅하기 위해이 프로젝트를 개발하고 있습니다.
다음 작업에 XLNET을 사용하십시오
알람,이 코드는 아직 완료되지 않았습니다. 사용하기 위해 조심하십시오.
예를 들어, 다음을 사용하여 Scipts를 실행하십시오.
python2.7 /home/dev/Documents/xlnet-master/run_blstm_crf-run_race.py
--use_tpu
--model_config_path /home/dev/Documents/xlnet_models/xlnet_cased_L-12_H-768_A-12/xlnet_config.json
--spiece_model_file /home/dev/Documents/xlnet_models/xlnet_cased_L-12_H-768_A-12/spiece.model
--model_dir /home/dev/Documents/xlnet_models/finetuned/
--data_dir /home/dev/Documents/udify-master/data/ud/xlnet_data/
--do_train True
--save_steps 2
--output_dir /home/dev/Documents/xlnet_models/output_dir https://universaldections.org/
"find ./ -name *test/dev/train.conll"을 사용하여 모든 conll 파일을 찾고 xargs를 사용하여 data_dir에 복사 할 수 있습니다.
https://github.com/yuchenlin/ontonotes-5.0-ner-bio
Python 스크립트 파일을 사용하여 영어 파일을 data_dir로 복사하기 만하면 다음과 같이 onotonotes_conll_copyfile.py (경로를 수정해야 할 수도 있습니다).
PR S는 환영합니다! NLP 전원을 향상시키기 위해 개발 프로젝트를 도와주세요!
XLNET 은 새로운 일반적인 순열 언어 모델링 목표를 기반으로 한 새로운 비 감독 언어 표현 학습 방법입니다. 또한 XLNET은 트랜스포머 -XL을 백본 모델로 사용하여 긴 컨텍스트와 관련된 언어 작업에 대한 우수한 성능을 보여줍니다. 전반적으로 XLNET은 질문 답변, 자연어 추론, 감정 분석 및 문서 순위를 포함한 다양한 다운 스트림 언어 작업에서 최첨단 (SOTA) 결과를 달성합니다.
기술적 인 세부 사항 및 실험 결과에 대한 자세한 설명은 다음을 참조하십시오.
XLNET : 언어 이해를위한 일반적인 자동 회귀 전 사전 조정
Zhilin Yang*, Zihang Dai*, Yiming Yang, Jaime Carbonell, Ruslan Salakhutdinov, Quoc V. Le
(*: 동등한 기여)
프리 프린트 2019
2019 년 6 월 19 일 현재 XLNET은 20 개의 작업에 대한 BERT를 능가하고 18 개의 작업에서 최첨단 결과를 달성합니다. 다음은 XLNET-LARGE와 BERT-LARGE를 비교하여 비슷한 모델 크기를 갖습니다.
| 모델 | 인종 정확도 | 분대 1.1 Em | Squad2.0 Em |
|---|---|---|---|
| 베르트 라지 | 72.0 | 84.1 | 78.98 |
| xlnet-base | 80.18 | ||
| xlnet-large | 81.75 | 88.95 | 86.12 |
우리는 표준 DEV 결과를 사용하여 추가 교육 데이터 또는 기타 데이터 증강 기술 사용과 같은 다른 요소를 제외합니다. 테스트 번호는 분대장 보드를 참조하십시오.
| 모델 | IMDB | Yelp-2 | Yelp-5 | dbpedia | 아마존 -2 | 아마존 -5 |
|---|---|---|---|---|---|---|
| 베르트 라지 | 4.51 | 1.89 | 29.32 | 0.64 | 2.63 | 34.17 |
| xlnet-large | 3.79 | 1.55 | 27.80 | 0.62 | 2.40 | 32.26 |
위의 숫자는 오류율입니다.
| 모델 | mnli | qnli | QQP | RTE | SST-2 | MRPC | 콜라 | STS-B |
|---|---|---|---|---|---|---|---|---|
| 베르트 라지 | 86.6 | 92.3 | 91.3 | 70.4 | 93.2 | 88.0 | 60.6 | 90.0 |
| xlnet-base | 86.8 | 91.7 | 91.4 | 74.0 | 94.7 | 88.2 | 60.2 | 89.5 |
| xlnet-large | 89.8 | 93.9 | 91.8 | 83.8 | 95.6 | 89.2 | 63.6 | 91.8 |
우리는 단일 태스크 개발 결과를 사용하여 멀티 태스킹 학습 또는 앙상블 사용과 같은 다른 요소를 제외합니다.
2019 년 7 월 16 일 현재 다음 모델이 제공되었습니다.
XLNet-Large, Cased : 24 층, 1024- 히든, 16 헤드XLNet-Base, Cased : 12 층, 768-HIDDEN, 12 헤드. 이 모델은 전체 데이터에 대해 교육을받습니다 (논문의 데이터와 다름).우리는 우리가 고려하는 작업에서 다음과 같이 발견했기 때문에 현재 만 케이스 모델 만 출시합니다. (2) 큰 설정의 경우, 일부 작업에서는 케이스 모델이 조금 더 좋습니다.
각 .zip 파일에는 세 가지 항목이 있습니다.
xlnet_model.ckpt ).spiece.model ).xlnet_config.json ).우리는 또한 다음을 포함하여 다른 설정에서 더 많은 사기꾼 모델을 지속적으로 출시 할 계획입니다.
업데이트, 공지 및 새로운 릴리스에 대한 알림을 받으려면 Google 그룹의 XLNET에 가입하는 것이 좋습니다.
2019 년 6 월 19 일 현재이 코드베이스는 Python2에서 Tensorflow 1.13.1로 테스트되었습니다.
XLNet-Large 의 길이 512의 단일 시퀀스 만 보유 할 수 있기 때문에 대부분의 XLNet-Large SOTA 결과를 12GB-16GB RAM의 RAM을 사용하는 용지에서 재생산하는 것은 현재 매우 어려운 (비용이 많이 듭니다. 따라서 논문에서 많은 결과를 재현하려면 많은 수 (32 ~ 128, batch_size 와 동일)가 필요합니다. 위에서 언급 한 메모리 문제를 감안할 때 기본 Finetuning Scripts ( run_classifier.py 및 run_squad.py )를 사용하여 Tensorflow 1.13.1을 사용하여 단일 16GB GPU의 최대 배치 크기를 벤치마킹했습니다.
| 체계 | 서열 길이 | 최대 배치 크기 |
|---|---|---|
XLNet-Base | 64 | 120 |
| ... | 128 | 56 |
| ... | 256 | 24 |
| ... | 512 | 8 |
XLNet-Large | 64 | 16 |
| ... | 128 | 8 |
| ... | 256 | 2 |
| ... | 512 | 1 |
대부분의 경우, 주어진 하드웨어에 맞는 배치 크기 train_batch_size 또는 최대 시퀀스 길이 max_seq_length 줄일 수 있습니다. 성능 감소는 작업 및 가용 리소스에 따라 다릅니다.
분류/회귀 결합을 수행하는 데 사용되는 코드는 run_classifier.py 에 있습니다. 또한 표준 1 문서 분류, 1 문서 회귀 및 문서 쌍 분류에 대한 예제도 포함되어 있습니다. 여기서는 run_classifier.py 사용하는 방법에 대한 두 가지 구체적인 예를 제공합니다.
여기에서 xlnet-large 및 xlnet-base가 각각 $LARGE_DIR 및 $BASE_DIR 로 다운로드되었다고 가정합니다.
이 스크립트를 실행하여 접착제 데이터를 다운로드하고 일부 디렉토리 $GLUE_DIR 로 포장하십시오.
XLNET-LARGE를 사용하여 Multi-GPU (4 V100 GPU) FINETUNING 수행하여 실행하십시오.
CUDA_VISIBLE_DEVICES=0,1,2,3 python run_classifier.py
--do_train=True
--do_eval=False
--task_name=sts-b
--data_dir= ${GLUE_DIR} /STS-B
--output_dir=proc_data/sts-b
--model_dir=exp/sts-b
--uncased=False
--spiece_model_file= ${LARGE_DIR} /spiece.model
--model_config_path= ${LARGE_DIR} /xlnet_config.json
--init_checkpoint= ${LARGE_DIR} /xlnet_model.ckpt
--max_seq_length=128
--train_batch_size=8
--num_hosts=1
--num_core_per_host=4
--learning_rate=5e-5
--train_steps=1200
--warmup_steps=120
--save_steps=600
--is_regression=True단일 GPU로 최종 결과를 평가하십시오
CUDA_VISIBLE_DEVICES=0 python run_classifier.py
--do_train=False
--do_eval=True
--task_name=sts-b
--data_dir= ${GLUE_DIR} /STS-B
--output_dir=proc_data/sts-b
--model_dir=exp/sts-b
--uncased=False
--spiece_model_file= ${LARGE_DIR} /spiece.model
--model_config_path= ${LARGE_DIR} /xlnet_config.json
--max_seq_length=128
--eval_batch_size=8
--num_hosts=1
--num_core_per_host=1
--eval_all_ckpt=True
--is_regression=True
# Expected performance: "eval_pearsonr 0.916+ "참고 :
num_core_per_host 사용할 GPU의 수를 나타냅니다.train_batch_size GPU 당 배치 크기를 나타냅니다.eval_all_ckpt 사용하면 훈련 마감 후 저장된 체크 포인트 (저장 주파수는 save_steps 에 의해 제어)를 평가하고 DEV 성능을 기반으로 최상의 모델을 선택할 수 있습니다.data_dir 및 output_dir 각각 "원시 데이터"및 "전처리 된 tfrecords"의 디렉토리를 참조하는 반면, model_dir 체크 포인트 및 TensorFlow 이벤트를 저장하기위한 작업 디렉토리입니다. model_dir init_checkpoint 의 별도 폴더로 설정해야합니다.init_checkpoint 및 model_config_path 의 변경 사항과 함께 --train_batch_size=32 및 --num_core_per_host=1 간단히 설정할 수 있습니다.train_batch_size 비례 적으로 줄이고 num_core_per_host 늘려 동일한 교육 설정을 사용하십시오.실행하여 IMDB 데이터 세트를 다운로드하여 풀립니다
wget http://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz
tar zxvf aclImdb_v1.tar.gzGoogle Cloud TPU v3-8 인스턴스를 시작하십시오 (클라우드 TPU를 설정하는 방법은 Google Cloud TPU 자습서 참조).
Google Storage Bucket Path $GS_ROOT 설정하고 IMDB 데이터 세트를 이동하고 사전 변경 된 체크 포인트를 Google 스토리지로 이동하십시오.
실행하여 XLNET-LARGE로 TPU FINETUNING을 수행하십시오
python run_classifier.py
--use_tpu=True
--tpu= ${TPU_NAME}
--do_train=True
--do_eval=True
--eval_all_ckpt=True
--task_name=imdb
--data_dir= ${IMDB_DIR}
--output_dir= ${GS_ROOT} /proc_data/imdb
--model_dir= ${GS_ROOT} /exp/imdb
--uncased=False
--spiece_model_file= ${LARGE_DIR} /spiece.model
--model_config_path= ${GS_ROOT} / ${LARGE_DIR} /model_config.json
--init_checkpoint= ${GS_ROOT} / ${LARGE_DIR} /xlnet_model.ckpt
--max_seq_length=512
--train_batch_size=32
--eval_batch_size=8
--num_hosts=1
--num_core_per_host=8
--learning_rate=2e-5
--train_steps=4000
--warmup_steps=500
--save_steps=500
--iterations=500
# Expected performance: "eval_accuracy 0.962+ "참고 :
data_dir 및 spiece_model_file 모두 Google 스토리지 경로 대신 로컬 경로를 사용합니다. 그 이유는 데이터 전처리가 실제로 로컬로 수행되기 때문입니다. 따라서 로컬 경로를 사용하면 전처리 속도가 빨라집니다. 분대 데이터 세트 코드는 run_squad.py 에 포함되어 있습니다.
코드를 실행하려면 :
(1) Squad2.0 데이터 세트를 $SQUAD_DIR 로 다운로드하십시오.
mkdir -p ${SQUAD_DIR} && cd ${SQUAD_DIR}
wget https://rajpurkar.github.io/SQuAD-explorer/dataset/train-v2.0.json
wget https://rajpurkar.github.io/SQuAD-explorer/dataset/dev-v2.0.json (2) 스크립트 scripts/prepro_squad.sh 사용하여 데이터 전처리를 수행하십시오.
캐릭터 위치 (원시 데이터)를 문장 직위 (훈련에 사용)에 정확하게 매핑하는 데 꽤 시간이 걸립니다.
더 빠른 병렬 전처리는 run_squad.py 의 플래그 --num_proc 및 --proc_id 참조하십시오.
(3) 교육 및 평가를 수행합니다.
최상의 성능을 위해 Xlnet-Large는 훈련에 시퀀스 길이 512 및 배치 크기 48을 사용합니다.
결과적으로 GPU로 최상의 결과를 재현하는 것은 매우 어렵습니다.
하나의 TPU v3-8로 교육을 받으려면 TPU와 Google Storage가 모두 설정된 후 스크립트 scripts/tpu_squad_large.sh 실행할 수 있습니다.
run_squad.py DEV 분대 세트에서 임계 값 검색을 자동으로 수행하고 점수를 출력합니다. scripts/tpu_squad_large.sh 의 경우 예상되는 F1 점수는 약 88.6 (다중 실행 중앙값)이어야합니다.
또는 GPUS (예 : 3 V100)와 함께 XLNET-베이스를 사용할 수 있습니다. 합리적인 하이퍼 파라미터 세트는 스크립트 scripts/gpu_squad_base.sh 에서 찾을 수 있습니다.
Reading Comprehension Task Race의 코드는 run_race.py 에 포함되어 있습니다.
코드를 실행하려면 :
(1) 공식 웹 사이트에서 레이스 데이터 세트를 다운로드하고 RAW 데이터를 $RACE_DIR 로 포장합니다.
(2) 교육 및 평가 수행 :
script/tpu_race_large_bsz32.sh 를 참조하십시오.script/tpu_race_large_bsz8.sh 참조).GPU와 함께 Google Colab을 사용하는 예가 제공되었습니다. 예제에서 하드웨어가 제한되므로 결과는 우리가 얻을 수있는 최선보다 더 나쁩니다. 주로 예제 역할을하며 성능을 극대화하기 위해 그에 따라 수정해야합니다.
Finetuning의 경우 run_classifier.py , run_squad.py 및 run_race.py 와 같은 기존 파일을 수정할 수 있습니다. 그러나보다 유연한 사용을 가능하게하기 위해 XLNET의 추상화를 제공합니다. 아래는 예입니다.
import xlnet
# some code omitted here...
# initialize FLAGS
# initialize instances of tf.Tensor, including input_ids, seg_ids, and input_mask
# XLNetConfig contains hyperparameters that are specific to a model checkpoint.
xlnet_config = xlnet . XLNetConfig ( json_path = FLAGS . model_config_path )
# RunConfig contains hyperparameters that could be different between pretraining and finetuning.
run_config = xlnet . create_run_config ( is_training = True , is_finetune = True , FLAGS = FLAGS )
# Construct an XLNet model
xlnet_model = xlnet . XLNetModel (
xlnet_config = xlnet_config ,
run_config = run_config ,
input_ids = input_ids ,
seg_ids = seg_ids ,
input_mask = input_mask )
# Get a summary of the sequence using the last hidden state
summary = xlnet_model . get_pooled_out ( summary_type = "last" )
# Get a sequence output
seq_out = xlnet_model . get_sequence_output ()
# build your applications based on `summary` or `seq_out`아래는 xlnet에서 토큰 화를 수행하는 예입니다.
import sentencepiece as spm
from prepro_utils import preprocess_text , encode_ids
# some code omitted here...
# initialize FLAGS
text = "An input text string."
sp_model = spm . SentencePieceProcessor ()
sp_model . Load ( FLAGS . spiece_model_file )
text = preprocess_text ( text , lower = FLAGS . uncased )
ids = encode_ids ( sp_model , text ) 여기서 FLAGS.spiece_model_file 은 사전에 걸린 모델과 동일한 지퍼의 문장 모델 파일입니다. FLAGS.uncased Uncasing을 수행할지 여부를 나타내는 부울입니다.
GPU의 사전 조정을 위해 TPU 및 train_gpu.py 사전 여지에 대해서는 train.py 를 참조하십시오. 먼저 텍스트 데이터를 tfrecords로 전처리해야합니다.
python data_utils.py
--bsz_per_host=32
--num_core_per_host=16
--seq_len=512
--reuse_len=256
--input_glob= * .txt
--save_dir= ${SAVE_DIR}
--num_passes=20
--bi_data=True
--sp_path=spiece.model
--mask_alpha=6
--mask_beta=1
--num_predict=85 input_glob 모든 입력 텍스트 파일을 정의하는 경우 save_dir tfrecords의 출력 디렉토리이며 sp_path 문장 조각 모델입니다. 다음은 문장 조각 모델을 훈련시키기위한 스크립트입니다.
spm_train
--input= $INPUT
--model_prefix=sp10m.cased.v3
--vocab_size=32000
--character_coverage=0.99995
--model_type=unigram
--control_symbols= < cls > , < sep > , < pad > , < mask > , < eod >
--user_defined_symbols= < eop > ,.,(,), " ,-,–,£,€
--shuffle_input_sentence
--input_sentence_size=10000000 control_symbols 및 user_defined_symbols 포함한 특수 기호가 사용됩니다. 우리는 <eop> 과 <eod> 사용하여 문서의 끝과 끝을 각각 나타냅니다.
data_utils.py 에 입력 텍스트 파일은 다음 형식을 사용해야합니다.
<eop> 삽입 할 수 있습니다.예를 들어 텍스트 입력 파일은 다음과 같습니다.
This is the first sentence.
This is the second sentence and also the end of the paragraph.<eop>
Another paragraph.
Another document starts here.
전처리 후, 우리는 xlnet을 사전에 전할 준비가되었습니다. 다음은 XLNET-Large 사전 레이팅에 사용되는 초 파라미터입니다.
python train.py
--record_info_dir= $DATA /tfrecords
--train_batch_size=2048
--seq_len=512
--reuse_len=256
--mem_len=384
--perm_size=256
--n_layer=24
--d_model=1024
--d_embed=1024
--n_head=16
--d_head=64
--d_inner=4096
--untie_r=True
--mask_alpha=6
--mask_beta=1
--num_predict=85여기서 우리는 가장 중요한 플래그 만 나열하고 다른 플래그는 특정 사용 사례에 따라 조정될 수 있습니다.