Skip to content
Published on

BERT 논문 완벽 분석: 양방향 Transformer가 NLP의 판도를 바꾼 방법

Authors
  • Name
    Twitter

1. 논문 개요

"BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding"은 2018년 10월 Google AI Language 팀의 Jacob Devlin, Ming-Wei Chang, Kenton Lee, Kristina Toutanova가 발표한 논문이다. 이후 NAACL 2019에서 Best Long Paper로 선정되었다.

BERT는 Bidirectional Encoder Representations from Transformers의 약자로, 이름 그대로 Transformer의 Encoder를 양방향으로 사전학습한 언어 표현 모델이다. 핵심 아이디어는 단순하다. 대규모 비지도 텍스트 코퍼스에서 양방향 문맥을 학습한 다음, 태스크별로 약간의 Fine-tuning만 수행하면 된다는 것이다.

이 단순한 접근법이 11개 NLP 벤치마크에서 동시에 State-of-the-Art(SOTA)를 달성했다. GLUE 점수를 80.5%까지 끌어올렸고(7.7% 절대 향상), SQuAD v1.1 F1을 93.2(1.5 포인트 향상), SQuAD v2.0 F1을 83.1(5.1 포인트 향상)로 기록했다. BERT는 NLP에서 Pre-training + Fine-tuning 패러다임을 확립한 논문이며, 이후 등장하는 거의 모든 언어 모델의 출발점이 되었다.


2. 배경: 왜 양방향이 필요했는가

2.1 Pre-trained Language Representation의 두 갈래

BERT 이전에 사전학습된 언어 표현을 활용하는 접근법은 크게 두 갈래로 나뉘어 있었다.

Feature-based 접근법 (ELMo)

Peters et al.(2018)이 제안한 ELMo(Embeddings from Language Models)는 Forward LSTM과 Backward LSTM을 각각 독립적으로 학습한 뒤, 두 방향의 hidden state를 연결(concatenation)하여 문맥 의존적 단어 표현을 생성했다. ELMo의 표현은 다운스트림 태스크의 입력 Feature로 사용되며, 태스크마다 별도의 아키텍처를 설계해야 했다.

ELMok=γj=0Lsj[hk,j;hk,j]\text{ELMo}_k = \gamma \sum_{j=0}^{L} s_j \cdot [\overrightarrow{h}_{k,j}; \overleftarrow{h}_{k,j}]

여기서 hk,j\overrightarrow{h}_{k,j}hk,j\overleftarrow{h}_{k,j}는 각각 Forward, Backward LSTM의 jj번째 레이어 hidden state이고, sjs_j는 학습 가능한 가중치다. 핵심적인 한계는 Forward와 Backward가 독립적으로 학습된다는 것이다. 두 방향의 정보가 깊은 레이어에서 상호작용하지 못한다.

Fine-tuning 접근법 (OpenAI GPT)

Radford et al.(2018)의 GPT(Generative Pre-Training)는 Transformer Decoder를 사용하여 Left-to-Right Language Modeling으로 사전학습한 후, 다운스트림 태스크에 맞게 전체 모델을 Fine-tuning하는 방식을 취했다. 태스크별 아키텍처 변경이 최소화된다는 장점이 있었지만, **단방향(Left-to-Right)**으로만 문맥을 인코딩한다는 근본적 한계가 있었다.

2.2 단방향의 한계

"The bank of the river"에서 "bank"의 의미를 파악하려면, "bank" 왼쪽의 "The"뿐 아니라 오른쪽의 "river"도 함께 봐야 한다. Left-to-Right 모델은 "bank"를 인코딩할 때 "river"를 참조할 수 없다. 이것이 GPT-1의 근본적 한계였다.

ELMo는 양방향을 고려하지만, Forward와 Backward를 각각 독립적으로 학습한 뒤 단순 연결하는 "얕은(shallow) 양방향" 이다. 진정한 양방향 표현이란, 모든 레이어에서 왼쪽과 오른쪽 문맥이 동시에 상호작용하며 학습되는 것이어야 한다.

2.3 세 가지 접근법 비교

특성ELMoGPT-1BERT
아키텍처Bi-LSTMTransformer DecoderTransformer Encoder
방향성얕은 양방향 (독립 학습)단방향 (Left-to-Right)깊은 양방향
사전학습 목표Forward + Backward LMLeft-to-Right LMMLM + NSP
다운스트림 적용Feature-basedFine-tuningFine-tuning
태스크별 아키텍처태스크마다 설계 필요최소 변경최소 변경
파라미터 수94M117M110M (Base) / 340M (Large)

BERT의 핵심 기여는 이 두 접근법의 장점을 결합한 것이다. GPT처럼 Fine-tuning 기반이면서도, ELMo처럼 양방향 문맥을 활용하되, 독립 학습이 아닌 모든 레이어에서 동시에(deeply) 양방향 문맥을 학습한다.


3. BERT 아키텍처

3.1 Transformer Encoder Stack

BERT는 Vaswani et al.(2017)의 Transformer 아키텍처에서 Encoder 부분만 사용한다. Decoder는 사용하지 않는다. 각 Encoder 레이어는 다음 두 Sub-layer로 구성된다.

  1. Multi-Head Self-Attention: 입력 시퀀스의 모든 토큰이 다른 모든 토큰을 양방향으로 참조
  2. Position-wise Feed-Forward Network: 각 토큰에 대해 독립적으로 비선형 변환 수행

각 Sub-layer에는 Residual Connection과 Layer Normalization이 적용된다.

output=LayerNorm(x+Sublayer(x))\text{output} = \text{LayerNorm}(x + \text{Sublayer}(x))

Decoder를 사용하지 않기 때문에 Auto-regressive Masking이 없고, 모든 위치의 토큰이 모든 다른 위치의 토큰을 자유롭게 참조할 수 있다. 이것이 BERT가 진정한 양방향(deeply bidirectional) 모델이 될 수 있는 구조적 기반이다.

3.2 BERT-Base vs BERT-Large

논문은 두 가지 모델 크기를 제시한다.

설정BERT-BaseBERT-Large
Layers (LL)1224
Hidden Size (HH)7681,024
Attention Heads (AA)1216
Feed-Forward Size3,072 (4H4H)4,096 (4H4H)
Total Parameters110M340M

BERT-Base는 GPT-1과 동일한 모델 크기(레이어 수, Hidden Size, Attention Head 수)를 가지도록 의도적으로 설계되었다. 이는 아키텍처 크기가 아닌 사전학습 방법론의 차이가 성능 향상의 원인임을 공정하게 비교하기 위함이다.

각 Attention Head의 차원은 dk=H/Ad_k = H / A이다. BERT-Base에서는 768/12=64768 / 12 = 64, BERT-Large에서는 1024/16=641024 / 16 = 64로, 두 모델 모두 Head당 차원은 64로 동일하다.

3.3 활성화 함수: GELU

BERT는 Transformer 원본 논문의 ReLU 대신 **GELU(Gaussian Error Linear Unit)**를 활성화 함수로 사용한다.

GELU(x)=xΦ(x)=x12[1+erf(x2)]\text{GELU}(x) = x \cdot \Phi(x) = x \cdot \frac{1}{2}\left[1 + \text{erf}\left(\frac{x}{\sqrt{2}}\right)\right]

GELU는 ReLU와 달리 입력값에 따라 부드럽게 활성화되며, 음수 영역에서도 약간의 기울기를 유지한다. 이후 GPT-2, RoBERTa 등 대부분의 Transformer 기반 모델에서 표준으로 자리 잡았다.


4. 입력 표현 (Input Representation)

BERT의 입력 표현은 세 가지 Embedding의 합으로 구성된다. 이 설계는 단일 모델이 단일 문장과 문장 쌍 태스크를 모두 처리할 수 있게 해준다.

4.1 WordPiece Tokenization

BERT는 30,000개의 WordPiece 토큰 어휘를 사용한다. WordPiece는 Byte-Pair Encoding(BPE)의 변형으로, 빈도 기반이 아닌 우도(likelihood) 기반으로 서브워드를 병합한다.

예를 들어, "playing"은 "play" + "##ing"으로 분리된다. "##" 접두사는 해당 토큰이 단어의 시작이 아니라 이전 토큰의 연속임을 나타낸다. 이 방식의 장점은 다음과 같다.

  • OOV(Out-of-Vocabulary) 문제 해결: 어떤 단어든 서브워드 조합으로 표현 가능
  • 형태소 정보 보존: "play"와 "playing"이 "play"라는 공통 토큰을 공유
  • 어휘 크기 제어: 30,000개의 제한된 어휘로 모든 텍스트를 커버

4.2 특수 토큰: [CLS]와 [SEP]

BERT는 두 가지 특수 토큰을 사용한다.

[CLS] (Classification Token): 모든 입력 시퀀스의 맨 앞에 추가된다. 이 토큰의 최종 hidden state는 분류 태스크에서 시퀀스 전체의 집약(aggregate) 표현으로 사용된다. Self-Attention을 통해 시퀀스의 모든 토큰 정보가 [CLS]에 집중되기 때문이다.

[SEP] (Separator Token): 두 문장을 구분하는 데 사용된다. 단일 문장 태스크에서는 문장 끝에, 문장 쌍 태스크에서는 두 문장 사이와 두 번째 문장 끝에 추가된다.

입력 형식의 예시는 다음과 같다.

단일 문장: [CLS] I love NLP [SEP]
문장 쌍:   [CLS] How old are you ? [SEP] I am 25 years old . [SEP]

4.3 세 가지 Embedding의 합

각 토큰의 입력 표현은 다음 세 가지 Embedding을 element-wise로 합산하여 생성한다.

Token Embedding: WordPiece 토큰에 대한 학습 가능한 Embedding이다. 어휘 크기 30,000에 대해 R30000×H\mathbb{R}^{30000 \times H} 크기의 Embedding 행렬을 가진다.

Segment Embedding: 입력이 문장 A인지 문장 B인지를 구분하는 학습 가능한 Embedding이다. 문장 A에 속하는 토큰은 EAE_A, 문장 B에 속하는 토큰은 EBE_B로 표현된다. 단일 문장 태스크에서는 모든 토큰이 EAE_A를 사용한다.

Position Embedding: 시퀀스 내 위치 정보를 인코딩하는 학습 가능한 Embedding이다. Transformer 원본 논문의 Sinusoidal Positional Encoding과 달리, BERT는 학습 가능한(learned) Position Embedding을 사용한다. 최대 시퀀스 길이는 512이다.

Input(xi)=Etoken(xi)+Esegment(xi)+Eposition(i)\text{Input}(x_i) = E_{\text{token}}(x_i) + E_{\text{segment}}(x_i) + E_{\text{position}}(i)

이 세 Embedding의 합이 Transformer Encoder의 첫 번째 레이어에 입력된다.


5. 사전학습 방법론

BERT의 사전학습은 두 가지 비지도 태스크로 구성된다. 이 두 태스크의 설계가 BERT 논문의 핵심 기여이다.

5.1 Masked Language Model (MLM)

동기: 양방향 학습의 딜레마

표준 Language Model은 P(wtw1,...,wt1)P(w_t | w_1, ..., w_{t-1}), 즉 이전 토큰들이 주어졌을 때 다음 토큰의 확률을 예측한다. 이는 본질적으로 Left-to-Right이다. Bidirectional Language Model을 직접 학습하면, 각 토큰이 간접적으로 "자기 자신을 볼 수 있는" 문제가 발생한다. 다층 네트워크에서 양방향 문맥이 순환하면서 예측 대상 단어의 정보가 누출되는 것이다.

BERT는 이 딜레마를 Cloze Task(빈칸 채우기)에서 영감을 받은 Masked Language Model로 해결한다.

15% Masking Strategy

각 학습 시퀀스에서 WordPiece 토큰의 15%를 무작위로 선택하여 마스킹한다. 그리고 선택된 토큰의 원래 단어를 예측하는 것이 학습 목표다.

하지만 단순히 [MASK] 토큰으로 대체하면 문제가 생긴다. Fine-tuning 시에는 [MASK] 토큰이 입력에 등장하지 않으므로, 사전학습과 Fine-tuning 사이에 불일치(mismatch) 가 발생한다.

80/10/10 규칙

이 불일치를 완화하기 위해, 선택된 15%의 토큰을 다음 비율로 처리한다.

비율처리 방법예시 ("my dog is hairy"에서 "hairy" 선택 시)
80%[MASK] 토큰으로 대체my dog is [MASK]
10%랜덤 토큰으로 대체my dog is apple
10%원래 토큰 유지my dog is hairy

이 전략의 효과를 구체적으로 살펴보면 다음과 같다.

  • 80% [MASK]: 모델이 문맥으로부터 원래 단어를 복원하도록 학습
  • 10% Random: 모델이 모든 입력 토큰에 대해 실제 단어인지 아닌지 불확실하게 만들어, 어떤 위치든 올바른 표현을 유지하도록 강제
  • 10% Unchanged: Fine-tuning 시 관찰되는 실제 입력과의 간극을 줄임

논문의 Ablation Study에서 80/10/10 비율이 최적이었으며, 100% [MASK]만 사용하면 Feature-based 접근법에서 성능이 크게 하락했다.

MLM Loss 함수

MLM의 손실 함수는 마스킹된 위치에서만 Cross-Entropy Loss를 계산한다.

LMLM=iMlogP(xix~)\mathcal{L}_{\text{MLM}} = -\sum_{i \in \mathcal{M}} \log P(x_i | \tilde{x})

여기서 M\mathcal{M}은 마스킹된 토큰의 인덱스 집합이고, x~\tilde{x}는 마스킹 처리된 입력 시퀀스이며, P(xix~)P(x_i | \tilde{x})는 모델이 마스킹된 위치 ii에서 원래 토큰 xix_i를 예측할 확률이다.

구체적으로, 마스킹된 각 위치의 최종 hidden state hih_i를 어휘 크기로 프로젝션한 뒤 Softmax를 적용한다.

P(xix~)=softmax(Whi+b)xiP(x_i | \tilde{x}) = \text{softmax}(W \cdot h_i + b)_{x_i}

여기서 WRV×HW \in \mathbb{R}^{|V| \times H}는 출력 가중치 행렬이고, V|V|는 어휘 크기(30,000)이다.

MLM의 단점은 각 배치에서 토큰의 15%만 예측하므로, 일반적인 Left-to-Right LM보다 수렴이 느리다는 것이다. 하지만 논문에서는 이 비용을 상쇄하고도 남을 만큼의 성능 향상을 실험적으로 입증했다.

5.2 Next Sentence Prediction (NSP)

동기

Question Answering(QA)이나 Natural Language Inference(NLI) 같은 태스크는 두 문장 사이의 관계를 이해해야 한다. 이 관계는 단순한 Language Modeling으로는 학습하기 어렵다.

학습 방법

NSP는 이진 분류 태스크다. 두 문장 A와 B가 주어졌을 때, B가 실제로 A 다음에 오는 문장인지(IsNext) 아니면 코퍼스에서 무작위로 선택된 문장인지(NotNext)를 예측한다.

  • 50%: B는 A의 실제 다음 문장 (IsNext)
  • 50%: B는 코퍼스에서 랜덤 선택 (NotNext)
[CLS] The man went to [MASK] store [SEP] He bought a gallon [MASK] milk [SEP]
Label: IsNext

[CLS] The man [MASK] to the store [SEP] Penguin [MASK] are flight ##less birds [SEP]
Label: NotNext

[CLS] 토큰의 최종 hidden state CC를 이진 분류기에 입력하여 예측한다.

P(IsNextC)=softmax(WNSPC)P(\text{IsNext} | C) = \text{softmax}(W_{\text{NSP}} \cdot C)

NSP의 효과와 논란

논문의 Ablation Study에서 NSP를 제거하면 QNLI(-3.5%), MNLI(-0.5%), SQuAD(-0.6%)에서 유의미한 성능 하락이 관찰되었다. 특히 문장 쌍 관계 추론이 중요한 태스크에서 하락이 두드러졌다.

그러나 이후 RoBERTa(Liu et al., 2019) 연구에서 NSP의 효과에 의문이 제기되었다. RoBERTa는 NSP를 제거하고도 BERT보다 높은 성능을 달성했으며, NSP의 효과는 학습 데이터 구성 방식에 더 크게 좌우된다고 주장했다.

5.3 전체 사전학습 손실

최종 사전학습 손실은 MLM과 NSP 손실의 합이다.

L=LMLM+LNSP\mathcal{L} = \mathcal{L}_{\text{MLM}} + \mathcal{L}_{\text{NSP}}

5.4 사전학습 데이터 및 설정

설정
학습 데이터BooksCorpus (800M 단어) + English Wikipedia (2,500M 단어)
총 데이터 크기약 16GB 텍스트
어휘 크기30,000 WordPiece 토큰
최대 시퀀스 길이512 토큰
Batch Size256 시퀀스 (128,000 토큰/배치)
학습 스텝1,000,000 스텝 (약 40 에포크)
OptimizerAdam (β1=0.9\beta_1=0.9, β2=0.999\beta_2=0.999, ϵ=106\epsilon=10^{-6})
Learning Rate1e-4 (10,000 스텝 warmup 후 linear decay)
Dropout0.1 (모든 레이어)
ActivationGELU
Hardware4개 Cloud TPU Pod (16 TPU 칩, BERT-Base) / 16개 Cloud TPU Pod (64 TPU 칩, BERT-Large)
학습 시간BERT-Base: 4일, BERT-Large: 4일

6. Fine-tuning 전략

BERT의 Fine-tuning은 놀라울 만큼 간단하다. 사전학습된 BERT 위에 태스크별 출력 레이어 하나만 추가하고, 전체 모델을 End-to-End로 Fine-tuning한다. 사전학습에 비해 Fine-tuning은 매우 빠르다. 대부분의 태스크에서 단일 Cloud TPU로 1시간 이내, GPU로는 수 시간 이내에 완료된다.

6.1 Fine-tuning Hyperparameters

대부분의 태스크에서 다음 하이퍼파라미터 범위가 잘 작동한다.

하이퍼파라미터권장 범위
Batch Size16, 32
Learning Rate (Adam)5e-5, 4e-5, 3e-5, 2e-5
Epochs2, 3, 4
Dropout0.1 (사전학습과 동일)

6.2 문장/문장 쌍 분류 (Classification)

감성 분석(SST-2), 자연어 추론(MNLI, RTE), 문장 유사도(STS-B, MRPC, QQP) 등의 태스크에서는 [CLS] 토큰의 최종 hidden state CRHC \in \mathbb{R}^H를 분류기에 입력한다.

P(yx)=softmax(WC+b)P(y | x) = \text{softmax}(W \cdot C + b)

여기서 WRK×HW \in \mathbb{R}^{K \times H}이고, KK는 레이블 수다.

문장 쌍 태스크의 경우 입력 형식은 다음과 같다.

[CLS] Sentence A [SEP] Sentence B [SEP]

Segment Embedding으로 문장 A와 B를 구분하며, [CLS]의 표현이 두 문장 간의 관계를 인코딩한다.

6.3 질의응답 (Question Answering, QA)

SQuAD(Stanford Question Answering Dataset)에서 질문과 지문이 주어지면, 지문에서 답변에 해당하는 구간(span)의 시작과 끝 위치를 예측한다.

[CLS] Question [SEP] Passage [SEP]

시작 위치 벡터 SRHS \in \mathbb{R}^H와 끝 위치 벡터 ERHE \in \mathbb{R}^H를 학습하고, 지문의 각 토큰 ii에 대해 시작/끝 확률을 계산한다.

Pstart(i)=eSTijeSTj,Pend(i)=eETijeETjP_{\text{start}}(i) = \frac{e^{S \cdot T_i}}{\sum_j e^{S \cdot T_j}}, \quad P_{\text{end}}(i) = \frac{e^{E \cdot T_i}}{\sum_j e^{E \cdot T_j}}

여기서 TiT_i는 토큰 ii의 최종 hidden state다. 후보 답변 span (i,j)(i, j)의 점수는 STi+ETjS \cdot T_i + E \cdot T_j (jij \geq i)로 계산된다.

SQuAD v2.0에서는 답변이 없는 경우도 처리해야 하므로, 답변이 없을 때 시작과 끝 위치를 모두 [CLS]로 설정하여 "답변 없음" 확률을 계산한다.

6.4 개체명 인식 (Named Entity Recognition, NER)

CoNLL-2003 NER 태스크에서는 각 토큰을 Person, Organization, Location, Miscellaneous, Other 중 하나로 분류한다. 이때 [CLS] 표현이 아닌 각 토큰의 최종 hidden state를 분류기에 입력한다.

P(yix)=softmax(WNERTi+bNER)P(y_i | x) = \text{softmax}(W_{\text{NER}} \cdot T_i + b_{\text{NER}})

WordPiece로 분리된 서브워드 토큰의 경우, 일반적으로 첫 번째 서브워드의 예측값을 해당 단어의 레이블로 사용한다.

6.5 Sequence Labeling 일반화

NER을 포함하여 POS Tagging, Chunking 등 시퀀스의 각 토큰에 레이블을 부여하는 모든 태스크에 동일한 방식을 적용할 수 있다. BERT의 각 토큰 표현이 양방향 문맥을 충분히 인코딩하고 있기 때문에, CRF(Conditional Random Field)와 같은 추가적인 시퀀스 모델링 레이어 없이도 높은 성능을 달성한다.

6.6 Feature-based 접근법

BERT는 Fine-tuning 외에도 Feature-based 접근법으로 사용할 수 있다. Transformer Encoder를 고정(freeze)하고, 특정 레이어의 hidden state를 Feature로 추출하여 별도의 모델에 입력하는 방식이다.

논문에서 CoNLL-2003 NER 태스크에 Feature-based 방식을 적용한 결과, 마지막 4개 레이어의 hidden state를 연결(concatenation)한 표현이 96.1% F1(dev)을 달성하여, Fine-tuning 방식의 96.4% F1(dev)에 근접했다. 이는 BERT의 사전학습된 표현 자체가 매우 풍부한 언어 정보를 담고 있음을 보여준다.


7. 핵심 수식 정리

7.1 Self-Attention (Scaled Dot-Product Attention)

BERT의 각 Encoder 레이어에서 수행되는 Self-Attention의 수식이다.

Attention(Q,K,V)=softmax(QKTdk)V\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V

여기서 Q=XWQQ = XW^Q, K=XWKK = XW^K, V=XWVV = XW^V이고, dk=H/Ad_k = H / A는 각 Attention Head의 차원이다.

7.2 Multi-Head Attention

MultiHead(Q,K,V)=Concat(head1,...,headA)WO\text{MultiHead}(Q, K, V) = \text{Concat}(\text{head}_1, ..., \text{head}_A) \cdot W^O headi=Attention(QWiQ,KWiK,VWiV)\text{head}_i = \text{Attention}(QW_i^Q, KW_i^K, VW_i^V)

BERT-Base에서는 A=12A=12, BERT-Large에서는 A=16A=16개의 head를 사용한다.

7.3 Feed-Forward Network

각 Attention Sub-layer 뒤의 Position-wise FFN이다.

FFN(x)=GELU(xW1+b1)W2+b2\text{FFN}(x) = \text{GELU}(xW_1 + b_1)W_2 + b_2

여기서 W1RH×4HW_1 \in \mathbb{R}^{H \times 4H}, W2R4H×HW_2 \in \mathbb{R}^{4H \times H}이다. 내부 차원이 Hidden Size의 4배인 Bottleneck 구조다.

7.4 MLM Loss (재정리)

마스킹된 토큰 집합 M\mathcal{M}에 대한 Cross-Entropy Loss이다.

LMLM=1MiMlogexp(Wxihi)v=1Vexp(Wvhi)\mathcal{L}_{\text{MLM}} = -\frac{1}{|\mathcal{M}|}\sum_{i \in \mathcal{M}} \log \frac{\exp(W_{x_i} \cdot h_i)}{\sum_{v=1}^{|V|} \exp(W_v \cdot h_i)}

여기서 hih_i는 마스킹된 위치 ii의 최종 hidden state, WvW_v는 출력 Embedding 행렬의 vv번째 행, V=30,000|V| = 30,000이다.

7.5 NSP Loss

LNSP=[ylogP(IsNext)+(1y)logP(NotNext)]\mathcal{L}_{\text{NSP}} = -\left[y \log P(\text{IsNext}) + (1-y) \log P(\text{NotNext})\right]

여기서 y{0,1}y \in \{0, 1\}은 실제 레이블이다.

7.6 전체 사전학습 목표

Lpretrain=LMLM+LNSP\mathcal{L}_{\text{pretrain}} = \mathcal{L}_{\text{MLM}} + \mathcal{L}_{\text{NSP}}

8. 실험 결과

8.1 GLUE Benchmark

GLUE(General Language Understanding Evaluation)는 9개의 NLU 태스크로 구성된 벤치마크이다. BERT-Large는 GLUE 전체 점수 **80.5%**를 달성하며 기존 SOTA 대비 7.7% 절대 향상을 기록했다.

태스크메트릭BERT-BaseBERT-Large기존 SOTA
MNLI-m / MNLI-mmAccuracy84.6 / 83.486.7 / 85.980.6 / 80.1
QQPF171.272.166.1
QNLIAccuracy90.592.787.4
SST-2Accuracy93.594.993.2
CoLAMatthews Corr52.160.535.0
STS-BSpearman Corr85.886.581.0
MRPCF188.989.386.0
RTEAccuracy66.470.161.7
WNLIAccuracy-65.165.1

특히 CoLA에서 기존 SOTA 대비 25.5% 절대 향상이 인상적이다. CoLA(Corpus of Linguistic Acceptability)는 문장의 문법적 적격성을 판단하는 태스크로, 깊은 언어 이해가 필요하다.

8.2 SQuAD v1.1

SQuAD v1.1(Stanford Question Answering Dataset)은 지문에서 답변 구간을 추출하는 Extractive QA 태스크다.

모델EM (Exact Match)F1
기존 SOTA (단일 모델)84.491.0
BERT-Large (단일 모델)84.190.9
기존 SOTA (앙상블)86.791.7
BERT-Large + TriviaQA (앙상블)87.493.2

TriviaQA 데이터를 활용한 앙상블 모델이 F1 93.2를 달성하며 인간 성능(91.2 F1)을 처음으로 초과했다.

8.3 SQuAD v2.0

SQuAD v2.0은 v1.1에 답변이 없는 질문(unanswerable questions) 을 추가한 버전이다.

모델EMF1
기존 SOTA73.777.0
BERT-Large (단일 모델)80.083.1

기존 SOTA 대비 F1에서 6.1 포인트 향상을 달성했다. 답변 가능 여부를 판단하는 능력에서 BERT의 양방향 문맥 이해가 특히 강점을 보였다.

8.4 SWAG

SWAG(Situations With Adversarial Generations)는 상식 추론 태스크로, 주어진 문장에 이어질 가장 적절한 후속 문장을 4개 후보 중에서 선택한다.

모델Dev AccuracyTest Accuracy
Human-88.0
ESIM + ELMo51.952.7
OpenAI GPT-78.0
BERT-Base81.6-
BERT-Large86.686.3

BERT-Large는 GPT를 8.3% 앞서며 인간 성능(88.0%)에 근접했다.

8.5 Ablation Study: 사전학습 태스크의 영향

논문에서 BERT-Base를 기준으로 사전학습 태스크의 중요성을 분석했다.

설정MNLI-mQNLIMRPCSST-2SQuAD F1
BERT-Base (MLM + NSP)84.488.486.792.788.5
No NSP83.984.986.592.687.9
LTR (Left-to-Right) & No NSP82.184.377.592.177.8
LTR + BiLSTM & No NSP82.184.175.791.684.9

핵심 발견사항은 다음과 같다.

  1. NSP 제거: QNLI에서 3.5% 하락, 문장 쌍 관계가 중요한 태스크에서 영향이 큼
  2. Left-to-Right: 양방향 대비 SQuAD에서 10.7 F1 하락, 토큰 수준 태스크에서 양방향성이 결정적
  3. LTR + BiLSTM: BiLSTM을 추가해도 양방향 사전학습을 대체하지 못함

8.6 Ablation Study: 모델 크기의 영향

설정LHAParamsMNLI-mMRPCSST-2SQuAD F1
3-layer37681245M77.979.888.475.6
6-layer67681267M80.684.391.183.7
BERT-Base1276812110M84.486.792.788.5
BERT-Large24102416340M86.687.893.791.3

모델 크기를 키우면 모든 태스크에서 일관되게 성능이 향상되었다. 특히 작은 데이터셋(MRPC: 3,600개 학습 예제)에서도 큰 모델이 더 좋은 성능을 보였다는 점이 주목할 만하다. 이는 사전학습이 충분한 지식을 제공하여, 적은 Fine-tuning 데이터로도 큰 모델을 효과적으로 학습할 수 있음을 시사한다.


9. 코드 예제: HuggingFace Transformers

9.1 BERT로 Masked Language Model 예측

from transformers import BertTokenizer, BertForMaskedLM
import torch

# 모델과 토크나이저 로드
tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")
model = BertForMaskedLM.from_pretrained("bert-base-uncased")
model.eval()

# 마스킹된 문장 준비
text = "The capital of France is [MASK]."
inputs = tokenizer(text, return_tensors="pt")

# [MASK] 위치 찾기
mask_token_index = torch.where(inputs["input_ids"] == tokenizer.mask_token_id)[1]

# 예측
with torch.no_grad():
    outputs = model(**inputs)
    logits = outputs.logits

# Top-5 예측 토큰 추출
mask_logits = logits[0, mask_token_index, :]
top5_tokens = torch.topk(mask_logits, 5, dim=1)

print(f"입력: {text}")
print("Top-5 예측:")
for i, (token_id, score) in enumerate(
    zip(top5_tokens.indices[0], top5_tokens.values[0])
):
    token = tokenizer.decode([token_id])
    print(f"  {i+1}. {token} (score: {score:.4f})")

출력 예시:

입력: The capital of France is [MASK].
Top-5 예측:
  1. paris (score: 18.2341)
  2. lyon (score: 12.1456)
  3. lille (score: 10.8923)
  4. toulouse (score: 10.5678)
  5. marseille (score: 10.3210)

9.2 문장 분류 (Sentiment Analysis) Fine-tuning

from transformers import BertTokenizer, BertForSequenceClassification
from transformers import Trainer, TrainingArguments
from datasets import load_dataset

# 데이터셋 로드 (SST-2)
dataset = load_dataset("glue", "sst2")
tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")

# 토크나이징
def tokenize_function(examples):
    return tokenizer(
        examples["sentence"],
        padding="max_length",
        truncation=True,
        max_length=128,
    )

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

# 모델 초기화 (2-class classification)
model = BertForSequenceClassification.from_pretrained(
    "bert-base-uncased",
    num_labels=2,
)

# 학습 설정 (논문의 권장 하이퍼파라미터)
training_args = TrainingArguments(
    output_dir="./results",
    num_train_epochs=3,              # 논문 권장: 2-4
    per_device_train_batch_size=32,  # 논문 권장: 16 또는 32
    learning_rate=2e-5,              # 논문 권장: 2e-5 ~ 5e-5
    weight_decay=0.01,
    warmup_ratio=0.1,
    evaluation_strategy="epoch",
    save_strategy="epoch",
    load_best_model_at_end=True,
    metric_for_best_model="accuracy",
)

# Trainer로 학습
trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=tokenized_datasets["train"],
    eval_dataset=tokenized_datasets["validation"],
)

trainer.train()

9.3 질의응답 (Question Answering)

from transformers import BertTokenizer, BertForQuestionAnswering
import torch

tokenizer = BertTokenizer.from_pretrained("bert-large-uncased-whole-word-masking-finetuned-squad")
model = BertForQuestionAnswering.from_pretrained("bert-large-uncased-whole-word-masking-finetuned-squad")
model.eval()

# 질문과 지문
question = "What is BERT?"
context = """BERT is a language representation model developed by Google.
It stands for Bidirectional Encoder Representations from Transformers.
BERT is designed to pre-train deep bidirectional representations from
unlabeled text by jointly conditioning on both left and right context
in all layers."""

# 토크나이징
inputs = tokenizer(question, context, return_tensors="pt")

# 예측
with torch.no_grad():
    outputs = model(**inputs)
    start_logits = outputs.start_logits
    end_logits = outputs.end_logits

# 답변 추출
start_idx = torch.argmax(start_logits)
end_idx = torch.argmax(end_logits)

answer_tokens = inputs["input_ids"][0][start_idx : end_idx + 1]
answer = tokenizer.decode(answer_tokens)
print(f"질문: {question}")
print(f"답변: {answer}")
# 출력: 답변: a language representation model developed by google

9.4 개체명 인식 (NER)

from transformers import pipeline

# NER 파이프라인 생성
ner_pipeline = pipeline(
    "ner",
    model="bert-base-cased",  # NER은 대소문자 구분이 중요
    aggregation_strategy="simple",
)

text = "Google released BERT in 2018 at their Mountain View headquarters."
results = ner_pipeline(text)

for entity in results:
    print(f"Entity: {entity['word']:20s} | "
          f"Label: {entity['entity_group']:5s} | "
          f"Score: {entity['score']:.4f}")

9.5 BERT Embedding 추출 (Feature-based 접근법)

from transformers import BertModel, BertTokenizer
import torch

tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")
model = BertModel.from_pretrained("bert-base-uncased", output_hidden_states=True)
model.eval()

text = "BERT produces contextualized word embeddings."
inputs = tokenizer(text, return_tensors="pt")

with torch.no_grad():
    outputs = model(**inputs)

# 모든 레이어의 hidden states (13개: embedding + 12 layers)
all_hidden_states = outputs.hidden_states  # tuple of (batch, seq_len, 768)

# [CLS] 토큰으로 문장 표현 (마지막 레이어)
sentence_embedding = outputs.last_hidden_state[:, 0, :]
print(f"문장 임베딩 차원: {sentence_embedding.shape}")  # (1, 768)

# 논문 방식: 마지막 4개 레이어 연결 (Feature-based)
last_4_layers = torch.cat(
    [all_hidden_states[i] for i in [-4, -3, -2, -1]], dim=-1
)
print(f"마지막 4레이어 연결 차원: {last_4_layers.shape}")  # (1, seq_len, 3072)

10. BERT의 영향과 후속 연구

BERT는 NLP 분야에 패러다임 전환을 가져왔다. "사전학습 + Fine-tuning"이라는 방법론은 이제 NLP의 표준이 되었고, BERT의 한계를 극복하기 위한 수많은 후속 연구가 쏟아져 나왔다.

10.1 RoBERTa (Liu et al., 2019, Meta AI)

Robustly Optimized BERT Pretraining Approach. BERT의 아키텍처를 변경하지 않고, 학습 방법론만 최적화하여 성능을 크게 향상시켰다.

주요 변경점:

  • NSP 제거: NSP가 오히려 성능을 해친다는 것을 실험적으로 입증
  • Dynamic Masking: BERT는 데이터 전처리 시 마스킹을 고정(static)하지만, RoBERTa는 매 에포크마다 마스킹 패턴을 변경
  • 더 많은 데이터: 16GB에서 160GB로 10배 증가 (CC-News, OpenWebText, Stories 추가)
  • 더 큰 배치: 256에서 8,000으로 증가
  • 더 긴 학습: BPE 어휘 50,000개, 더 많은 학습 스텝

결과: GLUE, SQuAD, RACE에서 BERT-Large를 모든 태스크에서 능가. BERT의 사전학습이 심각하게 과소학습(undertrained) 되어 있었음을 시사한다.

10.2 ALBERT (Lan et al., 2019, Google)

A Lite BERT. 파라미터 효율성에 초점을 맞춘 모델이다.

주요 기법:

  • Factorized Embedding Parameterization: 어휘 Embedding 차원(EE)과 Hidden 차원(HH)을 분리. V×HV \times H 대신 V×E+E×HV \times E + E \times H로 파라미터 절감. 예: E=128E=128이면 30000×768=23M30000 \times 768 = 23M 파라미터가 30000×128+128×768=3.9M30000 \times 128 + 128 \times 768 = 3.9M으로 감소
  • Cross-layer Parameter Sharing: 모든 Transformer 레이어가 동일한 파라미터를 공유. 파라미터 수를 크게 줄이면서도 성능 저하 최소화
  • Sentence Order Prediction (SOP): NSP 대신, 두 연속 문장의 순서가 올바른지 판별하는 태스크. NSP보다 더 어려운 태스크로, 문장 간 관계 학습에 효과적

결과: BERT-Large 대비 18배 적은 파라미터로 비슷하거나 더 나은 성능 달성.

10.3 DistilBERT (Sanh et al., 2019, Hugging Face)

Knowledge Distillation을 활용하여 BERT를 압축한 모델이다.

  • BERT-Base의 40% 크기 (66M 파라미터, 6 레이어)
  • BERT-Base의 60% 속도 향상
  • BERT-Base 성능의 97% 유지
  • 학습 시 Teacher(BERT-Base)의 Soft Label을 모방하는 Distillation Loss 사용
  • SQuAD v1.1에서 86.9 F1 (BERT-Base: 88.5 F1)

모바일, 에지 디바이스 배포에 적합한 경량 모델의 시작점이 되었다.

10.4 ELECTRA (Clark et al., 2020, Google/Stanford)

Efficiently Learning an Encoder that Classifies Token Replacements Accurately. BERT의 MLM 학습 비효율성을 근본적으로 개선한 모델이다.

핵심 아이디어:

  • Generator-Discriminator 구조: 작은 Generator(MLM)가 마스킹된 토큰을 채우고, Discriminator가 각 토큰이 원본인지 Generator가 생성한 것인지 판별
  • 모든 토큰에서 학습: BERT는 15%의 마스킹된 토큰에서만 학습하지만, ELECTRA는 모든 토큰에서 "원본 vs 대체" 판별을 학습하므로 학습 효율이 크게 향상
  • Replaced Token Detection(RTD): MLM보다 더 효율적인 사전학습 목표

결과: 동일한 계산 예산에서 BERT, RoBERTa, ALBERT를 능가. 특히 소형 모델(ELECTRA-Small)에서 효율성 차이가 극대화.

10.5 DeBERTa (He et al., 2020, Microsoft)

Decoding-enhanced BERT with Disentangled Attention. Attention 메커니즘 자체를 개선한 모델이다.

주요 혁신:

  • Disentangled Attention: 기존 BERT는 토큰 Embedding과 Position Embedding을 합산(sum)한 뒤 Attention을 수행하지만, DeBERTa는 Content와 Position을 분리하여 별도의 Attention을 수행. Content-to-Content, Content-to-Position, Position-to-Content 세 가지 Attention을 결합
  • Enhanced Mask Decoder: Decoding 레이어에서 절대 위치 정보를 주입하여, 상대적 위치와 절대적 위치 정보를 모두 활용

결과: BERT, RoBERTa 대비 동일한 모델 크기에서 더 높은 성능. 특히 학습 데이터의 절반만으로도 기존 모델을 능가하며, SuperGLUE에서 인간 성능을 초과.

10.6 후속 연구 계보 요약

BERT (2018)
├── RoBERTa (2019) ─── 학습 방법론 최적화
├── ALBERT (2019) ─── 파라미터 효율성
├── DistilBERT (2019) ─── Knowledge Distillation
├── ELECTRA (2020) ─── 학습 효율성 (RTD)
├── DeBERTa (2020) ─── Attention 메커니즘 개선
├── SpanBERT (2020) ─── Span 단위 마스킹
├── ERNIE (2019) ─── Knowledge-enhanced 사전학습
└── ModernBERT (2024) ─── 현대적 아키텍처 적용

11. 한계점과 교훈

11.1 BERT의 한계

1. 사전학습-Fine-tuning 불일치 (Pre-train/Fine-tune Discrepancy)

[MASK] 토큰은 사전학습에서만 등장하고 Fine-tuning에서는 나타나지 않는다. 80/10/10 전략으로 완화하지만 근본적으로 해결되지 않는다. ELECTRA의 RTD가 이 문제를 더 우아하게 해결했다.

2. 마스킹된 토큰 간 독립성 가정

MLM은 마스킹된 토큰들을 독립적으로 예측한다. 예를 들어 "New York"이 모두 마스킹되면 "New"와 "York"의 예측이 독립적으로 이루어진다. 실제로는 이 두 토큰 사이에 강한 의존성이 있다. XLNet(Yang et al., 2019)이 Permutation Language Modeling으로 이 문제를 해결하고자 했다.

3. 학습 비효율성

각 배치에서 토큰의 15%만 예측하므로, 수렴에 더 많은 학습 스텝이 필요하다. ELECTRA가 모든 토큰에서 학습하여 이 비효율성을 크게 개선했다.

4. 최대 시퀀스 길이 제한

512 토큰의 최대 길이 제한은 긴 문서 처리에 부적합하다. Self-Attention의 O(n2)O(n^2) 복잡도 때문에 시퀀스 길이를 크게 늘리기 어렵다. Longformer, BigBird 등이 Sparse Attention으로 이 문제를 완화했다.

5. 생성 태스크에 부적합

BERT는 Encoder-only 모델이므로, 텍스트 생성(요약, 번역, 대화 등)에는 직접 사용할 수 없다. 생성 태스크는 GPT 계열(Decoder-only)이나 T5, BART 계열(Encoder-Decoder)이 더 적합하다.

6. NSP의 효과 의문

RoBERTa의 실험에서 NSP가 오히려 성능을 해칠 수 있음이 밝혀졌다. 문제는 NSP 자체가 너무 쉬운 태스크여서, 랜덤으로 선택된 문장은 주제(topic) 차이만으로도 쉽게 구별할 수 있다는 것이다.

11.2 논문에서 얻는 교훈

1. 단순한 아이디어의 힘

BERT의 핵심 아이디어(양방향 문맥을 학습하자)는 놀라울 만큼 단순하다. 복잡한 아키텍처 혁신이 아닌, 사전학습 목표(MLM)의 변경만으로 극적인 성능 향상을 달성했다.

2. 스케일링의 효과

Ablation Study에서 모델 크기와 데이터 크기를 키우면 일관되게 성능이 향상됨을 보여주었다. 이는 이후 Scaling Law 연구와 GPT-3 등 대규모 모델 개발의 초석이 되었다.

3. Transfer Learning 패러다임의 확립

ImageNet 사전학습이 Computer Vision을 변혁했듯이, BERT는 NLP에서 사전학습된 언어 모델을 활용하는 것이 모든 태스크의 출발점이 되어야 한다는 것을 입증했다. 더 이상 태스크별 아키텍처를 처음부터 설계할 필요가 없어졌다.

4. 공정한 비교의 중요성

BERT-Base를 GPT-1과 동일한 크기로 설계하여, 아키텍처 크기가 아닌 방법론의 차이가 성능 향상의 원인임을 명확히 보여주었다. 이는 연구 논문의 실험 설계에서 중요한 교훈이다.


12. 마무리

BERT는 2018년 발표 이후 NLP 분야의 판도를 완전히 바꾼 논문이다. 양방향 문맥 학습이라는 단순하지만 강력한 아이디어를 Masked Language Model이라는 우아한 방법으로 구현했고, 11개 벤치마크를 동시에 석권하며 그 효과를 입증했다.

BERT의 가장 큰 유산은 특정 벤치마크의 수치가 아니다. "대규모 비지도 코퍼스에서 사전학습한 뒤, 소량의 레이블 데이터로 Fine-tuning한다" 라는 패러다임을 NLP에 확립한 것이다. 이 패러다임은 이후 GPT-3, T5, PaLM, LLaMA에 이르기까지 현대 언어 모델의 근간이 되었다.

물론 BERT에도 한계가 있었다. 마스킹 불일치, 학습 비효율성, 시퀀스 길이 제한 등의 문제는 RoBERTa, ELECTRA, Longformer 등의 후속 연구로 하나씩 해결되었다. 그러나 이 모든 후속 연구가 BERT라는 출발점 위에 세워졌다는 사실이, BERT 논문의 역사적 중요성을 말해준다.


References