[NLP | 논문리뷰] BERT : Pre-training of Deep Bidirectional Transformers for Language Understanding 상편

0

논문리뷰

목록 보기
8/29
post-thumbnail

BERT는 2018년에 나타난 모델임에도 불구하고 여전히 사랑받고 있는 모델입니다. 비록 최근에는 GPT-3, Open-AI 등도 나타났지만 pre-trained된 모델을 사용하게 되면 어느 정도의 성능을 보장한다는 큰 매력이 있습니다.

해당 논문을 다루기 이전에 ELMO와 GPT-1에 대해 다루었으면 좋았겠지만 해당 논문 리뷰는 다음주로 미루고 이번주에는 BERT를 중점적으로 다루고자 합니다.

💡 전체적인 내용

BERT 논문이 나타나기 이전에도 언어 모델을 사전 훈련한 후에 task에 대해서 feature-based 모델을 만들거나 fine-tuning하는 방식이 인기를 끌었다. BERT가 나타나기 이전에 나온 모델은 GPT-1으로 많은 양의 데이터를 학습된 pre-trained model이며 fine-tuning을 통해 성능을 보장했기에 상당한 인기를 얻었다.

그러나 기존 모델들은 LSTM이나 RNN처럼 결국에는 문제를 해결하기 위해서 문장을 학습할 때에 순차적으로(Left to Right) 읽을 수 밖에 없다는 문제점을 지니고 있다. 단어 임베딩의 경우 Transformer를 사용해서 Attention을 통해 관계성을 잘 파악하도록 만들어낼 수 있지만, 결국에 예측을 해야할 때는 단반향으로 읽어서 예측해야 하기에 이전 토큰만 참조할 수 있다는 큰 단점이 있다.

이러한 문제는 다음 문장에 대한 예측이나 문장의 빈칸에 대한 예측을 할 때에 상당히 치명적으로 다가오게 된다. 하지만 이것을 해결하기 위해 양방향으로 그냥 읽게 되면, 정답을 보고 예측하게 되므로 효과적으로 학습시킬 수 없다.

이것을 해결한 방식이 BERT의 MLM 방식이고 이를 통해 Bidirectional Transformer 이용이 가능해지었기에 줄여서 BERT라고 불리는 것이다.(약간 억지스럽지만 캐릭터가 귀여우니 봐주자)

이러한 BERT는 NLP의 11분야에서 모두 state-of-art 성능을 보였으며, NLP의 한 획을 그은 모델이 되었다.

🎯 들어가기 전 feature-based와 fine-tuning

BERT는 기본적으로 feature-based를 지양하고 fine-tuning을 기반으로 하는 모델이다.(나중에 Ablation에서도 나타나지만 feature-based를 하더라도 상당히 좋은 성능을 보이기는 한다.) 그렇다면 논문에 대한 내용을 들어가기 전에 fine - tuning과 feature-based에 대한 내용을 먼저 이해할 필요가 있다.

다음 두 문장으로 간단히 요약은 할 수 있다.

파인튜닝(fine-tuning): 모든 것을(그러나 조금은 미세하게) 업데이트 시키기, 임베딩까지 모두 업데이트하는 기법

피처베이스(feature-based): 임베딩은 그대로 두고 그 위에 레이어만 학습 하는 방법

대표적으로 feature-based approach에는 ELMO가 포함된다. Feature-based의 핵심은 어떠한 특정 task를 해결하기 위한 architecture를 task specific하게 구성하고 거기에 pre-trained representations(즉, embedding layer)를 부가적인 feature로 사용하는 것이다.

Fine-tuning approach에는 BERT를 예시로 들 수 있으며, 어떤 특정 task에 대한 parameter를 최소화하여 범용적인 pre-trained 모델을 사용합니다. 그리고 특정 task를 수행할 경우 그에 맞게 fine-tuning을 적용한다.

BERT는 기본적으로 대용량의 unlabeled data로 pre-training을 진행하고 특정 task에 대해 BERT를 여러 대로 복사해 transfer learning을 진행하게 됩니다. 즉, pre-trained 모델이 기반이 되는 것이다.

🛠 BERT and Model Architecture

BERT 개요

BERT 는 크게 pre-training 단계와 fine-tuning 단계, 두가지 단계로 구분한다.

BERT가 높은 성능을 얻을 수 있었던 것은, 레이블이 없는 방대한 데이터로 사전 훈련된 모델을 만든 후, 레이블이 있는 다른 작업(Task)에서 추가 훈련과 함께 하이퍼파라미터를 재조정하여 이 모델을 사용하기 때문이다. 기존 사례에서도 해당 기법을 사용하면 상당히 좋은 성능이 발휘되는 것이 입증되었다.

기초 체력을 기르고 추가적인 공부를 하는 느낌쓰

실제 task에서 사용하는 모델은 초기에 동일한 파라미터로 시작하지만, 최종적으로는 서로 다른 fine-tuned 된 모델을 보유하게 된다. BERT 는 pre-trained 된 모델과 fine-tuned 된 모델 사이의 구조적 차이가 거의 없게 된다. 그러나 미세하게 차이가 생기는 모델 여러 개를 생성하게 된다.

아래의 그림은 질문-대답 분야를 어떻게 학습하는지에 대해 논문에 나타나있는 예시이다.

위의 CLS토큰과 SEP토큰은 학습 부분에서 다루겠다.

BERT의 구별된 특징은 다양한 작업에 걸친 통일된(unified) 구조라는 것이다. 사전 훈련된 구조와 마지막 다운 스트림 구조 사이의 최소한의 차이만 있다.

Model Architecture

BERT의 모델 구조는 트랜스포머의 인코더만을 다중으로 쌓은 다중 레이어 양방향 트랜스포머 인코더이다. 즉, 기존의 Transformer와 달리 앞과 뒤 양방향에서 Attention을 사용하는 모델이라는 뜻이다.

레이어의 개수(트랜스포머 블럭 등)를 L, 은닉의 크기는 H, 셀프 어텐션 헤드의 수는 A로 표시한다. 저자들은 BERTBASE (L=12, H=768, A=12, Total Parameters=110M)과 BERTLARGE (L=24, H=1024, A=16, Total Parameters=340M) 두 모델 사이즈로 결과를 보여준다.

🔑 Input / Output Representations

다운스트림 과제 중에 단일 문장이 아닌 문장의 쌍(예: <질문, 답변>)에 대한 학습이 필요한 경우가 있다. 이러한 경우 문장 쌍을 토큰을 통해 순서와 쌍을 만들어줄 수 있다.

이 작업 내내, ‘문장(Senetence)’는 실제 언어의 문장 대신에 유사한 텍스트의 임의 범위가 될 수 있다.

그리고 논문에서 나타나는 '시퀀스(Sequence)’는 BERT에 대한 입력 토큰 시퀀스를 말하며 두 개의 문장을 함께 패킹(합친)한 것일 수 있다.

문장의 쌍은 하나의 시퀀스로 함께 묶인다. 그리고 이 쌍을 두 가지 방법으로 문장을 구별한다.
먼저, 토큰 ([SEP], [SEP])을 통해 기존의 문장들을 분리를 보여준다. 두 번째로 우리는 모든 토큰에 이것이 문장 A인지 B인지 표시하는 학습된 임베딩을 추가한다.

BERT에서 사용하는 tokenizer는 WordPiece 임베딩 방식이다. 해당 내용은 이전 포스트를 참고하면 된다.

모든 문장의 첫 번째 토큰은 항상 [CLS]이다. 이 토큰을 통해 마지막의 분류를 해줄 때에 분류에 대한 값이 이 토큰의 연산 결과로 나타나게 된다.

아래 사진을 보면, 각각의 임베딩 layer를 통해 나타나는 embedding을 E로 표시하고 각 단어의 tokenizer embedding, Segment Embedding(문장 쌍이라면 어디 속하는지), 그리고 Position Embedding을 해준다.

결론적으로 BERT는 총 3개의 임베딩 층이 사용된다.

WordPiece Embedding : 실질적인 입력이 되는 워드 임베딩. 임베딩 벡터의 종류는 단어 집합의 크기로 30,522개.
Position Embedding : 위치 정보를 학습하기 위한 임베딩. 임베딩 벡터의 종류는 문장의 최대 길이인 512개.
Segment Embedding : 두 개의 문장을 구분하기 위한 임베딩. 임베딩 벡터의 종류는 문장의 최대 개수인 2개.

이러한 embedding 과정을 거쳐서 BERT 구조에 넣어주고 연산이 되는 것이다.

🏃‍♀️ Pre-training BERT

BERT는 기존의 방식들과 달리 두 가지 방향에서 학습을 진행했으며, 두 가지 비지도 학습을 통해 훈련시켰다.

🎭 Masked LM

언어 모델이 아무런 제약조건 없이 Bidirectional하게 학습을 하게 되면 간접적으로 예측하려는 단어를 참조하게 되고, multi-layered 구조에서 해당 단어를 예측할 수 있기 때문이다. 즉 제대로 학습을 시키는 것이 매우 어려워진다.

이를 해결하기 위해 BERT 팀은, 다음 단어가 무엇이 오는지 예측하는 학습이 아니라, 문장 내에서 무작위로 입력 토큰의 일정 비율을 마스킹하고, 그 다음 마스킹된 토큰들을 예측한다. 이를 줄여서 MLM이라 부른다.

이 경우에,마스크 토큰에 해당하는 마지막 hidden vector는 표준 LM에서와 같이 어휘를 통해 출력 소프트맥스로 주어지고 단어를 예측하게 된다.

BERT는 WordPiece 토큰의 15%를 무작위로 각 시퀀스에서 마스킹한다. 이때 BERT는 문장을 복구하는 것이 목표가 아닌 해당 단어의 예측이 목표가 된다.

이를 통해 양방향으로의 학습이 가능해지지만, fine-tuning 중에 [MASK] 토큰이 나타나지 않기 때문에(빈칸 단어 예측은 그냥 빈칸 단어로 주어지기 때문), 사전 훈련과 fine-tuning 사이에 불일치를 만들어내는 단점이 있다.

훈련 데이터를 생성할 때에 예측을 위해 무작위로 토큰 포지션의 15%를 선택한다. 만약 i 번째 토큰이 선택된다면,

i 번째 토큰을
(1) 80%는 [MASK] 토큰으로 교체하거나
(2) 10%는 다른 토큰(단어)으로 교체하거나,
(3) 10%는 변경되지 않은 i 번째 토큰을 사용한다.

결과적으로 모델은 변경이 된 단어에 대해 적합한지를 판단해 예측을 하게 된다.

💭 Next Sentence Prediction(NSP)

위의 학습과 동시에 BERT는 Question Answering에서도 사용되기 위해 두개의 문장을 제공하고 문장들이 이어지는 문장인지 분류하는 훈련도 거치게 된다. 이때 문장들은 1/2 확률로 이어지는 문장이다.

그리고 여기서 [SEP] 토큰이 사용된다. 각 문장이 다른 문장임을 보여주기 위해서 문장과 문장 사이에 [SEP] 토큰을 넣게 된다. 그리고 가장 앞에 있는 [CLS] 토큰에 이 문장이 이어지는 문장인지에 대한 예측을 하게 된다.

논문의 Ablation Study에서는 해당 NSP 훈련을 하지 않을 경우 모델의 성능이 많이 감소한다고 명시했다.

🎯 Fine-tuning BERT

최종적으로 사전 학습된 BERT를 우리가 풀고자 하는 Task의 데이터를 통해 추가적으로 학습시켜 검증과 테스트를 거치게 된다. BERT 모델 자체가 Transformer를 통해 Attention Encoding을 하게 되고 그 모델을 다시 사용해서 문제를 해결하도록 fine-tuning하기 때문에 큰 조작을 가하지 않는다.

문제에 따라 Fine-tuning 하는 방식이 달라지게 되고 논문에서는 네 개의 학습을 보여주었다.

1) paraphrasing

2) hypothesis-premise pairs in entailment

  • 이론과 가설 쌍의 함의 관계에 대한 분류. 즉, 두 문장에 대한 이론과 가설 관계를 가지는지 분류해주는 것

3) question answering

4) tagging, text pair classification

  • 대표적으로 문장의 각 단어에 품사를 태깅하는 품사 태깅 작업과 개체를 태깅하는 개체명 인식 작업이 있다. 출력층에서는 입력 텍스트의 각 토큰의 위치에 밀집층을 사용하여 분류에 대한 예측을 하게 된다.
  • text pair classificationd의 경우 문장 간의 관계를 예측하는 것이다.

이 외에도 당양하게 많은 fine-tuning이 존재한다.

✏️ 후기

이번 리뷰의 경우에는 실험과 결과에 대한 내용은 담지 않았다. SQuAD에 대한 내용, SWAG에 대한 내용은 이후 하편에서 다루고자 한다. 그리고 그에 대한 내용으로 Ablation Study 내용도 담고자 한다.

BERT는 Transformer를 이해했다면 상당히 단순하지만 매우 강력한 모델임을 알 수 있다. 그렇기에 어느정도의 성능을 보장하기 위해서 자주 사용되는 모델인 것 같다. 리뷰를 하면서 ELMO와 GPT-1을 다루지 못한 것이 너무 아쉬워서 얼른 리뷰하고 싶다.

참고 : https://velog.io/@nawnoes/%ED%94%BC%EC%B2%98%EB%B2%A0%EC%9D%B4%EC%8A%A4feature-based%EC%99%80-%ED%8C%8C%EC%9D%B8%ED%8A%9C%EB%8B%9Dfine-tuning-%ED%95%99%EC%8A%B5%EC%9D%98-%EC%B0%A8%EC%9D%B4

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=winddori2002&logNo=222022178447

https://wikidocs.net/115055

https://catsirup.github.io/ai/2020/04/20/bert.html

https://supkoon.tistory.com/24

https://misconstructed.tistory.com/43

https://mino-park7.github.io/nlp/2018/12/12/bert-%EB%85%BC%EB%AC%B8%EC%A0%95%EB%A6%AC/?fbclid=IwAR3S-8iLWEVG6FGUVxoYdwQyA-zG0GpOUzVEsFBd0ARFg4eFXqCyGLznu7w

profile
프리미어와 IDE만 있다면 무엇이든 만들 수 있어

0개의 댓글