새소식

자연어 NLP

[BERT] BERT에 대해 쉽게 알아보기4 - BERT 파인튜닝

  • -

● BERT 파인튜닝

 

 

 

2편에서 구글에서 제공하는 공식 BERT코드로 대량의 위키디피아 코퍼스로 사전훈련하여 생성한 모델을,

이번 포스팅에서는 전이학습시켜 다른 nlp task에 적용하는 파인튜닝 실습을 진행해 보려고 합니다.

 

 

저번시간에 생성한 vocab.txt파일과 사전학습한 모델 ckpt를 그대로 사용하여도 되고,

미리 생성한 위키디피아 큰 코퍼스로 학습시킨 모델 데이터를 첨부하니 그것을 이용하여도 됩니다.

 

파인튜닝에 필요한 다른 필요한 코드 파일은 이전 포스팅에서 사전에 첨부한 파일을 그대로 사용합니다.

run_squad.py, run_classifier.py, run_multi_classifier.py 등

 

2020/03/26 - [SW개발/AI Development] - [BERT] BERT에 대해 쉽게 알아보기2 - BERT 사전훈련시키기(텐서플로우)

 

[BERT] BERT에 대해 쉽게 알아보기2 - BERT 사전훈련시키기(텐서플로우)

● BERT모델로 대량의 코퍼스 사전훈련 시키기 구글이 만든 사전훈련 모델 'BERT'로 대량의 코퍼스를 가지고 사전훈련을 시키는 방법을 포스팅 하도록 하겠습니다. 그리고 이 다음 포스팅에서는 사전훈련된 모델..

ebbnflow.tistory.com

 

 

 

vocab.txt 다운로드

vocab.txt
0.41MB

 

Pretrained Model 다운로드

 

https://drive.google.com/drive/folders/1twlUzDxleFJPYy1F1x7VOs7IjYa6S-sB?usp=sharing

 

 

 


 

 

1. 학습된 BERT모델로 KorQuAD 학습

 

KorQuAD 데이터 다운로드

https://drive.google.com/open?id=12cwvY9NMtWYDN-JJdlH8Ua9YWyzxjRtF

 

 

KorQuAD는 LG CNS에서 구글의 SQuAD와 같은 데이터를 한국어로 만든 데이터셋입니다. KorQuAD 데이터셋을 이용하여 QA task를 수행할 수 있습니다. SQuAD데이터셋과 마찬가지로 '컨텍스트/질문/대답'으로 데이터가 이루어져 있고 컴텍스트와 질문이 하나의 입력이 들어가면 컴텍스트에서 질문에 대한 대답을 찾아 출력하도록 학습합니다. KorQuAD는 SQuAD와 동일하고 위키디피아의 코퍼스를 사용하였습니다. 데이터는 바이트 스트링으로 되어있어 실제 데이터를 텍스트로 확인하려면 변환을 하여야 합니다.

 

 

run_squad.py, modeling.py, optimization.py, tokenization.py등의 모듈이 텐서플로우 1.0버전으로 작성되어 있습니다.

import tensorflow.compat.v1 as tf 로 수정하여 돌리려고 했으나, 

그냥 tensorflow 1.14버전을 설치하여 훈련을 진행하였습니다.

 

1
pip intall tensorflow==1.14.0
cs

 

tensorflow 2.x  버전이 uninstall 되고, 1.14버전이 깔립니다.

 

 


 

 

QA TASK 훈련(KorQuAD데이터)

 

run_squad.py

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
!python drive/My\ Drive/Colab\ Notebooks/BERT/src/make_bert_model/run_squad.py \
--vocab_file=drive/My\ Drive/Colab\ Notebooks/BERT/rsc/conf/vocab.txt \
--bert_config_file=drive/My\ Drive/Colab\ Notebooks/BERT/rsc/conf/bert_config.json \
--init_checkpoint=drive/My\ Drive/Colab\ Notebooks/BERT/rsc/pretrained_model/model_output_512_model.ckpt-200000 \
--do_train=True \
--train_file=drive/My\ Drive/Colab\ Notebooks/BERT/rsc/KorQuAD/KorQuAD_v1.0_train.json \
--do_predict=True \
--predict_file=drive/My\ Drive/Colab\ Notebooks/BERT/rsc/KorQuAD/KorQuAD_v1.0_dev.json \
--train_batch_size=16 \
--learning_rate=2e-5 \
--num_train_epochs=1.0 \
--max_seq_length=128 \
--doc_stride=128 \
--output_dir=drive/My\ Drive/Colab\ Notebooks/BERT/rsc/KorQuAD/output \
  --do_lower_case=False
cs

 

max_seq_length를 128로, num_train_epochs를 1로 훈련시키면 30분정도 소요가 됩니다.

만약 파라미터를 다르게 해서 학습을 시키면 시간이 더 소요되겠지만 정확도는 더 올라가게 됩니다.

default 파라미터로 학습을 시키면 colab GPU 기준 약 4시간정도 소요가 됩니다.

 

 

 

훈련 중

 


훈련이 완료되면, output_dir로 지정한 파일 밑에 predictions.json 파일이 생성됩니다.

 

결과 확인

 

1
2
3
!python drive/My\ Drive/Colab\ Notebooks/BERT/rsc/KorQuAD/evaluate-v1.0.py \
drive/My\ Drive/Colab\ Notebooks/BERT/rsc/KorQuAD/KorQuAD_v1.0_dev.json \
drive/My\ Drive/Colab\ Notebooks/BERT/rsc/KorQuAD/output/predictions.json
cs

 

exact_match는 약 61.9, f1 score는 약 80.8

 

위키디피아 코퍼스를 이용해 20만 step학습한 BERT모델로, max_seq_length를 128로, num_train_epochs를 1로 훈련시켰을 때 결과는 이렇고 Default 파라미터로 4시간 학습시에는 약 6% 정도 정확도가 올라가게 됩니다.

 

 

 

 

 

 

 


 

2. 학습된 BERT모델로 네이버 영화리뷰 감정분류

 

 

 

네이버 영화리뷰 데이터 다운로드

 

https://github.com/e9t/nsmc

 

 

run_classifier.py

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
!python drive/My\ Drive/Colab\ Notebooks/BERT/src/make_bert_model/run_classifier.py \
--task_name=nsmc \
--do_train=true \
--do_eval=true \
--data_dir=drive/My\ Drive/Colab\ Notebooks/BERT/rsc/nsmc \
--vocab_file=drive/My\ Drive/Colab\ Notebooks/BERT/rsc/conf/vocab.txt \
--bert_config_file=drive/My\ Drive/Colab\ Notebooks/BERT/rsc/conf/bert_config.json \
--init_checkpoint=drive/My\ Drive/Colab\ Notebooks/BERT/rsc/pretrained_model/model_output_512_model.ckpt-200000 \
--max_seq_length=128 \
--train_batch_size=32 \
--num_train_epochs=1.0 \
--learning_rate=3e-5 \
--do_lower_case=false \
--output_dir=drive/My\ Drive/Colab\ Notebooks/BERT/rsc/nsmc/output
cs

 

 

 

학습에는 약 20분 정도 소요됩니다.

 

 

 

 

 

 

 

 

 


 

 

 

3. 학습된 BERT모델로 관계 추출 실습

 

Entity가 가지는 관계 추출 task에 BERT 사전훈련 모델을 넣어 실습을 진행해 보았습니다.

 

관계 추출 데이터셋 다운로드

 

https://github.com/machinereading/kor-re-gold

 

 

run_multi_classifier.py

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
!python drive/My\ Drive/Colab\ Notebooks/BERT/src/make_bert_model/run_multi_classifier.py \
--task_name=kent \
--do_train=true \
--do_eval=true \
--data_dir=drive/My\ Drive/Colab\ Notebooks/BERT/rsc/relation_extract \
--vocab_file=drive/My\ Drive/Colab\ Notebooks/BERT/rsc/conf/vocab.txt \
--bert_config_file=drive/My\ Drive/Colab\ Notebooks/BERT/rsc/conf/bert_config.json \
--init_checkpoint=drive/My\ Drive/Colab\ Notebooks/BERT/rsc/pretrained_model/model_output_512_model.ckpt-200000 \
--max_seq_length=128 \
--train_batch_size=32 \
--num_train_epochs=1.0 \
--learning_rate=2e-5 \
--do_lower_case=false \
--output_dir=drive/My\ Drive/Colab\ Notebooks/BERT/rsc/relation_extract/output
cs

 

 

 

기존 BERT와 달리, 이 task는 Subject[SEP]Objedt[SEP]Sentence 형태로 데이터가 입력됩니다.

이 task의 경우는 거의 하루가까이 시간이 소요가 됩니다. 코랩의 세션이 12시간이므로 중간에 저장하고 다시 불러와야 합니다. 브라우저에 아무런 동작이 없을시 90분후에 타임아웃이 됩니다. 개발자도구 콘솔창에

 

function ClickConnect() {
    var buttons = document.querySelectorAll("colab-dialog.yes-no-dialog paper-button#cancel");
    buttons.forEach(function(btn) {
        btn.click();
    });
    console.log("1분마다 자동 재연결");
    document.querySelector("colab-toolbar-button#connect").click();
}
setInterval(ClickConnect, 1000 * 60);

 

다음 코드를 입력해주면 타임아웃을 방지할 수 있습니다.

 

 

 

2,3 의 task모두 짧게 훈련시킨 것에 비해 성능은 80%가 넘게 나왔습니다!

 


 

BERT 시리즈

BERT는 무엇인가, 동작 구조

2020/02/12 - [SW개발/AI Development] - [BERT] BERT에 대해 쉽게 알아보기1 - BERT는 무엇인가, 동작 구조

BERT 사전훈련시키기

2020/03/26 - [SW개발/AI Development] - [BERT] BERT에 대해 쉽게 알아보기2 - BERT 사전훈련시키기(텐서플로우)

BERT tf-hub이용, 캐글 분류 문제

2020/03/27 - [SW개발/AI Development] - [BERT] BERT에 대해 쉽게 알아보기3 - tf-hub BERT layer를 이용한 캐글 분류문제

BERT 파인튜닝

2020/03/30 - [SW개발/AI Development] - [BERT] BERT에 대해 쉽게 알아보기4 - BERT 파인튜닝

 


 

 

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.