OpenAI의 GPT-2는 NLG(Natural Language Generation)에서 가장 탁월한 성능을 보인다고 알려져 있습니다.
소설을 작성하는 데모를 제공함으로써 그 뛰어난 능력을 세상에 알렸죠. 그래서 흔히 소설쓰는 인공지능 모델이라고 많이 불립니다.
본 포스트에서는 GPT-2의 이론과 구조를 이해한 뒤, 이를 사용해보는 것을 목표로 합니다.
단순히 pre-trained된 모델을 돌려보는 것만에서 그치지 않고 fine-tuning하는 법까지 차근차근 적어보겠습니다.
목차는 다음과 같습니다.
<Table of Contents>
- What is GPT-2
- 언어 모델(Language Model)
- Transformers for Language Modeling
- Bert vs GPT-2
- Architecture : gpt-2의 구조
- Byte Pair Encoding, BPE
- Input Encoding : Positional Encoding
- Decoder Stacks : Self-attention
- Model Output
- Finetuning GPT-2
What is GPT-2
1. 언어 모델(Language Model)
언어 모델을 정의하기 전에, 사회과학 분야에서 부르는 모델의 의미를 명확하게 알고 넘어가야 합니다.
모델이란?
- 자연 법칙을 컴퓨터가 모사함으로써 시뮬레이션이 가능하게 한 것
- 이전 state를 기반으로 다음 state를 예측할 수 있다.
모델에 대한 설명에서 가장 중요한 포인트가 되는 단어들을 볼드 처리 해놓았습니다.
즉, 모델은 무언가에 대한 모사이며 예측입니다.
언어 모델이란?
- 자연어의 법칙을 컴퓨터로 모사한 것
- 주어진 단어들(이전 state)로부터 그 다음에 등장할 단어(다음 state)의 확률을 예측하는 방식으로 학습
사람의 언어, 즉 자연어는 단어들로 이루어진 시퀀셜 데이터입니다.
각 단어들은 불연속적 단위이기 때문에 각각에 대힌 확률값을 얻을 수 있습니다. 앞뒤 단어의 출현에 따라 각 단어의 확률값이 달라지죠.
즉, 언어 모델은 단어 시퀀스에 확률을 할당하는 모델입니다.
주어진 문장이 얼마나 자연스러운 표현인지 계산해 학습함으로써 가장 자연스러운 다음 단어를 예측하는 것이죠.
언어를 모델링하기 위해서는 매우 큰 코퍼스가 필요합니다. 일상 생활의 언어 분포를 근사해야하기 때문이죠.
Good Langauge Model
이러한 의미에서 좋은 언어 모델이란 다음과 같이 이야기할 수 있습니다.
- 그 언어의 의미/통사적 특성이 잘 반영된 모델
- 문맥이 잘 반영된 모델
마치 생성문법(Generative Grammar)에서 좋은 문법에 대한 정의와 유사하네요.
A good grammar should be able to explain the language phenomena in a language well enough.
GPT-2도 언어 모델입니다. 그것도 좋은 언어 모델이라고 할 수 있죠.
GPT-2는 WebText라 불리는 40GB 크기의 거대한 코퍼스에다가 인터넷에서 크롤링한 데이터를 합쳐서 훈련시킨 언어 모델입니다.
가장 작은 크기의 GPT-2모델 파라미터들을 다 저장하는데만도 500MB의 저장공간이 필요하다하니, 얼마나 큰 코퍼스로, 얼마나 많이 학습시켰는지 알 만하죠.
2. Transformers for Language Modeling
어텐션(Attention) 기법이 개발되고 난 뒤로, 뛰어난 성능을 가진 많은 언어 모델들이 생겨났습니다.
처음 어텐션이 적용된 분야는 기계번역(Machine Translation)이었습니다. 기존게 사용하던 seq2seq에 어텐션을 적용함으로써 성능을 높였죠.
어텐션만으로 구성된 트랜스포머(Transformer)도 등장했습니다.
트랜스포머는 인코더와 디코더 스택으로 구성되어 있습니다.
이에 그치지 않고, 트랜스포머의 인코더 혹은 디코더만 사용해야한다는 주장들이 등장했습니다. 그리고, 이렇게 등장한 것이 그 유명한 BERT와 GPT-2입니다. BERT는 트랜스포머의 인코더 스택만 사용한 모델이고, GPT-2는 디코더 스택만 사용한 모델이죠.
각각에 대한 간단한 내부 구조와 그에 따른 차이점을 살펴봅시다.
BERT vs GPT-2
Encoder & Decoder cell
인코더셀과 디코더셀의 차이점 중 가장 주목해야하는 것은 제일 첫번째 레이어입니다.
Encoder는 단순한 self-attention 레이어를 사용하는 반면, Decoder는 Masked Self Attention을 사용합니다.
이 말을 즉, BERT와는 다르게 gpt-2는 셀프 어텐션을 계산할 때 해당 스텝의 오른쪽에 있는 단어들은 고려하지 않는다는 것을 의미합니다.
Auto-Regressive
GPT-2는 자기 회귀 모델(auto-regressive model)입니다. 자기 회귀 모델이란 이전의 출력이 다음의 입력이 되는 모델을 의미합니다. 즉, RNN과 같은 것이죠! 반면, BERT는 자기 회귀 모델이 아닙니다.
이 둘의 장단점은 매우 확실합니다:
-
평범한 Self-Attention을 사용하며 자기 회귀 능력을 포기한 BERT는 다음 단어의 예측 능력은 덜 하지만, 맥락 정보를 충분히 고려할 수 있습니다.
-
반면, Masked Self-Attention을 사용하는 자기회귀 모델인 GPT-2는 다음 단어의 예측 능력은 뛰어나지만, 해당 단어의 이후에 있는 맥락 정보들을 이용할 수 없습니다.
3. Architecture : gpt-2의 구조
Byte Pair Encoding (BPE)
gpt-2는 Byte Pair Encoding를 거친 토큰을 입력 단위로 사용합니다.
BPE는 서브워드를 분리하는 알고리즘으로, 빈도수에 따라 문자를 병합하여 서브워드를 구성합니다. 단어를 문자(char) 단위로 쪼갠 뒤, 가장 빈도수가 높은 쌍을 하나로 통합하는 과정을 반복하여 토큰 딕셔너리를 만듭니다.
앞으로 단어, 토큰이라고 불리는 것은 모두 BPE token을 의미합니다.
Input encoding
문장의 시작을 알리는 start token과 문장의 끝을 알리는 end token이 각 문장마다 붙어있다고 가정해봅시다.
다른 자연어처리 모델들과 마찬가지로, gpt-2도 입력으로 임베딩 행렬을 받습니다.
그런데, 그냥 이 행렬을 입력으로 넣는 것이 아니라, Positional Encoding을 추가적으로 거쳐야 합니다.
Positional Encoding이란
positional encoding이란 각 단어에 순서 정보를 추가하는 것을 의미합니다. 즉, 문장 내 단어의 순서들을 넘겨준다고 생각할 수 있습니다.
이를 통해서 RNN의 최대 장점이었던 순서 정보의 고려가 트랜스포머에서도 가능해졌습니다.
gpt-2에서도 positional encoding을 거칩니다.
즉, 다음과 같이 정리할 수 있겠네요:
input token = embedded token + positional encoding
Decoder Stacks
과정은 단순합니다. 입력 벡터는 각 디코더셀의 self-attention 과정을 거친 뒤, 신경망 레이어를 지납니다. 이 과정은 스택에 있는 디코더셀, transformer block의 개수만큼 진행됩니다.
살펴봐야할 것은 self-attention입니다. gpt-2를 이해하기 위해서 필수적이므로, 간단하게만 보고 넘어갑시다!
Self-Attention
맥락 정보 없이 언어를 완전히 이해하는 것은 불가능합니다.
단어들의 조합인 문장의 의미는 다음의 절차를 겪으며 의미가 확정되기 때문입니다:
Process of Composition
1) Lexical component + Grammatical meaning + Syntactic strcture = Compositonal meaning (one or more)
2) Fix referent (by context)
3) Disambiguation (by context)
4) Meaning shift to fit context
즉, 언어는 단순한 단어의 조합으로는 이해할 수 없으며 맥락을 필요로 합니다.
다만, 컴퓨터로는 아직 의미를 완전히 표현할 수 없습니다. 그러나, 어느정도 맥락을 고려할 수 있게 하는 기법이 attention입니다. 특히 어떠한 것이 어떠한 것과 연관이 있는지 잘 드러냅니다. 그 중 Self-attention이란, 내 자신을 가장 잘 드러내는 것입니다.
밑의 정리글을 보면서 흐름을 이해하시면 됩니다.
Self-attention이란 이 과정을 자기 자신에 대해서 수행한 것이죠.
Attention, self-attention, masked self-attention에 대한 자세한 내용은 다음 포스트를 참고하세요!
Model Output
모든 디코더 블럭을 거친 최종 결과물은 입력값에 대한 최종 셀프 어텐션값을 가지고 있습니다. (파란색)
이를 우리가 가진 임베딩 벡터와 곱해주면 (초록색), 각 단어가 다음 단어로 등장할 확률값이 나옵니다. (보라색)
이 중에서 가장 확률값이 높은 것이 출력값이 되며, 또 다음의 입력값이 됩니다.
'Natural Language Processing' 카테고리의 다른 글
[NLP with D.L] 1) Word Representation, Word Sense and Word2Vec with Gensim (0) | 2020.09.08 |
---|---|
All about GPT-2 : 이론부터 fine-tuning까지(2) (1) | 2020.07.27 |