Skip to main content

RoBERTa, ALBERT, DeBERTa — BERT 개선 모델

BERT의 발표 이후 연구자들은 사전학습 전략, 모델 효율성, 어텐션 메커니즘 등 다양한 측면에서 BERT를 개선했습니다. 이 문서에서는 가장 영향력 있는 세 가지 개선 모델을 비교 분석합니다.

학습 목표

이 문서를 완료하면 다음을 할 수 있습니다.
  • RoBERTa, ALBERT, DeBERTa 각각의 핵심 혁신을 설명할 수 있습니다
  • BERT 대비 각 모델이 개선한 구체적인 문제점을 식별할 수 있습니다
  • 태스크 특성에 따라 적합한 BERT 변형 모델을 선택할 수 있습니다

왜 중요한가

BERT는 사전학습 패러다임을 열었지만, 여러 설계 선택이 최적이 아니었습니다. 후속 모델들의 개선점을 이해하면:
  1. 모델 선택 능력: 실무에서 BERT 대신 어떤 모델을 선택해야 하는지 판단할 수 있습니다
  2. 학습 전략 이해: 사전학습의 핵심 요소(데이터, 마스킹, 배치 크기)가 성능에 미치는 영향을 파악합니다
  3. 효율성 관점: 파라미터 효율성과 성능 사이의 트레이드오프를 이해합니다

핵심 개념

RoBERTa — Robustly Optimized BERT Approach

Facebook AI(현 Meta)가 2019년에 발표한 RoBERTa는 BERT의 학습 전략을 최적화한 모델입니다. 아키텍처 자체는 BERT와 동일하지만, 사전학습 방법을 개선하여 큰 성능 향상을 달성했습니다.

RoBERTa의 핵심 변경점

변경 사항BERTRoBERTa효과
NSP 제거MLM + NSPMLM만 사용NSP가 오히려 방해됨을 입증
동적 마스킹전처리 시 고정 마스킹에폭마다 마스킹 패턴 변경더 다양한 학습 신호
학습 데이터16GB (BookCorpus + Wiki)160GB (추가 데이터 포함)10배 많은 데이터
배치 크기2568,192대규모 배치의 효과
학습 스텝1M 스텝500K 스텝 (더 큰 배치)더 효율적인 학습
입력 형식문장 쌍연속 텍스트 (FULL-SENTENCES)문맥 연속성 유지

동적 마스킹 (Dynamic Masking)

BERT는 데이터 전처리 단계에서 마스킹 패턴을 고정합니다(static masking). RoBERTa는 매 에폭마다 새로운 마스킹 패턴을 생성하여 모델이 더 다양한 문맥을 학습하도록 합니다.
# BERT: 정적 마스킹 (전처리 시 고정)
# 동일한 문장이 항상 같은 위치가 마스킹됨
masked_data = preprocess_with_static_masking(corpus)  # 1회 실행

# RoBERTa: 동적 마스킹 (에폭마다 새로 생성)
# 매 에폭마다 다른 위치가 마스킹됨
for epoch in range(num_epochs):
    masked_data = apply_dynamic_masking(corpus)  # 매번 다른 패턴
    train(model, masked_data)

NSP 제거 실험 결과

RoBERTa 논문은 NSP의 효과를 체계적으로 실험했습니다.
입력 형식NSPMNLIQNLISST-2
SEGMENT-PAIRO84.091.492.8
SENTENCE-PAIRO82.990.892.5
FULL-SENTENCESX85.291.893.3
DOC-SENTENCESX84.791.693.1
NSP를 제거하고 FULL-SENTENCES 형식을 사용했을 때 가장 좋은 성능을 보입니다.

ALBERT — A Lite BERT

Google Research가 2019년에 발표한 ALBERT는 BERT의 파라미터 효율성을 극적으로 개선한 모델입니다. 두 가지 핵심 기법으로 파라미터 수를 대폭 줄이면서도 성능을 유지하거나 개선합니다.

기법 1: 인수분해된 임베딩 (Factorized Embedding Parameterization)

BERT에서 임베딩 차원(E)과 Hidden 차원(H)은 같은 크기로 묶여 있습니다(E = H = 768). ALBERT는 이를 분리하여 임베딩을 저차원으로 투사합니다. BERT:V×HALBERT:V×E+E×H\text{BERT}: V \times H \quad \rightarrow \quad \text{ALBERT}: V \times E + E \times H
모델어휘 크기(V)임베딩 차원(E)Hidden 차원(H)임베딩 파라미터
BERT-Base30,00076876823.0M
ALBERT30,0001287683.8M + 0.1M = 3.9M
임베딩 파라미터가 약 83% 감소합니다.
import torch.nn as nn

# BERT: 임베딩과 Hidden이 같은 차원
class BertEmbedding(nn.Module):
    def __init__(self, vocab_size=30000, hidden_dim=768):
        super().__init__()
        # V x H = 30000 x 768 = 23,040,000 파라미터
        self.embedding = nn.Embedding(vocab_size, hidden_dim)

# ALBERT: 인수분해된 임베딩
class AlbertEmbedding(nn.Module):
    def __init__(self, vocab_size=30000, embed_dim=128, hidden_dim=768):
        super().__init__()
        # V x E = 30000 x 128 = 3,840,000
        self.embedding = nn.Embedding(vocab_size, embed_dim)
        # E x H = 128 x 768 = 98,304
        self.projection = nn.Linear(embed_dim, hidden_dim)

    def forward(self, input_ids):
        """저차원 임베딩 후 Hidden 차원으로 투사합니다."""
        x = self.embedding(input_ids)  # (batch, seq_len, E)
        x = self.projection(x)         # (batch, seq_len, H)
        return x

기법 2: 크로스 레이어 파라미터 공유 (Cross-layer Parameter Sharing)

모든 Transformer 레이어가 동일한 파라미터를 공유합니다. 이를 통해 12개 레이어가 1개 레이어의 파라미터만 사용합니다.
# BERT: 각 레이어가 독립적인 파라미터
class BertEncoder(nn.Module):
    def __init__(self, num_layers=12):
        super().__init__()
        # 12개의 독립적인 레이어 → 12배의 파라미터
        self.layers = nn.ModuleList([
            TransformerLayer(hidden_dim=768) for _ in range(num_layers)
        ])

# ALBERT: 모든 레이어가 파라미터 공유
class AlbertEncoder(nn.Module):
    def __init__(self, num_layers=12):
        super().__init__()
        # 1개 레이어의 파라미터를 12번 재사용
        self.shared_layer = TransformerLayer(hidden_dim=768)
        self.num_layers = num_layers

    def forward(self, x):
        """동일한 레이어를 반복 적용합니다."""
        for _ in range(self.num_layers):
            x = self.shared_layer(x)
        return x

ALBERT의 사전학습: SOP (Sentence Order Prediction)

ALBERT는 NSP 대신 **SOP(Sentence Order Prediction)**를 사용합니다. 두 문장의 순서가 올바른지(A-B) 아니면 뒤바뀌었는지(B-A)를 예측합니다.
태스크양성 예시음성 예시난이도
NSP연속 문장 쌍무작위 문장 쌍쉬움 (주제만 다르면 구분 가능)
SOP올바른 순서 (A, B)뒤바뀐 순서 (B, A)어려움 (세밀한 문맥 이해 필요)

ALBERT 모델 크기 비교

모델파라미터MNLISQuAD 2.0
BERT-Base108M84.680.0
ALBERT-Base12M81.680.0
ALBERT-Large18M83.582.3
ALBERT-xxlarge235M90.888.1
ALBERT-Base는 BERT-Base 대비 89% 적은 파라미터로 유사한 성능을 달성합니다.

DeBERTa — Decoding-enhanced BERT with Disentangled Attention

Microsoft가 2020년에 발표한 DeBERTa는 어텐션 메커니즘 자체를 개선한 모델입니다. SuperGLUE 벤치마크에서 인간 성능을 최초로 초과한 모델이기도 합니다.

핵심 혁신 1: 분리된 어텐션 (Disentangled Attention)

BERT에서 각 토큰의 표현은 내용(content)과 위치(position)를 하나의 벡터로 합칩니다. DeBERTa는 이 두 가지를 분리하여 별도로 어텐션을 계산합니다. Aij=HiHjTcontent-to-content+HiPjiTcontent-to-position+PijHjTposition-to-contentA_{ij} = \underbrace{H_i H_j^T}_{\text{content-to-content}} + \underbrace{H_i P_{j|i}^T}_{\text{content-to-position}} + \underbrace{P_{i|j} H_j^T}_{\text{position-to-content}}
어텐션 유형의미예시
Content-to-Content단어 의미 간 관계”고양이”와 “강아지”가 의미적으로 유사
Content-to-Position단어 의미와 상대 위치의 관계동사 바로 뒤의 단어가 목적어일 가능성
Position-to-Content상대 위치와 단어 의미의 관계문장 첫 단어가 주어일 가능성
BERT는 content + position을 합친 단일 벡터로 어텐션을 계산하므로 이 세 가지 관계를 분리하여 학습할 수 없습니다.

핵심 혁신 2: 향상된 마스크 디코더 (Enhanced Mask Decoder)

BERT는 최종 Hidden State에서 바로 마스킹된 토큰을 예측합니다. DeBERTa는 디코더 단계에서 절대 위치 정보를 추가로 주입합니다. 이는 상대 위치만으로는 부족한 경우를 보완합니다. 예를 들어, "a new store opened"에서 "store""opened"는 상대적 관계로는 구분이 어렵지만, "store"가 문장의 특정 절대 위치에 있다는 정보가 구문 역할 판단에 도움이 됩니다.
# DeBERTa의 개념적 아키텍처
class DeBERTaConceptual(nn.Module):
    """DeBERTa의 분리된 어텐션 개념을 보여주는 간소화 코드입니다."""
    def __init__(self, hidden_dim=768, max_position=512):
        super().__init__()
        # 내용 임베딩과 위치 임베딩을 분리
        self.content_embedding = nn.Embedding(30000, hidden_dim)
        self.position_embedding = nn.Embedding(max_position * 2, hidden_dim)

        # 분리된 어텐션을 위한 별도 프로젝션
        self.query_content = nn.Linear(hidden_dim, hidden_dim)
        self.key_content = nn.Linear(hidden_dim, hidden_dim)
        self.query_position = nn.Linear(hidden_dim, hidden_dim)
        self.key_position = nn.Linear(hidden_dim, hidden_dim)

    def disentangled_attention(self, content, position):
        """내용과 위치를 분리하여 어텐션을 계산합니다."""
        # 내용 기반 Query/Key
        q_c = self.query_content(content)
        k_c = self.key_content(content)

        # 위치 기반 Query/Key
        q_p = self.query_position(position)
        k_p = self.key_position(position)

        # 세 가지 어텐션 항 계산
        content_to_content = q_c @ k_c.transpose(-1, -2)
        content_to_position = q_c @ k_p.transpose(-1, -2)
        position_to_content = q_p @ k_c.transpose(-1, -2)

        # 최종 어텐션 점수
        attention = content_to_content + content_to_position + position_to_content
        return attention

세 모델 종합 비교

항목RoBERTaALBERTDeBERTa
핵심 혁신학습 전략 최적화파라미터 효율성어텐션 메커니즘 개선
NSP제거SOP로 대체제거
마스킹동적 마스킹동적 마스킹동적 마스킹
위치 인코딩절대 위치 (학습)절대 위치 (학습)상대 위치 (분리)
파라미터 (Base)125M12M139M
MNLI (acc)90.290.891.1
SQuAD 2.0 (F1)89.488.190.7
SuperGLUE84.689.490.0
학습 데이터160GB16GB78GB
주요 장점단순하지만 효과적매우 적은 파라미터최고 성능
주요 단점대규모 데이터/컴퓨팅 필요추론 속도는 미개선복잡한 어텐션 구조

어떤 모델을 선택해야 할까?

상황추천 모델이유
최고 성능이 필요한 경우DeBERTa (v3)SuperGLUE SOTA, 가장 정교한 어텐션
리소스가 제한된 환경ALBERT적은 파라미터로 준수한 성능
간단하고 안정적인 베이스라인RoBERTa검증된 학습 전략, 폭넓은 생태계
한국어 태스크KLUE-RoBERTa한국어 벤치마크 최적화
빠른 실험과 프로토타이핑RoBERTa-BaseHuggingFace 생태계 지원 우수

AI/ML 활용

BERT 개선 모델들은 실무에서 다음과 같이 활용됩니다.
  • 텍스트 분류: DeBERTa-v3는 감성 분석, 주제 분류 등에서 최고 성능을 보입니다
  • 정보 추출: NER, 관계 추출 등 토큰 수준 태스크에서 분리된 어텐션이 효과적입니다
  • 문장 유사도: 검색 시스템, 중복 탐지 등에 RoBERTa 기반 Sentence-BERT가 널리 사용됩니다
  • 경량화 배포: ALBERT는 엣지 디바이스나 모바일 환경에 적합합니다
from transformers import AutoTokenizer, AutoModelForSequenceClassification

# 각 모델 로드 방법
models = {
    "RoBERTa": "roberta-base",
    "ALBERT": "albert-base-v2",
    "DeBERTa": "microsoft/deberta-v3-base",
}

for name, model_name in models.items():
    tokenizer = AutoTokenizer.from_pretrained(model_name)
    model = AutoModelForSequenceClassification.from_pretrained(
        model_name,
        num_labels=2,
    )
    num_params = sum(p.numel() for p in model.parameters()) / 1e6
    print(f"{name}: {num_params:.1f}M 파라미터")
정적 마스킹에서는 모델이 동일한 마스킹 패턴을 반복 학습하여 특정 패턴에 과적합될 수 있습니다. 동적 마스킹은 매 에폭마다 새로운 마스킹을 적용하므로, 모델이 더 다양한 문맥 관계를 학습합니다. 특히 학습 에폭이 많을수록 동적 마스킹의 이점이 커집니다.
ALBERT-Base는 BERT-Base보다 약간 낮은 성능을 보이지만, 파라미터 대비 성능은 훨씬 효율적입니다. ALBERT-xxlarge는 BERT-Large보다 적은 파라미터로 더 높은 성능을 달성합니다. 다만 파라미터 공유는 모델 크기(저장 공간)는 줄이지만, 연산량(추론 시간)은 줄이지 않는다는 점에 유의해야 합니다.
Position-to-position 어텐션은 “위치 i와 위치 j 사이의 관계”만을 나타내며, 실제 단어 내용과 무관합니다. 실험적으로 이 항을 추가해도 성능 향상이 없었으며, 오히려 불필요한 연산만 증가시켰습니다. 따라서 DeBERTa는 내용이 최소 한쪽에 포함된 세 가지 항만 사용합니다.
DeBERTa-v3는 ELECTRA의 Replaced Token Detection(RTD) 사전학습 목표를 결합한 모델입니다. Generator가 토큰을 대체하고, Discriminator가 원본 여부를 판별합니다. 이를 통해 모든 토큰에서 학습 신호를 받을 수 있어 MLM보다 효율적입니다. 또한 Gradient-Disentangled Embedding Sharing으로 Generator와 Discriminator의 임베딩 공유를 안정화했습니다.

체크리스트

학습을 마치셨다면 아래 항목을 확인해 보세요.
  • RoBERTa의 네 가지 핵심 변경점(NSP 제거, 동적 마스킹, 데이터 규모, 배치 크기)을 설명할 수 있다
  • ALBERT의 인수분해된 임베딩이 파라미터를 줄이는 원리를 수식으로 설명할 수 있다
  • ALBERT의 크로스 레이어 파라미터 공유의 장단점을 이해한다
  • DeBERTa의 분리된 어텐션이 BERT의 어텐션과 어떻게 다른지 설명할 수 있다
  • SOP가 NSP보다 더 효과적인 이유를 설명할 수 있다
  • 태스크 요구사항에 따라 세 모델 중 적합한 모델을 선택할 수 있다