이번 포스트에서는 🤗HuggingFace의 Transformers 라이브러리와 Tensorflow를 통해 사전 학습된 BERT모델을 Fine-tuning하여 Multi-Class Text Classification을 수행하는 방법에 대해 알아보고자 한다. Show 특히 이번에 fine-tuning을 진행할 모델은 최근에 KLUE를 통해 배포된 BERT모델이다.
1. Load Dataset데이터 셋의 경우 KLUE에서 Topic-Classification을 위해 사용한 YNAT 데이터 셋을 그대로 사용하여 성능을 재현해보기로 하였다. YNAT는 연합뉴스의 2016-202년까지의 뉴스 headline을 수집한 데이터 셋이며, 총 7가지 클래스(IT과학, 경제, 사회, 생활문화, 세계, 스포츠, 정치)로 분류되어있다. Load Trainset
Count by Label
라벨별 갯수를 보면 총 7개의 클래스로 구분되어 있고, 어느정도 데이터셋의 balance가 맞춰져 있는 것을 알 수 있다. 🤹♂️ Label Encoding
학습 시 Loss 계산을 위해 문자열 형태의 레이블을 숫자 형태의 카테고리로 인코딩을 수행한다. Encode를 위해 scikit-learn의 LabelEncoder를 사용하였으며, transform() 메서드 수행시 encode, inverse_transform() 메서드 수행시
decode를 수행한다.Spliting data into training and validation set
텍스트와 라벨을 따로 분리 후,
모델 검증을 위해 validation set을 training set의 20%의 비율로 분리하였다. 2. Tokenizing the text본격적으로 Tokenizing 및 pretrained 모델 사용을 위해 🤗HuggingFace의 Transformers라이브러리를 활용한다.
KLUE-BERT Model Path
여기서 이용할 KLUE-BERT모델 또한 HuggingFace Model Hub에 배포되어 있으며 해당 모델 주소를 추후 Load Tokenizer and Tokenizing
Tokenizer는 BertTokenizer() , BertTokenizerFast() 무엇을 사용하던 상관없지만,
BertTokenizerFast() 가 BertTokenizer() 대비 1.2 ~ 1.5배 tokenizing 속도가 빠르다.
truncation혹은 padding 옵션을 주어 input sequence의 길이를 맞춰줄 수 있으며, 여러가지 옵션으로 세세한 튜닝도 가능하다.
3. Creating a Dataset object for TensorFlowfine-tuning을 진행하기 전에 먼저 tokenized 된 데이터 셋을 Tensorflow의
4. Fine-tuning BERTFine-tuning을 위해 tensorflow를 이용하는 것과 transformers의 TFTrainer를 활용하는 두 가지 방법이 존재하며 각각 아래 소개한다. 4.1 Using Native TensorflowLoad Pretrained Model
Text Classification 수행이 목적이므로 위에서 정의한 HUGGINGFACE_MODEL_PATH를 다시
Training
training 방법은 tf.keras에서 모델을 훈련할 때와 같다. training 사전 종료를 위해 EarlyStopping callback 함수를 적용하였다. 4.2 Using TFTrainer class
Training
transformers의 Trainer API를 사용하면 보다 쉽게 model 학습이 가능하다. 또한, Trainer API는 기본적으로 멀티 GPU/TPU를 활용한 분산 학습이 가능하다. 5. Saving Modeltransformers에서 제공하는 Change id2label, label2id in model.config
학습된 모델은 기본적으로 모델 아키텍처, 레이어, label과 같은 모델 정보를 config 속성에 저장하게 된다. 이 config에는 Saving the model and tokenizer
모델을 저장할 디렉토리를 지정한 후 6. Loading the saved Model and PredictionLoading the model and tokenizer
추가로 transformers의 Pipelines 클래스를 사용하면 손쉽게 특정 task에 대한 inference를 수행할 수 있다. 우리가 하고자 하는 것은 분류문제이기 때문에
Load Testset
Prediction using Pipelines
label과 score를 각각 담을 리스트를 준비한 후 , 위에서 정의한 text_classifier 라는 이름의 TextClassificationPipeline 클래스에 텍스트를
전달한다.
7. Evaluation
scikit-learn의 OutroHuggingFace transformers와 Tensorflow를 통해 사전학습모델을 Fine-tuning하는 방법 및 학습된 모델을 통해 Multi-class text classfication 문제까지
해결해보았다.😎 다음 포스팅에서는 HuggingFace를 좀더 스마트하게 사용할 수 있도록! References
|