본문 바로가기
Machine-Learning/NLP (Natural Language Processing)

[NLP] BERT 의 이해

by AteN 2022. 11. 19.

BERT (Bidirectional Encoder Representations from Transformer)

2018년도에 구글에서 공개한 사전 훈련된 모델이다. BERT라는 이름은 세서미 스트리트 라는 미국 인형극의 캐릭터 이름이기도 한데, 앞서 소개한 임베딩 방법론 ELMO와 마찬가지로 세서미 스트리트의 캐릭터 이름을 따온 것이기도 한다

BERT는 트렌스포머를 이용하여 구현되었으며, 위키피디아 25억 단어 BooksCorpus 8억 단어와 같은 레이블이 없는 텍스트 데이터를 사전 훈련된 언어 모델이다.

BERT가 높은 성능을 얻을 수 있었던 것은 레이블이 없는 방대한 데이터로 사전 훈련된 모델을 가지고, 레이블이 있는 다른 작업(Task)에서 추가 훈련과 함께 하이퍼 파라미터를 재조정하여 이 모델을 사용하면 성능이 높게 나오는 기존의 사례들을 참고하였기 때문이다. 다른 작업에 대해서 파라미터 재조정을 위한 추가 훈련 과정을 파인 튜닝 (Fine-Tuning) 이라고 한다

우리가 하고 싶은 Task가 스팸 메일 분류라고 하였을 때, 이미 위키피티아 등으로 사전 학습된 BERT 위에 분류를 위한 신경망을 한 층 추가한다. 이경우 비유하자면 BERT가 언어 모델 사전 학습 과정에서 얻은 지식을 활용할 수 있으므로 스팸 메일 분류에서 보다 더 좋은 성능을 얻을 수 있다.

이전에 언급한 ELMO나 GPT-1 등이 이러한 파인 튜닝 사례의 대표적인 예이다.

BERT 의 크기

L : 트랜스포머 인코더 층의 수

D : d_model의 크기

A : 셀프 어텐션 헤드의 수

BERT-Base : L=12, D=768, A=12 : 110M 개의  파라미터 (GPT와 동일한 하이퍼 파라미터)

BERT-Large : L=24, D=1024, A=16 : 340M 개의 파라미터 (좋은 성적은 Large에 통해 이루어짐)

BERT의 문맥을 반영한 임베딩 (Contextual Embedding)

BERT는 ELMo나 GPT과 마찬가지로 문맥을 반영한 임베딩을 사용하고 있다 .

BERT의 입력은 임베딩 층 (Embedding layer)를 지난 임베딩 벡터들이다. d_model을 768이므로 모든 단어들은 768 차원의 임베딩 벡터가 되어 BERT의 입력으로 사용.

BERT는 내부적인 연산을 거친 후, 동일하게 각 단어에 대해서 768 차원의 벡터를 출력

BERT의 서브 워드 토크나이저 (Word Piece)

BERT는 단어보다 더 작은 단위로 쪼개는 서브워드 토크나이저를 사용. 서브워드 토크나이저는 기본적으로 자주 등장하는 단어는 그대로 단어 집합에 추가

바이트 페어 인코딩 (Byte Pair Encoding, BPE)의 유사 알고리즘, 동작 방식은 다르지만 글자로부터 서브 워드들을 병합해가는 방식으로 최종 단어 집합(Vocabulary)을 만드는 것은 BPE와 유사

포지션 임베딩 (Position Embedding)

: 트랜스포머에서 포지셔널 인코딩은 사인 함수와 코사인 함수를 사용하여 위치에 따라 다른 값을 가지는 행렬을 만들어 이를 단어 벡터로 더하는 방법이다. BERT에서는 이와 유사하지만 위치 정보를 사인 함수와 코사인 함수로 만드는 것이 아닌 학습을 통해서 얻는 포지션 임베딩이라는 방법을 사용

 

  • 사실 BERT는 세그먼트 임베딩(Segment Embedding)이라는 1개의 임베딩 층을 더 사용한다.

BERT의 사전 훈련 (Pre-Training)

MLM (Masked Language Model)

: BERT는 사전 훈련을 위해서 인공 신경망의 입력으로 들어가는 입력텍스트의 15%의 단어를 랜덤으로 마스킹한다. 그리고 인공 신경망에게 가려진 단어들을 예측하도록 한다. 중간에 단어들에 구멍을 뚫어놓고, 구멍에 들어갈 단어들을 예측하게 하는 식이다.

이렇게 하는 이유는 Mask만 사용할 경우에는 Mask 토큰이 파인 튜닝 단계에서는 나타나지 않으므로 사전 학습 단계와 파인 튜닝 단계에서의 불일치가 발생하는 문제가 있다. 이 문제를 완화하기 위해서 랜덤으로 선택된 15%의 단어들을 모든 토큰을 사용하지 않는다.

NSP (Next Sentence Prediction)

: BERT는 두 개의 문장을 준 후에 이 문장이 이어지는 문장인지 아닌지를 맞추는 방식으로 훈련시킨다. 이를 위해서 5:5비율로 실제 이어지는 두 개의 문장을 주고 훈련시킨다. 각각의 문장 A와 B라고 하였을 때, 연속성과 불연속성을 보여준다.

BERT가 언어 모델 외에도 다음 문장 예측이라는 태스크를 학습하는 이유는 QA(Question Answering)이나 NLI(Natural Language Inference)와 같이 두 문자의 관계를 이해하는 것이 중요한 태스크들이 이기 때문이다

세그먼트 임베딩 (Segment Embedding)

문장 구분을 위해 BERT는 세그먼트 임베딩이란 또 다른 임베딩 층을 사용한다. 첫 번째 문장에는 sentence 0 임베딩, 두번째 문장에는 sentence 1 임베딩을 더해주는 방식으로 임베딩 벡터는 2개만 사용된다. 결론적으로 BERT는 총 3개의 임베딩 층이 사용

 

Token Embedding : 30,000 Token vocabulary와 Word Piece Embedding 을 사용했다. 흔히 사용하는  word embedding 방식을 사용하지 않았다. 모든 sequence의 첫번 째 token은 항상 [CLS]이다. 두 문장 [SEP]를 통해 구분한다.

Word Piece Embedding : 실질적인 입력이 되는 워드 임베딩. 임베딩 벡터의 종류는 단어 집합의 크기로 30,522개.

BPE (Byte - Pair encoding)

Position Embedding : 위치 정보를 학습하기 위한 임베딩. 임베딩 벡터의 종류는 문장의 최대 길이인 512개.

Segment Embedding : 두 개의 문장을 구분하기 위한 임베딩. 임베딩 벡터의 종류는 문장의 최대 개수인 2개.

어텐션 마스크 (Attention Mask )

BERT 를 실제로 실습하게 되면 어텐션 마사크라는 시퀀스 입력이 추가로 필요하다. 어텐션 마스크는 BERT가 어텐션 연산을 할 때, 불필요하게 패딩 토큰에 대해서 어텐션을 하지 않도록 실제 단어와 패딩 토큰을 구분할 수 있도록 알려주는 입력이다. 이 값은 0과 1 두 가지 값을 가지는데 숫자 1은 해당 토큰은 실제 단어이므로 마스킹을 하지 않는다라는 의미이고, 숫자 0은 해당 토큰은 패딩 토큰이므로 마스킹한다는 의미이다. 위의 그림과 같이 실제 단어의 위치에는 1, 패딩 토큰의 위치에는 0의 값을 가지는 시퀀스를 만들어 BERT의 또 다른 입력으로 사용하면 된다.

BERT 모델의 구조

BERT 모델은 트랜스포머 인코더 encoder를 일부 변형한 아키텍처다. 이제 부처 원조 트랜스포머와 차이점 위주로 설명 한다

BERT 모델은 문장의 시작을 알리는 [CLS], 문장의 종결을 의미하나는 [SEP], 마스크 토큰 [MASK], 배치 데이터의 길이를 맞춰주기 위한 [PAD] 등의 네 가지 스페셜 토큰을 사용

우선 입력 토큰에 해당하는 토큰 벡터를 참조해 토큰 이베딩을 만든다. 여기서 첫번째 문장인지,  두 번쨰 문장인지에 해당하는 세그먼트 임베딩을 참조해 더해준다. 마지막으로 입력 토큰의 문장 내 절대적인 위치에 해당하는 포지션 임베딩을 더한다

이렇게 세 개 임베딩 더한 각각의 벡터에 레이어 정규화 (layer normalization)를 하고 드롭 아웃을 시행해 첫번째 트랜스포머 블록의 입력 행렬을 구성한다. 토큰 수가 11개인 문장이라면 트랜스포머 블록의 입력 행렬의 크기는 11 x 히든 차원 수가 된다. 토큰, 세그먼트 , 포지션 벡터를 만들 때 참조하는 행렬은 프리트레인 태스크 수행을 잘하는 방향으로 달느 학습 파라미터와 함께 업데이트 된다.

BERT 가 사용하는 트랜스포머 블록에서 원조 트랜스포머와 가장 큰 차이점을 보이는 대목은 Position-wise Feedforward Networks 쪽이다. 우선 활성화 함수를 기존 ReLU 대신 GELU를 쓴다. 정규 분포의 누적분포함수인 GELU는 ReLU보다 0 주위에서 부드럽게 변화해 학습 성능을 높인다

 

BERT 모델 트랜스포머 블록 내 멀티헤드 어텐션 레이어에서 각 토큰 임베딩 크기는 기본Base 768차원 라지 large 1024 차원이다. 바로 이어지는 Position-wise Feed-Forward Networts 레이어에서는 두번의 선형변환 (linear transformation)을 하게 된다. 이때 중간의 히든 차원 수를 원래 차원의 네 배까지 늘렸다가 다시 원상복구 시킨다. 이렇게 고무줄처럼 차원이 늘었다가 줄어드는 게 블록이 계속될 때마다 반복된다. BERT 저자들은 기본 모델에 트랜스포머 블록 12개, 라지 large 모델에 24개 쌓아서 만들었다

원조 트랜스포머와 BERT가 가장 크게 차이를 보이는 대목은 바로 마지막 예측(prediction) 레이어다. 마스크 언어 모델, 다음 문자인지 여부 맞추기 과제를 수애하기 위해서다.

댓글