1. 2개로 분류하는 모델 사용하기
자연어 처리를 수행할 때, 긍정/부정을 분류하는 모델을 사용할 수 있습니다. 여기서는 Hugging Face의 AutoModel 계열 클래스를 활용하여 보다 고도화된 모델 사용법을 익힙니다.
pipeline 기능은 간단하게 사전 학습된 모델을 로드하여 예측을 수행하는 데 적합합니다. 하지만, 특정 도메인(예: 도마뱀 종류를 분류하는 앱)에 특화된 모델을 사용하려면 Fine-tuning(모델 재학습) 또는 데이터 프리프로세싱(입력 데이터 조정)이 필요할 수 있습니다.
이러한 경우, AutoModelForSequenceClassification 같은 Auto 계열 클래스를 활용하면 모델을 세밀하게 조정할 수 있습니다.
from transformers import AutoModelForSequenceClassification, AutoTokenizer
# AutoModelForSequenceClassification의 경우
# 오토모델(AutoModel)은 무조건 붙고, 원하는 모델에 따라 뒤의 이름이 바뀝니다. (이것이 규칙입니다.)
model = AutoModelForSequenceClassification.from_pretrained("bert-base-uncased")
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
코드 설명:
- AutoModelForSequenceClassification: 감성 분석과 같은 분류 작업을 수행하는 모델을 로드합니다.
- AutoTokenizer: 텍스트를 토큰화하여 모델이 이해할 수 있는 숫자 값으로 변환합니다.
- from_pretrained("bert-base-uncased"): 사전 학습된 BERT 모델을 불러옵니다.
유용한 코드 작성의 다른 방법 예:
# 다른 모델을 사용할 경우
model = AutoModelForSequenceClassification.from_pretrained("distilbert-base-uncased")
tokenizer = AutoTokenizer.from_pretrained("distilbert-base-uncased")
DistilBERT와 같은 경량화된 모델을 사용하면 속도를 높일 수 있습니다.
2. 모델 실행 및 예측 과정
모델 실행
모델을 실행할 때는 반드시 입력 데이터를 올바르게 준비해야 합니다. 여기서는 사전 학습된 모델을 로드한 후, input_ids와 attention_mask를 사용하여 예측을 수행합니다. 모델이 학습되지 않도록 torch.no_grad()를 활용하여 그래디언트 계산을 방지합니다.
import torch
# 모델 실행 (가져올 때) 아래와 같이 시작해야 한다
# 이 모델은 학습하지 않고 예측을 수행한다
# 함수에 넣을 때 input_ids와 attention_mask는 필수이다
with torch.no_grad():
model(input_ids=inputs['input_ids'], attention_mask=inputs['attention_mask'])
코드 설명:
- input_ids: 토큰화된 문장의 ID 값입니다. 모델이 이해할 수 있도록 문장을 숫자로 변환한 것입니다.
- attention_mask: 문장에서 의미 있는 단어를 나타내는 마스크 값입니다. 패딩된 부분(의미 없는 부분)은 0, 중요한 부분은 1로 설정됩니다.
- torch.no_grad(): 모델이 예측 과정에서 불필요한 그래디언트 연산을 하지 않도록 설정하여 메모리를 절약합니다.
- outputs.logits: 모델이 출력하는 로짓(logit) 값으로, Softmax를 적용하여 확률 값으로 변환할 수 있습니다.
간편한 실행을 위한 딕셔너리 문법
위와 같이 작성해야 하지만, 매번 타이핑하기 힘들기 때문에,
이 모델은 만든 사람들이 딕셔너리를 활용하여 간편한 문법을 만들었습니다.
# 딕셔너리를 활용한 간편한 실행 방식
with torch.no_grad():
logits = model(**inputs)
# (**inputs)는 model(input_ids=inputs['input_ids'], attention_mask=inputs['attention_mask'])와 동일
추가 설명:
- 모델 함수는 input_ids와 attention_mask를 넣어 실행해야 하지만, 이를 매번 직접 입력하는 것은 번거롭습니다.
- 따라서, 딕셔너리 자체를 파라미터 이름(Key) 값으로 활용하여 **inputs 문법을 만들었습니다.
- 앞으로 (**inputs)을 보게 되면, 이는 model(input_ids=inputs['input_ids'], attention_mask=inputs['attention_mask'])과 동일한 동작을 한다고 이해하면 됩니다.
- 이를 활용하면 우리는 더 이상 긴 코드를 직접 입력할 필요 없이 간편하게 모델을 실행할 수 있습니다.
유용한 코드 작성의 다른 방법 예:
# 단일 문장 예측을 수행하는 함수
def predict(model, tokenizer, text):
inputs = tokenizer(text, return_tensors="pt", padding=True, truncation=True)
with torch.no_grad():
outputs = model(**inputs)
return outputs.logits
# 사용 예시
logits = predict(model, tokenizer, "이 문장은 감성 분석을 위한 테스트 문장입니다.")
이렇게 함수를 활용하면 반복적인 예측 수행을 더 간단하게 만들 수 있습니다.
3. 예측 결과 해석
모델이 반환하는 로짓 값은 직접적인 확률이 아니므로, 이를 확률로 변환하기 위해 Softmax 함수를 적용해야 합니다. Softmax는 입력된 숫자 값을 0과 1 사이의 확률 분포로 변환하며, 전체 확률의 합이 1이 되도록 정규화합니다.
import torch
from torch.nn.functional import softmax
# Softmax 적용
probabilities = softmax(logits, dim=-1)
코드 설명:
- logits: 모델이 출력하는 원본 예측 값(확률이 아닌 점수)입니다.
- softmax(logits, dim=-1): 로짓 값을 확률 값으로 변환하는 함수입니다. dim=-1은 마지막 차원(각 클래스의 점수)에 대해 연산하겠다는 의미입니다.
- Softmax는 입력된 숫자들을 0과 1 사이의 값으로 변환하며, 전체 합이 1이 되도록 정규화합니다.
Softmax 적용 예시:
import torch
from torch.nn.functional import softmax
logits = torch.tensor([2.0, 1.0, 0.1]) # 예측 점수 (로짓 값)
probabilities = softmax(logits, dim=-1)
print(probabilities) # [0.659, 0.242, 0.099] (전체 합이 1)
Softmax 란?
- Softmax 함수는 입력 값을 확률 분포로 변환해주는 함수이다.
- 입력된 숫자들을 0과 1 사이의 값으로 변환하며, 전체 확률의 합이 1이 되도록 정규화한다.
- 이를 통해 모델이 여러 클래스 중 하나를 선택할 확률을 계산할 수 있도록 해준다.
- 다중 클래스 분류 문제(예: 3개 이상의 카테고리)에서 사용된다.
유용한 코드 작성의 다른 방법 예
# numpy를 이용한 Softmax 적용
import numpy as np
def softmax_np(logits):
exp_logits = np.exp(logits - np.max(logits)) # Overflow 방지
return exp_logits / np.sum(exp_logits, axis=-1, keepdims=True)
logits_np = np.array([2.0, 1.0, 0.1])
probabilities_np = softmax_np(logits_np)
print(probabilities_np) # [0.659, 0.242, 0.099]
이렇게 하면 PyTorch 없이 NumPy만 사용하여 Softmax를 적용할 수 있습니다.
참고 사항:
- 이진 분류(Binary Classification)에서는 Softmax 대신 Sigmoid 함수를 사용하는 것이 일반적입니다.
- Softmax는 입력 값의 차이를 강조하며, 특정 클래스의 확률을 더욱 명확하게 구분하는 효과가 있습니다.
4. ID 변환 및 모델 해석 & 5. 입력 데이터 처리 (토큰화 및 패딩)
ID 변환 및 모델 해석
모델이 예측한 숫자 값을 사람이 이해할 수 있도록 변환해야 합니다. 모델이 예측하는 결과는 숫자로 표현되지만, 이를 실제 레이블(긍정/부정 등)로 변환할 수 있습니다.
코드로 어떻게 알 수 있는가?
모델의 설정에서 id2label을 가져와서 확인할 수 있습니다.
from transformers import AutoConfig
# 모델 설정 가져오기
config = AutoConfig.from_pretrained(model_name)
print(config.id2label) # ID와 레이블 매핑 출력
예측된 클래스의 실제 레이블 확인하기
# 예측된 클래스의 레이블 가져오기
predicted_label = config.id2label[predicted_classes[0]]
print("예측된 클래스:", predicted_label)
코드 설명:
- AutoConfig.from_pretrained(model_name): 사전 학습된 모델의 설정을 가져옵니다.
- config.id2label: 모델이 학습한 ID와 실제 레이블을 매핑한 딕셔너리입니다.
- config.id2label[predicted_classes[0]]: 예측된 클래스를 사람이 이해할 수 있도록 레이블로 변환합니다.
파이프라인과의 차이점
- 파이프라인을 사용하면 위와 같은 과정이 자동으로 처리됩니다.
- 하지만 우리가 이렇게 직접 확인하는 이유는 튜닝(Fine-tuning)을 위해서입니다.
- 만약 튜닝 없이 기본 모델을 그대로 사용하려면, 파이프라인을 그대로 활용하면 됩니다.
입력 데이터 처리 (토큰화 및 패딩)
모델에 입력할 데이터를 준비하는 과정에서, 문장이 리스트로 되어 있거나 단어 수가 많을 경우 추가적인 처리가 필요합니다. 이를 위해 토큰화(Tokenization)와 패딩(Padding)을 활용합니다.
문장이 리스트로 되어 있는 경우
여러 개의 문장을 동시에 입력하려면 리스트 형태로 제공해야 합니다.
texts = ["I love this movie! It was fantastic!", "This is the worst experience I have ever had."]
# 첫 번째 인자는 문자열 리스트, 두 번째 인자는 형식 지정
inputs = tokenizer(texts, return_tensors='pt', padding=True, truncation=True, max_length=128)
코드 설명:
- texts: 여러 개의 문장을 리스트 형태로 저장합니다.
- return_tensors='pt': PyTorch 텐서 형식으로 변환하여 모델에 입력할 수 있도록 합니다.
- padding=True: 입력된 문장의 길이를 맞추기 위해 패딩을 추가합니다.
- truncation=True: 너무 긴 문장은 max_length 값에 맞게 자릅니다.
- max_length=128: 최대 토큰 길이를 128로 설정하여 문장이 너무 길어지는 것을 방지합니다.
문장이 매우 길 경우 (단어 수가 많은 경우)
문장이 길어져서 모델이 처리할 수 있는 길이를 초과하는 경우, truncation=True 옵션을 사용하여 초과된 부분을 잘라냅니다.
long_text = "This is a very long sentence that goes on and on without stopping and contains a lot of words, making it exceed the model's input length limit."
# 길이가 너무 길 경우, 모델이 처리할 수 있는 최대 길이에 맞춰 자름
inputs_long = tokenizer(long_text, return_tensors='pt', padding=True, truncation=True, max_length=128)
유용한 코드 작성의 다른 방법 예:
# 수동으로 최대 길이 설정 및 패딩 적용
max_length = 128
inputs = tokenizer(texts, padding='max_length', truncation=True, max_length=max_length, return_tensors='pt')
이렇게 하면 모델이 처리할 수 있는 길이를 벗어나지 않도록 입력 데이터를 정리할 수 있습니다.
아래 표는 Hugging Face의 AutoModel 계열 클래스를 주요 용도별로 정리한 것입니다. 각 클래스가 어떤 용도로 쓰이고, 어떤 모델 아키텍처를 자동으로 불러오는지 간단히 적어두었습니다. 필요에 따라 더 세부적인 정보를 Transformers 공식 문서에서 확인하세요.
클래스 이름 | 설명 / 용도 | 예시 모델 |
AutoModel | 가장 기본적인 AutoModel 클래스. 모델에서 단순히 **히든 스테이트(embedding)**를 추출할 때 사용. 예: BERT의 마지막 레이어 아웃풋 등 |
BERT, RoBERTa, DistilBERT, GPT-2 등 (트랜스포머 기반 모델 전반) |
AutoModelForCausalLM | 언어 생성(Language Modeling) 작업에 특화된 클래스. 디코더(Decoder) 구조로, 시퀀스를 한 토큰씩 이어가며 생성 |
GPT-2, GPT-Neo, LLaMA, CodeGen 등 |
AutoModelForSeq2SeqLM | Seq2Seq 구조의 언어 생성 모델. 주로 번역, 요약, 챗봇 등에서 인코더-디코더 형태로 사용 |
BART, T5, Marian, Pegasus 등 |
AutoModelForMaskedLM | 마스킹 언어 모델링(Masked LM) 작업에 사용. 특정 토큰을 마스킹하고 채우는 방식의 학습 구조 |
BERT, RoBERTa, DeBERTa 등 |
AutoModelForPreTraining | 언어모델의 사전 학습(Pretraining) 목적을 지원. 예: BERT의 MLM + NSP 등 (지금은 주로 MaskedLM과 분리됨) |
BERT (초기 모델 구조) |
AutoModelForSequenceClassification | 문장(시퀀스) 분류 작업. 예: 감성 분석, 토픽 분류 등 | BERT, DistilBERT, RoBERTa, XLNet 등 (분류 헤드 부착) |
AutoModelForTokenClassification | 토큰 단위 분류 작업. 예: 개체명 인식(NER), 품사 태깅 등 | BERT, RoBERTa, DeBERTa 등 (토큰 분류 헤드 부착) |
AutoModelForQuestionAnswering | 질문답변(QA) 작업에 특화된 헤드를 제공. 입력 질문과 문서(context)에서 정답 스팬(구간)을 예측 |
BERT, DistilBERT, RoBERTa 등 (QA 헤드 부착) |
AutoModelForMultipleChoice | 객관식 질문(MC) 작업. 질문과 여러 선택지를 입력으로 받아 정답 확률을 계산 |
RoBERTaForMultipleChoice, GPT-2/3 MC 등 |
AutoModelForNextSentencePrediction | NSP(Next Sentence Prediction) 작업. 두 문장이 연결되는지 여부 등을 예측 |
BERTForNextSentencePrediction 등 |
AutoModelForTableQuestionAnswering | 표(Table) 기반 QA 작업을 지원. TabNet, TAPAS 등 특정 테이블 구조 입력을 처리 |
TAPAS 등 |
AutoModelForSeq2SeqSpeech 또는 AutoModelForSpeechSeq2Seq |
음성 입력 → 텍스트 출력(음성 인식) 또는 텍스트 입력 → 음성 출력(음성 합성) 등 시퀀스 변환 작업 |
Speech2Text, Whisper 등 |
AutoModelForCTC | 음성 인식(CTC, Connectionist Temporal Classification) 구조 사용 모델 | Wav2Vec2, HuBERT 등 |
AutoModelForAudioClassification | 오디오/음성 분류 작업. 예: 감정 분류, 환경 소리 분류 등 | Wav2Vec2, Hubert, Whisper 등 |
AutoModelForSpeechXVector | 음성 임베딩 추출(x-vector) 등 화자 인식 모델 | Speech models with x-vector support |
AutoModelForImageClassification | 이미지 분류 작업. 사전 학습된 비전 트랜스포머(ViT), Swin, ConvNeXt 등에 분류 헤드를 부착 | ViT, BEiT, Swin Transformer 등 |
AutoModelForObjectDetection | 오브젝트 디텍션(bounding box & label) 작업. DETR, DINO 등 | DETR, DINO, YOLOS 등 |
AutoModelForSemanticSegmentation | 시맨틱 세그멘테이션(이미지 픽셀별 분류) 작업 | SegFormer, DPT 등 |
AutoModelForVideoClassification | 비디오 분류 작업. 영상(프레임 시퀀스)에 대한 분류 모델 |
VideoMAE, Timesformer 등 |
AutoModelForMaskedImageModeling | 이미지 마스킹(MIM) 방식의 사전 학습 모델 Mask Image Modeling, 예: BEiT |
BEiT, MAE 등 |
AutoModelForDepthEstimation | 단일 이미지에서 깊이(Depth) 맵을 추론하는 모델 | DPT(Depth) 등 |
AutoModelForVision2Seq | 이미지 → 텍스트 시퀀스 변환(이미지 캡셔닝, OCR 등)에 활용 | VisionEncoderDecoderModel 등 |
추가 참고 사항
- AutoModel 계열 클래스는 모델 아키텍처와 헤드(head, 최종 레이어) 구성을 자동으로 불러오는 기능을 제공합니다.
- 모델 아키텍처를 직접 지정하지 않고 프리트레인된 체크포인트 이름만 넣으면, 내부적으로 해당 모델 구조에 맞는 클래스를 자동 매핑해줍니다.
- 예를 들어, AutoModelForSequenceClassification.from_pretrained("bert-base-uncased")라고 하면, 내부적으로 BertForSequenceClassification이 로드됩니다.
- 새로운 모델이 추가될 때마다 Hugging Face Transformers 라이브러리에 AutoModel 매핑이 계속 늘어나는 추세이므로, 항상 최신 버전의 공식 문서를 참고하면 좋습니다.
이 표가 AutoModel 계열을 빠르게 파악하는 데 도움이 되길 바랍니다. 필요에 따라 자신에게 맞는 작업 유형(분류, 생성, 디텍션 등)에 맞춰 클래스를 선택하시면 됩니다.
'🐍 Python' 카테고리의 다른 글
LLM + RAG 활용 AI 시스템 정리 (0) | 2025.02.12 |
---|---|
Hugging Face 기반 파인튜닝 및 모델 배포 완벽 가이드 (1) | 2025.02.11 |
허깅 페이스(Hugging Face)로 오브젝트 디텍션: 소화전 탐지 모델 만들기 A to Z (0) | 2025.02.11 |
Hugging Face 파이프라인 사용법 총정리: 감정 분석부터 번역, 이미지 분류까지 한 번에!" (0) | 2025.02.10 |
Hugging Face로 시작하는 Transformer 모델 완벽 활용 가이드: GPT부터 BERT, T5까지 (0) | 2025.02.10 |