🤖 AI/ML

BERT

Bidirectional Encoder Representations from Transformers

Google의 양방향 언어 모델. 문맥 이해에 탁월. NLP 벤치마크 혁신. GPT와 함께 현대 LLM의 선구자.

📖 상세 설명

BERT(Bidirectional Encoder Representations from Transformers)는 2018년 Google이 발표한 사전학습 언어 모델로, 양방향 문맥을 동시에 고려하여 텍스트를 이해합니다. 기존의 단방향 모델과 달리 문장의 앞뒤 맥락을 모두 활용해 단어의 의미를 파악합니다.

BERT는 2018년 10월 공개 직후 11개의 NLP 벤치마크에서 SOTA를 달성하며 NLP 분야에 패러다임 전환을 일으켰습니다. 이후 RoBERTa, ALBERT, DistilBERT 등 수많은 변형이 등장했고, 한국어 특화 모델인 KoBERT, KoELECTRA도 개발되었습니다.

핵심 원리는 Masked Language Model(MLM)과 Next Sentence Prediction(NSP) 두 가지 사전학습 태스크입니다. MLM은 입력 토큰의 15%를 [MASK]로 가리고 예측하게 하여 양방향 문맥 학습을 가능하게 합니다. NSP는 두 문장이 연속인지 판별하여 문장 간 관계를 학습합니다.

실무에서 BERT는 텍스트 분류, 개체명 인식(NER), 질의응답(QA), 문장 유사도 측정 등 NLU(자연어 이해) 태스크에 주로 활용됩니다. 사전학습된 BERT를 특정 태스크에 맞게 fine-tuning하면 적은 데이터로도 높은 성능을 얻을 수 있어, 산업 현장에서 표준 접근법이 되었습니다.

💻 코드 예제

# BERT를 활용한 감정 분류 Fine-tuning 예제
from transformers import BertTokenizer, BertForSequenceClassification
from transformers import Trainer, TrainingArguments
from datasets import load_dataset
import torch

# 1. 모델과 토크나이저 로드
model_name = "bert-base-uncased"
tokenizer = BertTokenizer.from_pretrained(model_name)
model = BertForSequenceClassification.from_pretrained(
    model_name,
    num_labels=2  # 긍정/부정 이진 분류
)

# 2. 데이터셋 로드 및 전처리
dataset = load_dataset("imdb")

def tokenize_function(examples):
    return tokenizer(
        examples["text"],
        padding="max_length",
        truncation=True,
        max_length=512
    )

tokenized_datasets = dataset.map(tokenize_function, batched=True)

# 3. 학습 설정
training_args = TrainingArguments(
    output_dir="./bert-imdb",
    num_train_epochs=3,
    per_device_train_batch_size=8,
    per_device_eval_batch_size=16,
    warmup_steps=500,
    learning_rate=2e-5,  # BERT 권장 학습률
    evaluation_strategy="epoch",
    save_strategy="epoch",
    load_best_model_at_end=True
)

# 4. Trainer로 Fine-tuning
trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=tokenized_datasets["train"],
    eval_dataset=tokenized_datasets["test"]
)

trainer.train()

# 5. 추론 예제
def predict_sentiment(text):
    inputs = tokenizer(text, return_tensors="pt", truncation=True, max_length=512)
    with torch.no_grad():
        outputs = model(**inputs)
    probs = torch.softmax(outputs.logits, dim=-1)
    return "긍정" if probs[0][1] > 0.5 else "부정"

🗣️ 실무 대화 예시

NLP 프로젝트 모델 선정 회의에서

"감정 분류는 문맥 이해가 핵심이니까 BERT 계열이 적합합니다. 한국어니까 KoBERT나 KoELECTRA로 시작하고, 데이터가 충분하면 RoBERTa-large로 스케일업하는 전략을 제안합니다. GPT는 생성 태스크에 더 적합해요."

Fine-tuning 성능 이슈 논의 중

"BERT fine-tuning에서 learning rate가 너무 크면 catastrophic forgetting이 발생해요. 2e-5에서 5e-5 사이로 유지하고, warmup을 전체 스텝의 10% 정도 주는 게 안전합니다. 현재 설정이 1e-4면 너무 높아요."

기술 면접에서

"BERT의 MLM이 양방향 학습을 가능하게 하는 이유는 마스킹된 토큰을 예측할 때 왼쪽과 오른쪽 문맥을 모두 볼 수 있기 때문입니다. GPT처럼 다음 토큰 예측이면 오른쪽을 볼 수 없어서 단방향이 되죠. 이 차이가 BERT가 NLU에 강한 근본적인 이유입니다."

📊 BERT 모델 스펙 비교

모델 파라미터 레이어 Hidden 용도
BERT-base 110M 12 768 🏆 일반 사용 (권장)
BERT-large 340M 24 1024 높은 정확도 필요시
DistilBERT 66M 6 768 💨 빠른 추론 (40% 경량화)
KoBERT 92M 12 768 🇰🇷 한국어 특화

💡 실무 팁: 대부분 BERT-base로 충분. 프로덕션 속도 중요시 DistilBERT 사용. 한국어는 KoBERT 또는 KoELECTRA 권장. Fine-tuning시 GPU 메모리: base 8GB, large 16GB 이상 필요.

⚠️ 주의사항

1
512 토큰 제한

BERT-base는 최대 512 토큰만 처리할 수 있습니다. 긴 문서는 chunking하거나 Longformer, BigBird 같은 long-context 모델을 사용하세요. 단순 truncation은 중요 정보 손실을 유발합니다.

2
생성 태스크 부적합

BERT는 인코더 전용 모델로 텍스트 생성에는 적합하지 않습니다. 요약, 번역, 대화 생성 등에는 GPT 계열이나 T5 같은 인코더-디코더 모델을 사용하세요.

3
도메인 불일치

일반 도메인으로 사전학습된 BERT를 의료, 법률 등 전문 도메인에 바로 적용하면 성능이 떨어집니다. BioBERT, LegalBERT 등 도메인 특화 모델을 사용하거나 도메인 데이터로 추가 사전학습하세요.

🔗 관련 용어

📚 더 배우기