23.06.15
DEVOTEE를 활성화 시키면
지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.
버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.
| 컨텐츠 유형 | 제목 | 저장일 | 삭제 |
|---|
본인인증 로그인에 실패하였습니다.
회원이 아니시거나 본인인증 등록이
완료되지 않은 사용자입니다.
허깅페이스는 인공지은 모델을 쉽게 활용할 수 있는 플랫폼을 제공합니다.
허깅페이스 트랜스포머는 트랜스포머 모델을 통일된 인터페이스로 사용할 수 있도록 지원하는 오픈소스 라이브러리입니다. (https://huggingface.co/)
transformers : 트랜스포머 모델과 토크나이저를 활용할 때 사용하는 라이브러리
datasets : 데이터셋을 공개하고 사용할 수 있도록 지원하는 라이브러리
허깅페이스 허브는 다양한 사전 학습 모델과 데이터셋을 탐색하고 사용할 수 있도록 제공하는 온라인 플랫폼입니다. 모델, 데이터셋, 스페이스를 제공합니다.
모델은 Multimodal, Computer Vision, 자연어 처리(Natural Language Processing), Audio, Tabular, Reinforcement Learning 등을 제공합니다.
데이터셋은 task와 라이브러리에 따라 뷰어를 제공하여 데이터를 볼 수 있도록 되어 있습니다. 스페이스를 통해 모델 데모를 공유합니다.
허깅페이스 라이브러리를 사용해 KLUE의 연합뉴스 주제 분류(ynat) 데이터셋을 다운로드, 전처리, 분할하는 작업을 수행해 보겠습니다.
klue 데이터셋의 ynat(연합뉴스 주제 분류) 부분을 불러옵니다. split='train'과 split='validation'으로 각각 훈련과 검증용 데이터셋을 다운로드합니다
from datasets import load_dataset
#1.모델 학습에 사용할 연합뉴스 데이터셋 다운로드
klue_tc_train = load_dataset('klue', 'ynat', split='train')
klue_tc_eval = load_dataset('klue', 'ynat', split='validation')
#2. 실습에 사용하지 않는 불필요한 컬럼 제거
klue_tc_train = klue_tc_train.remove_columns(['guid', 'url', 'date'])
klue_tc_eval = klue_tc_eval.remove_columns(['guid', 'url', 'date'])
#3. 카테고리를 문자로 표기한 label_str 컬럼 추가
klue_tc_train.features['label']
# ClassLabel(names=['IT과학', '경제', '사회', '생활문화', '세계', '스포츠', '정치'], id=None)
klue_tc_train.features['label'].int2str(1)
# '경제'
klue_tc_label = klue_tc_train.features['label']
def make_str_label(batch):
batch['label_str'] = klue_tc_label.int2str(batch['label'])
return batch
klue_tc_train = klue_tc_train.map(make_str_label, batched=True, batch_size=1000)
#4.학습/검증/테스트 데이터셋 분할
train_dataset = klue_tc_train.train_test_split(test_size=10000, shuffle=True, seed=42)['test']
dataset = klue_tc_eval.train_test_split(test_size=1000, shuffle=True, seed=42)
test_dataset = dataset['test']
valid_dataset = dataset['train'].train_test_split(test_size=1000, shuffle=True, seed=42)['test']다운받은 데이터에서 불필요한 컬럼을 제거(remove_columns 메서드로 'guid', 'url', 'date' 제거)하여 데이터셋 용량을 줄이고 처리 속도를 높입니다.
make_str_label 함수를 정의하여 label 값을 문자열로 변환한 새로운 컬럼 label_str을 추가합니다. map 메서드를 통해 데이터셋의 각 배치(batch)에 함수를 적용합니다.
train_test_split 함수로 데이터셋을 훈련, 검증, 테스트 세트로 분할합니다. shuffle=True로 데이터를 무작위로 섞고, seed=42는 결과를 재현 가능하게 하는 시드입니다.
각각의 결과는 아래와 같습니다.
klue_tc_train
Dataset({
features: ['guid', 'title', 'label', 'url', 'date'],
num_rows: 45678
})
klue_tc_train[0]
{'guid': 'ynat-v1_train_00000',
'title': '유튜브 내달 2일까지 크리에이터 지원 공간 운영',
'label': 3,
'url': 'https://news.naver.com/main/read.nhn?mode=LS2D&mid=shm&sid1=105&sid2=227&oid=001&aid=0008508947',
'date': '2016.06.30. 오전 10:36'}
klue_tc_train.features['label'].names
# ['IT과학', '경제', '사회', '생활문화', '세계', '스포츠', '정치']
klue_tc_train[0]
# {'title': '유튜브 내달 2일까지 크리에이터 지원 공간 운영', 'label': 3, 'label_str': '생활문화'}허깅 페이스는 학습에 필요한 다양한 기능을 학습 인자만으로 활용할 수 있는 trainer API를 제공합니다.
KLUE/roberta-base 모델을 사용하여 시퀀스 분류(텍스트 분류) 작업을 수행하는 실습을 트레이너 api 를 사용해 보겠습니다.
import torch
import numpy as np
from transformers import (
Trainer,
TrainingArguments,
AutoModelForSequenceClassification,
AutoTokenizer
)
#1. 준비
def tokenize_function(examples):
return tokenizer(examples["title"], padding="max_length", truncation=True)
model_id = "klue/roberta-base"
model = AutoModelForSequenceClassification.from_pretrained(model_id, num_labels=len(train_dataset.features['label'].names))
tokenizer = AutoTokenizer.from_pretrained(model_id)
train_dataset = train_dataset.map(tokenize_function, batched=True)
valid_dataset = valid_dataset.map(tokenize_function, batched=True)
test_dataset = test_dataset.map(tokenize_function, batched=True)
#2. 학습 인자정의
training_args = TrainingArguments(
output_dir="./results",
num_train_epochs=1,
per_device_train_batch_size=8,
per_device_eval_batch_size=8,
evaluation_strategy="epoch",
learning_rate=5e-5,
push_to_hub=False
)
#3. 평가 함수 정의
def compute_metrics(eval_pred):
logits, labels = eval_pred
predictions = np.argmax(logits, axis=-1)
return {"accuracy": (predictions == labels).mean()}
#4.학습 진행
trainer = Trainer(
model=model,
args=training_args,
train_dataset=train_dataset,
eval_dataset=valid_dataset,
tokenizer=tokenizer,
compute_metrics=compute_metrics,
)
trainer.train()
trainer.evaluate(test_dataset) # 정확도 0.84tokenize_function 함수: 주어진 데이터셋의 title 컬럼을 토크나이즈합니다.
토크나이저는 지정된 최대 길이까지 패딩하고, 입력을 자릅니다. tokenizer는 KLUE/roberta-base 모델의 토크나이저를 사용합니다.
모델 및 데이터셋 설정: AutoModelForSequenceClassification을 사용하여 시퀀스 분류를 위한 KLUE/roberta-base 모델을 불러옵니다.
이 모델은 미리 학습된 roberta 모델로, 다중 클래스 분류 작업에 사용됩니다.
train_dataset, valid_dataset, test_dataset 각각에 대해 tokenize_function을 적용하여 텍스트를 토큰으로 변환합니다.
모델 학습을 위한 하이퍼파라미터를 정의합니다.
output_dir: 학습 결과가 저장될 경로.
num_train_epochs: 학습 반복 횟수(1회).
per_device_train_batch_size: 학습 시 각 디바이스당 배치 크기(8).
evaluation_strategy: 평가 전략(매 epoch마다 평가).
learning_rate: 학습 속도.
compute_metrics 함수: 평가 시 사용되는 메트릭 함수를 정의합니다. 모델의 출력 로짓(logits)을 통해 예측을 만든 후, 실제 레이블과 비교하여 정확도를 계산합니다.
Trainer 정의:Trainer 클래스는 모델 학습, 평가, 예측 등의 작업을 간단하게 처리합니다.
정의된 model, training_args, train_dataset, valid_dataset, tokenizer, compute_metrics을 사용하여 학습을 진행합니다.
훈련 및 평가: trainer.train()을 호출하여 모델을 학습시킵니다.
trainer.evaluate(test_dataset)을 통해 테스트 데이터셋에서 모델의 성능(정확도 0.84)을 평가합니다.
허깅페이스 허브에 학습한 모델을 업로드하면 필요할때마다 계정에 접속해서 사용할 수 있습니다.
from huggingface_hub import login
login(token="허깅페이스개인토큰")
repo_id = f"허깅페이스개인계정/roberta-base-klue-ynat-classification"
trainer.push_to_hub(repo_id)결과는 아래와 같습니다. 허깅페이스 확인해 보면 개인계정에 아래와 같이 보입니다.
모델 추론(Model Inference)은 기계 학습에서 훈련된 모델을 사용하여 새로운 데이터에 대한 예측이나 결정을 내리는 과정입니다.
이 과정은 모델이 학습 단계에서 습득한 패턴과 관계를 바탕으로 실시간 데이터를 처리하고 결과를 생성하는 것을 포함합니다.
PyTorch와 Hugging Face의 datasets 및 transformers 라이브러리를 사용하여 텍스트 분류 작업을 수행해 보겠습니다.
# 실습을 새롭게 시작하는 경우 데이터셋 다시 불러오기 실행
import torch
import torch.nn.functional as F
from datasets import load_dataset
from transformers import pipeline
dataset = load_dataset("klue", "ynat", split="validation")
model_id = "smjung8710/results"
model_pipeline = pipeline("text-classification", model=model_id)transformers 라이브러리의 pipeline 함수는 사전학습된 모델로 다양한 자연어 처리 작업을 간단히 수행할 수 있는 기능입니다.
klue 데이터셋의 ynat (연합뉴스 주제 분류) 데이터셋을 다운로드하고, validation (검증) 세트를 불러옵니다. 이 데이터셋은 주제 분류(task)에 사용되는 한국어 데이터셋입니다.
이 코드는 데이터셋과 분류 모델을 연결하여, 주어진 텍스트에 대해 주제를 예측하는 데 활용될 수 있습니다.
결과 확인
custom_pipeline(dataset['title'][:5])
[{'label': '경제', 'score': 0.973315954208374},
{'label': '사회', 'score': 0.8159481883049011},
{'label': 'IT과학', 'score': 0.9437124133110046},
{'label': '경제', 'score': 0.9733883142471313},
{'label': '사회', 'score': 0.9629247188568115}]pipeline 함수를 사용하지 않고 직접 추론하는 아래 코드를 수행하는 방법도 있으니 참고하세요
import torch
from torch.nn.functional import softmax
from transformers import AutoModelForSequenceClassification, AutoTokenizer
class CustomPipeline:
def __init__(self, model_id):
self.model = AutoModelForSequenceClassification.from_pretrained(model_id)
self.tokenizer = AutoTokenizer.from_pretrained(model_id)
self.model.eval()
def __call__(self, texts):
tokenized = self.tokenizer(texts, return_tensors="pt", padding=True, truncation=True)
with torch.no_grad():
outputs = self.model(**tokenized)
logits = outputs.logits
probabilities = softmax(logits, dim=-1)
scores, labels = torch.max(probabilities, dim=-1)
labels_str = [self.model.config.id2label[label_idx] for label_idx in labels.tolist()]
return [{"label": label, "score": score.item()} for label, score in zip(labels_str, scores)]
custom_pipeline = CustomPipeline(model_id)
DEVOTEE를 활성화 시키면
지금 작성한 댓글에 AI가 댓글을 달아줍니다.