본문 바로가기
딥러닝(Deep Learning)/D&A Deep Session

[D&A Deep Session] 9차시 - 16. BERT

by rahites 2022. 5. 25.

# BERT

: BERT는 Transformer를 이용하여 구현되었으며, 위키피디아의 25억 단어와 BooksCorpus의 8억단어와 같은 레이블이 없는 텍스트 데이터로 사전 훈련된 언어 모델이다. 이와 같이 다른 작업에 대해서 파라미터 재조정을 위한 추가 훈련 과정을 파인 튜닝(Fine-tuning)이라고 한다. 결국 BERT는 특정한 task를 해결하기 위한 모델이 아닌, 언어 전반을 이해하고 이를 벡터로 표현하는데에 특화된 모델이다. 

 

* BERT의 기본구조

BERT는 Transformer 모델의 Encoder를 쌓아올린 구조입니다. BERT-Base는 12개의 layer, BERT-Large는 24개의 layer를 쌓은 구조이다. 

 

* BERT의 두 가지 특별 토큰

1. CLS

-> 분류 문제를 풀기 위한 특별 토큰

-> 문서의 시작 부분에 위치

 

2. SEP

-> 문장 구별을 위한 토큰

-> 문장의 끝에 위치

 

* Embedding

: BERT의 입력은 임베딩 층을 지난 임베딩 벡터들로 이루어집니다. \(d_{model}\)을 768로 정의하여 모든 단어들은 768차원의 벡터가 되어 입력에 사용됩니다. 예를 들어 위의 CLS 토큰의 예시그림에서 확인해보면 각각 768차원의 [CLS], I, love, you라는 4개의 벡터를 입력 받아서 동일하게 768차원의 4개의 벡터를 출력하는 것을 확인할 수 있습니다. 

BERT연산을 거친 후 출력은 문장의 문맥을 모두 참고한 임베딩이 된다. 입력 임베딩 당시의 단어토큰은 단순히 임베딩 계층을 거친 벡터였지만 BERT를 지나고 나면 모든 단어 벡터들을 참고해 문맥 정보를 가지는 벡터가 된다. 하나의 단어가 모든 단어를 참고하는 과정은 BERT의 12개 층에서 이루어지고 BERT의 첫번째 층의 출력 임베딩은 BERT의 두번째 층의 입력 임베딩이 된다. 이 때 BERT는 Transformer의 Encoder를 12번 쌓은 모델이기 때문에 내부적으로 각 층마다 Multi-head self-attention과 position wise feed-forward를 수행하여 문맥을 반영한 출력 임베딩을 얻게 되는 것이다.

 

- Token Embedding

: BERT는 WordPiece라고 부르는 단어보다 더 작은 단위로 쪼개는 subword tokenizer를 사용한다. 이는 BPE의 유사 알고리즘으로 자주 등장하는 단어는 그대로 단어 집합에 추가하고, 자주 등장하지 않는 단어는 더 작은 단위인 subword로 분리하여 단어 집합에 추가한다. 이러한 단어 집합을 만들고 나면 이를 기반으로 토큰화를 수행한다. 

 

- Position Embedding

: Transformer(sin함수와 cos함수를 사용하여 위치에 따라 다른 값을 가지는 행렬을 만들어 이를 단어 벡터들과 더해줌)와 달리 각 단어에 대한 position embedding vector를 학습으로 구해 더해준다. Position Embedding의 아이디는 위치 정보를 위한 임베딩 층을 하나 더 사용하여 BERT의 입력마다 'n번째 단어의 임베딩 벡터 + m번 포지션 임베딩 벡터'를 더해주는 것이다. 

 

- Segment Embedding

: 이어지는 두 문장을 구별하기 위한 embedding로 두 문장을 입력받는 task가 아닐 경우에 같은 값으로 설정한다. 이를 위해 또 다른 임베딩 층을 사용하고 첫번째 문장에는 Sentence 0 임베딩, 두번째 문장에는 Sentence 1 임베딩을 더해주는 방식이다. 

 

* BERT의 Pre-training

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

: BERT는 사전 훈련을 위해 인공 신경망의 입력으로 들어가는 입력 텍스트의 15%의 단어를 랜덤으로 Masking한다. 그리고 인공 신경망이 이 Masking된 단어들을 예측하도록하는데 이 때 아래의 규칙을 따른다.

  • 80%의 단어를 [MASK] 특별토큰으로 변경한다.
  • 10%의 단어들은 랜덤으로 다른 단어로 변경한다.
  • 10%의 단어들은 동일하게 둔다.

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

결국 전체 단어의 85%는 Masking된 언어 모델 학습에 사용되지 않고, 15%의 단어만 학습에 사용된다. 학습에 사용되는 단어 중 12%(전체 비율 중 )는 [MASK]로 변경 후에, 1.5%는 랜덤으로 단어가 변경된 후에, 1.5%는 단어가 변경되지는 않았지만 BERT 모델이 이 단어가 변경도니 단어인지 원래 단어인지는 모르는 상태로 원래 단어를 예측한다. 

 

ex)

'My dog is cute. he likes playing'

dog -> [MASK] 

출력층에 있는 다른 위치 벡터들은 예측, 학습에 사용되지 않고 오직 dog위치의 출력층 벡터만이 사용된다. 구체적으로 이야기하면 BERT의 손실함수에서 다른 위치에서의 예측은 무시한다고 볼 수 있고 출력층에서 예측을 위해 단어 집합의 크기만큼의 Dense layer에 softmax 함수가 사용되어 원래 단어를 맞추는 것이다. 이렇게 1가지 단어만 바뀌는 것이 아니라 여러 방법으로 데이터가 변하고, 이를 예측할 수도 있다. 

dog -> [MASK] , he -> king,  play (변경 x but 예측에 사용)

 

2. 다음 문장 예측(Next Sentence Prediction, NSP)

: BERT는 2개의 문장을 준 후 이 문장이 이어지는 문장인지 아닌지를 맞추는 방식으로 훈련을 진행한다. 이를 위해서 5:5 비율로 실제 이어지는 2개의 문장(Label = IsNextSentence)과, 랜덤하게 이어붙인 2개의 문장(Label = NotNextSentence)을 주고 훈련시킨다. 이 때 CLS 출력층을 통해 이어지는 문장인지 아닌지를 구분하고, 위의 MLM과 동시에 훈련을 진행한다. 

 

* 대표적인 language task에서 BERT의 fine-tuning

1. 하나의 텍스트에 대한 텍스트 분류 유형 ( Single Text Classification )

영화 리뷰 감성 분류, 로이터 뉴스 분류 등과 같이 입력된 문서에 대해서 분류를 하는 유형으로 문서의 시작에 [CLS]라는 토큰을 입력하고, [CLS] 토큰 위치의 출력층에서 Dense layer이나 fully-connected layer이라고 불리는 층들을 추가하여 분류에 대한 예측을 진행한다. 

 

2. 하나의 텍스트에 대한 태깅 작업 (Tagging)

앞서 RNN계열의 신경망들을 이용해 풀었던 문제로, 문장의 각 단어에 품사를 태깅하는 작업같은 개체명 인식 작업 등에 사용된다. 출력층에서는 입력 텍스트의 각 토큰의 자리에 Dense layer를 이용하여 분류에 대한 예측을 진행한다.

 

3. 텍스트의 쌍에 대한 분류 또는 회귀 문제(Text Pair Classification or Regression)

텍스트를 쌍으로 입력받는 대표적인 예시인 자연어 추론(Natural language inference)에서는, 두 문장이 주어졌을 때 하나의 문장이 다른 문장과 논리적으로 어떤 관계에 있는지를 분류한다. 하나의 문장이 다른 문장과 논리적으로 어떤 관계에 있는지를 분류하는 것으로 모순 관계(contradiction), 함의 관계(entailment), 중립 관계(neutral)가 있다. 텍스트를 쌍으로 입력받기 때문에 입력 텍스트가 여러개이므로 텍스트 사이에 [SEP] 토큰을 넣어 Sentence 0 임베딩과 Sentence 1 임베딩의 두 종류로 Segment Embedding을 사용하여 문서를 구분한다.

 

4. 질의 응답(Question Answering)

 

텍스트를 쌍으로 입력받는 또 다른 Task로는 QA(Question Answering)이 있다. 이 Task의 대표적인 데이터셋으로 SQuAD(Stanford Question Answering Dataset) v1.1이 있다. 이 데이터셋을 푸는 방법으로는 질문과 본문을 입력받았을 경우, 본문의 일부분을 추출해서 질문에 답하는 것이다. 

 

 

**참고**

https://wikidocs.net/115055

 

02) 버트(Bidirectional Encoder Representations from Transformers, BERT)

* 트랜스포머 챕터에 대한 사전 이해가 필요합니다. ![](https://wikidocs.net/images/page/35594/BERT.PNG) BERT(Bid ...

wikidocs.net

 

댓글