본문 바로가기
Bigdata

Transformers - 구조와 BERT, GPT 이해

by 올엠 2024. 8. 11.
반응형

Transformer는 현재 ChatGPT와 Bert, KoAlpaca등 대규모 언어모델(LLM, Large Language Model)분야에서 가장 크게 성장하고 있는 모델로써, 스스로 Transformer를 이해하기 위해 정리할 필요성이 있다고 느껴서 여기에 정리해 본다.

Transformer

Transformer는 영화 Transformers와 연관성이 전혀 없지만, 지금 보면 자유로이 입력을 출력으로 만들 수 있는 정의를 준것이 아닌가 라는 생각이 든다. Transformer 논문은 2017년 Attention Is All You Need 라는 이름으로 https://arxiv.org/abs/1706.03762  거제되었고, 기존 CNN, RNN등을 사용했을 때보다 높은 성능을 내면서 많은 관심을 받으며, 현재 Bert(이후 Bard) ChatGPT(GPT, Generative pre-trained transformer 관련)으로 확대되었다.

Attention 방식은 번역 모델인 Seq2Seq에서 선보인 입력된 단어의 번역에 연광성있는 단어를 찾는 방법으로 Transformer에서는 Self-Attention을 통해 입력 단어간의 연관성을 찾게 된다.

Attention Visualizations Input-Input Layer

모델 구조

논문에서 가장 중요한 전체 모델 구조는 아래와 같다.

입력과 출력 부분에 처리하는 과정이 거희 동일하게 Multi-Head Attention을 이용해 입력 문장의 단어들의 연관성을 파악하고 출력에서는 Encoder의 결과와 Masked Multi-Head Attention을 통해서 다음 단어(혹 문장)을 예측하는 어떻게 보면 단순하지만 현재 가장 강력한 LLM 모델로 자리 잡았다.

이유는 Attention을 이용해서 Ecoder는 단어간 연관성을 사람이 문장을 이해하는 것과 비슷하며(중요한 단어 찾기),
Decoder는 다음에 나올 단어, 문장을 제시함으로써, 사람과 가장 유사한 판단을 한다고 할 수 있다는 점이다.
그렇다면, Transformar를 이해하고자 하기 위해 가장 기본이 되는 하이퍼 파라메터에 대해서 이해해 보자.
 

하이퍼 파라메터(설정값)

1. dmodel
 
d라고도 쓰며, 입력과 출력의 크기로써 차원의 크기라고 할 수 있다. 이 차원에 값을 Embedding 한다.

2. num_layers
 

인코더와 디코더의 레이어 층이다. 모델 구조에서 Nx로 표현된 것으로 레이어 갯수만큼 반복적으로 진행하며, GPT2 의 가장 작은 모델은 12개의 레이어를 가지고 있었다.

 

3. num_heads
Transformar 에서 Multi-Head self Attension 이라고 하는데, 이때 분할 해서 병렬로 수행할 어텐션 개수이다.
 
4. ffn_num_hiddens
 
Transformar 내부에 존재하는 Feed Forward 피드 포워드 신경망이 존재하는데, 이 은닉층의 크기를 의미한다. 피드 포워드 신경망의 입력 차원과 출력 차원의 크기는 앞의 d와 같다. 

 
그럼 인코더부터 단계별로 이해를 진행해보자.

1. Encoder

1. 가장 먼저 해야 할 일은 Vector화 하여 Embedding 하는 것이라고 할 수 있다.
 
Vector는 특정 성질이 설정된 값을 의미한다. 그리고 Embedding은 이를 특정 모델에서 사용할 수 있도록 변환한 것으로 
 
만약 I am allmnet이라는 문장을 Transformer에 넣기 위한 작업을 각 단어를 입력할 수 있도록 변환 한다고 생각하면 되겠다.
 
Vector(특정 성질를 의미하는 값)화하여 Embedding(변환하는 작업)
 
여기에서는 각 단어의 위치값 pos 라고 하여 Vector화 된 값들이 Embedding 된다.
 
2. Transformer는 단어별 진행하지 않고, 입력값 전체를 넣기 때문에 단어별 포지션 정보를 위해 Positional Encoding 정보를 넣게 된다.
 
즉 입력 벡터와 인덱스(포지션 정보)가 함께 출력 차원에 저장된다.(pos, i)
 
3. 이후 모델 구조에서 처럼 num_layers의 갯수 만큼 (Multi-head Self-Attention x num_heads 병렬로)을 진행하여, Attention Score를 구하게 된다. 여기에서 Query, Key, Value에 대해서 이해할 필요가 있다.
 
Query: 현재 벡터
 
Key: 현재 벡터의 관계된 모든 벡터
 
Value: 각 Key로 구해진 가중치
 
앞서 논문에서 공개한 Query와 Key의 Value를 통해 구해진 값을 그래프로 표현하면 아래와 같다.
 
즉 사전에 학습된 가중치(W, Weight) 행렬을 이용해서 Query와 Key 의 관계를 Value에 저장한다고 생각하면 된다.
 


4. 그리고 값을 축소시키는 작업을 진행하게 된다.
 
이를 위해서 차원 수와 Head의 갯수만큼 d/hum_heads로 Q, K의 곱을 나누어 값을 축소 시킨후
 
5. 이를 softmax를 통해 값을 0과 1사이의 값으로 만들고
 
6. 그 결과를 Value와 곱하여 최종 Attention Value가 만들어 지게 된다.
 
이를 그림으로 요약하면 아래와 같다.
 

이후 Add & Norm 이라는 단계가 있는데, Add는 Multi-head로 각각 진행한 결과를 입력과 출력을 더해주는 과정이라고 생각하면 된다.
 
그리고 이 값을 Norm, LayerNormalization으로 각 층의 평균화하는 작업이 되겠다.
 
이러한 결과는 각각 인코더의 num_layers 만큼 생성되고, 마지막 층 인코더를 Decoder에게 보내면서 인코더 작업은 끝나게 된다.
 

Bert

Bert는 문맥을 고려한 언어 표현 벡터를 생성하도록 개발된 모델로, 
 
Transformers Encoder 모델 활용하여, MLM (Masked Language Model)과  NSP (Next Sentence Prediction)으로 사전 학습(Pre-trained)된 데이터를 미세조정(Fine-tuning)하여 사용하는 모델이다.
 
 
Bert 모델의 강점은 특정 문장이 주어질 때 가장 적절한 단어를 맞추는 지식/컨텐츠 검색 서비스에 유용한 모델이라고 할 수 있다. 
 
정리해보면 다음과 같다.
텍스트 생성 아닌 입력 문장에 대한 언어 정보를 표현하는 것이 목표으로,
텍스트가 가진 문맥 정보를 표현하는 것이 중요하고,이를 Fine-tuning으로 특정 Task 에 최적화 하는 접근방식을 사용한다.
GPT는 이와 상관없이 학습없이 텍스트 인터페이스로 사용자 명령으로 Task 수행을 하는 목적을 지향

GPT

GPT는 Generative Pre-trained Transformer의 약자
GPT-1은 OpenAI에서 2018년에 개발한 최초의 GPT모델
Radford, Alec, et al. "Improving language understanding by generative pre-training." (2018).
하나의 모델로 다양한 자연어 처리 Task에 대해서 state-of-the-art 성능을 보여주는 모델을 개발함, 즉 특정 작업을 위해서 개발되지 않아도 범용성이 좋은 하나의 모델로 대규모 데이터를 통해 필요한 튜닝을 거치면 더 좋은 성능을 낼 수 있다는 것을 증명하면서 급속도로 발전 하게 되었다.(기존 모델 대비 좋은 성능이 증명됨) 해당 영역은 아래와 같다.
 
자연어 처리 영역
Text Entailment (텍스트 연관성 인식) - 2가지 주어진 문장, 텍스트 간의 연관성을 파악하는 작업으로, 2개의 문장을 주고서 긍정인지 부정인지 중립인지를 파악하는 것이다.
SNLI (image captions), SciTail (science exams), QNLI (wiki articles), MNLI (transcribed speech and govt reports), RTE (news articles)
Semantic Similarity(문장간 유사도) -  2개의 문장의 의미 파악하는 작업, 동일한 의미인지 아닌지를 분별하는 것이다.
MRPC (paraphrase corpus), QQP (quora question pairs), STS-B(Semantic Textual Similarity Benchmark)
Reading Comprehension(문장 이해) - 독해 지문을 통해 문제를 이해하고 답을 맞추는 작업
RACE(Large-scale ReAding Comprehension Dataset From Examinations)
Commonsense Reasoning(상식 능력) - 상황을 주어주고 상식적인 답을 맞추는 작업
COPA(Choice of Plausible Alternatives), ROCStories
Sentiment Analysis(텍스트 감정 이해) - 문장, 텍스트를 통해 감정을 맞추는 작업
SST-2
Linguistic Acceptability(문법 오류) - 문장, 텍스트의 문법 오류를 맞추는 작업
CoLA
아래는 GPT 가 나오기 전에 가장 좋은 성능으로 유명한 SOTA(State of the art)모델보다 9개 영역에서 좋은 성능을 발휘한다는 것을 확인할 수 있다.
참조
https://openai.com/research/language-unsupervised
 
GPT 모델 구조는 Transformar의 Decoder 부분의 Masked Multi Self Attention 인 다음 단어 맞추는 모델이 기본 모델이라고 생각하면 된다.
 
GPT는 문장을 생성하는데 최적화 하여 개발된 Transformers Decoder 모델을 활용하는 모델로,
Generative pre-trained transformer라는 말처럼 사전 학습(Pre-trained) 을 시키는 부분이 크다.
사전 학습을 통해서 기본적인 언어 모델의 능력인 범용성 높은 텍스트로 문장을 잘 구사하도록 학습을 수행할 수 있고, 이후 Fine-Tuning을 통해 각각 개별 Task에 대한 성능도 함께 사용할 수 있는 모델이다. 이러한 이유로 현재 사전 학습 모델들이 많이 활용되어지고 있다.
그럼 이 사전 학습(Pre-trained) 은 어떻게 진행할 수 있을까?
사전 학습은 일반적인 말뭉치를 학습하는 것이라고 할 수 있다. 즉 특정 작업에 맞춰서 진행하는 것이 아닌, 다양한 문장을 통해 단어간의 연관성을 찾도록 하는 것이다. 이를 통해 보다 다른 모델보다 학습이 되지 않은 상황에서도 보다 높은 성능을 나올 수 있게 된다.
GPT-1의 경우 BookCorpus 데이터셋은 7000개의 판타지, 로맨스, 어드벤처 장르를 포함한 미출판된 책의 텍스트로 사전 학습을 진행하였다고 한다. 또한 모델이 Iong-term information을 잘 학습할 수 있도록 연속적인 긴 텍스트로 구성하여 진행하였다고 한다.
모델의 사전학습에 대해 조금 더 자세히 다루어 보면,
모델은 Transformer 기본 모델의 Decoder 부분을 활용하였고, 12개의 레이어를 가진 768개의 파라메터와 12의 Attention Heads를 활용하였다고 함
Position-wise feed-forward는 3072 차원의 Inner States를 사용하고, learning rate는 2.5e-4로 정수로 0.00025로 경사하강법으로 학습 파라메터로 512의 연속된 토큰으로 64개씩 랜덤하게 minibatch로 구성해 100번(epoch) 학습을 진행
 

미세 조정(Fine-Tunning)

이후 미세 조정(Fine-Tunning)을 진행하게 되는데, GPT는 특정 작업별로 모델을 만들지 않고, 모델 하나를 이용해서 다양한 자연어 처리가 가능하도록 구성하는게 목적이기 때문에, 이를 위해서 약간의 구성에 맞게 변환작업을 거치게 된다.
 
GPT에서는 Text Classification과 Question Answering, Text Entailment와 같은 작업을 처리할 수 있는데, 각 작업은 목적에 맞게 사용하기 위해서 구조적으로 다른다. 예를 들어 Question Answering 의 경우, Document, Question, Answer으로 구분하여 작업을 수행해야 하는데, 하나의 모델에서 처리하기 위해서 각각 작업 특성에 맞게 구분 토큰을 이용해서 연속된 테스트로 변경하여 이용하게 된다. 이때 사용되는 것이 <s>, <e> 그리고 구분하는 <$>와 같은 토큰으로 구조를 구분하게 된다.
 
아래 그림은 GPT에서 처리하는 대표적인 4가지 작업에 대한 구분 방식이다.


GPT 모델의 경우 모델 자체의 학습된 모델이 다수 공개 되어 있고, 이렇게 공개된 모델들이 범용성이 높은 텍스트 문장을 구사하는 모델이라고 할 수 있으며, 추가로 입력시점에도 사전 학습을 시켜 줄 수 있는 방법이 있는데 바로 In-Context Learning 이다.
 
In-Context Learning 은 사전에 유사한 질문을 몇가지 줌으로써, 올바른 결과를 만들어주는 방식인 Few-shot Learning(GPT-3에 사용됨)을 이용하여 보다 정확한 결과를 찾는 Text Generation에 초점이 맞춰진 모델이다.
 
즉 거대 언어 모들을 통해 In-Context Learning(추론을 통해 답을 찾는 모델)을 효과적으로 활용하기 위해 Few-shot Learning 을 활용함. 적은 데이터의 샘플로도 활용할 수 있는 장점이 있다.
 
GPT가 현재 잘 나가는 이유?
 
생성 모델과 Few-shot learning
 
- 입력 내용을 토대로 다음 단어가 생성이 되는 것을 목표
 
- Fine-tuning 없이도 few-shot 성능이 좋은 결과를 보임
 
- 모델 스케일을 키우면 성능이 좋아진다는 경향이 있음
 
- 명령어 만으로 사용자가 원하는 것을 쉽게 볼 수 있는 점
용어정리
Fine-tuning
용도가 명확하고 정확성을 요구하는 작업에 활용하기 좋다.(스팸 필터링)
In-Context Learning(zero-shot, one-shot, Few-shot Learning)
용도에 대한 정의가 정해지지 않고 즉시적인 답을 얻고자 할 때 유용로,
질문 시점에 학습을 시킴, 모델을 통해 빠르게 탐색하는데 효과적임

참고

https://github.com/karpathy/minGPT
https://github.com/openai/finetune-transformer-Im
https://openai.com/research/language-unsupervised

반응형