데이터 스터디/DL

[논문 읽기] BERT: Pre-training of Deep Bidirectional Transformers forLanguage Understanding (NAACL 2019)

케이와이엠 2023. 11. 29. 11:18

BERT ( Bidirectional Encoder Representations from Transformers)

  • 2018년에 구글이 공개한 트랜스포머 기반의 사전 훈련된 모델
  • 위키피디아(25억 단어)와 BooksCorpus(8억 단어)와 같은 레이블이 없는 텍스트 데이터로 사전 훈련
  • 주로 fine-tuning을 거쳐 여러 task에 이용
    → 사전 훈련된 BERT 모델 + 추가적 훈련 + 하이퍼 파라미터 재조정

BERT는 사전 학습을 위해 두 가지 방법 (Masked Language Model(MLM)과 Next Sentence Prediction(NSP))를 사용함으로써 BERT가 양방향으로 학습되어 문맥을 더 잘 파악할 수 있게 한다. 

 

# Intro

전이학습 모델 

구글의 Devlin(2018)이 제안한 BERT는 사전 학습된 대용량의 레이블링 되지 않는(unlabeled) 데이터를 이용하여 언어 모델(Language Model)을 학습하고 이를 토대로 특정 작업( 문서 분류, 질의응답, 번역 등)을 위한 신경망을 추가하는 전이 학습 방법

사전 학습 모델

 대용량의 데이터를 직접 학습시키기 위해서는 매우 많은 자원과 시간이 필요하지만 BERT 모델은 기본적으로 대량의 단어 임베딩 등에 대해 사전 학습이 되어 있는 모델을 제공하기 때문에 상대적으로 적은 자원만으로도 충분히 자연어 처리의 여러 일을 수행할 수 있다. 이전에는 단어 임베딩을 위해 Word2Vec, Glove, Fasttext 방식을 사용했지만, BERT가 자연어 처리 분야의 11개 실험에서 가장 좋은 성능을 차지하면서 많이 사용되고 있다.

 

# BERT 구조

1. Input Representation

BERT의 input representation은 그림과 같이 세 가지 임베딩 값의 합으로 구성됨

 

1.1.Token Embeddings - WordPiece Model(WPM)

Token Embeddings는 Word piece 임베딩 방식을 사용한다.

Word Piece 임베딩은 자주 등장하면서 가장 긴 길이의 sub-word을 하나의 단위로 만드는 방식.

즉, 자주 등장하는 단어(sub-word)는 그 자체가 단위가 되고, 자주 등장하지 않는 단어(rare word)는 더 작은 sub-word로 쪼개짐

  • 서브워드로 분리하는 이유
    • 이전에 자주 등장하지 않은 단어를 전부 Out-of-vocabulary(OOV)로 처리하여 모델링의 성능을 저하했던 문제 해결
    • 하나의 단어를 더 작은 단위의 의미를 가진 서브워드로 쪼개 단어 집합의 한계를 뛰어 넘고자 함

입력받은 모든 문장의 시작으로 [CLS] 토큰(special classification token)이 주어지며 이 [CLS] 토큰은 모델의 전체 계층을 다 거친 후 토큰 시퀀스의 결합된 의미를 가지게 된다.

import pandas as pd
from transformers import BertTokenizer

tokenizer = BertTokenizer.from_pretrained("bert-base-uncased") # Bert-base의 토크나이저
result = tokenizer.tokenize('Here is the sentence I want embeddings for.')
print(result)

# ['here', 'is', 'the', 'sentence', 'i', 'want', 'em', '##bed', '##ding', '##s', 'for', '.']

 

  • WordPiece의 토큰화 수행 방식
    1. BERT는 이미 훈련 데이터로부터 만들어진 단어 집합을 가지고 있는 상태이다.
    2. 토큰이 단어 집합에 존재 → 해당 토큰 분리 X
    3. 토큰이 단어 집합에 존재 X → 해당 토큰을 서브 워드로 분리
  • 예시(##은 해당 서브워드가 단어의 중간부터 등장하는 서브워드라는 것을 알려주기 위한 기호)
  • BertTokenizer를 import해 문장을 토큰화 할 수 있으며 BERT의 단어 집합의 크기는 30,522이다.
  • 만약 BERT의 단어 집합에 embedding이 존재하지 않고 대신 em, ##bed, ##ding, #s라는 서브 워드들이 존재한다면 em, ##bed, ##ding, #s 을 토큰으로 삼는다.

 

1.2. Segment Embeddings

Segment Embeddings는 토큰으로 나누어진 단어들을 다시 하나의 문장으로 만들고

첫 번째 [SEP] 토큰까지는 0으로 그 이후 [SEP] 토큰까지는 1 값으로 마스크를 만들어 각 문장들을 구분함.

 

주의할 점은 일반적으로 설명의 편의를 위해 QA task에서 BERT는 두 개의 구분된 문장을 입력 받는다고 설명하지만 실제로는 두 개의 문단이 될 수도 있다. 즉 Q와 A로 나눠지기만 한다면 Q와 A는 각각 문장, 문단, 텍스트 중 어느 것이든 가능하다.

만약 QA task가 아니라 문장 구분을 할 필요가 없는데도 segment embedding 계층이 있는 BERT 모델을 사용할 경우, segment embedding 값을 모두 0으로 주면 된다.

 

1.3. Position Embeddings

Position Embeddings는 토큰의 순서를 인코딩한다.

그 이유는  BERT는 transformer의 encoder를 사용하는데 Transformer의 Self-Attention은 입력의 위치에 대해 고려하지 못하므로 입력 토큰의 위치 정보를 주어야 한다.

이때 사인 함수와 코사인 함수를 사용하여 위치에 따라 다른 값을 가지는 행렬을 만들어 이를 단어 벡터들과 더해 위치를 표현한다.

실제 BERT에서는 문장의 최대 길이를 512로 하고 있으므로, 총 512개의 포지션 임베딩 벡터가 학습되어 이용된다.

 

 

2. Pre-training과 Fine-Tuning

 

  • 기존 인코더-디코더 모델과 달리 Transformer는 CNN 및 RNN을 사용하지 않고 self-attention 개념을 도입함.
  • Transformer의 인코더-디코더 중 인코더만 사용

그림과 같이 BERT를 이용한 자연어 처리는2단계로 진행되며

거대 Encoder가 입력 문장들을 임베딩하여 언어를 모델링하는 Pre-training 과정과 이를 fine-tuning하여 여러 자연어 처리 Task를 수행하는 과정으로 나뉜다.

 

BERT의 사전 훈련 방법은 크게 마스크드 언어 모델(Masked Language Model)과 다음 문장 예측(Next sentence prediction, NSP)이 있다. 특히 마스크드 언어 모델을 통해 BERT는 양방향성을 얻을 수 있었다.

 

2.1. 마스크드 언어 모델(Masked Language Model, MLM)

MLM(Masked Language Model)은 일련의 단어가 주어지면 그 단어를 예측하는 작업이다.

이때 모든 다음 토큰을 예측하는 것이 아닌 입력에서 무작위 하게 몇 개의 토큰을 마스킹하고 이를 Transformer 구조에 넣어 주변 단어의 맥락으로 마스킹된 토큰만 예측한다. 이전의 좌-우, 혹은 우-좌를 통하여 문장 전체를 예측하는 사전학습 언어 모델 방법과는 달리, [MASK] 토큰만을 예측하는 pre-training 작업을 수행한다.이 [MASK] 토큰은 pre-training에만 사용되고, fine-tuning시에는 사용되지 않는다.

 

사용 이유

마스크 없이 문장을 학습할 경우 양방향 학습을 해버리면 문장의 전체 정보를 학습하는 것과 다름 없게 된다. 즉, 이미 문단을 통채로 암기하고 있는 것과 마찬가지다. 따라서 특정 부분에 오는 단어를 예측하는 것은 의미 없는 일이 되버린다. 하지만 마스크가 있는 상태라면 애초에 문단 전체 정보를 다 알 수 없으므로 양방향 학습을 해도 문제가 없다.

 

mask 방법

  1. 입력 텍스트의 15%에 해당하는 단어를 랜덤으로 고른다.
  2. 1번 중, 80%의 단어들은 [MASK]로 변경한다.
  3. 1번 중, 10%의 단어들은 랜덤으로 단어가 변경된다.
  4. 1번 중, 10%의 단어들은 동일하게 둔다.

이렇게 하는 이유는 [MASK]만 사용할 경우에는 [MASK] 토큰이 파인 튜닝 단계에서는 나타나지 않으므로 사전 학습 단계와 파인 튜닝 단계에서의 불일치가 발생하기 때문이다.

 

예시1 : 'My dog is cute. he likes playing’ ⇒ 'My [Mask] is cute. he likes playing’

  • 'dog' 토큰을 [MASK]로 변경
  • BERT 모델은 [MASK]의 원래 단어를 예측하는 것이 목적
  • 오직 'dog' 위치의 출력층의 벡터만이 사용 (출력층에 있는 다른 위치의 벡터들은 예측과 학습에 사용 X)
  • 출력층에서는 예측을 위해 단어 집합의 크기만큼의 밀집층(Dense layer) + 소프트맥스 함수 사용

예시2 : 'My dog is cute. he likes playing’ ⇒ 'My [Mask] is cute. king likes playing’

  • 'dog' 토큰을 [MASK]로 변경 + 'he'는 랜덤 단어 'king'으로 변경 + 'play'는 변경되진 않았지만 예측에 사용
  • BERT 모델은 [MASK]와 king, play에 대해 모두 원래 단어가 무었이었는지 예측하는 것이 목적

 

 

 

2.2. NSP(Next Sentence Prediction) 

NSP(Next Sentence Prediction)는 두 문장의 관계를 이해하기 위해 BERT의 학습 과정에서 두 번째 문장이 첫 번째 문장의 바로 다음에 오는 문장인지 예측하는 방식입니다.

  • 50:50 비율로 실제 이어지는 두 개의 문장과 랜덤으로 이어붙인 두 개의 문장을 주고 훈련
  • 입력에서 첫번째 문장과 두번째 문장의 끝에 [SEP]라는 특별 토큰을 사용해서 문장을 구분
  • 두 문장이 실제 이어지는 문장인지 아닌지를 [CLS] 토큰의 위치의 출력층에서 이진 분류 문제로 학습
  • BERT가 언어 모델 외에도 다음 문장 예측이라는 태스크를 학습하는 이유는 BERT가 풀고자 하는 태스크 중에서는 QA(Question Answering)나 NLI(Natural Language Inference)와 같이 두 문장의 관계를 이해하는 것이 중요한 태스크들이 있기 때문이다.

 

# 3. Fine - tuning

Downstream task에 BERT를 적용하는 것은 상대적으로 단순하다. 입력(한 문장 또는 두 문장)의 개수에 따라 (앞서 설명한 것처럼) 알맞게 하나의 sequence 로 생성해서 모델의 입력으로 제공한다. 두 문장이 입력으로 제공된 경우, 하나의 sequence로 생성하고, 두 문장 사이의 self-attention도 수행하게 된다. 

Fine-tuning하는 방법은 task에 알맞는 입력과 출력을 모델에 입력으로 제공해서 파라미터들을 해당 task에 맞게 end-to-end로 업데이트한다. Token representation은 token level task(sequence tagging, question-answering 등) 의 입력으로 사용된다. [CLS] 토큰은 classification을 수행하기 위해 사용된다. 

 

# BERT base와 large

L = 트랜스포머 블록, H =  히든 레이어 차원 수, A = self-attention의 헤드(head) 수라고 할 때,

  • BERT-base 모델의 하이퍼 파라미터는 L = 12, H =768, A = 12
  • BERT-large 모델은 L= 24, H = 1024, A= 16

 

Devlin, Jacob, et al. "Bert: Pre-training of deep bidirectional transformers for language understanding." arXiv preprint arXiv:1810.04805 (2018). https://arxiv.org/abs/1810.04805