Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place. Commercial Alternative to JupyterHub.
Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place. Commercial Alternative to JupyterHub.
Path: blob/main/transformers_doc/ko/masked_language_modeling.ipynb
Views: 2542
마스킹된 언어 모델링(Masked language modeling)[[masked-language-modeling]]
마스킹된 언어 모델링은 시퀀스에서 마스킹된 토큰을 예측하며, 모델은 양방향으로 토큰에 액세스할 수 있습니다. 즉, 모델은 토큰의 왼쪽과 오른쪽 양쪽에서 접근할 수 있습니다. 마스킹된 언어 모델링은 전체 시퀀스에 대한 문맥적 이해가 필요한 작업에 적합하며, BERT가 그 예에 해당합니다.
이번 가이드에서 다룰 내용은 다음과 같습니다:
ELI5 데이터 세트에서 r/askscience 부분을 사용해 DistilRoBERTa 모델을 미세 조정합니다.
추론 시에 직접 미세 조정한 모델을 사용합니다.
다음 아키텍쳐 중 하나를 선택하세요:
ALBERT, BART, BERT, BigBird, CamemBERT, ConvBERT, Data2VecText, DeBERTa, DeBERTa-v2, DistilBERT, ELECTRA, ERNIE, ESM, FlauBERT, FNet, Funnel Transformer, I-BERT, LayoutLM, Longformer, LUKE, mBART, MEGA, Megatron-BERT, MobileBERT, MPNet, MVP, Nezha, Nyströmformer, Perceiver, QDQBert, Reformer, RemBERT, RoBERTa, RoBERTa-PreLayerNorm, RoCBert, RoFormer, SqueezeBERT, TAPAS, Wav2Vec2, XLM, XLM-RoBERTa, XLM-RoBERTa-XL, X-MOD, YOSO
시작하기 전에 필요한 라이브러리가 모두 설치되어 있는지 확인하세요:
Hugging Face 계정에 로그인하여 모델을 업로드하고 커뮤니티와의 공유를 권장합니다. 메시지가 표시되면(When prompted) 토큰을 입력하여 로그인합니다:
ELI5 데이터 세트 가져오기[[load-eli5-dataset]]
먼저 🤗 Datasets 라이브러리에서 ELI5 데이터 세트의 r/askscience 중 일부만 가져옵니다. 이렇게 하면 전체 데이터 세트 학습에 더 많은 시간을 할애하기 전에 모든 것이 작동하는지 실험하고 확인할 수 있습니다.
데이터 세트의 train_asks
를 train_test_split
메소드를 사용해 훈련 데이터와 테스트 데이터로 분할합니다:
그리고 아래 예시를 살펴보세요:
많아 보일 수 있지만 실제로는 text
필드에만 집중하면 됩나다. 언어 모델링 작업의 멋진 점은 (비지도 학습으로) 다음 단어가 레이블이기 때문에 레이블이 따로 필요하지 않습니다.
전처리[[preprocess]]
마스킹된 언어 모델링을 위해, 다음 단계로 DistilRoBERTa 토크나이저를 가져와서 text
하위 필드를 처리합니다:
위의 예제에서와 마찬가지로, text
필드는 answers
안에 중첩되어 있습니다. 따라서 중첩된 구조에서 flatten
메소드를 사용하여 text
하위 필드를 추출합니다:
이제 각 하위 필드는 answers
접두사(prefix)로 표시된 대로 별도의 열이 되고, text
필드는 이제 리스트가 되었습니다. 각 문장을 개별적으로 토큰화하는 대신 리스트를 문자열로 변환하여 한번에 토큰화할 수 있습니다.
다음은 각 예제에 대해 문자열로 이루어진 리스트를 join
하고 결과를 토큰화하는 첫 번째 전처리 함수입니다:
이 전처리 함수를 전체 데이터 세트에 적용하기 위해 🤗 Datasets map
메소드를 사용합니다. 데이터 세트의 여러 요소를 한 번에 처리하도록 batched=True
를 설정하고 num_proc
로 처리 횟수를 늘리면 map
함수의 속도를 높일 수 있습니다. 필요하지 않은 열은 제거합니다:
이 데이터 세트에는 토큰 시퀀스가 포함되어 있지만 이 중 일부는 모델의 최대 입력 길이보다 깁니다.
이제 두 번째 전처리 함수를 사용해
모든 시퀀스를 연결하고
연결된 시퀀스를 정의한
block_size
보다 더 짧은 덩어리로 분할하는데, 이 덩어리는 모델의 최대 입력 길이보다 짧고 GPU RAM이 수용할 수 있는 길이여야 합니다.
전체 데이터 세트에 group_texts
함수를 적용합니다:
이제 DataCollatorForLanguageModeling
을 사용하여 데이터 예제의 배치를 생성합니다. 데이터 세트 전체를 최대 길이로 패딩하는 것보다 collation 단계에서 매 배치안에서의 최대 길이로 문장을 동적으로 패딩하는 것이 더 효율적입니다.
시퀀스 끝 토큰을 패딩 토큰으로 사용하고 데이터를 반복할 때마다 토큰을 무작위로 마스킹하도록 mlm_-probability
를 지정합니다:
시퀀스 끝 토큰을 패딩 토큰으로 사용하고 데이터를 반복할 때마다 토큰을 무작위로 마스킹하도록 mlm_-probability
를 지정합니다:
훈련[[train]]
Trainer
로 모델을 미세 조정하는 데 익숙하지 않다면 기본 튜토리얼 여기를 살펴보세요!
이제 모델 훈련을 시작할 준비가 되었습니다! AutoModelForMaskedLM
를 사용해 DistilRoBERTa 모델을 가져옵니다:
이제 세 단계가 남았습니다:
TrainingArguments
의 훈련 하이퍼파라미터를 정의합니다. 모델 저장 위치를 지정하는output_dir
은 유일한 필수 파라미터입니다.push_to_hub=True
를 설정하여 이 모델을 Hub에 업로드합니다 (모델을 업로드하려면 Hugging Face에 로그인해야 합니다).모델, 데이터 세트 및 데이터 콜레이터(collator)와 함께 훈련 인수를
Trainer
에 전달합니다.train()
을 호출하여 모델을 미세 조정합니다.
훈련이 완료되면 evaluate()
메소드를 사용하여 펄플렉서티(perplexity)를 계산하고 모델을 평가합니다:
그리고 push_to_hub()
메소드를 사용해 다른 사람들이 사용할 수 있도록, Hub로 모델을 업로드합니다.
Keras로 모델을 미세 조정하는 데 익숙하지 않다면 기본 튜토리얼 여기를 살펴보세요!
다음으로 TFAutoModelForMaskedLM
를 사용해 DistilRoBERTa 모델을 가져옵니다:
prepare_tf_dataset()
메소드를 사용해 데이터 세트를 tf.data.Dataset
형식으로 변환하세요:
compile
메소드를 통해 모델 훈련을 구성합니다:
이는 업로드할 모델과 토크나이저의 위치를 PushToHubCallback
에 지정하여 수행할 수 있습니다:
드디어 모델을 훈련할 준비가 되었습니다! 모델을 미세 조정할 때 훈련 및 검증 데이터 세트, 에포크 수, 콜백이 포함된 fit
을 호출합니다:
훈련이 완료되면, 자동으로 Hub로 업로드되어 누구나 사용할 수 있습니다!
마스킹된 언어 모델링을 위해 모델을 미세 조정하는 방법에 대한 보다 심층적인 예제는 PyTorch notebook 또는 TensorFlow notebook을 참조하세요.
추론[[inference]]
지금까지 모델 미세 조정을 잘 했으니, 추론에 사용할 수 있습니다!
모델이 빈칸을 채울 텍스트를 스페셜 토큰(special token)인 <mask>
토큰으로 표시합니다:
추론을 위해 미세 조정한 모델을 테스트하는 가장 간단한 방법은 pipeline()
에서 사용하는 것입니다. fill-mask
태스크로 pipeline
을 인스턴스화하고 텍스트를 전달합니다. top_k
매개변수를 사용하여 반환하는 예측의 수를 지정할 수 있습니다:
텍스트를 토큰화하고 input_ids
를 PyTorch 텐서 형태로 반환합니다. 또한, <mask>
토큰의 위치를 지정해야 합니다:
모델에 inputs
를 입력하고, 마스킹된 토큰의 logits
를 반환합니다:
그런 다음 가장 높은 확률은 가진 마스크 토큰 3개를 반환하고, 출력합니다:
텍스트를 토큰화하고 input_ids
를 TensorFlow 텐서 형태로 반환합니다. 또한, <mask>
토큰의 위치를 지정해야 합니다:
모델에 inputs
를 입력하고, 마스킹된 토큰의 logits
를 반환합니다:
그런 다음 가장 높은 확률은 가진 마스크 토큰 3개를 반환하고, 출력합니다: