새소식

딥러닝(Deep Learning)/모델(Model)

BERT(Bidirectional Encoder Representations from Transformers) 개념 정리 및 이해

  • -

1.  BERT란?

 

BERT(Bidirectional Encoder Representation from Transformers)란, 2017년 구글에서 발표한 대규모 언어 모델(LLM)로 Transformer에서 영감을 받은 모델입니다. 기존 Transformer는 Encoder-Decoder구조로 되어있는 반면, BERT모델은 transformer의 encoder만을 활용한 모델입니다. transformer에서 encoder는 문장을 잠재 벡터로 표현해 주는 역할을 하고 있습니다. 그렇다면 BERT는 transformer의 encoder를 어떻게 활용하였을까요?

 

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

We introduce a new language representation model called BERT, which stands for Bidirectional Encoder Representations from Transformers. Unlike recent language representation models, BERT is designed to pre-train deep bidirectional representations from unla

arxiv.org

 

BERT의 모델 구조
그림 1.BERT의 모델 구조

 

BERT라는 모델은 하나이지만 전이학습을 하기 때문에,(1)대량의 문장으로 먼저 학습하는 Pre-training 단계와 (2) 사용자가 원하는 task에 맞게 모델을 학습하는 Fine-Tuning 단계로 구성되어 있습니다. 이제 각 단계에서 BERT가 어떤 방식으로 동작하는지 살펴보겠습니다.

2. Pre-training : overview of model 

 

Pre-training 단계에 대해 알아보겠습니다. 모델을 살펴보면 아래서부터, Unlabeled Sentence A and B Pair 라고 되어있으므로, 2개의 라벨이 붙지 않은 문장이 입력으로 들어감을 알 수 있습니다. 다음으로, 이 두 개의 문장을 구분하기 위해 [SEP]이라는 스페셜 토큰으로 경계를 나누는 모습을 볼 수 있고, 문장의 시작을 알리는 [CLS] 토큰이 추가로 붙음을 알 수 있습니다. 이후 multi-layer bidirectional transformer encoder를 통과하는 모습을 볼 수 있습니다. 마지막으로 출력은 NSP(Next Sentence Prediction)과 Mask LM으로 구성되어 있습니다. 즉, BERT는 Pre-training 단계에서 두 문장이 서로 이어져있는 문장인지(NSP) 그리고 랜덤하게 마스킹(masking)한 토큰이 무엇인지 맞추는(Mask LM) task를 수행하게 됩니다. 

 

BERT의 Pre-training 구조
그림 2 : BERT의 Pre-training 구조

 

2.1 Pre-training : Input representation

 

조금 더 자세히 살펴보면, BERT의 입력으로 들어가는 embedding은 3개로 구성되어 있습니다. 각 임베딩은 token embedding, position embedding, segment embedding으로 구성되어 있으며, 그림과 같이 단순히 더해서 입력 embedding을 만들게 됩니다. 

 

BERT Embedding
그림 3. BERT Embedding

 

[1] Token Embedding

 

토큰 임베딩(Token embedding)은 WordPiece Tokenizer를 사용합니다. WordPiece Tokenizer는 구글에서 개발한 토크나이저로써 BERT에 사용하기 위해 개발되었습니다. WordPiece Tokenizer는 BPE와 유사하지만, likelihood 정보를 이용하여 더 자주 같이 나오는 토큰에 대해 우선적으로 병합됩니다. 간단하게 정리하면 '##'이라는 특수 접두사를 사용하여 BPE와 동일한 방법으로 토큰화를 진행합니다. 따라서 playing 은 play + ##ing 형태로 나뉘게 됩니다. 어떻게 playing 이 WordPiece Tokenizer를 거치면 play + ##ing가 되는지 궁금하시다면 'WordPiece tokenizer 이해 및 정리' 글을 참고해주시면 이해하시는데 도움이 될 것입니다!. 이렇게 만들어진 토큰을 임베딩하여 벡터로 변환하여 준비합니다.

 

[2] Segment Embedding

 

Segment Embedding은 입력된 2개의 문장의 순서를 알려주는 embedding입니다. 첫 번째 문장은 0으로 표시하며, 두 번째 문장은 1로 표시합니다. 간단한 예시를 들어보겠습니다.

 

sentence 1 : my dog is cute

sentence 2 : he likes playing

 

두 문장이 주어지면 특수 토큰[SEP]을 이용하여 "[CLS] my dog is cute [SEP] he likes play ##ing [SEP]"으로 입력이 들어가게 되며, 이때 segment embedding은 [CLS] my dog is cute [SEP] -> [0,0,0,0,0,0] 이 되며 뒷부분인 he likes play ##ing [SEP] -> [1,1,1,1,1]로 embedding이 됩니다. 결국 전체 임베딩은 [0,0,0,0,0,0,1,1,1,1,1]이 되게 됩니다.

 

[3] Position Embedding

 

마지막으로 Position Embedding은 Transformer에서 사용한 Position Embedding을 사용하였습니다. BERT또한 Transformer와 마찬가지로 모든 토큰이 한 번에 입력되기 때문에 토큰의 순서 정보를 알려주어야 합니다. Position Embedding에 대한 자세한 설명은 제가 따로 정리해 놓은 Positional Encoding과 Relative Position Representation 어떻게 동작하는가를 참고해주세요!

2.2. BERT : Pre-training model architecture

 

BERT의 모델 구조는 왼쪽 그림입니다. ELMO나 GPT 등의 기존 모델과는 다르게 양방향 트랜스포머(bidirectional Transformer)를 사용한 것이 특징입니다. 저자들은 양방향 트랜스포머 구조가 문장을 이해하는데 더 효과적이라고 주장합니다. 기존 GPT 모델은 단방향(왼쪽-> 오른쪽)으로 입력이 들어가며, ELMO는 방향이 다른 두 개의 단방향 구조를 이용하여 합친 구조라는 부분에서 BERT와이 차이가 존재합니다.

bidirection transformer 구조를 가진 BERT와 단방향 구조를 가진 GPT 그리고 ELMo
그림 4. bidirection transformer 구조를 가진 BERT와 단방향 구조를 가진 GPT 그리고 ELMo

 

BERT 모델은 multi-layer bidirection transformer encoder를 활용하여 입력값을 처리합니다. 실제로 논문에서도 저자들은 Transformer와 상당히 유사하다고 표현하고 있습니다.

Because the use of Transformers has become common and our implementation is almost identical to the original, we will omit an exhaustive background description of the model architecture

 

입력값이 multi-layer bidirection transformer encoder를 통과하게 되면 최종적으로 다음 내용인 Masked LM과 Next Sentence Prediction(NSP)의 수행 결과를 출력으로 내놓게 됩니다. 이제 각 task에 대해 알아보겠습니다.

2.2.1 Task 1 : Masked Language model (Masked LM)

 

[BackGround] BERT 연구진들이 Masked LM을 도입한 이유?

left-to-right 혹은 right-to-left 구조의 모델은 일반적으로 사용하는 방식입니다(LSTM 혹은 ELMO 등등). BERT에서는 bidirectional 구조를 취하고 있는데. 이 bidirection은 직관적으로는 단방향(left-to-right/right-to-left) 모델보다 성능이 뛰어나다고 생각하는 것이 어찌 보면 타당하지만, 실제로는 각 단어가 간접적으로 '자기 자신을 볼 수 있게' 해주며, 이로 인해 모델이 multi-layer context에서 Target word를 쉽게 예측할 수 있게 됩니다. 따라서 이러한 간접적으로 자기자신을 볼 수 있는 문제로 인해 모델이 언어의 구조를 제대로 학습하지 못하지 못하게 되는데, 저자들은 이 문제를 해결하기 위해 쉽고 간단한 방법인 'masking' 방법을 도입하였습니다.

 

Masked LM은 간단히 말해서 일부 토큰을 마스킹하는 방법입니다. BERT에서는 전체 토큰의 15%를 masking 합니다. background에서도 볼 수 있듯이, masking 방법은 모델을 bidirection으로 학습할 수 있게 해 주었지만, Fine-tuning 시에는 [MASK] token이 나타나지(사용하지) 않기 때문에, pre-training과 fine-tuning 사이의 mismatch가 발생하게 되는데, 저자들은 이러한 mismatch를 완화하기 위해 'masked' word를 항상 [MASK] token으로 바꾸지는 않았습니다. 그 대신 저자들은 'masked' word 중 80%만 [MASK] token으로 바꾸었으며, 10%는 랜덤 한 다른 토큰으로 바꾸었고, 나머지 10%는 바꾸지 않고 그대로 유지하는 방식을 취하였습니다. 이 과정을 거쳐서 최종적으로는 'masked' word가 무엇인지 맞추게 되며, BERT에서는 cross entropy loss를 이용하여 정답과 비교하면서 pre-training 학습을 진행합니다.

 

Question?) 여기서 의문이 들 수 있는 점은 모든 'masked' word를 [MASK] 토큰으로 바꾸지 않는 건 알겠는데(pre-training과 fine-tuning의 mismatch 완화목적), 왜 20%의 'masked' word를 그대로 놔두지 않고 10%만 그래도 두고 10%는 '랜덤 한 다른 토큰'으로 바꾸는지 궁금할 수 있습니다. 간단히 이 질문에 답을 한다면, 데이터의 증강 정도를 제어하기 위함이라고 볼 수 있습니다. BERT는 대량의 텍스트를 기반으로 pre-train 되며, 무작위로 단어를 바꾸는 것은 모델이 더 많은 예시를 보고 일반화(generalize)하는데 도움이 될 수 있지만, 너무 많이 변형하게 되면 원래 문장의 의미를 완전히 잃어버릴 수 있기 때문입니다. 따라서 BERT연구진들은 이 비율을 적절히 10% 정도로 제한하였다고 생각해 볼 수 있습니다.

 

2.2.2 Task 2 : Next Sentence Prediction(NSP)

 

NSP는 두 개의 문장이 서로 이어져있는 문장인지 맞추는 학습입니다. 아래와 같이 두 문장이 서로 이어져 있으면 "IsNext", 그렇지 않으면 "NotNext" 라벨을 사용하는 방식을 이용하여 학습이 진행됩니다. 예시는 다음과 같습니다.

 

[Case 1]

Input : [CLS] 그는 집 [MASK] 편의점에 갔다 [SEP] 그는 편의점에서 [MASK] 구매했다 [SEP]

Label : IsNext

 

[Case 2]

Input : [CLS] 그는 집 [MASK] 편의점에 갔다 [SEP] 지구와 가장 가까운 [MASK] 태양이다 [SEP]

Label : NotNext

 

BERT 연구진들은 문장의 관계를 파악하는 것이 Question&Answering(QA)와 Natural Language Inference(NLI)에 상당한 이점이 있다고 주장합니다. pre-training 결과로 나오는 C라는 변수는 두 문장이 이어지는 문장인지 아닌지 판단할 때 사용합니다.

 

2.3. Effect of Model Size

 

논문에서는 \(BERT_{Base}\)와 \(BERT_{Large}\) 두 가지 모델을 소개합니다. 두 모델은 단순히 학습 parameter의 차이로 나누었지만, 성능은 \(BERT_{Large}\)가 더 좋습니다. 구체적으로 살펴보면, L 은 layer의 수, H는 hidden size, A는 self attention head의 수로 표현하면 다음과 같은 차이가 있습니다.

 

  • \(BERT_{Base}\) : L = 12 , H = 768, A = 12 / Total Parameter : 110M
  • \(BERT_{Large}\) : L = 24, H = 1024, A = 16 / Total Parameter : 340M

 

3. BERT : Fine Tuning 

 

BERT는 전이학습을 이용하므로 pre-training 이후, Fine-tuning 학습을 진행합니다. pre-training과 다르게 fine-tuning은 self-attention의 도입으로 인해 매우 간단합니다. 원하는 task에 맞춰서 입력과 출력을 정한 다음, pre-training이 완료된 모델을 이용하여 downstream task를 수행합니다. 간단하게 말하면 원하는 task(QA, NLI, Text classification 등등)에 맞춰서 모델 학습을 진행하면 됩니다. 특히 BERT의 output 중 하나인 C(CLS)는 입력 전체에 대한 정보를 담고 있고 또한 일정한 dimension size가 나오기 때문에 추론이나 감정 분석 등의 classification에 사용하면 좋습니다. 다음 그림은 다양한 fine-tuning의 예시입니다. 각 task의 자세한 설명은 논문을 참고하시면 좋습니다.

 

Illustrations of Fine-tuning BERT on Different Tasks
그림 5. Illustrations of Fine-tuning BERT on Different Tasks.

 

4. 논문에서 수행한 실험(일부분)

 

지금까지 BERT의 동작 방식에 대해 정리하였습니다. 다음으로는 BERT 모델이 다양한 task에서 얼마나 좋은 성능을 내는지 실험을 진행하는 단계입니다. BERT에서는 제시한 모델의 성능을 GLUE task를 통해 보여주었으며, 기존 모델들보다 더욱 좋은 성능을 보여주었습니다. 또한 \(BERT_{Base}\)와 \(BERT_{Large}\) 의 성능 또한 모델의 크기가 클수록 더욱 높은 성능을 낸다는 것을 보여주었습니다. 자세한 내용은 논문을 직접 보시는 게 좋을 것 같으며, 이번 챕터에서는 여러 실험 중 개인적으로 중요하다고 생각하는 실험 2개를 정리해 보았습니다.

4.1 Ablation Studies

 

Ablation Study란, 모델의 구성 요소를 하나씩 제거해가며 각 구성 요소가 모델에 얼마나 영향을 끼치는지 실험하는 방법입니다. BERT 모델에서는 pre-training 단계에서 수행하는 NSP와 Masked LM이 모델에 얼마나 영향을 끼치는지 확인하였습니다.

Ablation over the pre-training tasks using the BERT_BASE architecture
그림 6. Ablation over the pre-training tasks using the BERT_BASE architecture

[Case 1 - No NSP]

No NSP는 입력한 두 문장이 순서대로 이어져 있는지 맞추는 NSP task를 제거한 상황입니다.

 

[Case 2 - LTR & No NSP]

기존 No NSP에 더불어 LTR(Left-to-Right : 단방향) 형식으로 학습시킨 경우입니다. 이 경우에는 BERT 모델에서 사용한 bidirectional 한 구조가 모델에 얼마나 영향을 끼치는지 판단할 수 있습니다. 또한 단방향으로 바꾸게 될 경우 기존 OpenAI의 GPT-1의 방식과 유사하기 때문에 직접적으로 비교가 가능하지만, 이 실험에서는 기존 GPT-1을 소개한 논문보다 더 많은 데이터를 사용하였으며, 입력 표현과 fine-tuning 방식은 BERT를 따릅니다.

 

[실험 결과 해석]

실험 결과는 위 표와 같으며, 우선 전체적으로 보면 두 요소 중 하나라도 빠지게 되면 성능이 크게 떨어짐을 확인할 수 있습니다. [Case 1] No NSP의 경우에는 NLI(QNLI) task에 크게 영향을 끼치는 모습을 확인할 수 있으며, 이는 NSP가 문장의 연결구조를 파악하는데 도움이 된다고 해석할 수 있습니다. 다음으로는 [Case 2] LTR & No NSP의 경우, MRPC와 SQuAD 데이터셋에서 두드러지는 성능 하락이 있습니다. 이는 어찌 보면 LTR 방식을 사용한다는 것은 오른쪽 context를 전혀 고려하지 않기 때문에 당연하다고 생각할 수 있다. 따라서 저자들은 임의로 초기화된 BiLSTM을 추가하는 방식으로 추가 실험을 진행하였습니다. 실험 결과 SQuAD에서는 성능 향상이 있었지만, 여전히 bidirection 구조를 채택한 결과와 차이가 있음을 확인하였습니다. 즉, BiLSTM이 GLUE task에서 성능이 낮다고 볼 수 있습니다. 이를 보완하기 위해 LTR 뿐만 아니라 RTL을 추가로 도입하여 보완할 수도 있지만(ELMO처럼), 저자들은 (1) 단방향 모델보다 비용이 2배로 든다는 점 (2) QA와 같은 task에서는 직관적이지 않다는 점(RTL은 질문에 대한 답변을 조건적으로 처리할 수 없기 때문) (3) 각 layer에서 LTR과 RTL을 각각 사용하는 것이 bidirectional 보다 절대적으로 덜 강력하다는 점을 이유로 적합하지 않다고 지적합니다.

4.2 Feature-based approach

 

Feature-based approach는 fine-tuning시 parameter 전체를 미세조정 하지 않고, 그대로 사용하는 것을 의미합니다. 그대로 사용하는 대신 추가 layer를 도입하여 해당 layer에서 입력을 받고 학습을 진행하는 방식으로 특정 NLP task를 수행할 수 있으며, 또한 전체를 미세조정 하지 않으므로 계산적 이점이 존재합니다.

CoNLL-2003 Named Entity Recognition results
그림 7. CoNLL-2003 Named Entity Recognition results.

 

연구진들은 CoNLL-2003 dataset을 이용하여 Named Entity Recognition task를 수행하였습니다. 실험에서 NER을 수행하기 위해서 추가로 768차원을 입력으로 받는 BiLSTM layer 2개를 추가하였습니다. 가장 높은 score를 달성한 경우는 pre-training 된 모델의 마지막 4개의 hidden layer를 concat 한 텐서를 BiLSTM의 입력으로 넣어서 학습한 결과가 가장 좋았으며, \(BERT_{Base}\) 전체 layer를 fine-tuning 한 것에 비해 F1 score가 0.3 밖에 차이가 나지 않았습니다. 따라서 BERT는 Feature-based approach에도 효과적이라고 판단할 수 있습니다.

5. 마치며

 

지금까지 BERT 모델의 구조 및 작동 방식, 그리고 몇 가지 연구진들의 실험 결과에 대해 정리하였습니다. 당시에는 엄청난 센세이션을 불러왔던 모델로 기억합니다. 현재는 더욱 개선된 모델들이 많이 연구되고 발표되었지만, 그 시초가 되는 모델로써 한 번쯤은 정리해보고 싶었습니다. 다음에는  BERT 모델의 pre-training & fine-tuning을 python으로 구현해 보는 포스트를 작성해보고 싶습니다. 또한 BERT계열뿐만 아니라 다른 모델들에 대해서도 알아보는 포스트를 작성해보려고 합니다.

 

Contents

포스팅 주소를 복사했습니다!

이 글이 도움이 되었다면 공감 부탁드립니다!