2. Hello Bert!
2018년 10월 30일 구글에서 발표
발표 직후 squad(Stanford Question Answering Dataset)에서 상
위 랭크의 주로 사용되는 모델
Google researchers에 따르면 11개의 Task에 적용 가능한 모델
Goal : Bert의 근간을 이루는 Transformer 에 대한 이해 +
Bert fine-tuning / + 기사 데이터에 적용
Project
3. Plan
• 3월 9일(1차) : 지난 기수 활동 정리, 내용 공유
• 3월 19일(2차) : Bert model 탐색, Microsoft Research Paraphrase Corpus (MRPC) 가지고
Fine-Tuning 시도
• 3월 23일(3차) : bert model의 run_classifier 구조 분석, Input Embedding 분석
• 4월 2일(4차) : Task에 따른 model output 분석
• 4월 6일(5차) : 중간 발표, bert output에서 start, stop position에 대한 공부
• 4월 20일, 30일(6, 7차) : KorQuAD를 이용해 Fine-Tuning 시도
• 5월 7일(7차) : KorQuAD를 이용해 Fine-Tuning 결과 확인 및 I/O 변경
• 5월 25일 : 최종 데모데이
8. Fine Tuning
KorQuAD Dataset (Training set 60,407개, 약 37MB)
KorQuAD dev evaluate
AIHub squad Dataset (Training set ?개, 약 88MB)
KorQuAD + AIHUB Dataset dev evaluate
10. • 기존의 BERT를 이용한
KOQUAD모델은 .json파일형
태로 입력받은 후
PREDICTION 결과를 .json파
일형태로 출력하는 형태였음
KORQUAD BERT MODEL
TRAINING FILE
(JSON)
DEV FILE
(JSON)
PREDICTION
FILE
(JSON)
DO_TRAIN=TRUE DO_PREDICT=TRUE
• 하지만 챗봇의 형태를 띠기
위해서는 텍스트를 입력 받
고 텍스트를 콘솔에 출력하
는 것이 자연스럽다고 판단
Model I/O Change
11. KOQUAD BERT MODEL
TRAINING FILE DEV FILE
PREDICTION
FILE
DO_TRAIN=FALSE
• 우선 학습된 모델을 이용해
질문에 대한 답을
PREDICTION만 하면 되었
기 때문에 DO_TRAIN
=FALSE로 지정
DO_PREDICT=TRUE
Model I/O Change
12. 변환 방법(데이터 입력처리)
• 플래그형식으로 입력받은
질문과 문맥을 모델에 전달
• 입력받는 함수에서
koquard에 부합하는 json
형식으로 변환 후
PREDICTION 과정 진행
• DEV FILE은 전달만 될 뿐
사용되지 않음
문맥
입력
KOQUAD BERT MODEL
DEV FILE
(미사용)
FLAG:
context
FLAG:
question
질문
입력
모델 내에서
JSON형태 변환
Model I/O Change
13. 변환 방법(데이터 출력처리)
KOQUAD BERT MODEL
PREDICTION
FILE
• 파일에 쓰여질 내용들을 추출
하여 기존의 PREDICTION
FILE에 담지 않고 콘솔에 출
력만 함.
• 이때 내부정합성을 위해서 각
함수의 인자들은 그대로 유지
한 뒤 함수 내부 코드만 변경
이는 입력파트도 마찬가지로
적용됨
• 입력함수 :
read_squad_examples
• 출력함수 : write_predictions
콘솔 출력
답
Model I/O Change
14. UNK Tokens Issue
[UNK] 토큰으로 처리 되는 현상
이 부분이 문제인 것 같은데
NFD로 normalize 할 경우 ㅍㅏㅇㅣㅆㅓㄴ (원문 파이썬)
식으로 저장
Vocab은 자모음이 아닌 음절단위로 구성
15. 한글에 대해서 NFD normalize 가 되지 않도록
Tokenization.py 수정
참고 : https://github.com/google-
research/bert/pull/228
UNK Tokens
17. Out of Memory Issue
Google Blog에 올라와있는 single Titan X (12GB RAM) TF 1.11
Maximum batch size (Benchmarked)
Google colab 을 이용 주로 12GB
(GPU RAM Free: 11441MB | Used: 0MB | Util 0% | Total
11441MB) 할당
이유는 모르겠지만 12GB에서 종종 Memory Issue로 실행이
종료
ResourceExhaustedError
Batch size 변경 Seq Length 320 / Max Batch Size 8
(5~6시간 소요)
18. Out of Memory Issue
메모리 문제의 해결책으로 생각되었던 논문
- Reducing BERT Pre-Training Time from 3 Days to 76 Minutes
(https://arxiv.org/abs/1904.00962 2019.04.01 Google)
- large batch size 에 적합한 optimizer 를 제안
- 기존(AdamW) 보다 large batch size에서 정확성이 높음
- LAMB optimizer
- batch size를 증가시켜서 학습
- 64배 많은 TPU 사용 (3일 76분)
- 메모리 할당량을 줄이는 방식으로는 적합하지 않음
19. • 질문과 문맥을 입력할때마다 모델을 쌓고 파라미터를 로드하는 과정을 거쳐야만 답이
나옴
• 현재의 경우 질문뿐만 아니라 질문의 답을 찾을 수 있는 문맥도 함께 제공하여야 함.
TF-IDF 를 이용해서 특정 Knowledge base에서 서칭
• 질문만 던져주면 문맥은 자동적으로 모델에 제공할 수 있는 방법이 필요
Bert single sentence classification 사용
• Tensor Flag 가 한번 설정되면 다시 설정되면 DuplicateFlagError 가 발생
Model I/O Issue