BERT(Bidirectional Encoder Represenation from Transformer) 이해하기
BERT는 다양한 자연어 처리 태스크 분야에서 높은 성능을 보이며, 자연어 처리가 전반적으로 발전하는데 영향을 끼쳤다.
BERT는 구글에서 발표한 임베딩 모델이다. BERT는 문맥이 없는 WORD2VEC와 같은 다른 임베딩 모델과 달리 문맥을 고려한 임베딩이다.
문맥을 고려하는게 왜 중요하냐면, 동음이의어
나 여러가지 의미를 가진 단어
에 유연하게 대응할 수 있기 때문이다.
bert는 transformer에서 파생된 구조이기 때문에 transformer내용을 먼저 살펴보고 오자 -> 링크
BERT의 동작 방식
bert는 이름에서 알 수 있듯이 트랜스포머 모델을 기반으로 하며, 인코더-디코더가 있는 트랜스포머모델과 달리 인코더만 사용한다.
위 그림 같이 나는 배가 고프다.
라는 문장을 인코더에입력으로 제공하고 문장의 각 단어를 출력으로 표현할 수 있다. 그림과 같이 N개의 인코더를 쌓을 수 있으나, 불필요한 복잡합을 줄이기 위해 하나의 블록만 확장한 그림이다.
각 토큰의 표현 크기는 인코더 레이어의 출력의 차원이며, 인코더 레이어의 차원이 768이라고 가정하면 각 토큰의 표현 크기는 768이 된다. (인코더 레이어의 출력 차원과 토큰의 표현 크기가 같아요 레이어를 여러 겹 쌓을 수 있다.)
BERT의 구조
BERT-base
BERT-base는 12개의 인코더 레이어가 스택처럼 쌓인 형태로 구성되어 있다. 모든 인코더는 12개의 어텐션 헤드를 사용하며, 인코더의 피드포워드 네트워크는 768개의 은닉 유닛으로 구성된다. 따라서 BERT-base를 통해 얻은 출력의 크기는 768이다.
BERT-base
모델은 12개의 레이어, 12개의 어텐션 헤드, 768개의 은닉 유닛으로 구성된다.
BERT-large
BERT-large는 24개의 인코더 레이어가 스택처럼 쌓인 형태로 구성되어 있다. 모든 인코더는 16개의 어텐션 헤드를 사용하며, 인코더의 피드포워드 네트워크는 1,024개의 은닉 유닛으로 구성된다.
그 밖의 여러 BERT 구조
- BERT-tiny : 레이어 - 2, 어텐션헤드 - 2,은닉 유닛 - 128
- BERT-mini : 레이어 - 4, 어텐션헤드 - 4,은닉 유닛 - 256
- BERT-small : 레이어 - 4, 어텐션헤드 - 8,은닉 유닛 - 512
- BERT-medium: 레이어 - 8, 어텐션헤드 - 8,은닉 유닛 - 512
bert의 입력 표현
bert는 데이터를 입력하기 전에 다음 세 가지 임베딩 레이어를 기반으로 입력 데이터를 임베딩으로 변환 해야한다.
- token embedding
- segment embedding
- position embedding
token embedding
토큰 임베딩을 이해하기 위해 다음 두 문장을 살펴보자 .
- busan is a beautiful city
- i love korea
먼저 아래처럼 두 문장을 토큰화해 토큰들을 추출한다.
tokens = ['busan','is','a','beautiful','city','i','love','korea']
다음으로, 첫 번째 문장의 시작 부분에만 [CLS]토큰을 추가한다.
tokens = [[CLS],'busan','is','a','beautiful','city','i','love','korea']
그런 다음 모든 문장 끝에 [SEP] 토큰을 추가 한다.
tokens = [[CLS],'busan','is','a','beautiful','city',[SEP],'i','love','korea',[SEP]]
[CLS] 토큰은 분류 작업에 사용되며 [SEP] 토큰은 모든 문장의 끝을 나타내는 데 사용된다. 이제 모든 토큰을 BERT에 입력하기 전에 토큰 임베딩이라는 임베딩 레이어를 사용해 토큰을 임베딩으로 변환한다.
Segment embedding
세그먼트 임베딩은 주어진 두 문장을 구별하는 데 사용된다.
세그먼트 임베딩 레이어는 입력에 대한 출력으로 $E_A$, $E_B$만 반환한다.
tokens = [[CLS],'busan','is','a','beautiful','city',[SEP],'i','love','korea',[SEP]]
position embedding
트랜스포머는 어떤 반복 메커니즘을 사용하지 않고 모든 단어를 병렬로 처리하므로 단어 순서와 관련된 정보를 제공해야 된다. 이때 트랜스포머는 positional encoding을 사용했다.
BERT는 본직적으로 트랜스포머의 인코더 이므로 BERT에 데이터를 직접 입력하기 전에 문장에서 단어(토큰)의 위치에 대한 정보를 제공해야 한다.
최종 입력 데이터 표현
최종 입력 데이터는 아래 그림처럼 먼저 주어진 입력 문장을 토큰으로 변환하고 토큰을 토큰 임베딩, 세그먼트 임베딩, 위치 임베딩 레이어에 공급하고 임베딩을 얻는다.
그다음으로 모든 임베딩을 합산해 BERT에 입력으로 제공한다.
워드피스 토크나이저
BERT는 워드피스 토크나이저라는 특별한 유형의 토크나이저를 사용하며, 이는 하위 단어 토큰화 알고리즘을 기반으로 한다. 예제를 통해 워드 피스 토크나이저가 어떻게 작동하는지 이해해보자.
string : Let us start pretraining the model
워드 피스 토크나이저
tokens = [let, us, start, pre, ##train, ##ing, the, model]
워드 피스 토크나이저를 사용해 문장을 토큰화하면 개별 단어가 pre, ##train, ##ing와 같은 하위 단어 subword로 분할된다.
BERT는 워드피스 토크나이저를 사용해 토큰화할때 단어가 어휘 사전에 있는지 확인한다. 단어가 어휘 사전에 있으면 그 단어를 토큰으로 사용하고, 단어가 어휘 사전에 없으면 그 단어를 하위 단어로 분할해 하위 단어가 어휘 사전에 있는지 확인하다.
만약 하위 단어가 어휘 사전에 없으면 다시 하위 단어로 분할해 어휘 사전에 있는지 확인한다.
이런 식으로 개별 문자에 도달할 때까지 어휘 사전을 기반으로 하위 단어를 계속 분할하고 확인 한다.
이 방식은 어휘 사전 이외(Out of Vocaulary)의 단어를 처리하는 데 효과적이다.
사전 학습 전략
BERT는 다음 두 가지 태스크에 대해 사전 학습된다.
- masked language modeling(MLM)
- next sentence prediction(NSP)
masked language modeling(MLM)
언어 모델링
언어 모델링은 일반적으로 임의의 문장이 주어지고 단어를 순서대로 보면서 다음 단어를 예측하도록 모델을 학습 시키는 것이다.
bert는 예측을 위해 문장을 양방향으로 읽는다. MLM은 주어진 입력 문장에서 전체 단어의 15%를 무작위로 마스킹하고 마스크된 단어를 예측하도록 모델을 학습시키는 것이다. 마스크된 단어를 예측하기 위해 모델은 양방향으로 문장을 읽고 마스크된 단어를 예측하려 시도 한다.
마스크 언어 모델링 예시
tokens = [[CLS],'busan','is','a','beautiful','city',[SEP],'i','love','korea',[SEP]]
위 토큰의 15%를 무작위로 마스킹 한게 되면 아래와 같이 입력 문장이 바뀌게 된다.
tokens = [[CLS],'busan','is','a',[MASK],'city',[SEP],'i','love','korea',[SEP]]
Bert는 마스크된 토큰을 예측하기 위해 학습을 진행한다.
하지만 위 방식에는 문제가 있다. 위와 같은 방식으로 토큰을 마스킹하면 사전 학습과 파인 튜닝 사이에 불일치가 생긴다. 왜냐하면 파인 튜닝에는 입력에 [MASK] 토큰이 없기 때문이다.
이 문제를 해결하기 위해 80-10-10 % 규칙
을 사용한다.
- 15% 중 80%의 토큰(실제 단어)를 [MASK] 토큰으로 교체
tokens = [[CLS],'busan','is','a',[MASK],'city',[SEP],'i','love','korea',[SEP]]
- 15% 중 10%의 토큰(실제 단어)을 임의의 토큰(임의 단어)로 교체
tokens = [[CLS],'busan','is','a','korea','city',[SEP],'i','love','korea',[SEP]]
- 15% 중 나머지 10%의 토큰은 어떠한 변경도 적용하지 않는다.
tokens = [[CLS],'busan','is','a','beautiful','city',[SEP],'i','love','korea',[SEP]]
그렇다면 마스크된 토큰을 bert는 어떻게 예측할 수 있을까?
마스크된 토큰을 예측하기 위해 BERT에서 반환된 (인코더를 거쳐 최종 출력된) $R_[mask]$의 표현을 소프트맥스 활성화를 통해 피드 포워드 네트워크에 입력한다. 피드포워드 네트워크는 다음 그림과 같이 $R_[mask]$ 단어가 마스크 될 확률을 반환한다.
그림에서 볼 수 있듯이 beautiful이라는 단어가 마스크된 단어일 확률이 높다.
학습 초기에는 BERT의 피드포워드 네트워크 및 인코더 계층의 가중치가 최적이 아니므로 모델이 올바른 확률을 반환하지 않는다. 그러나 학습을 통해 최적의 가중치를 학습하게 된다.
next sentence predict(NSP)
NSP는 BERT 학습에 사용되는 태스크로, 이진 분류 테스트다. NSP 태스크에서는 BERT에 두 문장을 입력하고 두 번째 문장이 첫 번째 문장의 다음 문장인지 예측한다.
예를 들어 B문장이 A문장의 후속 문장이면 문장 쌍을 isNext
로 표시하고 그렇지 않으면 notNext
로 표시한다. NSP 태스크에서 모델의 목표는 문장 쌍이 isNext의 범주에 속하는지 여부를 예측하는 것이다. 문장 쌍을 bertㅔ 입력하고 B문장이 A 문장 다음에 오는지 여부를 예측 하도록 학습 시킨다.
NSP 태스크의 목적은 모델이 두 문장 사이의 관계를 파악할 수 있게 하는 것 이다. 두 문장 간의 관계를 이해하는 것은 질문-응답 및 유사문장탐지와 같은 downstream에서 유용 하다.
NSP 태스크를 위한 데이터셋은 아무 말뭉치에서나 얻을 수 있다. 2개의 문서가 있다고 했을 때, isNext클래스의 경우 한 문서에서 연속 된 두 문장을 isNext로 표시하고 notNext클래스의 경우 한 문서에서 한 문장을, 임의의 문서에서 다른 문장을 가져와 notNext로 표시 하면 된다.
BERT는 사전 학습 을 진행하며 MLM과 NSP작업을 동시에 사용해 학습을 진행한다.
'딥러닝 > NLP' 카테고리의 다른 글
ALBERT (2) | 2021.03.20 |
---|---|
GPT-2/GPT-3 (0) | 2021.03.20 |
GPT-1 (0) | 2021.03.20 |
Transformer (0) | 2021.03.18 |
BLEU (0) | 2021.03.18 |