티스토리 뷰

728x90
반응형

구글 BERT의 정석

인공지능, 자연어 처리를 위한 BERT의 모든 것

 

 

위 책을 읽으며 정리한 내용입니다.

 

 

1장에 대한 내용을 보려면 아래 링크를 클릭!

[BERT 이해하기] "구글 BERT의 정석" 1장, 트랜스포머 입문

https://domdom.tistory.com/521

 

[BERT 이해하기] "구글 BERT의 정석" 1장, 트랜스포머 입문

구글 BERT의 정석 인공지능, 자연어 처리를 위한 BERT의 모든 것 위 책을 읽으며 정리한 내용입니다. 1장, 트랜스포머 입문 트랜스포머(transformer) : 자연어처리에서 주로 사용하는 딥러닝 아키텍처

domdom.tistory.com

 

 

 

2장, BERT 이해하기

 

 

가장 널리 사용되는 고성능 텍스트 임베딩 모델인 BERT는 자연어처리 태스크 분야에서 가장 성능이 뛰어남.

마스크언어모델링(MLM)과 다음문장예측(NSP) 두가지 태스크 기반 BERT모델이 어떻게 사전 학습을 진행하는지 살펴보자

 

 

1. BERT의 기본개념

BERT가 성공한 주된 이유는 문맥이 없는 워드투벡터(WORD2VEC)와 같은 임베딩 모델과 달리, 문맥을 고려한 임베딩 모델이기 때문임.

BERT는 문맥기반이므로 문장의 문맥을 이해한 다음 문맥에 따라 단어 임베딩을 생성함.

 

2. BERT의 동작 방식

BERT는 트랜스포머 모델을 기반으로 하며, 인코더-디코더가 있는 트랜스포머 모델과 달리 "인코더"만 사용함.

트랜스포머 인코더는 양방향으로 문장을 읽을 수 있기 때문에 양방향이고, 따라서 BERT는 기본적으로 트랜스포머에서 얻은 양방향 인코더 표현임.

 

3. BERT 구조

BERT 논문 저자들은 BERT-base, BERT-large 두 가지 구성의 모델을 제시함. (표준)

 

3-1. BERT-base

: 12개의 인코더 레이어가 스택처럼 쌓인 형태로 구성되어 있음. 모든 인코더는 12개의 어텐션 헤드를 사용하며, 인코더의 피드포워드 네트워크는 768개 차원의 은닉 유닛으로 구성됨.

따라서 BERT-base에서 얻은 표현 크기는 768임.

 

3-2. BERT-large

: 24개의 인코더 레이어가 스택처럼 쌓인 형태로 구성되어 있음. 모든 인코더는 16개의 어텐션 헤드를 사용하며, 인코더의 피드포워드 네트워크는 1,024개 차원의 은닉 유닛으로 구성됨.
따라서 BERT-large에서 얻은 표현 크기는 1,024가 됨.

 

 그밖에 BERT-tiny, BERT-mini, BERT-small, BERT-medium 등이 있음.

 

4. BERT 사전 학습

입력문장에 대한 적절한 표현을 생성하려면 BERT를 어떻게 학습시켜야 할까?
학습에 어떤 데이터셋을 사용해야 할까?
학습 방법은 무엇일까?

 

대표적인 사전학습 유형은 아래와 같음.

1) 특정 태스크에 대한 방대한 데이터셋으로 모델을 학습시키고 학습된 모델을 저장함.

2) 새 태스크가 주어지면 임의 가중치로 모델으 초기화하는 대신, 이미 학습된 모델의 가중치로 모델을 초기화함.

(새 태스크를 위해 새로운 모델로 처음부터 학습시키는 대신 사전 학습된 모델을 사용하고, 새로운 태스크에 따라 가중치를 조정함(파인튜닝))

 

BERT는 MLM과 NSP라는 두 태스크를 이용해 거대한 말뭉치를 기반으로 사전 학습됨.

사전학습된 BERT를 저장해두고, 새로운 태스크가 주어질 경우 BERT를 처음부터 학습시키는 대신, 사전학습된 BERT를 사용함. (=사전학습된 BERT를 기반으로 새 태스크에 대한 가중치 조정(파인튜닝))

 

 

 

BERT의 입력데이터 구조화 방식을 먼저 알아보자.

 

4-1. BERT 입력표현

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

 

1) 토큰 임베딩

: 문장을 모두 토큰화하여, 첫번째 문장의 시작 부분에만 [CLS] 토큰이라는 새 토큰을 추가하고, 모든 문장 끝부분에 [SEP]이라는 새 토큰을 추가함.

ex) tokens = [ [CLS], Paris, is, a, beautiful, city, [SEP], I, love, Paris, [SEP]]

: CLS 토큰은 분류작업에 사용되며, SEP 토큰은 모든 문장의 끝을 나타내는데 사용됨. 이후 토큰을 임베딩으로 변환함. 

 

2) 세그먼트 임베딩

: 주어진 두 문장을 구별하는데 사용됨. 

SEP 토큰과 별도로 문장들을 구분하기 위해 모델에 일종의 지표를 제공함.(= 세그먼트 임베딩 레이어에 입력토큰 제공)

세그먼트 임베딩 레이어는 입력에 대한 출력으로 Ea, Eb만 반환하는데, 입력토큰이 A문장에 속하면 토큰이 Ea에 매핑되고, B문장에 속하면 Eb에 매핑됨.

 

3) 위치 임베딩

: BERT는 트랜스포머의 인코더이므로 BERT에 데이터를 직접 입력하기 전에 문장에서 단어(토큰)의 위치에 대한 정보를 제공해야 함.

 

4) 최종 입력 데이터 표현

==> 입력 (토큰화) -> 토큰 임베딩 + 세그먼트 임베딩 + 위치임베딩

 

 

 

다음으로는 BERT에서 사용하는 워드피스 토크나이저에 대해 알아보자.

BERT는 "워드피스 토크나이저"라는 특별한 유형의 토크나이저를 사용함. 이는 하위 단어 토큰화 알고리즘을 기반으로 함.

워드피스 토크나이저란?

하위단어가 사전에 있는지 확인하여, 없다면 계속해서 단어를 분할시켜 개별문자에 도달할 때까지 어휘 사전을 기반으로 하위단어를 분할함.

이 방식은 어휘 사전 이외(OOV)의 단어를 처리하는데 효과적임.

ex) let us start pretraining the model --> tokens = [let, us, start, pre, ##train, ##ing, the, model]

(pretraining을 사전에 있을 때까지 쪼개었음. 해시기호는 하위단어임을 나타내고, 앞에 다른 단어가 있음을 의미함.)
--> 이후 [CLS]토큰과 [SEP] 토큰을 추가함.

 

 

5. 사전 학습 절차

BERT는 마스크언어모델링(MLM)과 다음문장예측(NSP) 두 가지 태스크에 대해 사전 학습됨.

MLM 태스크 설명 전 먼저 "언어 모델링" 태스크를 살펴보자.

 

5-1. 언어 모델링

: 언어모델링은 자동회귀 언어모델링, 자동 인코딩 언어모델링 두 가지로 분류됨.

동회귀 언어모델링은 전방예측(왼->오), 후방예측(오->왼)이 있고, 외쪽에서 오른쪽으로 읽으며 공백을 예측함.

자동 인코딩 언어모델링은 전방예측, 후방예측을 모두 활용함. 즉, 예측을 하면서 양방향으로 문장을 읽음. [양방향]

ex) Paris is a beautiful ___. I love Paris.

--> 양방향으로 문장을 읽으면 문장 이해 측면에서 더욱 명확해 지므로 더 정확한 결과를 제공함.

 

5-2. 마스크 언어 모델링(MLM)

BERT는 자동 인코딩 언어 모델로, 예측을 위해 문장을 양방향으로 읽음.
MLM은 주어진 입력문장에서 전체단어의 15%를 무작위로 마스킹하고, 문장을 양방향으로 읽어 마스킹된 단어를 예측하도록 모델을 학습시킴.

그러나 여기서 문제점이 발생하는데, 위같은 방식으로 토큰을 마스킹하면 사전학습과 파인튜닝 사이 불일치가 생기게 됨.

[MASK]토큰을 예측해 BERT를 사전 학습시키고, 감정분석과 같은 다운스트림 태스크를 위해 사전 학습된 BERT를 파인튜닝 하는데, 파인튜닝에는 입력에 [MASK]토큰이 없음.

이 문제를 극복하기 위해 80-10-10% 규칙을 적용함.

 

문장에서 토큰의 15%를 무작위로 마스킹하는데, 15% 토큰에 대해 다음을 수행함.

 

- 15% 중 80%의 토큰(실제단어)을 [MASK] 토큰으로 교체한다.

tokens = [[CLS], Paris, is, a, beautiful, [MASK], [SEP], I, love, Paris, [SEP]]

- 15% 중 10%의 토큰(실제 단어)을 임의의 토큰(임의단어)으로 교체한다. 적용 결과는 다음과 같다.

tokens = [[CLS], Paris, is, a, beautiful, love, [SEP], I, love, Paris, [SEP]]

- 15% 중 나머지 10%의 토큰은 어떤 변경도 하지 않는다. 적용 결과는 다음과 같다.

tokens = [[CLS], Paris, is, a, beautiful, city, [SEP], I, love, Paris, [SEP]]

 

 

토큰화 및 마스킹 후에 입력토큰을 토큰, 세그먼트, 위치 임베딩 레이어에 입력해 입력 임베딩을 얻음.

이제 이 입력 임베딩을 BERT에 제공하며, 마스크된 토큰을 예측하기 위해 BERT에서 반환된 마스크된 토큰 R[MASK]의 표현을 소프트맥스 활성화를 통해 피드포워드 네트워크에 입력함.

피드포워드 네트워크는 R[MASK]단어가 마스크된 단어가 될 확률을 반환하고, 확률이 높은 단어가 마스크된 단어일 확률이 높은 것임.

 

학습초기에는 BERT의 피드포워드 네트워크 및 인코더 계층의 가중치가 최적이 아니므로 모델이 올바른 확률을 반환하지 않음.

역전파를 통한 일련의 반복학습을 거치며 최적의 가중치를 학습하게 됨.

 

 

 

좀 더 어려운 전체 단어 마스킹 방법을 알아보자

 

5-3. 전체 단어 마스킹(WWM)

1) 토큰화한 문장에 CLS, SEP 토큰을 추가함

tokens = [[CLS] let, us, start, pre, ##train, ##ing, the, model, [SEP]]

2) 단어의 15%를 무작위로 마스킹함

tokens = [[CLS], [MASK], us, start, pre, [MASK], ##ing, the, model, [SEP]]

--> ##train 이라는 하위 단어에 마스킹이 되었음. 하위단어가 마스킹되면 해당 하위 단어와 관련된 모든 단어를 마스킹함

tokens = [[CLS], [MASK], us, start, pre, [MASK], [MASK], the, model, [SEP]]

3) 마스크 비율이 15%를 초과하면 다른 단어의 마스킹을 무시함

tokens = [[CLS], let, us, start, pre, [MASK], [MASK], the, model, [SEP]]

 


5-4. 사전 학습 절차

BERT의 사전학습에는 토론토 책 말뭉치 및 위키피디아 데이터셋을 사용함.

앞서 BERT는 MLM, NSP 태스크를 사용해 사전 학습된다고 했는데, 이 두 태스크를 사용해 BERT를 학습시키기 위한 데이터셋을 어떻게 준비할까?

먼저 말뭉치에서 두 문장을 샘플링하고, 두 문장의 총 토큰 수의 합은 512보다 작거나 같아야 함.

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

80-10-10% 규칙에 따라 토큰의 15%를 무작위 마스킹한 후, 토큰을 BERT에 입력하고 모델을 학습시키며, 동시에 B문장이 A문장의 후속문장인지 여부를 분류하게 함. 즉, MLM과 NSP 작업을 동시에 사용해 BERT를 학습시킴.

BERT는 총 100만 스탭을 학습시키고, 각 스탭당 배치크기 256 입력 시퀀스에 대해 학습시킴.

아담 옵티마이저를 사용하며, 웜업은 1만 스텝으로 학습을 진행함.

 

- 웜업 스텝이란?

학습이 진행되면, 높은 학습률을 설정해 학습초기에 모델의 큰 변화를 유도하고, 후반에는 낮은 학습률을 설정해 모델에 작은 변화를 주어 최적화 함.

이를 학습률 스케줄링이라고 하는데, 웜업스텝은 학습률 스케줄링의 일부임. 또한, 드롭아웃 확률이 0.1인 모든 레이어에 드롭아웃을 적용하고, BERT에서는 갤루라는 활성화 함수를 사용하는데, 이는 가우시안 오차 선형 유닛을 의미함.

 

 

6. 하위 단어 토큰화 알고리즘

어휘사전에 단어가 없으면 토큰은 알 수 없는 단어로 표시됨. 이 문제를 해결하기 위해 하위 단어 토큰화 알고리즘을 사용함.

다음과 같이 어휘사전이 있을 때,

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

토큰 리스트는 다음과 같이 구성됨.

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

사전에 존재하는 단어를 토대로, 하위단어 토큰화는 알 수 없는 단어, 즉 어휘 사전에 없는 단어를 처리함.

 

 

하위 단어 토큰화 알고리즘에는 아래와 같이 흥미러운 몇가지 방식이 있음.

1) 바이트 쌍 인코딩

2) 바이트 수준 바이트 쌍 인코딩

3) 워드피스

 

그중 BERT는 "워드피스 토크나이저"라는 특별한 유형의 토크나이저를 사용함.  (하위단어 토큰화를 기반으로 한)

 

 

다음 장에서는 BERT를 활용하는 방법을 배워본다.

728x90
반응형
댓글