2022. 4. 16. 00:12ㆍArtificial_Intelligence/etc
허깅페이스는 Tensorflow Hub와 유사한 기능을 제공하는 곳이다.
트랜스포머를 기반으로 하는 다양한 모델들이 존재하며, 각각의 Task에 맞게 미세조정을 진행한 모델들 또한 구축되어있다. 또한, 데이터를 각 모델에 맞게 전처리하기 편리하도록 Tokenizer도 전부 구현되어있다.
그 뿐만 아니라, 학습을 위해 필요한 데이터셋도 저장되어 있어, 사용자는 그저 가져온 뒤 사용하기만 하면 된다.
즉, 허깅페이스를 사용하면 기존 학습 스크립트에서 반복되는 모든 부분을 일일이 따로 구현하지 않아도 편리하게 사용할 수 있으며, 데이터 구축부터 전처리, 모델 학습 및 결과 도출까지 매우 편리하고 효율적으로 코딩할 수 있다는 장점이 있다.
허깅페이스는 다양한 트랜스포머 모델과 학습 스크립트를 제공하는 모듈로, pytorch와 tensorflow로 각각 구현되어 있다. 먼저 필요한 모델을 자신의 작업에 맞게 가져오면 된다.
간단하게 Fill-Mask를 위해 BERT 모델을 사용하고 싶다면 "bert-base-uncased" 처럼 검색을 하여 들어가서 정보를 확인하면 된다.
이 모델을 매우 간단하게 사용하는 방법은 아래와 같다.
#BERT 모델과 이를 위한 BERT 모델에 맞는 Tokenizer을 가져온다.
from transformers import BertTokenizer, BertModel
#토크나이저는 미리 학습된 'bert-base-uncased'에서 가져온다.
#BertTokenizer대신 AutoTokenizer을 사용해도 된다.
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
# 모델은 사전 학습된 "bert-base-uncased"을 가져와서 사용한다.
# 이또한 AutoModel을 import하여 사용할 수 있다.
model = BertModel.from_pretrained("bert-base-uncased")
#데이터를 입력한뒤
text = "Replace me by any text you'd like."
#토크나이저로 데이터를 모델에 넣을 수 있게 만들어준다.
#'pt'는 pytorch, 'tf'는 tensorflow를 의미한다.
encoded_input = tokenizer(text, return_tensors='pt')
#마지막으로 모델에 데이터를 넣으면 끝난다.
output = model(**encoded_input)
데이터를 가져오는 것은 아래와 같다.
from datasets import load_dataset
# 허깅페이스에서 SNLI 데이터셋 가져오기
raw_datasets = load_dataset("snli")
간단하게 가져와서 사용만 한다면 위와 같은 방법으로 가능하다.
허깅페이스에서 트랜스포머 모델을 가져와서 자신의 작업에 맞게 미세조정 하는 방법은 다음과 같다.
예시로 Text Classification 하는 모델이다.
#학습에 사용할 옵티마이저를 설정
from transformers import AdamW
optimizer = AdamW(model.parameters(), lr=2e-5)
#데이터셋을 전처리 완료했다는 가정하에, 학습을 위한 기타 설정을 진행한다.
num_epochs = 5
num_training_steps = num_epochs * len(train_dataloader)
lr_scheduler = get_scheduler(
"linear",
optimizer=optimizer,
num_warmup_steps=0,
num_training_steps=num_training_steps,
)
#가져온 모델을 사용하여 학습을 진행한다.
for batch in train_dataloader:
model.train()
optimizer.zero_grad()
batch = {k: v.to(device) for k, v in batch.items()}
outputs = model(**batch)
loss = outputs.loss
loss.backward()
optimizer.step()
lr_scheduler.step()
torch.save(model,model_save_path)
이와 같은 방법으로 학습을 진행하는데,
학습율을 작게 설정하여 자신의 데이터셋으로 미세 조정 시키면 된다.
중간에 학습되는 과정을 확인하고 싶으면, 아래와 같이 설정하여 성능을 확인할 수 있다.
# 에포크가 하나 진행되었을 때 마다 돌아가도록 설정하면 된다.
model.eval()
test_loss = 0
correct = 0
with torch.no_grad():
for batch in eval_dataloader:
batch = {k: v.to(device) for k, v in batch.items()}
outputs = model(**batch)
logits = outputs.logits
predict = torch.argmax(logits, dim=-1)
metric.add_batch(predictions=predict, references=batch["labels"])
print(metric.compute())
혹여나 다른 Task의 작업을 위해 만들어놓은 모델을 자신의 Task에 맞게 모델의 아웃풋을 추가하거나 수정하고 싶다면 다음과 같은 방법이 있다.
#모델정의하고 모델에 배치 전달
from transformers import AutoModelForSequenceClassification
from transformers import AutoConfig
# model을 수정할 거라고 설정
config_model = AutoConfig.from_pretrained(model_name)
# 모델의 마지막 부분에 Classification을 위해 3개의 아웃풋으로 설정함
config_model.num_labels = 3
# 수정한 모델을 사용할 거라고 설정
model =AutoModelForSequenceClassification.from_config(config_model)
현재까지는 Classification을 위한 예시이며, 회귀나 다른 Task의 작업은 허깅페이스 홈페이지에 자세히 설명되어있다.
https://huggingface.co/
매우 편하고 쓰기 쉽다. 자연어 처리 공부하면서 유용하게 잘 쓰고 있다.
'Artificial_Intelligence > etc' 카테고리의 다른 글
Learning Rate Scheduler (0) | 2022.05.29 |
---|---|
Confusion Matrix(혼동행렬) 구현 (0) | 2022.04.16 |
RNN, CNN (1) | 2021.06.12 |
Artificial Intelligence (0) | 2021.04.23 |
Dataset 및 데이터전처리 기초 (0) | 2021.03.19 |