딥러닝/NLP

BERT 정리

eunsour 2022. 11. 15.
반응형

Introduce

BERT(Bidirectional Encoding Representation from Transformer)는 구글에서 발표한 임베딩 모델이다. 질의 응답, 텍스트 분류, 정보 추출 등과 같은 태스크에서 가장 좋은 성능을 도출해 자연어 처리 분야에 크게 기여해왔다. BERT가 성공한 주된 이유는 문맥이 없는 Word2Vec과 같은 다른 인기 있는 임베딩 모델과 달리 문맥을 고려한 임베딩 모델이기 때문이다.

 

A : He got bit by python

B : Python is my favorite programming language

 

A 문장에서 ‘파이썬’이라는 단어는 뱀의 한 종류를 의미하고 B 문장에서는 ‘파이썬’이라는 단어는 프로그래밍 언어를 의미한다.

 

Word2Vec과 같은 임베딩 모델을 사용해 앞의 두 문장에서 ‘파이썬’이라는 단어에 대한 임베딩을 얻는 경우 두 문장에서 동일한 단어가 쓰였으므로 문맥에 관계없이 동일하게 표현하게 된다. → 정적 임베딩 생성

 

반면 BERT는 문맥 기반 모델이므로 문장의 문맥을 이해한 다음 문맥에 따라 단어 임베딩을 생성한다. 따라서 앞의 두 문장의 문맥을 기반으로 ‘파이썬’이라는 단어에 대해 서로 다른 임베딩을 제공한다. → 동적 임베딩 생성

 

 

BERT의 동작 방식

BERT는 트랜스포머 모델을 기반으로 하며, 인코더-디코더가 있는 트랜스포머 모델에서 인코더만 사용한다. 입력 문장을 트랜스포머의 인코더에 입력으로 제공하고 문장의 각 단어에 대한 문맥 표현(임베딩)을 출력으로 가져온다. 인코더에 문장을 입력하면 인코더는 멀티 헤드 어텐션을 사용해 문장의 각 단어의 문맥을 이해해 문장에 있는 각 단어의 문맥 표현을 출력으로 반환한다.

 

BERT에 입력된 A · B 문장의 각 단어 표현 출력

 

 

BERT의 구조

BERT의 논문 저자들은 아래와 같이 두 가지 구성의 모델을 제시했다.

  • BERT-base
  • BERT-large

 

BERT-base

BERT-base12개의 인코더 레이어가 스택처럼 쌓인 형태로 구성되어 있다. 모든 인코더는 12개의 어텐션 헤드를 사용하며, 인코더의 피드포워드 네트워크는 768개 차원의 은닉 유닛으로 구성된다. 따라서 BERT-Base에서 얻은 표현 크기는 768이다.

  • \(L = 12\)
  • \(A = 12\)
  • \(H = 768\)

 

BERT-large

  • \(L = 24\)
  • \(A = 16\)
  • \(H = 1024\)

 

BERT-base와 BERT-Large

 

 

그 밖의 여러 BERT 구조

출처 : https://huggingface.co/google/bert_uncased_L-12_H-768_A-12

 

 


BERT 사전 학습

BERT는 MLMNSP라는 태스크를 이용해 거대한 말뭉치를 기반으로 사전 학습된다.

 

 

BERT의 입력 표현

BERT에 데이터를 입력하기 전에 다음 세 가지 임베딩 레이어를 기반으로 입력 데이터를 임베딩으로 변환해야 한다.

  • 토큰 임베딩
  • 세그먼트 임베딩
  • 위치 임베딩

 

 

토큰 임베딩

A : Paris is a beautiful city

B : I love paris

 

토큰 임베딩을 하기 위해 두 문장을 모두 토큰화해 토큰들을 추출한다.

tokens = [Paris, is, a, beautiful, city, I love, Paris]

 

첫 번째 문장의 시작 부분에만 [CLS] 토큰이라는 새 토큰을 추가한다.

tokens = [[CLS], Paris, is, a, beautiful, city, I love, Paris]

 

그런 다음 모든 문장 끝[SEP] 라는 새 토큰을 추가한다.

tokens = [[CLS], Paris, is, a, beautiful, city, [SEP], I love, Paris, [SEP]]

 

[CLS](Classification Token) 토큰은 첫 번째 문장의 시작 부분에만 추가되고 [SEP](Seperator Token) 토큰은 모든 문장의 끝에 추가한다. [CLS] 토큰은 분류 작업에 사용되며 [SEP] 토큰은 모든 문장의 끝을 나타내는 데 사용된다.

 

이제 모든 토큰을 BERT에 입력하기 전에 토큰 임베딩이라는 임베딩 레이어를 사용해 토큰을 임베딩으로 변환한다. 토큰 임베딩의 변수들은 사전 학습이 진행되면서 학습된다.

 

토큰 임베딩

 

 

세그먼트 임베딩

세그먼트 임베딩은 주어진 두 문장을 구별하는 데 사용된다.

A : Paris is a beautiful city

B : I love paris

 

앞의 두 문장을 토큰화하면 다음과 같은 결과를 얻는다.

tokens = [[CLS], Paris, is, a, beautiful, city, [SEP], I love, Paris, [SEP]]

 

이제 [SEP] 토큰과 별도로 두 문장을 구분하기 위해 모델에 일종의 지표를 제공해야 한다. 이를 위해 세그먼트 임베딩 레이어에 입력 토큰을 제공한다.

 

세그먼트 임베딩 레이어는 입력에 대한 출력으로 \(E_A,\,E_B\) 만 반환한다. 입력 토큰이 A 문장에 속하면 토큰이 \(E_A\) 에 매핑되고, B 문장에 속하면 \(E_B\) 에 매핑된다.

 

세그먼트 임베딩

 

 

위치 임베딩

트랜스포머는 모든 단어를 병렬로 처리하기 위해 단어 순서와 관련된 정보를 제공하는 위치 인코딩을 사용한다. BERT는 본질적으로 트랜스포머의 인코더이므로 BERT에 데이터를 직접 입력하기 전에 문장에서 단어(토큰)의 위치에 대한 정보를 제공해야 한다. 따라서 위치 임베딩이라는 레이어를 사용해 문장의 각 토큰에 대한 위치 임베딩 출력을 얻게 된다.

 

위치 임베딩

 

 

 

최종 입력 데이터 표현

주어진 입력 문장 A와 B를 토큰으로 변환하고 토큰을 토큰 임베딩, 세그먼트 임베딩, 위치 임베딩 레이어에 공급하고 임베딩을 얻는다. 그다음으로 모든 임베딩을 합산해 BERT에 입력으로 제공한다.

입력의 최종 표현

 

 

워드피스 토크나이저

BERT는 워드피스 토크나이저라는 특별한 유형의 토크나이저를 사용하며, 이는 하위 단어 토큰화 알고리즘을 기반으로 한다.

Let us start pretraining the model

 

워드피스 토크나이저를 사용해 위 문장을 토큰화하면 다음 토큰을 얻을 수 있다.

tokens = [let, us, start, pre, ##train, ##ing, the model]

 

개별 단어가 pre, ##train, ##ing 와 같은 하위 단어(subword)로 분할되는 것을 볼 수 있다. 토큰 앞의 해시 기호는 하위 단어임을 나타내고 앞에 다른 단어가 있음을 의미한다.

 

이후 문장 시작 부분과 끝부분에 [CLS] 토큰과 [SEP] 토큰을 추가한다.

tokens = [[CLS], let, us, start, pre, ##train, ##ing, the model, [SEP]]

 

입력을 임베딩으로 변환해 BERT에 공급하는 방법과 워드피스 토크나이저를 사용해 입력을 토큰화하는 방법을 알아보았다.

 

 


사전 학습 전략

BERT는 다음 두 가지 태스크에 대해 사전 학습 된다.

  1. 마스크 언어 모델링 (masked language modeling, MLM)
  2. 다음 문장 예측 (next sentence prediction, NSP)

MLM 태스크를 살펴보기 전에 언어 모델링 태스크를 살펴본다.

 

 

언어 모델링

언어 모델링은 일반적으로 임의의 문장이 주어지고 단어를 순서대로 보면서 다음 단어를 예측하도록 모델을 학습시키는 것이다. 언어 모델링은 다음 두 가지로 분류할 수 있다.

  • 자동 회귀 언어 모델링 (auto-regressive language modeling)
  • 자동 인코딩 언어 모델링 (auto-encoding language modeling)

 

자동 회귀 언어 모델링

자동 회귀 언어 모델링은 다시 두 가지 방식으로 구분할 수 있다.

  • 전방 예측 (forward prediction)
  • 후방 예측 (backward prediction)
Paris is a beautiful city. I love Paris.

 

위 문장이 주어졌을 때 다음과 같이 ‘city’ 라는 단어를 제거하고 공백을 추가해본다.

Paris is a beautiful ___. I love Paris.

 

모델은 공백을 예측해야 한다. 전방 예측을 사용하는 경우 모델은 예측을 수행하기 위해 왼쪽에서 오른쪽으로 공백까지 모든 단어를 읽는다.

Paris is a beautiful ___.

 

후방 예측을 사용하면 오른쪽에서 왼쪽으로 공백까지 모든 단어를 읽는다.

___. I love Paris.

자동 회귀 언어 모델은 원래 단방향이므로 한 방향으로만 문장을 읽는다.

 

자동 인코딩 언어 모델링

자동 인코딩 언어 모델링은 전방 및 후방 예측을 모두 활용한다. 즉, 예측을 하면서 양방향으로 문장을 읽는다.

Paris is a beautiful ___. I love Paris.

 

양방향으로 문장을 읽으면 문장 이해 측면에서 더 명확해지므로 더 정확한 결과를 제공한다.

 

 

 

마스크 언어 모델링(MLM)

BERT는 자동 인코딩 언어 모델로, 예측을 위해 문장을 양방향으로 읽는다. 마스크 언어 모델링(MLM)은 주어진 입력 문장에서 전체 단어의 15%를 무작위로 마스킹하고 마스크된 단어를 예측하도록 모델을 학습시키는 것이다. 즉, 마스크된 단어를 예측하기 위해 모델은 양방향으로 문장을 읽고 마스크된 단어를 예측하려 시도한다.

Paris is a beautiful city. I love Paris.

tokens = [Paris, is, a, beautiful, city, I, love, Paris]

tokens = [[CLS], Paris, is, a, beautiful, city, [SEP], I, love, Paris, [SEP]]

 

다음으로, 토큰(단어)의 15%를 무작위로 마스킹한다. 다음과 같이 city 라는 단어를 마스킹한 다음 city 를 [MASK] 토큰으로 바꾼다.

tokens = [[CLS], Paris, is, a, beautiful, [MASK], [SEP], I, love, Paris, [SEP]]

 

여기에는 작은 문제가 있다. 위와 같은 방식으로 토큰을 마스킹하면 사전 학습과 파인 튜닝 사이에 불일치가 생기게 된다. [MASK] 토큰을 예측해 BERT를 사전 학습시키고, 학습시킨 후에 감정 분석과 같은 다운스트림 태스크를 위해 사전 학습된 BERT를 파인 튜닝할 때는 입력에 [MASK] 토큰이 없다. 이 때문에 BERT가 사전 학습되는 방식과 파인 튜닝에 사용되는 방식 간에 불일치가 발생한다.

 

이 문제를 극복하기 위해 80-10-10% 규칙을 적용한다. 무작위로 마스킹 한 15%의 토큰에 대해 다음을 수행한다.

  • 15% 중 80%의 토큰(실제 단어)을 [MASK] 토큰으로 교체한다.
    • tokens = [[CLS], Paris, is, a, beautiful, [MASK], [SEP], I, love, Paris, [SEP]]
  • 15% 중 10%의 토큰(실제 단어)을 임의의 토큰(임의 단어)으로 교체한다.
    • tokens = [[CLS], Paris, is, a, beautiful, love, [SEP], I, love, Paris, [SEP]]
  • 15% 중 나머지 10%의 토큰은 어떤 변경도 하지 않는다.
    • tokens = [[CLS], Paris, is, a, beautiful, city, [SEP], I, love, Paris, [SEP]]

 

토큰화 및 마스킹 후에 입력 토큰을 토큰, 세그먼트, 위치 임베딩 레이어에 입력해 입력 임베딩을 얻고 이 입력 임베딩을 BERT에 제공한다.

 

 

BERT는 입력을 받은 다음 각 토큰의 표현 벡터를 출력으로 반환한다. BERT-base 모델을 사용하면 각 토큰의 표현 벡터 크기는 768이다.

 

마스크된 토큰을 예측하기 위해 BERT에서 반환된 마스크된 토큰 \(R_{[MASK]}\) 의 표현을 소프트맥스 활성화를 통해 피드포워드 네트워크에 입력한다. 피드포워드 네트워크는 \(R_{[MASK]}\) 단어가 마스크된 단어(city)가 될 확률을 반환한다.

 

학습 초기에는 BERT의 피드포워드 네트워크 및 인코더 계층의 가중치가 최적이 아니므로 모델이 올바른 확률을 반환하지 않는다. 그러나 역전파를 통한 일련의 반복 학습을 거치며 BERT 피드포워드 네트워크 및 인코더 계층의 가중치 업데이트가 반복되면서 최적의 가중치를 학습하게 된다.

 

마스크 언어 모델링 태스크는 빈칸 채우기 태스크라고도 한다.

 

 

다음 문장 예측(NSP)

다음 문장 예측(NSP)은 BERT에 두 문장을 입력하고 두 번째 문장이 첫 번째 문장의 다음 문장인지 예측한다.

A : She cooked Pasta (그녀가 파스타를 요리했다).

B : It was delicious (맛있었다).

 

위 문장 쌍에서 B 문장은 A 문장의 후속 문장이다. 따라서 위 문장 쌍을 isNext 로 표시해 B 문장이 A 문장의 다음 문장임을 알 수 있게 한다.

A : Turn the radio on (라디오 켜줘).

B : She bought a new hat (그녀는 새 모자를 샀다).

 

 

위 문장 쌍에서 B 문장은 A 문장의 후속 문장이 아니다. 따라서 이 문장 쌍을 notNext 로 표시해 B 문장이 A 문장의 다음 문장이 아님을 알 수 있게 한다.

 

NSP 태스크에서 모델의 목표는 문장 쌍이 isNext 범주에 속하는지 여부를 예측하는 것이다. 문장 쌍을 BERT에 입력하고 B 문장이 A 문장 다음에 오는지 여부를 예측하도록 학습시키는 이진 분류 태스크다.

 

NSP 태스크를 수행함으로써 모델은 두 문장 사이의 관계를 파악할 수 있다. 두 문장 간의 관계를 이해하는 것은 질의응답, 감정 분류, 유사문장탐지와 같은 다운스트림 태스크에서 유용하다.

 

NSP 태스크를 위한 데이터셋은 어떠한 말뭉치에서도 획득할 수 있다. 2개의 문서가 있다고 가정할 경우, isNext 클래스의 경우 한 문서에서 연속된 두 문장을 isNext로 표시하고 notNext 클래스의 경우 한 문서에서 한 문장을, 임의의 문서에서 다른 문장을 가져와 notNext로 표시하면 된다. isNext 클래스를 전체의 50% 비율로 유지하고 notNext 클래스에서 50%를 유지해 클래스가 균형을 이룰 수 있도록 한다.

 

BERT를 학습시키는 방법은 다음과 같다.

tokens = [She, cooked, Pasta, It, was, delicious]

tokens = [[CLS], She, cooked, Pasta, [SEP], It, was, delicious, [SEP]]

 

위 토큰들을 각 레이어에 입력하고 입력 임베딩을 반환받는다. 그런 다음 입력 임베딩을 BERT에 넣어 각 토큰의 표현을 얻는다.

 

분류를 수행하려면 간단히 [CLS] 토큰 표현을 가져와 소프트맥스 함수를 사용해 피드포워드 네트워크에 입력한다. 그러면 문장 쌍이 isNext인지, notNext인지에 대한 확률값이 반환된다.

 

[CLS] 토큰은 기본적으로 모든 토큰의 집계 표현을 보유하고 있으므로 문장 전체에 대한 표현을 담고 있다. 따라서 다른 모든 토큰의 표현을 무시하고 [CLS] 토큰 표현 \(R_{[CLS]}\) 를 가져와 확률을 반환하는 소프트맥스 함수를 사용해 피드포워드 네트워크에 공급할 수 있다.

 

NSP 태스크

 

사전 학습 절차

BERT의 사전 학습에는 토론토 책 말뭉치위키피디아 데이터셋을 사용한다. BERT는 MLMNSP 태스크를 사용해 사전 학습된다.

말뭉치에서 두 문장을 샘플링하는데, 전체의 50%는 B 문장이 A 문장의 후속 문장이 되도록 샘플링하고, 나머지 50%는 B 문장을 A 문장의 후속 문장이 아닌 것으로 샘플링한다.

A : We enjoyed the game (우리는 게임을 즐겼다). 

B : Turn the radio on (라디오 켜줘).

 

먼저 워드피스 토크나이저로 문장을 토큰화 하고 [CLS] 토큰과 [SEP] 토큰을 추가한다.

tokens = [[CLS], we, enjoyed, the, game, [SEP], turn, the, radio, on, [SEP]]

 

이후 80-10-10% 규칙에 따라 토큰의 15%를 무작위로 마스킹한다.

tokens = [[CLS], we, enjoyed, the, [MASK], [SEP], turn, the, radio, on, [SEP]]

 

이제 토큰을 BERT에 입력하고 마스크된 토큰을 예측하기 위해 모델을 학습시키며 동시에 B 문장이 A 문장의 후속 문장인지 여부를 분류하게 된다. 즉, MLM과 NSP 작업을 동시에 사용해 BERT를 사전 학습시킨다. 사전 학습된 BERT는 다양한 태스크에 사용할 수 있다.

 

 

 

 


Reference

BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

 

 

Everything You Need to Know About Google BERT | HackerNoon

Google BERT will help you to kickstart your NLP journey by showing you how the transformer’s encoder and decoder work.

hackernoon.com

 
구글 BERT의 정석
저자 : 수다르산 라비찬디란
역자 : 전희원, 정승환, 김형준
출판 : 한빛미디어
발매 : 2021.11.03

 

 

 

반응형

댓글