[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 사전훈련시키기(텐서플로우)
vocab.txt 다운로드
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 |
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모델로 네이버 영화리뷰 감정분류
네이버 영화리뷰 데이터 다운로드
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 파인튜닝
'자연어 NLP' 카테고리의 다른 글
[NLP] 자연어처리 - 한국어 임베딩 (0) | 2020.10.30 |
---|---|
[NLP] 자연어처리 - 한국어 전처리를 위한 기법들 (4) | 2020.10.22 |
[BERT] BERT에 대해 쉽게 알아보기3 - tf-hub BERT layer를 이용한 캐글 분류문제 (7) | 2020.03.27 |
[BERT] BERT에 대해 쉽게 알아보기2 - colab으로 BERT Pretraining(수정) (17) | 2020.03.26 |
[BERT] BERT에 대해 쉽게 알아보기1 - BERT는 무엇인가, 동작 구조 (2) | 2020.02.12 |
소중한 공감 감사합니다