SimpleTransformers: 알기 쉬운 트랜스포머
서론
오픈 소스 라이브러리인 Hugging Face Transformers 는 수많은 사전 훈련된 모델을 위한 하나의 장소입니다. API 디자인은 잘 설계되었으며 구현하기 쉽습니다. 하지만 여전히 어느 정도의 복잡성(complexity)이 존재하며, 잘 구현되기 위해서는 몇 가지 기술적 노하우가 필요합니다.
Simple Transformers를 입력하고, 복잡성을 제거하여, 트랜스포머 모델 아키텍처에 대한 모델 교육 및 훈련과 같은 중요한 사항에 착수할 수 있습니다. 이를 통해 모든 복잡한 설정, 보일러플레이트코드(boilerplate code) 및 다음과 같은 일반적인 기타 불쾌한 사안을 전부 우회할 수 있습니다.
- 한 라인에서 모델 초기화
- 다음 라인에서 훈련
- 세 번째 라인에서 평가하기
이 간략한 리포트에서, 저희는 Hugging Face 및 Simple Transformers를 모두 사용하여 IMDB 데이터세트에 대한 감성 분류기(sentiment classifier)를 구축해보겠습니다. 그다음 Simple Transformers를 사용해 소규모 프로젝트를 진행하겠습니다.
Hugging Face 방식
이 섹션에서, Hugging Face API를 사용해 간단한 감성 분류기를 구축해보겠습니다. IMDB 데이터세트를 사용해 Distil BERT 모델을 미세 조정하겠습니다.
Google Colab에서 해보기 →\rightarrow
Hugging Face 트랜스포머를 사용해 단 몇 줄의 코드로 감성 분류기를 구축할 수 있습니다. 하지만 여기에는, 특히 트랜스포머를 막 시작한 분들의 경우, 몇 가지 까다로운 부분이 있습니다.
1.. 불러오기(Imports)
트랜스포머마다 다른 불러오기(imports)가 필요합니다. Hugging Face는 두 가지 딥러닝 프레임워크 PyTorch, TensorFlow를 지원합니다. TF prefix(접두어)는 TensorFlow 관련 불러오기에 사용됩니다.
from transformers import DistilBertTokenizerFast
from transformers import TFDistilBertForSequenceClassification, TFTrainer, TFTrainingArguments
저희 감성 분류기의 경우, 토크나이저, 모델, 트레이너가 주로 필요합니다.
2. 토크나이저
토큰화는 NLP에서 가장 일반적인 전처리(pre-processing) 작업 중 하나입니다. 문장이 주어지면, 작업은 문장을 토큰이라는 조각으로 나누는 것입니다. 심지어 트랜스포머도 토큰화되려면 입력이 필요합니다. 그러나 트랜스포머마다 다른 토큰화 모듈이 필요하므로, 올바른 모듈을 불러오기 해야 합니다.
tokenizer = DistilBertTokenizerFast.from_pretrained('distilbert-base-uncased')
train_encodings = tokenizer(train_texts, truncation=True, padding=True)
val_encodings = tokenizer(val_texts, truncation=True, padding=True)
test_encodings = tokenizer(test_texts, truncation=True, padding=True)
3. 훈련 전달인자
Hugging Face는 간단하지만 완전한 훈련 및 평가 인터페이스를 제공합니다. TrainingArguments
또는 TFTrainingArguments
를 사용하면, 광범위한 훈련 옵션을 제공할 수 있으며, 로깅, 기울기 축적(gradient accumulation), 혼합 정밀도(mixed precision)과 같은 내장 기능을 사용할 수 있습니다. 다른 훈련 전달인자에 대해서 알아보시려면 이곳을 클릭하시기 바랍니다.
training_args = TFTrainingArguments(
output_dir='./results',
num_train_epochs=3,
per_device_train_batch_size=16,
per_device_eval_batch_size=64,
warmup_steps=500,
weight_decay=0.01,
logging_dir='./logs',
logging_steps=10,
)
4. 모델 구하기
Hugging Face API를 사용하여 사전 훈련된 트랜스포머 모델을 다운로드할 수 있습니다. 하지만, 여전히 올바른 모듈을 불러오기 해야 합니다.
model = TFDistilBertForSequenceClassification.from_pretrained("distilbert-base-uncased")
5. 훈련
Trainer
또는 TFTrainer
API는 인터페이스를 제공하여 다운스트림 작업(downstream task)에서 트랜스포머 모델을 훈련 및 평가합니다.
trainer = TFTrainer(
model=model,
args=training_args,
train_dataset=train_dataset,
eval_dataset=val_dataset
)
trainer.train()
Hugging Face는 Weights and Biases integration과 함께 제공됩니다. trainer.train()
은 W&B 대시보드에서 훈련하는 동안 자동으로 모든 메트릭을 로그합니다. 아래는 감성 분류기를 훈련하는 동안 로그된 차트입니다.
Simple Transformers 방식
Simple Transformers는 Hugging Face 섹션에서 확인한 모든 복잡성을 방지합니다. Simple Transformers는 더 큰 추상화(abstraction)을 Hugging Face API에 제공하여 트랜스포머 모델을 신속하게 훈련 및 평가합니다. 다운스트림 미세조정 작업의 경우, 단 세 줄의 코드만 작성하면 됩니다. Simple Transformers를 사용하여 감성 분류기를 구축해보겠습니다.
Google Colab에서 Simple Transformer 미세 조정하기 →\rightarrow
Simple Transformers의 제작자 Thilina Rajapakse가 작성한 이 게시물에서 Simple Transformers가 초보자 친화적인지 살펴보실 수 있습니다.
1. 불러오기
Simple Transformers를 사용하는 것은 한 라인을 불러오기 하는 것만큼이나 쉽습니다. 각 다운스트림 작업의 경우, 불러오기 할 모듈이 하나 있습니다. 예를 들면, 코드 스니펫(code snippet)에 표시된 불러오기는 텍스트 분류에 필요한 전부입니다.
from simpletransformers.classification import ClassificationModel
2. 훈련 전달인자(Training Arguments)
You just need a dictionary, train_args
, to provide training arguments. Check out all the available arguments here. 훈련 전달인자를 제공하기 위해, 사전인 train_args만 있으면 됩니다. 여기에서 사용 가능한 모든 전달인자를 확인할 수 있습니다.
train_args={
'num_train_epochs': 3,
'train_batch_size': 16,
'eval_batch_size': 64,
'warmup_steps': 500,
'weight_decay': 0.01,
'logging_steps': 10,
'learning_rate': 5e-5,
'fp16': False,
'wandb_project': 'gallery',
"wandb_kwargs": {'entity': 'wandb'}
}
3. 작업별 모델(Task-Specific Model) 초기화
저희가 할 작업은 작업별 모델을 초기화가 전부입니다. 여기서 분류작업을 하므로, ClassificationModel을 초기화해야 합니다. 사전훈련된 모델을 사용하기 위해 정확한 모듈을 불러오기 해야 하는 Hugging Face와는 달리, Simple Transformers에서는 모델의 이름을 전달인자로 전달하기만 하면 됩니다. train_args
을 전달할 수 있습니다. 토크나이저를 초기화할 필요가 없음을 유의하시기 바랍니다. Simple Transformers는 정확한 토큰화를 자동으로 적용합니다. 하지만, 토크나이저의 이름을 지정할 수도 있습니다.
model = ClassificationModel('distilbert', 'distilbert-base-uncased', use_cuda=True, cuda_device=0, args=train_args)
4.훈련
모델을 훈련하는 것은 데이터세트를 model.train_model
로 전달하는 것만큼이나 간단합니다. 우선 적절한 토큰화를 적용하고, 그다음 모델을 훈련시킵니다. Simple Transformers는 Weights and Biases integration과 함께 제공되며, 이는 모든 훈련 메트릭을 자동으로 로그합니다.
model.train_model(train_df)
훈련 결과는 아래와 같습니다.
테스트 드라이브에 SimpleTransformers 사용하기
이 간단한 프로젝트에서, 저희는 Simple Transformers를 사용해 다중 클래스 분류 모델을 구축하겠습니다. Stack Overflow에 게시된 수많은 프로그래밍 질문이 포함된 이 블로그 게시물에 게시된 데이터세트를사용하겠습니다. 각 질문에는 정확하게 하나의 태그(Python, CSharp, JavaScript, or Java)가 있습니다. 이 작업은 입력 질문을 태그로 분류하는 것입니다.
Google Colab 에서 실험해보기 →\rightarrow
다중 클래스 분류 문제이므로 동일한 부분을 반영하도록 모델을 초기화하겠습니다. num_labels
전달인자에 유의하시기 바랍니다.
# labels
LABELS = ['csharp', 'java', 'javascript', 'python']
# initialize model
model = ClassificationModel('distilbert', 'distilbert-base-cased', num_labels=4, use_cuda=True, cuda_device=0, args=train_args)
모델을 훈련시키는 것은 model.train_model()
을 호출하는 것만큼이나 간단합니다. 훈련 결과는 아래와 같습니다.
결론
Simple Transformers가 내장 지원하는 NLP 작업은 훨씬 더 많이 있습니다. 그중 일부는 다음과 같습니다:
- 토큰 분류
- 질문 답변
- 언어 모델링
- 언어 생성
가 수행할 수 있는 작업에 대해 더 알아보고 싶으시다면 Ayush Chaurasia 의 Using SimpleTransformers on common NLP applications on common NLP applications을 확인하시기 바랍니다.
Simple Transformers를 사용한 트랜스포머 사용에 대한 짧은 튜토리얼이 여러분께 도움이 되었기를 바랍니다.
Simple Transformers를 전에 사용해 보신 적 있으신가요? 어땠습니까? 댓글에 여러분의 경험담을 공유해 주세요!