본문 바로가기

책 정리/구글 Bert의 정석

2장. BERT 시작하기

역시 네이밍이 중요해

1. BERT의 기본 개념

- NLP 분야에서 좋은 성능을 내는 LM.

- Transformer 구조를 기반함.

- BERT가 성공한 주된 기능은 문맥(context)을 고려하지 않은 word2vec과 같은 임베딩 모델과는 달리, 문맥을 고려한 동적 임베딩 모델이기 때문.


* 문맥 기반(context-based) 임베딩 모델과 문맥 독립(context-free)임베딩 모델의 차이

A : He got bit by Python --> 파이썬(뱀)이 그를 물었다.
B : Python is my favorite programming language --> 내가 가장 좋아하는 프로그래밍 언어는 파이썬이다.

- 두 문장에서 'Python'이라는 단어의 의미가 서로 다르다는 것을 알 수 있다. (A : 뱀을 의미 , B : 프로그래밍 언어를 의미)

- word2vec과 같은 '문맥 독립 임베딩 모델(context-free model)'의 경우 두 문장에서 'Python'이라는 동일한 단어가 쓰였으므로 동일하게 표현하게 된다. 즉, 동일한 임베딩을 제공한다.

- 반면 BERT와 같은 '문맥 기반 임베딩 모델(context-based model)'의 경우 문장의 문맥을 이해한 다음 문맥에 따라 단어 임베딩을 생성한다. 따라서 앞의 두 문장의 문맥을 기반으로 'Python'이라는 단어에 대해 서로 다른 임베딩을 제공한다.

 


- BERT는 Bidirectional Encoder Representation from Transformer의 약자이다.

- 이름 그대로  BERT는 Unidirection하지 않고, Bidirectional한 방향으로 문맥을 이해하여 단어의 표현을 출력하는 딥러닝 모델이다.

 


*BERT가 양방향 인코더 형태를 취한 이유?

- Transformer는 Bidirectional한 인코더와 Unidirectional(Left to Right direction)한 디코더로 구성되어져 있음.

- 즉, Transformer의 인코더는 양방향으로 문맥을 이해하고, 디코더는 왼쪽에서 오른쪽 방향으로 문맥을 이해한다.

- BERT가 Bidirectional한 형태를 취한 이유는 GPT-1의 등장에서 시작된다.

 

GPT-1이란?

더보기

GPT-1

- GPT1은 Transformer의 Decoder구조를 사용해 만든 LM이다.

- 문장을 입력 데이터로 사용하며, 단어를 하나씩 읽어가며 다음 단어를 예측하는 방법으로 모델을 학습시킴.

- 왼쪽에서 오른쪽 방향으로 문장을 읽어가며 모델을 학습 시켰으므로 (Unidirectional한 형태를 취했다고 볼 수 있음.)

- 이러한 학습 방식은 별로의 labeling 작업이 필요가 없기에 '비지도 학습'이라 할 수 있다. 

한문장만 가지고도 여러 학습 데이터를 만드는게 가능해짐

- 따라서 GPT-1 학습 시 필요한 것은 엄청난 양의 질 좋은 데이터일 것이다.

- 모델이 발전하는 동시에 질적으로도 좋은 데이터를 선별하는 기술 역시 발전할 것이므로 GPT는 앞으로도 각광 받을 모델일 것이다.(GPT-3 폼 미쳤다)

- BERT는 GPT-1의 발표이후 얼마 지나지 않고 발표하게 됨. 

- BERT는 GPT-1과 같이 문장을 단방향으로만 이해하는 것은 그 문맥을 이해하는데 한계가 있다고 판단하여, 예측해야 하는 단어의 왼쪽 뿐만 아니라 미래에 나올 오른쪽 단어에 대해서도 양방향으로 한꺼번에 학습할 수 있으면 더 좋은 성능을 낼것이라고 주장하였다.

- 그래서 BERT는 분석에 초점을 맞추기 위해 GPT와는 반대로 Transformer의 인코더 부분에만 집중하게 됨.


- GPT-1과 같은 기존의 Unidirectional L.M은 현재까지 읽은 단어를 통해 다음 단어를 예측할 수 있도록 학습이 된다.

지금까지 입력된 단어 how,are,you를 통해 다음 단어 doing을 예측

- 반면 BERT는 동일한 문장 그대로를 학습하되, 가려진 단어(<mask> 토큰)를 예측하도록 학습한다.

<mask>를 제외한 문장 내 단어들을 통해 <mask>를 예측

- BERT도 GPT-1과 마찬가지로 사람이 직접 데이터를 labeling할 필요가 없다.

- 단순히 랜덤하게 문장 속 단어만 가려주고, 가려진 단어를 맞추도록 학습하면 되는것.

 

결론 : GPT-1은 Unidirectional한 형태, 지금까지 나온 단어를 통해 다음 나올 단어를 예측하는 것을 학습시키는 모델, 반면 BERT는 Directional한 형태로 문장 내 단어들을 통해 mask된 단어를 예측하는 것을 학습시키는 모델.

 


2. BERT의 구조

- 이름에서 알 수 있듯이 BERT는 Transformer의 encoder를 기반으로 하여 인코더만 쌓아 올린 구조이다.

Bert 동작 방식

Step1) 인코더에 문장을 입력
Step2) Multi-head attention mechanism을 통해 각 단어의 문맥을 이해
Step3) 문장에 있는 각 단어의 문맥 표현을 출력으로 반환

-BERT 논문의 저자는 두가지 구성의 모델을 제안했다.

 (L: 인코더 층의 수, D: 인코더의 피드포워드 네트워크의 차원 수, A: 셀프 어텐션 헤드의 수)

  • BERT-Base : L=12, D=768, A=12, Total Parameters=110M
  • BERT-Large : L=24, D=1024, A=16, Total Parameters=340M

- 여기서 BERT-Base는 GPT-1과 하이퍼파라미터가 동일한데, 이는 BERT 연구진이 직접적으로 GPT-1과 성능을 비교하기 위함.

- BERT-Large는 BERT의 최대 성능을 보여주기 위해 만들어진 모델. (Bert가 세운 기록들은 이 구조로 이루어졌음.)

 


3.  BERT의 학습방식

- BERT가 높은 성능을 얻을 수 있었던 것은, label이 없은 방대한 데이터로 모델을 사전 학습 시키고(Pre-Trained Model)

- 사전학습된 모델을 기반으로 label이 있는 다른 Task에 대해 파라미터를 파인 튜닝(Fine-Tuning)하는 방식을 채택했기 때문이다.

 

- 먼저 BERT에서 입력 데이터를 구조화하는 방식부터 살펴보자.


3.1 BERT의 입력 표현

- BERT 모델에 데이터를 입력하기 전에 다음 세 가지 임베딩 레이어를 기반으로 입력 데이터를 임베딩으로 변환해야 한다.

  • 토큰 임베딩(Token Embedding)
  • 세그먼트 임베딩(Segment Embedding)
  • 위치 임베딩(Position Embedding)

- 즉, Bert의 input representation은 그림과 같이 세 가지 임베딩 값의 합으로 구성된다.

- Bert의 입력값으로는 한 문장뿐 아니라 두 문장도 받을 수 있다. 

한 문장을 입력으로 받아 자연어 처리하는 Task로는 스팸, 긍정부정 분류 모델.
두 문장을 입력으로 받아 자연어 처리하는 Task로는 질의 및 응답이 있다.

- Bert는 한 문장 또는 두 문장의 학습 데이터를 통해서 토큰(단어) 간 상관관계 뿐 아니라 문장 간 상관관계도 학습하게 된다. 

 

1) 토큰 임베딩 ( Token Embedding )

- 토큰 임베딩은 말 그대로 문장들을 모두 토큰화해 토큰들을 추출한다.

- 위 그림을 보면 다음 두 문장을 토큰화 한 것을 볼 수 있다.

  • A: My dog is cute.
  • B: He likes playing.

- 첫번째 문장의 시작 부분에는 [CLS] 토큰을 사용하며 이는 분류 작업에 사용된다.

- 두 문장이 입력값으로 받아들여진 경우 [SEP] 토큰을 통해 두 문장을 구분한다. 즉, [SEP]는 문장의 끝을 나타내는데 사용된다.

 

- Token Embedding은 Word Piece 임베딩 방식을 하용한다.

- 다음 그림과 같이 Word Piece 임베딩은 단순히 띄어쓰기로 토큰을 나누는것 보다 효과적으로 토큰을 구분한다.

 

- 위 그림을 보면 playing이라는 단어가 play와 ##ing이라는 하위 단어(sub-word)로 분할되는 것을 볼 수 있다.

- BERT는 Word Piece Embedding을 사용하여 다음과 같이 토큰화 한다.

  • 단어가 어휘 사전에 있다 -> 그 단어를 토큰으로 사용.
  • 단어가 어휘 사전에 없다 -> 그 단어를 하위 토큰으로 분할하여 하위 단위가 어휘 사전에 있는지 확인.

- 만약 하위 단어가 어휘 사전에 없다면 다시 하위단어로 분할한다.

- 이런식으로 개별 문자에 도달할 때까지 어휘 사전을 기반으로 하위단어를 계속 분할하고 확인한다.

 

- 위와 같은 방식으로 토큰화 하면 두가지 장점이 존재한다. 

  1. 위 그림을 보면 play라는 단어는 놀다라는 뜻이 있고, -ing라는 단어는 현재 무엇을 하고 있다는 의미가 명확히 있기 때문에 딥러닝 모델에 이 두가지 단어의 의미를 명확히 전달 할 수 있다.
  2. 이렇게 쪼개서 입력하게 될 경우, Googling, Texting과 같은 사전에 없는 신조어같은 단어들도 Google과 ing, Text와 ing처럼 모델이 학습단계에서 봤을만한 단어들로 쪼개서 입력되기 때문에 흔치 않은 단어들에 대한 예측이 향상됨

- 즉 이전에 자주 등장하지 않은 단어를 전부 Out-of-vocabulary(OOV)로 처리하여 모델링의 성능을 저하했던 문제를 해결할 수 있다.

 

* 하위 단어 토큰화 알고리즘 

더보기

하위 단어 토큰화 알고리즘 

- 하위 단어 토큰화 알고리즘은 OOV 단어 처리에 매우 효과적이기 때문에 BERT, GPT-3을 포함한 많은 자연어 모델에서 널리 사용됨.

- 먼저 기존의 단어 토큰화 알고리즘의 문제점에 대해 살펴보자. 


기존의 단어 토큰화 알고리즘의 문제점

 - 모델은 어휘 사전을 구축하기 위해 데이터셋에 있는 텍스트를 공백으로 분할하고, 모든 고유 단어를 어휘 사전에 추가한다.

- 일반적으로 어휘 사전은 많은 단어로 구성되지만 여기서는 다음 단어로만 구성되었다고 가정해보자.

vocabulary = [game, the, I, played, walked, enjoy]

 

-  이제 'I play the game'이라는 입력 문장에서 토큰을 생성해 본다.  공백을 기준으로 분할하여 문장의 모든 단어를 얻는다.

- 즉, [I, play, the, game]을 얻게 된다.

- 이제 어휘 사전에 위 단어가 있는지 확인한다. 모든 단어가 어휘 사전에 있기 때문에 주어진 문장에 대한 최종 토큰은 다음과 같다.

tokens = [I, played, the, game]

 

- 이번에는 'I enjoyed the game'이라는 입력 문장에서 토큰을 생성해 보자. 

- [I, enjoyed, the, game]을 얻게 된다.

- 어휘 사전에 위 단어들이 있는지 확인해 보면 enjoyed를 제외하고 어휘사전에 모든 단어가 있다.

- 하지만 enjoyed라는 단어는 어휘 사전에 존재하지 않기 때문에, <UNK>(unknown) 토큰으로 대체한다. 

tokens = [I, <UNK>, the, game]

 

- 어휘 사전에 enjoy라는 단어가 있지만, 단어 enjoyed는 없기 때문에 이 토큰은 <UNK>와 같이 '알 수 없는 단어'로 표시된다.

- 이러한 문제점을 해결하기 위해 어휘사전을 더 크게 할 수 있으나, 이는 모델의 메모리 부족 문제와 성능 문제를 일으킬 수 있다.

- 이러한 이슈를 하위 단어 토큰화 알고리즘이 해결할 수 있다.


- 하위 토큰화 알고리즘은 공백을 기준으로 나눈 단어들을 어휘사전에 검색해보고, 없는 단어가 있는 경우 하위 단어로 쪼갠 후 검색한다.

tokens = [I, enjoy, ##ed, the, game]

- ed라는 단어 앞 ## 기호는 ed가 하위 단어이고 앞에 다른 단어가 있음을 나타낸다.

- 단어의 시작 부분에 해당하는 하위 단어 enjoy에는 ##기호를 추가하지 않는다. 

 

- 그렇다면 분할할 단어와 분할하지 않은 단어를 어떻게 결정할까? 이 질문에 대한 답변은 하위 단어 토큰화 알고리즘에 있다.

 

- 하위 단어 토큰화 알고리즘들 중 세가지에 대해 설명해보겠다.

 

1) Byte Pair Encoding(BPE)

- BPE 알고리즘의 단계는 다음과 같다.

  1. 빈도수와 함께 주어진 데이터셋에서 단어 추출
  2. 어휘 사전의 크기 설정
  3. 단어를 문자 시퀀스로 분할 
  4. 문자 시퀀스의 모든 고유 문자를 어휘 사전에 추가
  5. 빈도가 높은 기호 쌍을 선택하고 병합 및 어휘 사전에 추가
  6. 어휘 사전 크기에 도달할 때까지 앞 다섯 단계 반복

- 이렇게 만들어진 다음과 같은 어휘 사전을 생성했다고 가정해 보자.

vocabulary = [a,b,c,e,l,m,n,o,s,t,u,st,me,men,be]

 

- 이제 입력 단어 'mean'을 토큰화 해보자.

1. mean 이라는 단어를 어휘사전에 존재하는지 검색
2. 없으므로 하위 단어 [me,an]으로 분할.
3. 'me'는 어휘 사전에 있지만, 'an'은 없으므로 하위 단어 'an'을 분할
4. tokens = [me, a, n]

- 이제 입력단어 'bear'를 토큰화 해보자.

1. bear 이라는 단어를 어휘사전에 존재하는지 검색
2. 없으므로 하위 단어 [be,ar]으로 분할.
3. 'be'는 어휘 사전에 있지만, 'ar'은 없으므로 하위 단어 'ar'을 분할하여 확인
4. 'a'는 있지만, 'r'은 없는 상황.
5. 'r'은 개별 문자이므로 분할을 수행할 수 없는 상황. 'r'은 <UNK>토큰으로 교체.
tokens = [be, a, <UNK>]

- 입력 단어가 'men'일 경우

1. 어휘 사전에 'men'이라는 단어가 있으므로 해당 토큰이 반환된다.
tokens = [men]

2) Byte-level Byte Pair Encoding(BBPE)

- BPE와 매우 유사하게 작동하지만, 문자 수준 시퀀스를 사용하는 대신 바이트 수준 시퀀스를 사용.

- 단어 'best'를 문자 시퀀스로 변환해보자.

tokens = [b,e,s,t]

-단어 'best'를 바이트 시퀀스로 변환해보자.

tokens = [62,65,73,74]

- 이러한 바이트 수준 BPE는 다국어 설정 및 OOV 단어 처리에 효과적이라 여러 언어로 어휘 사전을 공유하기 좋다.

 

3) Wordpeice Encoding

- BPE와 유사하게 동작하지만

- 단, 고빈도 기호쌍을 식별하고 추가할 때 빈도가 아닌 가능도를 확인한다.

- 다음과 같이 기호 쌍 s 및 t의 가능도를 계산한다. $$\frac{p(st)}{p(s)p(t)}$$

 

2) 세그먼트 임베딩 ( Segment Embedding )

- Segment Embeddings는 주어진 두 문장을 구분하는데 사용된다. 

- 아래 두 문장을 토큰화하면 다음과 같은 결과를 얻는다. 

  • A: My dog is cute.
  • B: He likes playing.

- [SEP] 토큰과 별도로 두 문장을 구분하기 위해 모델에 일종의 지표를 제공해야 한다.

- 이를 위해 세그먼트 임베딩 레이어에서 입력 토큰을 제공한다. 

- 위 그림은 입력 토큰이 A에 속하면 $E_A$를, B에 속하면 $E_B$에 매핑된다.

 

- 문장이 하나있는 경우, 문장의 모든 토큰이 $E_A$에 매핑된다.

 

3) 위치 임베딩 ( Position Embedding )

- Position Embedding은 토큰의 순서를 인코딩한다.

- 그 이유는 BERT는 Transformer의 encoder를 사용하는데, Transformer는 Self-Attention 모델을 사용한다.

- Self-Attention은 입력의 위치에 대해 고려하지 못하므로 토큰의 위치 정보를 주어야 한다.

- Transformer에서 위치 인코딩에 sin, cos 함수를 사용한 것 같이 BERT에서도 sin cos함수를 사용한 위치 인코딩을 제공하고 있다.

 

 

결론: 입력 문장을  토큰으로 변환하고, 토큰을 토큰 임베딩, 세그먼트 임베딩, 위치 임베이 레이어에 공급하고 임베딩들을 얻는다.
그 다음으로 모든 임베딩을 합산해 BERT에 입력으로 제공된다. 

3.1 BERT의 사전 학습 전략

- BERT는 사전학습(Pre-Training)과 파인 튜닝(Fine-Tuning) 의 두 단계로 나뉘게 된다.

 

* 사전학습에서의 BERT와 GPT의 차이점

더보기

BERT와 GPT 차이점

- GPT는 선행학습된 모델 그 자체로 여러가지 Task를 수행 가능, 다만 그 모델 크기가 상당히 큼.

- BERT는 모델이 상대적으로 작으며, 각각의 Task를 수행하기 위해 Fine-Tuning이라는 과정이 필요.

- GPT는 모델을 학습시키기 위해 엄청난 시간과 돈이 든다.

- 하지만 BERT는 GPT에 비해 적은 시간과 돈이 들지만, Fine-Tuning이라는 과정이 필요함.

 

- BERT는 다음 두가지 Task에 대해 사전학습된다.

  1. 마스크 언어 모델링(Masked Language Model) MLM
  2. 다음 문장 예측(Next Sentence Prediction) NSP

* 언어 모델링(Language Modeling)이란..?

더보기

- 보통 언어 모델링(Language Modeling)은 일반적으로 임의의 문장이 주어지고, 단어를 순서대로 보면서 다음 단어를 예측하도록 모델을 학습시킨다.

 

- 언어 모델링은 다음 두 가지로 분류할 수 있다.

    1. 자동 회귀 언어 모델링(auto-regressive language modeling)

       - 자동 회귀 언어 모델링은 전방(left-right)혹은 후방(right-left)예측 두가지 방식으로 구분된다.

       - 한 방향으로만 문자를 읽으므로 '단방향 언어 모델'이라고 할 수 있다.

 

    2.자동 인코딩 언어 모델링(auto-encoding language modeling)

       - 자동 인코딩 언어 모델링은 전방, 후방 예측을 모두 활용한다.

       - 즉 예측을 하면서 양방향으로 문장을 읽는다.

       - BERT는 자동 인코딩 언어 모델로, MLM을 사용한다. 

 

 

3.1.2 마스크 언어 모델링(Masked Language Modeling) MLM

- MLM은 일련의 단어가 주어지면, 그 단어를 예측하는 작업.

- 주어진 입력 문장에서 전체 단어의 15%를 무작위로 마스킹하고, 마스크된 단어를 예측하도록 모델을 학습시키는 것.

- 마스크된 단어를 예측하기 위해 모델은 양방향으로 문장을 읽고 마스크된 단어를 예측한다.

- 하지만 여기에 문제가 발생하게 된다.

- Fine-Tuning단계에서는 입력에 [MASK] 토큰이 들어가지 않는다.

- 그렇기 때문에 BERT가 사전 학습되는 방식과 파인 튜닝에 사용되는 방식간에 불일치가 발생한다.

ex) Downstream Task가 감정 분석인 경우 굳이 [mask]토큰을 넣어 예측할 필요는 없어 사전훈련된 모델과 불일치가 발생.

- 이를 극복하기 위해 본 논문에서는 80-10-10%규칙을 이용한다.

- 주어진 토큰에서 마스킹된 15%의 단어들 중

  • 80%를 [mask] 토큰으로 대체
  • 10%를 임의의 토큰(임의의 단어)으로 대체
  • 10%는 어떠한 변경도 하지 않고 그대로 둔다.

* ##가 포함된 하위 단어가 마스크된 경우, 해당 하위 단어와 관련된 모든 단어를 마스킹한다.

또한 만약에 하위 단어와 관련된 모든 단어를 마스킹 하는 동안 비율이 15%를 초과하면 다른 단어의 마스킹을 풀어준다.

- 이렇게 토큰화 및 마스킹 후 입력 토큰을 토큰, 세그먼트, 위치 임베딩 레이어에 입력후 모두 합해 입력 임베딩을 얻는다.

- 이 입력 임베딩을 BERT에 넣으면 각 토큰의 표현 벡터를 출력으로 반환한다.

- 모델은 마스크된 토큰을 예측하기 위해 BERT에서 반환된 표현 벡터 R을 활성화 함수가 소프트맥스인 피드포워드 네트워크에 입력하여 마스크된 입력 단어를 예측한다.

- 물론 학습 초기에는 BERT의 피드포워드 네트워크 및 인코더 계측의 가중치가 최적이 아니므로 모델이 올바른 예측값을 반환하지는 않는다.

- 하지만 역전파를 통한 반복학습을 거치며 최적의 가중치를 학습하게 된다.

- MLM은 빈칸 채우기 태스크(cloze task)라고도 한다.

 

3.1.3 다음 문장 예측(Next Sentence Prediction) NSP

 

- NSP Task에서는 BERT에 두 문장을 입력하고, 두 번째 문장이 첫 번째 문장의 다음 문장인지 예측하는 이진 분류 문제이다.

- 두 문장 A와 B가 주어졌다고 가정해 보자

  • B문장이 A문장의 후속 문장일 경우 문장 쌍을 isNext로 표시해 B 문장이 A 다음 문장임을 알 수 있게 한다.
  • B문장이 A문장의 후속 문장이 아닐 경우 문장 쌍을 notNext로 표시해 B 문장이 A 다음 문장이 아님을 알 수 있게 한다.

- NSP Task에서 모델의 목표는 문장 쌍이 isNext 범주에 속하는지 여부를 예측하는 것이다.

  * 모델은 B가 A다음으로 이어지면 isNext를 반환, 아니면 notNext를 반환한다 따라서 NSP는 본질적으로 이진 분류 태스크다.

- NSP Task를 수행함으로써 모델은 두 문장 사이의 관계를 파악할 수 있다.

- 두 문장 사이의 관계를 이해하는 것은 질문-응답 및 유사 문장 탐지와 같은 Downstream Task에 유용하다.

 

그럼 NSP Task를 위한 데이터셋을 어떻게 얻을 수 있을까?
- 어떠한 말뭉치에서 데이터셋을 획득할 수 있다.
- 2개의 문서가 있다고 가정했을때
   > isNext 클래스의 경우 한 문서에서 연속된 두 문장을 가져와 isNext로 표시
   > notNext 클래스의 경우 한 문서에서 한문장, 임의의 문서에서 다른 문장을 가져와 notNext로 표시.
- isNext와 notNext 클래스를 각각 50%씩 유지해 클래스가 균형을 이룰 수 있도록 한다.

- NSP는 [CLS] 토큰의 표현 $R_CLS$ 토큰의 표현을 가져와 Softmax함수를 사용해 feedforward network에 입력한다.

- 그렇게 되면 문장 쌍이 isNext/notNext 에 대한 확률값을 반환한다.

- 다른 표현값은 모두 무시한채 [CLS] 토큰만 넣는 이유는 [CLS] 토큰기본적으로 모든 토큰의 집계 표현을 보유하고 있어 문장의 전체적인 의미를 담고 있는 토큰이기 때문이다.

- 피드포워드 네트워크 및 인코더 계층의 가중치는 반복학습을 통해 최적의 가중치를 학습하게 될것이다.


3.2 BERT의 사전 학습  절차

- BERT의 사전학습에는 토론토 책 말뭉치(Toronto BookCorups) 및 위키피디아 데이터셋을 사용한다.

 

1) 말뭉치에서 두 문장을 샘플링한다.

   - 두 문장의 총 토큰 수의 합은 512보다 작거나 같아야 한다.

   - 두 문장을 샘플링할 때 전체의 50%는 B문장이 A문장의 후속문장이 되도록, 나머지 50%는 B문장이 A문장의 후속문장이 아닌 것으로     샘플링한다.

 

2) Word Peice Embedding 방식을 사용하여 문장을 토큰화 한다.

 

3) 80-10-10% 에 따라 주어진 토큰의 15%를 무작위로 마스킹한다.

 

4) 토큰을 BERT에 입력하고, [MASK] 토큰을 예측함과 동시에 B문장이 A문장의 후속 문장인지 여부를 분류하게 한다.

   - 즉, MLM과 NSP 작업을 동시에 사용하여 BERT를 학습시킨다.

   - BERT는 총 100만 스텝을 학습시키고, 각 스텝당 batch size = 256이다.

   - 학습률은 $lr = 1e-4, β_1 = 0.9 , β_2 = 0.999$로 설정하고 optimizer는 adam이다.

   - 웜업 스텝은 1만 스텝으로 학습을 진행한다.

*웜업 스텝이란..?

더보기

학습률 스케쥴링

- 학습이 진행되면, 높은 학습률을 설정해 학습 초기에 모델의 큼 변화를 유도(학습 초기에는 수렴과 거리가 멀기 때문에 모델에 과감한 변화를 줌)

 - 학습 후반에는 낮은 학습률을 설정해 모델에 작은 변화를 주어 최적화 한다(후반에는 수렴에 가까워지기 때문에 모델에 작은 변화를 줌)

 

- 즉, 학습 초기에 학습률 값을 높게 설정한 다음 학습이 진행되면서 학습률을 감소시키는 것을 학습률 스케쥴링이라고 함.

 

- 웜업 스텝도 학습률 스케쥴링의 일부.

- 학습률이 $1e-4$이고, 웜업 스텝이 총 1만 스텝이라고 가정하면, 초기 1만 스텝은 학습률이 0에서 $1e-4$만큼 선형적으로 증가한다는 것을 의미한다.

- 1만 스텝 후에는 학습률을 선형적으로 감소시키게 된다.

- 또한 드롭 아웃확률이 0.1인 모든 레이어에 드롭아웃을 적용한다.

- BERT에서는 GELU라는 활성화 함수를 사용하는데, 이는 가우시안 오차 선형 유닛(Gaussian Error Linear Unit)을 의미한다.

 

*GELU

더보기

GELU

 

- 최근 BERT, Wave2Vec 2.0 같은 최신 논문에서 많이 사용하는 성능이 뛰어난 함수.

- Dropout, zoneout, ReLU 함수의 특성을 조합하여 유도하였으며, ReLU의 smoothing 버젼이라 할 수 있다.

- ReLU의 경우 입력이 0보다 작아지는 순간 기울기가 0이 되기 때문에 파라미터들의 업데이터가 멈춘다. (dying ReLU)

- 반면 GELU는 죽이기 애매한 값들은 매우 완만한 기울기 0.0000001정도의 그레디언트를 곱해 살려는 주는 중용을 가짐.

 

'책 정리 > 구글 Bert의 정석' 카테고리의 다른 글

5장. 지식 증류 기반 BERT 파생 모델  (0) 2023.02.08
4.4장-Span BERT  (0) 2023.02.01
4-3장. ELECTRA  (1) 2023.02.01
3장. BERT 활용하기  (2) 2023.01.31
1 . 트랜스 포머  (1) 2023.01.02