NLP-writing

BERT와 OpenAI GPT 란

summerorange 2023. 6. 18. 21:54
반응형

* 잘못 이해한 내용이 있을 수 있습니다. 

오늘은 BERT: Pre-trainining of Deep Bidirectional Transformers for Language Understanding 이라는 2019년도 5월에 발표된 논문을 읽어보고, BERT에 대해서 간략하게 작성했습니다.

Google의 Bard와 OpenAI GPT

구글 Bard가 출시되었지만, chatGPT 만큼 핫하지 않은 것 같습니다. 구글이 앞서가고 있고 이런 저런 오픈 소스를 많이 풀고 있었는데 어느 순간 분위기가 바뀌었습니다. 재주는 google이 넘고 MS가 주가를 더 가져갔.... (광고주님 화이팅)

구글 Bard와 chatGPT의 차이에 대해서 살펴보려면, 일단 BERT의 개념에 대해서 살펴볼 필요가 있습니다. 

간단하게 Bard와 GPT의 가장 큰 차이점은 학습 방법입니다. direction이 BERT는 bidirection. 양방향입니다.

Bard는 BERT 모델에서 최종 모델로 진화한 것인데. BERT란 Bidirectional Encoder Representations from Transformers 의 약자입니다. 사전 훈련된(pre-trained) 양방향 transformer 인코더를 기반으로 합니다. left-to-right 방향으로도 읽고, right-to-left 방향으로도 읽어서 문맥을 좀 더 잘 잡아낼 수 있는 특징이 있습니다. 

반대로, GPT는 left-to-right의 단방향 형식입니다. 

GPT는 left-to-right 만 고려한 걸 볼 수 있습니다


BERT 란?

일단, 방대한 데이터를 바탕으로 사전 학습된 모델(pre-training model)을 transformer(다른 작업에 적용시키는) 방법은 다음의 두 가지가 있습니다.

 

사전 학습 모델 활용 접근 방법

"Feature-based"와 "fine-tuning"은 BERT와 같은 사전 훈련된 모델을 다른 작업에 적용하는 두 가지 접근 방법을 나타냅니다.

1. Feature-based 접근: Feature-based 접근은 사전 훈련된 BERT 모델을 사용하여 텍스트 특성(feature)을 추출한 후, 추출된 특성을 다른 모델(예: 전통적인 머신 러닝 모델)에 입력으로 제공하는 방법입니다. BERT는 각 단어의 표현을 학습하기 때문에, 텍스트에 대한 풍부한 표현을 얻을 수 있습니다. 이러한 특성은 텍스트 분류, 개체명 인식, 문장 유사성 측정 등 다양한 자연어 처리 작업에 사용될 수 있습니다. Feature-based 접근은 사전 훈련된 BERT 모델을 "고정된" 텍스트 표현기로 사용하는 방식입니다.

- 논문에서는 ELMo (Peters et al., 2018)를 예시로 듦

2. Fine-tuning 접근: Fine-tuning 접근은 사전 훈련된 BERT 모델을 특정 작업에 맞게 추가적인 훈련(fine-tuning)하는 방법입니다. 사전 훈련 단계에서 학습한 언어 이해 능력을 유지하면서, 특정 작업에 대한 최적화를 수행합니다. 이를 위해 사전 훈련된 BERT 모델 위에 작업별로 추가적인 레이어를 구성하고, 작은 데이터셋을 사용하여 해당 작업에 맞게 BERT 모델을 조정합니다. Fine-tuning은 전체 모델을 업데이트하면서 특정 작업에 최적화된 가중치를 학습하는 과정입니다.

Fine-tuning은 Feature-based 접근보다 더 많은 파라미터를 업데이트하고 작업에 맞게 조정할 수 있기 때문에, 일반적으로 특정 작업에 더 잘 맞는 모델을 얻을 수 있습니다. Fine-tuning 접근은 작은 데이터셋에서도 좋은 성능을 발휘할 수 있으며, 전이 학습(transfer learning)의 효과를 가져올 수 있습니다.

- 논문에서는 OpenAI GPT (Radford et al., 2018)을 예시로 듦

 

BERT의 사전 학습 모델 접근 방법

BERT는 사전 훈련과 파인 튜닝의 두 단계로 구성된 접근 방법입니다. 여기에서 사용하는 특수토큰은

[CLS]은 Classification token으로 문장의 시작에 추가되는 토큰. 문잔의 전체 의미를 요약하는 문맥 벡터를 생성하는 역할. 해당 문장에 대한 문맥 정보를 인코딩하는 데 사용

[SEP] : sperate 를 의미하고 문장의 구분을 나타내는 토큰. 

이렇게 있고, 특수 토큰으로 문맥과 구조를 파악합니다

[cls]와 [sep] 그리고 [sep]

output 레이어를 제외하고, 사전 훈련과 파인 튜닝은 같은 구조를 가지고 있습니다. 

1. pre-training 단계  : 언어를 이해하는 능력을 습득하도록 함

-  마스킹된 언어 모델링(Masked Language Modeling, MLM) 진행 : 입력 문장의 일부 단어를 마스킹하고, 모델이 이를 예측하도록 함

- 문장 쌍 분류 : 문장 A와 문장 B를 입력으로 받고, 문장 B가 문장 A의 다음 문장인지를 예측하는 과제임 

2. fine-turing 단계: 특정 작업에 맞게 최적화 

- 작업에 맞는 추가적인 레이어를 BERT 모델 위에 구성하고, 작은 데이터셋을 사용하여 해당 작업에 맞게 BERT 모델을 조정함. 전체 모델을 업데이트하면서 특정 작업에 최적화된 가중치를 학습하는 과정...

- hyperparameter 값들 : dropout 비율은 0.1로 고정함. batch size: 16 또는 32, Learning rate: Adam이고 5e-5, 3e-5, 2e-5, epochs: 2, 3, 4


학습 과정에서 BERT와 GPT 차이

  GPT BERT
데이터셋 BookCorpus(8억 개의 단어) BookCorpus(8억 개 단어) & Wikipeadia (25 억 개 단어)
훈련 차이 fine-tuning 단계에만 특수 토큰을 사용(sep, cls) pre-training 단계부터 특수 토큰과 a/b 문장 테스트
훈련 반복 횟수 32,000단어의 배치 크기로 1백만 단계를 훈련 (32억 단어의 데이터를 훈련) 128,000 단어의 배치 크기로 1백만 단계를 훈련 (1,280억 단어의 데이터를 훈련)
학습률 모든 fine-tuning 단계에서 학습률은 5e-5 로 고정됨 개별 작업에 맞는 학습률을 사용.

마무리

BERT의 성공을 기반으로 한 다양한 변형 모델들이 개발되었습니다. 이러한 변형 모델들은 BERT를 기반으로 하면서도 다양한 모델 구조나 사전 훈련 방법을 도입하여 성능을 개선하려는 시도가 이루어지고 있습니다. 예를 들어, 다음과 같은 BERT 변형 모델들이 주목받고 있습니다:

  • RoBERTa: RoBERTa는 BERT의 사전 훈련 방법을 확장하여 성능을 개선한 모델입니다. 더 많은 데이터와 더 오래된 훈련 시간을 사용하여 사전 훈련되었으며, 동적 마스킹과 언어 모델링 방법을 채택하여 성능을 향상시켰습니다.
  • ALBERT: ALBERT는 BERT의 모델 크기와 계산 비용을 줄이기 위해 모델 압축과 파라미터 공유 방법을 도입한 모델입니다. ALBERT는 BERT보다 효율적인 모델 구조를 가지면서도 비슷한 수준의 성능을 발휘합니다.
  • Electra: Electra는 BERT의 사전 훈련 방법을 대체하기 위한 모델로, 생성자와 판별자라는 두 개의 모델을 사용합니다. 생성자는 입력 문장의 일부 단어를 마스킹하고, 판별자는 이를 복원하는 과정을 거치면서 사전 훈련됩니다. 이 방식은 더 효율적인 학습을 가능하게 하고, 성능을 향상시킵니다.

 

추가적으로, bert 사용 코드 예시는 다음과 같습니다.

from transformers import BertTokenizer, BertForSequenceClassification
import torch

# 한국어 BERT 모델과 토크나이저 로드
model_name = 'monologg/kobert'
tokenizer = BertTokenizer.from_pretrained(model_name)
model = BertForSequenceClassification.from_pretrained(model_name)

# 입력 문장 텍스트
text = "한국어 BERT를 활용한 예시입니다."

# 문장 토큰화 및 패딩
input_ids = torch.tensor(tokenizer.encode(text, add_special_tokens=True)).unsqueeze(0)
attention_mask = torch.ones(input_ids.shape, dtype=torch.long)

# 문장 분류를 위한 로짓 예측
outputs = model(input_ids, attention_mask=attention_mask)
logits = outputs.logits

# 예측된 레이블
predicted_label = torch.argmax(logits, dim=1).item()

# 결과 출력
print("입력 문장:", text)
print("예측된 레이블:", predicted_label)

이것보단 google에서 colab에서 사용할 수 있도록 코드를 뿌린 게 있습니다.

https://github.com/google-research/bert

 

GitHub - google-research/bert: TensorFlow code and pre-trained models for BERT

TensorFlow code and pre-trained models for BERT. Contribute to google-research/bert development by creating an account on GitHub.

github.com

여기와

https://colab.research.google.com/github/google-research/bert/blob/master/predicting_movie_reviews_with_bert_on_tf_hub.ipynb

 

Predicting Movie Reviews with BERT on TF Hub.ipynb

Run, share, and edit Python notebooks

colab.research.google.com

이 부분도 참고하면 좋을 것 같네요

그럼 포스팅은 여기까지~

 

Reference

Devlin, J., Chang, M. W., Lee, K., & Toutanova, K. (2018). Bert: Pre-training of deep bidirectional transformers for language understanding. arXiv preprint arXiv:1810.04805.

반응형

'NLP-writing' 카테고리의 다른 글

[마무리] What's Next?  (1) 2023.07.16
chatbot 만들기 실패 - google spreadsheet 연결하는 법  (3) 2023.07.02
텍스트 유사도-벡터 유사도  (0) 2023.06.04
텍스트 분류  (0) 2023.05.21
한국어 텍스트 데이터 전처리  (5) 2023.05.07