GPT와 BERT, 두 모델의 공통점과 차이점에 대하여...
자연어처리(NLP)를 찍먹해본 경험이 있다면 GPT와 BERT, 이 2개의 모델은 한 번쯤은 들어봤으리라 생각한다. GPT(Generative Pre-trained Transformer)와 BERT(Bidirectional Encoder Representations from Transformers)은 자연어처리에 사용되는 대표 모델이다. 나 또한 자연어처리에 관심이 있는 사람으로써, 이 2개의 모델을 들어보고 활용한 서비스도 여럿 봐왔다. *요새 이슈인 챗GPT도 대표적으로 GPT 모델을 활용하여 만들어진 AI이다. 하지만 이 2개의 모델 차이가 뭐냐라는 질문에는 대답하지 못할만큼 얕은 지식의 소유자였다. 그렇기 때문에 이번에 2가지 모델의 차이점을 알아보고 정리해보았다.
모델 구조
GPT는 트랜스포머 디코더 모델을 사용하는 자연어 생성 모델이다. 이 모델은 텍스트 시퀀스를 입력으로 받아 다음 단어를 예측하고, 이를 반복하여 텍스트를 생성한다. GPT는 이전 단어들을 사용하여 다음 단어를 예측하므로 텍스트 생성 과정에서는 단방향으로 진행된다. 이는 GPT가 이전 문맥을 이해하고 다음 단어를 결정하는 데에 초점을 둔다는 의미이다.
반면, BERT는 트랜스포머 인코더 모델을 사용하는 양방향 자연어 이해 모델이다. BERT는 입력 문장의 양방향 정보를 모델에 전달하여 문맥을 이해한다. 이를 위해 BERT는 입력 문장을 양방향으로 인코딩하여 단어 임베딩을 생성한다. BERT는 모든 단어의 문맥 정보를 사용하여 단어의 의미를 파악하고 문장 전체의 문맥을 이해하는 데에 초점을 둔다는 특징이 있다.
따라서, GPT는 텍스트 생성에 특화되어 있으며, 단방향으로 진행되는 텍스트 생성 과정을 수행한다. 반면에 BERT는 텍스트 이해에 초점을 두고 있으며, 입력 문장의 전체 문맥을 고려하여 양방향으로 단어 임베딩을 생성한다. 이러한 방향성의 차이로 인해 GPT와 BERT는 서로 다른 자연어처리 작업에 적합하며, 각각의 장점을 가지게 된다.
학습 데이터
GPT와 BERT는 모두 사전학습된(pre-trained) 모델로, 대규모 텍스트 데이터셋에서 학습된다. 하지만 GPT와 BERT는 학습 데이터의 구성과 목표가 다르기 때문에 서로 다른 방식으로 학습된다.
GPT는 대규모 텍스트 코퍼스에서 비지도 학습을 통해 사전 학습된다. GPT는 주로 웹 크롤링 데이터, 온라인 문서, 뉴스 기사, 책, 블로그 등 다양한 텍스트 데이터를 사용하여 학습된다. 이러한 데이터는 다양한 주제와 다양한 문체의 텍스트를 포함하고 있다. GPT는 사전 학습 과정에서 다음 단어 예측과 같은 언어 모델링 태스크를 수행하면서 문맥을 이해하고 텍스트 생성 능력을 강화한다.
BERT는 사전 학습을 위해 동일한 데이터와 GPT와 유사한 대규모 텍스트 코퍼스를 사용할 수 있지만, 학습 과정에서의 목표는 다르다. BERT는 언어 모델링 뿐만 아니라 마스킹된 언어 모델링과 다음 문장 예측과 같은 다양한 태스크를 결합하여 학습된다. BERT의 학습 데이터에는 문장 쌍이 포함되어 있으며, BERT는 문맥 이해와 문장 관계 학습을 목표로 학습된다.
즉, GPT는 텍스트 생성 능력을 강화하기 위해 다음 단어 예측을 중심으로 학습되고, BERT는 문맥 이해와 문장 관계 학습을 위해 다양한 언어 모델링 태스크를 결합하여 학습된다고 볼 수 있다.
적용 분야
GPT와 BERT는 각각 다양한 적용 분야를 가지고 있다. 다음은 GPT와 BERT의 주요 적용 분야 몇 가지를 나열한 것이다.
GPT
- 자유로운 텍스트 생성: GPT는 이전 문맥을 기반으로 다음 단어를 예측하여 텍스트를 생성하는 데에 특화되어 있다. 따라서 GPT는 대화형 대답 생성, 글 작성 보조 도구, 콘텐츠 생성 등에서 활용될 수 있다.
- 대화형 AI 시스템: GPT는 자연어 이해와 텍스트 생성 능력을 결합하여 대화형 AI 시스템에 적용될 수 있다. 챗봇, 가상 비서, 대화 인터페이스 등에서 GPT는 사용자와 자연스러운 대화를 수행하는 데에 활용될 수 있다.
- 텍스트 감정 분석: GPT는 자연어 생성 능력을 통해 텍스트의 감정을 분석하는 데에 활용될 수 있다. 텍스트 감정 분류, 감성 분석, 감정 기반 추천 시스템 등에서 GPT는 감정 정보를 추출하고 분석하는 데에 사용될 수 있다.
BERT
- 텍스트 분류: BERT는 입력 문장의 문맥을 이해하고 문장의 의미를 파악하는 능력을 가지고 있어, 문장 분류 작업에 적용된다. 감정 분류, 질문 유형 분류, 문장 간 관계 분류 등에서 BERT는 뛰어난 성능을 보인다.
- 개체명 인식: BERT는 입력 문장의 양방향 정보를 활용하여 개체명을 인식하는 데에 적용된다. 개체명 인식 작업은 주로 정보 추출, 자연어 이해, 질의응답 시스템 등에서 활용된다.
- 질문 응답: BERT는 입력 질문과 문맥 문장 간의 관계를 이해하고, 질문에 대한 답변을 생성하는 데에 활용될 수 있다. 질의응답 시스템, 정보 검색, 지식 그래프 구축 등에서 BERT는 질문 응답 작업에 활용된다.
물론, GPT와 BERT는 위에 언급된 분야 외에도 요약, 번역, 키워드 추출, 문법 교정, 문서 분류 등 다양한 작업에 사용될 수 있다. 각 모델은 자연어 이해와 생성 능력에서 강점을 가지고 있기 때문에 적용하려는 작업의 목적과 필요사항을 고려하여 선택해야 한다.
GPT 코드
import torch
from transformers import GPT2LMHeadModel, GPT2Tokenizer
# GPT 모델과 토크나이저 로드
model_name = 'gpt2' # 모델 이름 설정 (예: 'gpt2', 'gpt2-medium')
model = GPT2LMHeadModel.from_pretrained(model_name)
tokenizer = GPT2Tokenizer.from_pretrained(model_name)
# 텍스트 생성 함수
def generate_text(prompt, max_length=50):
input_ids = tokenizer.encode(prompt, return_tensors='pt')
output = model.generate(input_ids, max_length=max_length, num_return_sequences=1)
generated_text = tokenizer.decode(output[0], skip_special_tokens=True)
return generated_text
# 텍스트 생성 예시
prompt = "Once upon a time"
generated_text = generate_text(prompt)
print(generated_text)
위 코드는 gpt2 모델을 사용하여 텍스트를 생성하는 코드이다. 위 코드를 직접 실행해보면 Once upon a time 뒤로 문장을 예측하여 생성해주는데, 나는 아래와 같은 결과값이 나왔다. (생성된 텍스트는 모델과 사용된 데이터에 따라 달라질 수 있다.)
[결과값]
Once upon a time there was a little girl who lived in a small cottage in the forest. She loved to explore the woods and discover new adventures. One day, she stumbled upon a hidden treasure chest buried beneath a tall oak tree...
BERT 코드
import torch
from transformers import BertTokenizer, BertForSequenceClassification
# 사전 학습된 BERT 모델과 토크나이저 로드
model_name = 'bert-base-uncased'
tokenizer = BertTokenizer.from_pretrained(model_name)
model = BertForSequenceClassification.from_pretrained(model_name, num_labels=2) # 이진 분류인 경우 num_labels=2로 지정
# 분류할 입력 문장
input_text = "This is an example sentence."
# 입력 문장을 토크나이징하고 토큰 인덱스로 변환
tokens = tokenizer.encode_plus(input_text, add_special_tokens=True, padding='max_length', max_length=128, truncation=True, return_tensors='pt')
input_ids = tokens['input_ids']
attention_mask = tokens['attention_mask']
# 텍스트 분류 수행
outputs = model(input_ids, attention_mask)
logits = outputs.logits
predicted_labels = torch.argmax(logits, dim=1)
# 예측된 레이블 출력
print("Predicted Label:", predicted_labels.item())
위 코드는 Hugging Face의 'transformers' 라이브러리를 사용하여 BERT 모델과 토크나이저를 로드해 텍스트를 분류하는 코드이다. 위의 코드에서는 input_texts 리스트에 분류할 문장을 저장한다. 그리고 입력 문장을 토크나이징하고 토큰 인덱스로 변환한 후, BERT 모델에 입력하여 분류 결과를 얻는다. 마지막으로, 예측된 레이블을 출력한다.
[결과값]
Predicted Label: 1
BERT 모델은 한 번에 하나의 문장에 대한 분류를 수행하는 모델이기 때문에, 2개 이상의 문장이 있는 경우에는 각 문장을 개별적으로 BERT 모델에 입력하여 분류를 수행해야 한다.
import torch
from transformers import BertTokenizer, BertForSequenceClassification
# 사전 학습된 BERT 모델과 토크나이저 로드
model_name = 'bert-base-uncased'
tokenizer = BertTokenizer.from_pretrained(model_name)
model = BertForSequenceClassification.from_pretrained(model_name)
# 분류할 입력 문장들
input_texts = ["This is the first sentence.", "This is the second sentence."]
# 각 문장에 대해 분류 수행
for input_text in input_texts:
# 입력 문장 토크나이징
tokens = tokenizer.encode_plus(input_text, add_special_tokens=True, padding='max_length', max_length=128, truncation=True, return_tensors='pt')
input_ids = tokens['input_ids']
attention_mask = tokens['attention_mask']
# 텍스트 분류 수행
outputs = model(input_ids, attention_mask)
logits = outputs.logits
predicted_label = torch.argmax(logits, dim=1)
# 예측된 레이블 출력
print("Input Text:", input_text)
print("Predicted Label:", predicted_label.item())
print()
[결과값]
Input Text: This is the first sentence.
Predicted Label: 0
Input Text: This is the second sentence.
Predicted Label: 1
자연어처리 모델인 GPT와 BERT에 대해 간략히 살펴보았다. GPT와 BERT는 각각 다른 방식으로 설계된 모델이긴 하지만, 두 모델 다 현재 자연어처리 분야에서 많은 관심을 받고 있으며, 모델 크기 확장, 도메인 특화 및 다국어 처리, 더 나은 언어 이해와 상호 작용을 위한 모델 개발 등의 측면은 향후 더 발전해나갈 것이다. 이러한 발전은 자연어처리 분야에서 더 정확하고 유연한 모델을 제공하여 다양한 응용 분야에 많은 혜택을 제공하게 될 것이다.
참고
- Transformer - Harder, Better, Faster : https://tech.scatterlab.co.kr/transformer-review/
- Bert와 GPT : https://ratsgo.github.io/nlpbook/docs/language_model/bert_gpt/