1편에서
한글 질의응답 시스템, 질의응답 처리절차, 데이터세트, 성능평가까지 살펴보았다. 이제 이어서 훈련, KoertTokenizer 환경 준비부터 파인튜닝 그리고 평가까지의 절차를 살펴보도록 하자.
시작하기 전에, 1편에서 한글 질의응답 성능에서 HanBERT 가 가장 성능이 좋다고 하였는데, Huggingface Transformers 의 2020년 KoELECTRA 를 보니, small model 과 base-model에서 인간의 성능(EM 80.17, F1 91.2)을 모두 능가하는 성능을 달성하였다. Small 과 Base의 차이, ELECTRA 등에 대한 자세한 내용은 여기를 참고하기 바란다.
<그림 1. Huggingface
한글질의 응답 성능 비교>
BERT 언어모델 훈련
아래 그림 2 와 같이 Bert에 입력되는 두개의 문장은 Token, Segment, Position이라는 임베딩이 단어 임베딩 단위로 이루어져 Bert 에 입력된다. 이때 최종 입력되는 형태인 그림 최상단의 input 을 보면 ①과 같이 문장 처음에 [CLS]가 삽입되고 ②와 같이 문장 일부를 가려(MASK)버리고, ③과 같이 문장과 다음 문장을 구별하는 [SEP] 구별자가 들어가고 ④와 같이 단어 임베딩으로 WordPiece tokenizer 를 사용하는데playing 이 play 와 ##ing 로 어절이 분리된다. 구글은 BERT 에 WordPiece 를 사용했지만 구현체를 공개하지 않아 대부분의 한국어 NLP 개발자들은 SentencePiece 를 사용한다. SentencePiece 는 단어 분리 알고리즘을 사용하기위해 사전 토큰화 작업없이 전처리를 하지않은 raw 데이터에 바로 단어 토크나이저를 사용할 수 있다는 이점을 제공한다. Tokenizer 에 대해서는 이전 뉴스레터 16호 를 참고.
<그림 2. BERT 에 입력되는 토큰의 임베딩>
monologg/KoBERT 모델의 훈련
1편에서 git clone 을 통해 설치된 monologg/KoBERT 코드의
home 디렉토리 밑에 run_squad.py 그리고 data 와 models 폴더를 확인하면서 아래와 같은 명령어를 수행함으로써
모델 훈련이 시작된다. ①번과 같이 model_name 에
monologg/kobert 가 입력되어야 한다. ②번에
output_dir 을 models 로 해주어야 models 밑에 훈련 output 인 checkpoint 파일들이 저장된다. ③에 저장 step 이 4000회 마다 저장된다.
<그림 3. Monologg/kobert 훈련 명령어>
훈련된 모델의 성능은 KorQuAD_v1.0_dev.json
파일을 대상으로 아래와 같은 파이선 명령어를 통해 평가할 수 있다. evaluate_v1_0.py 파일은 KorQuAD에서
제공하는 evaluation script 로 평가한 결과는 EM
51.09, F1 은 78.36으로 huggingface
의 official monologg/KoBert 성능(EM:
52.81, F1: 80.27)에 근접한 것을 확인할 수 있다.
KoBertTokenizer 환경 준비
본 시스템은 huggingface
transformers 의 monologg/kobert 모델을 사용하고 있지만, huggingface transformers 가 v2.9.0 부터
tokenization 관련 API 가 일부 변경되었다. 이에 맞춰 기존의 tokenization_kobert.py
를 상위 버전에 맞게 수정한
버전은 여기를 참조. 따라서 transformers 버전은 반드시
3.0 이상을 설치할 것을 권고한다.
우선 한글 tokenizer 를
사용하려면 KoBertTokenizer 를 아래와 같이 import 해야
한다. BERT 언어모델, KoBERT, SentencePiece 등은 이전 뉴스레터 16호, KoBERT 의 한글 tokenizer 에 대해 보다 자세한 사항은 뉴스레터 17호 를 참고바란다.
그리고 아래와 같은 명령을
통해 tokenizer 를 사용할 수 있게 된다. models 디렉토리에는
훈련된 checkpoint 파일들이 있어야 한다.
Tokenizer.tokenize
를
통해 토큰화된 결과를 확인해보자. Encode 는 인코딩된 숫자로 나타나고 나중에 decode 하면 원문으로 복원된다.
질의응답 문제 해결을 위해 BERT
모델 활용 변경
BERT 는 위 그림 2 와 같이 이어지는 두개의 문장을 mask 모델과 다음 문장 예측과 같은 방법으로 학습하는 자기지도(self-supervised) 방식이다. 반면 질의응답은 아래 그림 4와 같이, [SEP]로 분리된 문장을 질문과 원문으로 다르게 활용한다.
<그림 4. 질의응답의 BERT 학습 방식>
파인 튜닝
사전훈련 모델이란 BERT 와 같은 대용량
데이터세트의 자연어 언어 모델 작업을 사전에 훈련시켜 놓은 모델을 뜻한다. 이미 검증된 성능으로 훈련시킨
언어모델의 가중치를 사용함으로써 한글 질의응답이 담긴 소규모 train 과 dev 데이터세트로도 좋은 성능을 낼 수 있다. 파인 튜닝(fine tuning)이란 BERT 와 같은 사전 학습 모델의 가중치를
그대로 사용하여 BERT 사전 학습된 가중치의 이점으로 한글 질의응답데이터세트를 질문과 원문의 입력으로
변형하여 훈련시키는 것을 말한다. 아래 그림 5 는 사전
학습된 모델을 로드 할 때 training=False로 하여 BERT 모델에서 마지막 트랜스포머 계층 까지만 모델이 로드되게 하는
개념을 설명하기위한 하나의 예이다. 전이학습절차, 모델 파인튜닝에
대한 자세한 내용은 이전 뉴스레터 15호를 참고 바란다.
<그림
5. 사전 학습 모델 로드>
아래
그림 6는 파인 튜닝의 이해를 돕기 위해 Keras 로 구현된 fine
tuning 모델 모듈 예시다. 위의 그림 5와
같이 BERT 로 로드 된 모델에 그림 6과 같이 My_layer_Start 와 My_layer_End 의 완전연결층을
추가하여 파인 튜닝 모델을 완성한다.
① 에서 Bert 모델에서 출력된 질문과 원문의 두 입력 값이 파인
튜닝 모델의 입력으로 입력된다. ②는 NonMasking 함수를 지정해서, Bert 모형의 자체 Masking 된 텐서들을 풀어줘야 한다. ③에서 MyLayer_Start는 정답의 첫 번째 단어를 예측하는
것을 담당하고, MyLaer_End는 정답의 마지막 단어를 예측하는 것을 담당한다. 즉, BERT 의 마지막 입력을 받아서, 2개의 텐서에 출력을 내보내는 두 layer 의 역할은 동일하다. 여기서
SEQ_LEN 즉 최대 입력되는 토큰 수는 BERT 에서
512 까지를 최대값으로 설정되어 있다.
<그림 6. 모델 파인 튜닝 예>
평가
파인튜닝 모델을 위에서
설명한 monologg/KoBert 모델에 완전연결층을 추가하여 구현 할 수 있으나 Huggingface의 BERT – transformers 4.12.5 document
의 BertForQuesionAnswering 에 나와있는 예제 를 참조하여 평가 모듈을 구현할 수 있다. 이때 transformers 버전은 4.0 이상의 환경일 경우에만 정상 작동한다. 따라서, 파인튜닝 학습은 transformers 3.3.1 을 준수하고 평가
모듈 작성시에는 4.0 이상을 고려해야 한다.
아래 그림 7 은 수행관
결과이다. ①은 질문, ②는 원문, ③은 KorQuAD_v1.0_train 데이터세트에 있는 정답 컬럼에서
가져온 값, ④는 본 질의응답 시스템에서 예측한 답이다.
<그림 7. 질의응답 수행 결과>
또한, Huggingface 의 monologg/KoElectra small v3 모델을 Nvidia A100
GPU 2 대로 훈련하여 파인튜닝 한 결과, 아래 그림과 같이 EM: 82.59, F1:91.49 를 기록하여 인간의 성능인 EM:
80.17, F1: 91.2 를 능가함을 확인하였고 질의응답에서도 더 나은 성능을 보였다.
결언
지금까지 1편에서 딥러닝을
이용한 한글 질의응답
처리절차, 데이터세트, 성능평가 그리고 이번 2편에서 훈련, KoertTokenizer 환경 준비, 파인튜닝 그리고 평가까지의 절차를 살펴보았다. Huggingface
transformers 기반 BERT 모델 중에 monologg/KoBert
를 중심으로 살펴보았다. 이외에도 104개 국어를
지원하는 Bert-mutilingual 도 별도의 한글 토큰화 없이도 자체 모델만으로도 F1 score 가 90.25% 로 높은 점수를 내고 있고, 그 이후에 선보인 KoELECTRA 모델은 앞에 살펴본 바와 같이
사람의 성능을 뛰어넘는 결과를 보여준다.
다만 KorQuAD 1.0 대상의 질의응답은 입력 시퀀스가 몇 가지 단락의 한글 문장만이 대상이어서, KorQuAD 2.0 과 같이, 한글 위키백과 전체에서 답을 찾고, 표와 리스트도 포함된 다양한 형태와 길이로 사람의 성능을 뛰어넘는 딥러닝 기반 질의응답 시스템이 발전하고 있어서 향후 많은 발전이 기대되는 부분이라고 할 수 있겠다.