> For the complete documentation index, see [llms.txt](https://lswkim322.gitbook.io/til/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://lswkim322.gitbook.io/til/til-ml/boostcamp/u-stage-nlp/untitled-1.md).

# (09강) Self-supervised Pre-training Models

> GPT-1과 BERT에 대한 소개

## GPT-1(Generative Pre-training) 모델

[참고사이트](https://openai.com/blog/language-unsupervised/)

* It introduces special tokens, such as \ / \ / $, to achieve effective transfer learning during fine-tuning
* It does not need to use additional task-specific architectures on top of transferred &#x20;
* Transformer의 Decoder 기반의 모델이다.
* 비지도 학습이며, 다양한 분야의 수많은 데이터로 Language Model로 Pre-training 된다.
* Language 모델학습으로 일반적인 자연어처리 능력이 내재적으로 학습되어, 추가적인 Layer없이 적은 label로 구성된 데이터만으로도 Fine-Tuning되어 좋은 성능을 낸다.
* Byte Pair Encoding을 사용해서 Embedding을 업그레이드 시켰다.

입력과 출력이 나누어진 것이 아니라 데이터로부터 추출한 문장으로부터 다양한 Task를 처리할 수 있는 모델이다.

![GPT-1은 12개의 Layer를 쌓는다](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MjcKlzGhHYe2bvmxTwS%2F-Mk5TBWCbqZzkExKjyro%2F-Mk5UEq1bC4D98tCjiJM%2Fimage.png?alt=media\&token=11347e22-4020-4b55-a9ed-b72b797452fe)

* Natural Language Inference : 두 문장간의 관계 추론
* Question & Answer : 질의응답
* Semantic Similarity : 문장 유사도
* Classification : 분류 &#x20;

위와 같은 Task에서 활용되며 Delimiter(구분자, $)와 \ Extract를 활용하여 각 Task별로 변화를 주게 된다.

## BERT (Bidirectional Encoder Representations from Transformer)

### 1.1. Pre-Training(사전훈련)

여러 임베딩 기법에도 불구하고 하나의 단어가 하나의 벡터값으로 매핑되므로 문맥을 고려하지 못한다는 문제점이 있었다. 단적으로는 다의어나 동음이의어를 구분하지 못한다는 문제이다.(사과 : apple, forgive) 이러한 한계는 사전 훈련된 모델 Pre-Trained Model을 사용하므로 극복할 수 있었다.

방대한 데이터로부터 학습을 진행한 모델을 다른 Task에서 사용하게 되더라도 더 좋은 성능을 얻는다는 것이다.

### 1.2. 개요

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MjcKlzGhHYe2bvmxTwS%2F-Mk5UOeNTz5KNPxVdWFW%2F-Mk5UcznWshqMY8b5qIs%2Fimage.png?alt=media\&token=c61e197d-d1ed-4d34-9972-513bd2a79313)

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

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

BERT는 양방향성을 포함하여 문맥을 더욱 자연스럽게 파악할 수 있습니다. GPT와 마찬가지로 문맥을 파악하는 방법 (Context Embedding)을 지녔지만, 양방향을 확인하는 방법으로 보다 앞뒤 단어의 관계성을 잘 나타낼 수 있어졌다.

### 1.3. 사용되는 Task

1. **Question & Answering**
   * 질의응답
   * KorQuAD, Visual QA etc.
2. **Machine Translation**
   * 구글 번역기, 네이버 파파고
3. **문장 주제 찾기, 분류하기**
   * 기존 NLP에서 해결할 수 있는 문제도 해결 가능하다.
4. **사람처럼 대화하기**

### 1.4. Basic Structure

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MjcKlzGhHYe2bvmxTwS%2F-Mk5UOeNTz5KNPxVdWFW%2F-Mk5V8jMRdRsmEqYAVqN%2Fimage.png?alt=media\&token=e7c96d67-ac4f-4213-97ca-72946740529c)

* 트랜스포머의 인코더를 쌓아올린 구조 (L:인코더 층의수, D: d\_model의 크기, A: Self Attention Head 수)
  * BERT-Base : L = 12, D = 768, A = 12 : 110M개의 파라미터 &#x20;
  * BERT-Large : L = 24, D = 1024, A = 16 : 340M개의 파라미터

#### 1.5.1. Pre-Training Tasks in BERT

**1.5.1.1 Masked Language Model(MLM)**

BERT는 사전훈련을 위해서 입력으로 들어가는 텍스트의 일부(15%)를 마스킹하고 이를 예측하도록 한다.

* **Mask some percentage of the input tokens at random, and then predict those masked tokens**
* **15% of the words to predict**
  * **80% of the time, replace with \[MASK]**\
    \=> The man went to the store -> The man went to the \[MASK]
  * **10% of the time, replace with a random word**\
    \=> The man went to the store -> The man went to the dog
  * **10% of the time, keep the sentence as same**\
    \=> The man went to the store -> The man went to the store

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MjcKlzGhHYe2bvmxTwS%2F-Mk5UOeNTz5KNPxVdWFW%2F-Mk5VWklJA1wpvoXdIfe%2Fimage.png?alt=media\&token=64aaa5f1-5589-42a6-9d3e-4716673f3649)

* 너무 많은 부분을 MASK를 하게 되면 맞추기에 충분한 자료가 제공되지 않아 맞추기 어려워지고, 너무 적은 부분을 MASK한다면 시간적으로, 계산량이 늘어난다.(15%가 적정값) &#x20;

  * Too little masking : Too expensive to train&#x20;
  * Too much masking : Not Enough to capture context

* 15% 의 데이터를 100% 모두 \[MASK]로 치환하게 되면 부작용이 발생할 수 있다. \[MASK] 만 사용할 경우에는 \[MASK] 토큰이 Fine-Tuning 단계에서는 나타나지 않으므로 Pre-Training과 Fine-Tuning 단계에서의 불일치가 발생하는 문제가 있습니다. 이 문제를 완화하기 위해 80%/10%/10% 과 같이 나누어 사용하게 됩니다.

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

BERT는 두 개의 문장을 준 후에 이 문장이 이어지는 문장인지 아닌지를 맞추는 방식으로 훈련시킨다. 이를 위해서 50:50 비율로 실제 이어지는 두 개의 문장과 랜덤으로 이어 붙인 두 개의 문장을 주고 훈련시킨다.

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MjcKlzGhHYe2bvmxTwS%2F-Mk5UOeNTz5KNPxVdWFW%2F-Mk5VpagEYZlgFuz7Jqp%2Fimage.png?alt=media\&token=ee7b9830-be55-48ec-8cfe-1c43d2ab30ae)

* 문장의 구분을 위해 첫번쨰 문장과 두번째 문장의 끝에 \[SEP] 토큰을 사용한다.
* \[CLS] 토큰 위치의 출력층에서 이어지는 문장 여부(이진 분류문제)를 풀도록 한다.
* loss를 합하여 MLM과 동시에 학습이 이루어진다.

BERT가 언어 모델 이외에도 다음 문장 예측이라는 Task를 학습하는 이유는 질의응답이나 관계 추론과 같이 두문장의 관계를 이해하는 Task들이 있기 때문이다.

#### 1.5.2. Embedding

**1.5.2.1. WordPiece Embedding**

단순 Subword와는 조금 다르게 아래와 같은 순서를 가지고 있다.

1. **토큰이 Vocab에 존재한다.**
   * 토큰을 분리하지 않는다.
2. **토큰이 Vocab에 존재하지 않는다.**
   * 해당 토큰을 subword로 분리한다.
   * 첫번째 subword를 제외한 나머지 subword 앞에 "##"을 붙인다\
     ex) embedding -> em, ##bed, ##ding

"##" 표시로 인해 다시 손쉽게 원래 단어로 복원이 가능하게 된다<br>

**1.5.2.2. Position Embedding**

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MjcKlzGhHYe2bvmxTwS%2F-Mk5UOeNTz5KNPxVdWFW%2F-Mk5Wq-CA6ZN4znUMBYY%2Fimage.png?alt=media\&token=1d9a326d-d490-428d-806d-060e56b93dad)

트랜스포머에서 사용한 Positional encoding은 Sin, Cos 함수를 사용하여 위치에 따라 다른값을 더하는 방법이다. BERT에서는 학습을 통해서 얻는 Position Embedding 방법을 사용하게 된다.

* 문장의 길이가 4라면 4개의 포지션 임베딩 벡터를 학습시키는 것이다.
* BERT 입력마다 각 포지션 임베딩 벡터를 더해주는 것.

**1.5.2.3. Segment Embedding**

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MjcKlzGhHYe2bvmxTwS%2F-Mk5UOeNTz5KNPxVdWFW%2F-Mk5XFbWq3pph5gWM6qA%2Fimage.png?alt=media\&token=9211f59b-0243-4f25-b08c-fd64d6e9bf3e)

* 두 개의 문장입력이 필요한 Task (Q/A, 추론)에서 문장구분을 위해 Segment Embedding 층을 사용하게 된다. 첫 문장에는 $$E\_A$$를 두번째 문장에는 $$E\_B$$를 더해주는 방식이다.

#### 1.5.3. Fine-Tuning

Task 별로 진행하는 Fine-Tuning(Pre-Training 된 모델을 Task에 맞게 변형하고 학습을 업데이트 하는 것) 방법에 대해서 알아본다.

#### 1.5.3.1. Single Text Classification

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MjcKlzGhHYe2bvmxTwS%2F-Mk5UOeNTz5KNPxVdWFW%2F-Mk5Xlsk310tRfE5oag1%2Fimage.png?alt=media\&token=0aa93682-56e9-41a1-aa23-726bc04d53ea)

* 영화리뷰 감성분류, 로이터 뉴스 분류 등
* 문서의 시작에 \[CLS] 토큰을 사용함으로써 문맥정보를 담는다.
* \[CLS] 토큰 위치의 출력층에서 Dense Layer(Fully Connected Layer)를 통해 분류에 대한 예측을 진행한다.

#### 1.5.3.2. Tagging

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MjcKlzGhHYe2bvmxTwS%2F-Mk5UOeNTz5KNPxVdWFW%2F-Mk5Y5NsDe0-E61yuvAj%2Fimage.png?alt=media\&token=77beeeab-bf4d-4e7c-a2dc-47aec24ecd37)

* 문장에서 각 단어의 품사를 태깅하거나, 개체를 태깅하는 작업이 있음.
* 출력층에서는 입력 텍스트의 각 토큰의 위치에 Dense Layer를 사용해 분류에 대한 예측을 진행한다.

#### 1.5.3.3. Text Pair Classification or Regression

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MjcKlzGhHYe2bvmxTwS%2F-Mk5UOeNTz5KNPxVdWFW%2F-Mk5YTeVuHwLo4zOYDlP%2Fimage.png?alt=media\&token=215610dc-3056-44b7-90ca-2dbd1760fb9a)

* 두 문장을 입력받는 Task
* 자연어 추론 Task (두 문장의 논리적 관계 - 모순, 중립, 함의 관계)
* 문장의 끝을 의미하는 \[SEP] 토큰을 사용한다.
* Segment Embedding을 사용하여 문장을 구분하도록 값을 더해준다.
* \[CLS] 토큰에서 Dense Layer를 통해 관계에 대한 예측을 진행한다.

#### 1.5.3.4. Question Answering

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MjcKlzGhHYe2bvmxTwS%2F-Mk5UOeNTz5KNPxVdWFW%2F-Mk5YnyTucg080_tlZwo%2Fimage.png?alt=media\&token=2f3f1298-8636-4200-9cb9-2ae3a98fcd96)

* 두 문장을 입력받는 Task
* SQuAD(Stanford Question Answering Dataset)
* 질문과 본문을 입력 받으면, 본문의 일부분을 추출해서 답변을 하는 것. &#x20;

  ex) 강우가 떨어지도록 영향을 받는 것은? / 기상학에서 강우는 대기 수증기가 응결되어 중력의 영향을 받고 떨어지는 것을 의미합니다. => 중력

### 1.5. Summary

1. **Model Architecture**
   * BERT BASE : L = 12, H = 768, A = 12
   * BERT LARGE: L = 24, H = 1024, A = 16
2. **Input Representation**
   * WordPiece embeddings (30,000 Word Piece) -> Subword
   * Learned positional embedding
   * \[CLS] - Classification embedding -> 문맥정보를 담고 있음
   * Packed sentence embedding (SEP)
   * Segment embedding
3. **Pre-Training Tasks**
   * Masked Language Model
   * Next sentence Prediction

## GPT-1 vs BERT

#### Training Size

* GPT : BookCorpus(800M words)
* BERT : BookCorpus and Wikipedia (2,500M)

#### Training special tokens during training

* BERT : \[SEP], \[CLS] and sentence A/B embedding(segment emb) during pre-training

#### Batch size

* GPT : 32,000
* BERT : 128,000

큰 배치를 사용할 수록 성능 향상과 안정화가 될 수 있다. 경사하강법을 할 때, 일부의 데이터로 하는 것보다 많은 양의 데이터로 수행하여야 안정화가 되기 때문이다. 단, GPU 메모리 소모가 크다.

#### Task-specific fine-tuning

* GPT : 5e-5 learning rate for all fine-tuning experiment
* BERT : choose a task-specific fine-tuning learning rate
