본문 바로가기

Natural Language Processing

All about GPT-2 : 이론부터 fine-tuning까지(2)

 

지난 포스트에서는 GPT-2의 이론과 구조에 대해 설명했습니다.

2020/07/23 - [Natural Language Processing] - All about GPT-2 : 이론부터 fine-tuning까지(1)

 

이번 포스트에서는 영어 교과서 코퍼스를 이용하여 gpt-2를 finetuning하는 법에 대해 다룹니다. 비교를 위해 pre-trained된 모델을 사용한 결과와 비교할 것입니다.

 

목차는 다음과 같습니다.

<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

Finetuning GPT-2 for text generation

Step 1: 데이터셋 준비하기

모델을 선언하기 전에, 학습과 평가에 사용할 데이터셋을 준비해야 합니다.

제가 사용한 데이터셋은 2006년부터 2019년까지의 고등학교 영어 교과서 및 중학교, 초등학교 영어 교과서 파일입니다. 고등학교 파일은 총 43,775개의 지문, 중학교와 초등학교는 각각 634개와 366개의 지문으로 이루어져 있는 코퍼스입니다.

 

해당 코퍼스는 추가적인 작업이 끝난 후에 깃헙"https://github.com/hyyoka"에 공유할 예정입니다.

데이터 전처리로, 총 데이터를 학습(train), 검증(validation), 평가(test) 데이터로 나누었습니다.
각각 Textbook_H.txt, Textbook_E.txt, Textbook_M.txt 라는 이름을 가집니다.

Step 2: Download Libraries

GPT-2를 사용하고 학습시키기 위해서는 Huggingface의 transformer 라이브러리를 install해야 합니다.

저는 github repo에서 바로 clone해와 수정하여 사용할 수 있는 방법을 택했습니다.

!git clone https://github.com/huggingface/transformers
%cd transformers
!pip install .
!pip install -r ./examples/requirements.txt

Step 3: Finetuning 하기

이전 버전의 huggingface transformer의 gpt-2에서는 run_lm_finetuning.py 를 사용하면 파인튜닝을 할 수 있었습니다. 하지만 최근 수정을 거치면서 파인튜닝을 할 수 있는 파이썬 이름이 다른 것으로 바뀌었어요. 현재는 run_language_modeling.py 파일에서 추가적인 훈련과 평가를 할 수 있습니다.

 

최근 버전의 finetuning하는 코드는 다음과 같습니다:

# Train gpt-2 model

!python /content/transformers/examples/language-modeling/run_language_modeling.py \
    --output_dir=finetune \
    --model_type=gpt2 \
    --model_name_or_path=gpt2 \
    --save_total_limit=5 \
    --num_train_epochs=1.0 \
    --do_train \
    --evaluate_during_training \
    --logging_steps=1000 \
    --save_steps=1000 \
    --train_data_file=/content/Textbook_H.txt \
    --do_eval \
    --eval_data_file=/content/Textbook_E.txt \
    --per_device_train_batch_size=8 \
    --per_device_eval_batch_size=8 \
    --block_size=128 \
    --gradient_accumulation_steps=5

 

추가하거나 바꾸고 싶어할만한 명령은 다음과 같습니다.

  • --line_by_line
    만약 데이터가 전부 하나의 글이 아니라, 각 라인에 있는 데이터들이 시작과 끝이 있는 별개의 데이터로 구성되어 있다면 해당 명령을 적는 것이 좋습니다. 이 명령어를 사용할 시, padding이 선행되어야 합니다.

  • --num_train_epochs
    말 그대로, 훈련의 반복 수입니다. 저는 google colab에서 코드를 돌렸기에 1로 설정했습니다.

  • --block_size
    입력한 훈련 데이터가 이 명령에 적힌 길이만큼 쪼개집니다. 테스트 시, 최대 이 길이만큼만 문장을 생성할 수 있습니다. (성능을 고려했을 때)

  • --gradient_accumulation_steps
    입력한 숫자의 간격대로 모델의 가중치를 업데이트 합니다.

  • --output_dir
    체크포인트들이 저장될 공간입니다. finetuning을 하기 위해서는 이를 설정해야합니다.

  • --model_name_or_path
    사용할 모델명, 혹은 경로를 입력해주면 됩니다. 모델 가중치들이 기입된 파일이 있어야합니다.
    만약 355M 크기의 gpt-2 모델을 사용하고 싶다면, gpt2-medium, 124M gpt-2 모델을 사용하고 싶다면 gpt2를 입력하면 됩니다. 더 큰 모델 (ex. gpt2-large, 등등)도 있습니다.

Step 4: 평가(Evaluation)하기

finetuning한 모델을 평가해보는 코드입니다. 앞서 언급했듯, run_language_modeling.py 파일에서 평가를 할 수 있습니다.

# Test gpt-2 model : evaluate perplexity

!python /content/transformers/examples/language-modeling/run_language_modeling.py \
    --output_dir=finetune \
    --model_type=gpt2 \
    --model_name_or_path=finetune \
    --do_eval \
    --eval_data_file=/content/Textbook_M.txt \
    --per_device_eval_batch_size=8 \

Step 5: 문장 생성하기 (Text Generation)

문장의 생성은 transformers/examples/text-generation/run_generation.py를 통해 할 수 있습니다.

비교를 위해, 추가적인 학습이 진행되지 않은 124M 크기의 gpt-2 모델을 이용한 결과를 먼저 살펴보았습니다.

!python /content/transformers/examples/text-generation/run_generation.py \
    --model_type=gpt2 \
    --length=120\
    --model_name_or_path=gpt2

 

Model prompt >>> What do you want to have for dinner? Pizza or Chicken?
=== GENERATED SEQUENCE 1 ===
What do you want to have for dinner? Pizza or Chicken? Cardiologist can give you that.


This list is about all the sites we have provided and they are listed on the largest and largest bookshelf in the world. If you are looking for a work of writing or doing some other freelance work then ask us, not last longer than three days. If you have seen movies or pieces of literature we give you a hard copy so that you can help us from other the same length sites.<|endoftext|>

 

다음은 영어 교과서를 이용한 finetuning 이후의 결과입니다. 이전에 output_dir로 설정했던 finetune을 model_name_or_path에 넣어주었습니다.

!python /content/transformers/examples/text-generation/run_generation.py \
    --model_type='gpt2' \
    --length=120 \
    --model_name_or_path=finetune

 

Model prompt >>> It was a boss night with my lad.
=== GENERATED SEQUENCE 1 ===
It was a boss night with my lad. 'young master asked me to play the guitar with him, and it was really delicious." "i could not resist it, so he paid me a visit." "he asked me for a seat and said to me, i'm an english teacher." "i was surprised because i would never be able to speak english." "well, how could i understand what he was saying? nah, they're so!" "why do you think that?" "i'm more interested in the art world than studying." "i want to pursue my passion." "you know, i wonder why people think that way."        

 


출처: https://privatedevelopnote.tistory.com/81 [개인노트]