GPT는 다음 단어를 예측합니다. BERT는 빠진 단어를 예측합니다. 이 한 문장 차이가 이후 약 10년에 걸친 임베딩(embedding) 기반 시스템의 흐름을 만들었습니다.
유형: Build
언어: Python
선수 지식: Phase 7 · 05 (Full Transformer), Phase 5 · 02 (Text Representation)
예상 시간: 약 45분
문제
2018년에는 감성 분석(sentiment), 개체명 인식(Named Entity Recognition; NER), 질의응답(Question Answering; QA), 함의 판정(entailment) 같은 자연어 처리 과제마다 직접 모은 라벨 데이터(labeled data)로 모델을 처음부터 학습하는 일이 흔했습니다. 파인튜닝(fine-tuning)해서 사용할 수 있는 "영어를 이해하는" 사전학습 체크포인트(pre-trained checkpoint)가 따로 존재하지 않았습니다. ELMo(2018)는 양방향 LSTM(bidirectional LSTM)으로 문맥 임베딩(contextual embedding)을 사전학습할 수 있다는 것을 보였고 어느 정도 도움이 되었지만, 충분히 일반화되지는 않았습니다.
BERT(Devlin et al. 2018)는 질문을 바꿨습니다. 트랜스포머 인코더(Transformer Encoder)를 가져와 인터넷의 모든 문장으로 학습시키고, 양쪽 문맥을 모두 보면서 빠진 단어를 맞히도록 강제하면 어떨까? 그런 다음 다운스트림 과제(downstream task)에서는 헤드(head) 하나만 파인튜닝하면 됩니다. 이 파라미터 효율성(parameter efficiency)이 당시로서는 큰 전환점이었습니다.
결과적으로 18개월 안에 BERT와 RoBERTa, ALBERT, ELECTRA 같은 변형 모델들이 당시 존재하던 거의 모든 자연어 처리 리더보드(leaderboard)를 지배했습니다. 2020년 무렵에는 전 세계의 검색 엔진, 콘텐츠 모더레이션 파이프라인(content moderation pipeline), 의미 검색(semantic search) 시스템 대부분에 BERT 계열 인코더가 들어가 있었습니다.
2026년에도 인코더 전용 모델(encoder-only model)은 분류(classification), 검색(retrieval), 구조화된 정보 추출(structured extraction)에 가장 잘 맞는 도구입니다. 디코더(decoder)보다 토큰당 5-10배 빠르게 동작하고, 그 임베딩은 현대 검색 스택의 핵심 골격이 됩니다. ModernBERT(2024년 12월)는 Flash Attention + RoPE + GeGLU를 결합해 이 아키텍처를 8K 문맥 길이까지 확장했습니다.
사전 테스트
2문제 · 이 강의를 시작하기 전에 얼마나 알고 있는지 확인해보세요
1.BERT가 이전 자연어 처리 모델이 해결하지 못했던 어떤 문제를 해결했나요?
2.BERT는 양방향 어텐션(bidirectional attention)을 사용하고 GPT는 인과 어텐션(causal attention, 왼쪽에서 오른쪽)을 사용하는 이유는 무엇인가요?
0/2 답변 완료
개념
훈련 신호(training signal)
문장을 하나 가져옵니다. the quick brown fox jumps over the lazy dog.
토큰(token)의 15%를 무작위로 마스킹(masking)합니다.
input: the [MASK] brown fox jumps [MASK] the lazy dog
target: the quick brown fox jumps over the lazy dog
모델은 마스킹된 위치의 원래 토큰을 예측하도록 학습합니다. 인코더는 양방향(bidirectional)이기 때문에 위치 1의 [MASK]를 예측할 때 위치 2 이후의 brown fox jumps까지 함께 활용할 수 있습니다. 이것이 바로 GPT가 하지 못하는 부분입니다.
BERT의 마스킹 규칙
예측 대상으로 선택된 15%의 토큰 중에서:
80%는 [MASK]로 바꿉니다.
10%는 어휘에서 뽑은 임의의 토큰(random token)으로 바꿉니다.
10%는 그대로 둡니다.
왜 항상 [MASK]로 바꾸지 않을까요? [MASK]는 추론 시점(inference time)에는 등장하지 않기 때문입니다. 만약 마스킹된 위치의 100%를 [MASK]로만 학습시키면, 사전학습(pretraining)과 파인튜닝 사이에 분포 변화(distribution shift)가 생깁니다. 10%의 임의 토큰 치환과 10%의 원본 유지는 모델이 한쪽으로 치우치지 않고 보다 현실적인 입력을 다루도록 만듭니다.
다음 문장 예측(Next Sentence Prediction; NSP)과 제거된 이유
원래의 BERT는 NSP도 함께 학습했습니다. 두 문장 A와 B가 주어졌을 때 B가 A 뒤에 오는지 여부를 예측하는 과제입니다. RoBERTa(2019)는 제거 실험(ablation)을 통해 NSP가 성능에 도움이 되기는커녕 오히려 해가 된다는 점을 보였습니다. 그 결과 현대의 인코더들은 더 이상 NSP를 사용하지 않습니다.
2026년에 달라진 것: ModernBERT
2024년 ModernBERT 논문은 인코더 블록을 2026년 시점의 기본 구성 요소(primitive)로 다시 설계했습니다.
구성 요소(Component)
Original BERT (2018)
ModernBERT (2024)
Positional
Learned absolute
RoPE
Activation
GELU
GeGLU
Normalization
LayerNorm
Pre-norm RMSNorm
Attention
Full dense
Alternating local (128) + global
Context length
512
8192
Tokenizer
WordPiece
BPE
2018년의 스택과 달리 ModernBERT는 처음부터 Flash Attention에 최적화되어 있습니다(Flash-Attention-native). 시퀀스 길이 8K에서 DeBERTa-v3보다 추론 속도가 2-3배 빠르고 GLUE 점수도 더 좋습니다.
2026년에도 인코더를 고르게 되는 사용 사례
과제(Task)
디코더보다 인코더가 유리한 이유
검색/의미 검색 임베딩(retrieval / semantic search embedding)
양방향 문맥이 토큰당 임베딩 품질을 높여준다
분류(classification: sentiment, intent, toxicity)
생성 오버헤드(generation overhead) 없이 순전파(forward pass) 한 번이면 된다
개체명 인식 / 토큰 라벨링(NER / token labeling)
위치별 출력이 필요하고 양방향 구조가 자연스럽다
제로샷 함의 판정(Zero-shot entailment, NLI)
인코더 위에 분류기 헤드(classifier head)만 얹어 처리한다
검색 증강 생성(RAG) 재순위화기(reranker)
크로스 인코더 점수화(cross-encoder scoring)가 LLM 재순위화기보다 약 10배 빠른 경우가 많다
직접 만들기
Step 1: 마스킹 로직(masking logic)
code/main.py를 살펴봅니다. create_mlm_batch 함수는 토큰 ID 목록, 어휘 크기(vocab size), 마스킹 확률(mask probability)을 입력으로 받아 마스킹이 적용된 입력 ID와 라벨(label)을 반환합니다. 라벨은 마스킹된 위치에만 원래 토큰 값을 두고, 그 외 위치에는 PyTorch의 무시 인덱스 관례(ignore index convention)인 -100을 둡니다.
defcreate_mlm_batch(tokens, vocab_size, mask_prob=0.15, rng=None):
input_ids = list(tokens)
labels = [-100] * len(tokens)
for i, t inenumerate(tokens):
if rng.random() < mask_prob:
labels[i] = t
r = rng.random()
if r < 0.8:
input_ids[i] = MASK_ID
elif r < 0.9:
input_ids[i] = rng.randrange(vocab_size)
# else: 원본 유지return input_ids, labels
Step 2: 작은 말뭉치(tiny corpus)에서 MLM 예측 실행
20개 단어로 이루어진 어휘와 200개의 문장으로 구성된 장난감 말뭉치 위에서, 2층 인코더와 MLM 헤드를 함께 실행해 봅니다. 그래디언트(gradient)는 계산하지 않고 순전파(forward pass) 정상 동작 점검만 진행합니다. 전체 학습을 돌리려면 PyTorch가 필요합니다.
Step 3: 마스크 유형 비교
세 갈래 규칙(three-way rule)이 [MASK] 없이도 모델을 그대로 사용할 수 있게 만들어 주는 방식을 확인합니다. 마스킹이 없는 문장과 마스킹이 적용된 문장 모두에 대해 예측을 돌려 봅니다. 모델은 학습 과정에서 두 가지 패턴을 모두 보았기 때문에, 두 경우 모두 어느 정도 그럴듯한 토큰 분포를 만들어 내야 합니다.
Step 4: 헤드 파인튜닝
장난감 감성 데이터셋(toy sentiment dataset) 위에서 MLM 헤드를 분류 헤드(classification head)로 교체합니다. 인코더는 동결(freeze)한 채로 두고, 헤드만 학습시킵니다. 거의 모든 BERT 응용이 따르는 기본 패턴입니다.
사용해보기
from transformers import AutoModel, AutoTokenizer
tok = AutoTokenizer.from_pretrained("answerdotai/ModernBERT-base")
model = AutoModel.from_pretrained("answerdotai/ModernBERT-base")
text = "Attention is all you need."
inputs = tok(text, return_tensors="pt")
out = model(**inputs).last_hidden_state # (1, N, 768)
임베딩 모델(embedding model)은 파인튜닝된 BERT입니다.sentence-transformers의 all-MiniLM-L6-v2 같은 모델은 대조 손실(contrastive loss)로 학습된 BERT입니다. 인코더는 동일하고, 손실 함수가 바뀐 것뿐입니다.
크로스 인코더 재순위화기(cross-encoder reranker) 역시 파인튜닝된 BERT입니다.[CLS] query [SEP] doc [SEP] 위에서 쌍 분류(pair classification)를 수행합니다. 쿼리와 문서 사이를 잇는 양방향 어텐션(bidirectional attention)이 바로 크로스 인코더가 바이 인코더(bi-encoder)보다 품질에서 앞서는 이유입니다.
2026년에 BERT를 선택하지 말아야 하는 경우. 생성형 출력(generative output)이 필요한 모든 과제가 그렇습니다. 인코더에는 자기회귀적으로(autoregressively) 토큰을 생성할 자연스러운 방법이 없습니다. 또한 파라미터가 1B 이하라면 작은 디코더가 더 유연하면서도 비슷한 품질을 내는 경우도 있습니다(예: Phi-3-Mini, Qwen2-1.5B).
산출물 만들기
outputs/skill-bert-finetuner.md를 살펴봅니다. 이 스킬(skill)은 새로운 분류 또는 추출 과제(extraction task)를 위한 BERT 파인튜닝의 범위(backbone, head, 데이터, 평가, 종료 기준)를 정해 줍니다.
연습문제
쉬움.code/main.py를 실행해 10,000개의 토큰에 대한 마스킹 분포를 출력합니다. 약 15%가 선택되고, 그중 약 80%가 [MASK]로 바뀌는지 확인합니다.
중간. 전체 단어 마스킹(whole-word masking)을 구현합니다. 한 단어가 여러 개의 서브워드(subword)로 나뉘는 경우, 그 단어에 속한 모든 서브워드를 함께 마스킹하거나 함께 마스킹하지 않습니다. 500문장 말뭉치에서 MLM 정확도(accuracy)가 개선되는지 측정합니다.
어려움. 공개 데이터셋(public dataset)의 문장 10,000개를 사용해 작은(2층, d=64) BERT를 학습합니다. SST-2 감성 분석 과제에서 [CLS] 토큰을 활용해 파인튜닝하고, 동일한 파라미터 수의 디코더 전용 기준 모델(decoder-only baseline)과 비교해 봅니다. 어느 쪽이 이깁니까?
핵심 용어
용어
흔한 설명
실제 의미
MLM
"마스크 언어모델링(Masked Language Modeling)"
토큰의 15%를 무작위로 [MASK] 등으로 바꾼 뒤 원래 토큰을 예측하도록 학습시키는 훈련 신호이다.
양방향(bidirectional)
"양쪽을 본다"
인코더 어텐션에는 인과 마스크(causal mask)가 없어, 모든 위치가 다른 모든 위치를 참조한다.
[CLS]
"풀러 토큰(pooler token)"
시퀀스 맨 앞에 붙이는 특수 토큰(special token)이다. 마지막 층의 임베딩을 문장 수준 표현(sentence-level representation)으로 사용한다.
[SEP]
"세그먼트 구분자(segment separator)"
쿼리와 문서, 문장 A와 B 같은 쌍 시퀀스(paired sequence)를 구분하는 토큰이다.
NSP
"다음 문장 예측(Next Sentence Prediction)"
BERT의 두 번째 사전학습 과제이다. RoBERTa 이후로 대부분 제거되었다.
파인튜닝(fine-tuning)
"과제에 맞춘다"
인코더는 대부분 그대로 두고, 다운스트림 과제용 작은 헤드만 위에 올려 학습시킨다.
크로스 인코더(cross-encoder)
"재순위화기(reranker)"
쿼리와 문서를 함께 입력으로 받아 관련성 점수(relevance score)를 출력하는 BERT이다.
ModernBERT
"2024년 개선판"
RoPE, RMSNorm, GeGLU, 지역과 전역을 교대로 적용하는 어텐션(alternating local/global attention), 8K 문맥을 도입한 현대적인 인코더이다.