Step 15 RoBERTa: 사전학습 모델 파인튜닝

최종 최강 모델 - 문맥 임베딩의 완성

1. 지금까지의 여정

Step 9부터 14까지, 우리는 점점 발전하는 모델들을 배웠습니다. 이제 마지막 단계, 사전학습 모델의 파인튜닝입니다!

📊 성능 비교 요약

Step 모델 임베딩 예상 성능 특징
9 MLP 원핫 ~88% 기초 베이스라인
10 CNN TF-IDF ~90% 단어 중요도 + n-gram
11 RNN Word2Vec (freeze) ~91% 순서 처리 시작
12 LSTM GloVe (freeze) ~92% 장기기억 추가
13 Attention FastText (fine-tune) ~94% 중요 단어 집중
14 Transformer 학습가능 (from scratch) ~89% 소형, 개념 시연
15 RoBERTa 사전학습 (fine-tune) ~96%+ 🏆 최종 최강

2. BERT와 RoBERTa

BERT는 2018년 Google이 발표한 사전학습 모델입니다. RoBERTa는 Facebook이 BERT를 개선한 버전이에요!

🤖 BERT vs RoBERTa

특징 BERT RoBERTa
발표 2018, Google 2019, Facebook
구조 Transformer Encoder Transformer Encoder
사전학습 데이터 16GB (BookCorpus + Wikipedia) 160GB (10배 더 많음!)
학습 시간 짧음 훨씬 김 (더 많이 학습)
NSP 태스크 사용 제거 (불필요)
Dynamic Masking 정적 동적 (더 효과적)
성능 좋음 더 좋음!

RoBERTa의 개선점:

더 많은 데이터: 10배 더 많은 텍스트로 학습
더 긴 학습: 더 오래 학습해서 성능 향상
Dynamic Masking: 매 에폭마다 다른 단어를 가림
NSP 제거: Next Sentence Prediction 태스크 불필요
더 큰 배치: 8K 배치 크기로 안정적 학습

3. 문맥 임베딩 (Contextual Embedding)

Word2Vec/GloVe와 BERT/RoBERTa의 가장 큰 차이는 문맥입니다!

💡 정적 vs 문맥 임베딩

정적 임베딩 vs 문맥 임베딩 Word2Vec / GloVe "bank" → 항상 같은 벡터 "river bank" (강둑) "money bank" (은행) → 둘 다 같은 벡터! 😢 BERT / RoBERTa "bank" → 문맥에 따라 다름! "river bank" (강둑) → [0.1, -0.3, 0.8, ...] "money bank" (은행) → [0.7, 0.2, -0.4, ...] 문맥 임베딩의 장점 주변 단어를 보고 의미를 결정 → 다의어도 구분 가능!

4. RoBERTa 파인튜닝

사전학습된 RoBERTa를 우리 데이터(AG News)에 맞게 파인튜닝합니다!

🏗️ 모델 아키텍처

RoBERTa Fine-tuning Input: "The cat sat on the mat" RoBERTa-base (사전학습 완료) 12 Transformer Layers, 768 hidden, 12 heads 125M parameters 160GB 텍스트로 학습됨! Classification Head (4 classes)
from transformers import RobertaModel, RobertaTokenizer
import torch.nn as nn

class RoBERTaClassifier(nn.Module):
    def __init__(self, num_classes=4, dropout=0.3):
        super().__init__()
        
        # 사전학습된 RoBERTa 로드
        self.roberta = RobertaModel.from_pretrained('roberta-base')
        
        # 분류 헤드 (처음부터 학습)
        self.dropout = nn.Dropout(dropout)
        self.fc = nn.Linear(self.roberta.config.hidden_size, num_classes)
    
    def forward(self, input_ids, attention_mask):
        # RoBERTa 인코딩
        outputs = self.roberta(
            input_ids=input_ids,
            attention_mask=attention_mask
        )
        
        # [CLS] 토큰의 출력 사용
        pooled_output = outputs.pooler_output  # [batch, 768]
        
        x = self.dropout(pooled_output)
        return self.fc(x)

# 토크나이저
tokenizer = RobertaTokenizer.from_pretrained('roberta-base')

# 모델 생성
model = RoBERTaClassifier(num_classes=4)
print(f"총 파라미터: {sum(p.numel() for p in model.parameters()):,}")
# 약 125M개!

⚙️ 파인튜닝 전략

학습 설정:

Learning Rate: 매우 작게 (2e-5 ~ 5e-5)
  → 사전학습된 가중치를 조금씩만 조정

Epochs: 3~5 에폭만
  → 너무 오래 학습하면 과적합

Warmup: 초반에 learning rate 천천히 증가
  → 안정적인 학습

Gradient Clipping: 기울기 폭발 방지
  → max_grad_norm = 1.0

✅ RoBERTa의 압도적 장점

🏆 시리즈 1 완료!

축하합니다! AG News 텍스트 분류 시리즈를 모두 완주했습니다! 🎉

배운 것들:
• 원핫 인코딩 → TF-IDF → Word2Vec → GloVe → FastText
• MLP → CNN → RNN → LSTM → Attention → Transformer → BERT/RoBERTa
• Freeze vs Fine-tune
• 정적 임베딩 vs 문맥 임베딩
• 사전학습 + 파인튜닝의 위력

성능 향상:
88% (MLP) → 96%+ (RoBERTa) = +8%p 향상!

다음 단계:
시리즈 2에서 생성 모델 (Seq2Seq, Autoencoder, GPT)을 배워봅시다! 🚀