(1) 주제 및 목표
- 부스트캠프 AI Tech NLP 트랙 level 2 MRC
- 주제 : ODQA (Open-Domain Question Answering)
ODQA 데이터셋을 활용해 질문에 맞는 정답을 예측
(2) 평가지표
- 주 평가지표 : Exact Match (모델의 예측과 실제 답이 정확하게 일치할 때만 점수가 주어짐)
- 참고용 : F1 score (모델의 예측과 실제 답에 겹치는 부분이 있으면 부분점수가 주어짐)
(3) 개발 환경
- GPU : Tesla V100 * 4
(4) 협업 환경
Tool | Description |
---|---|
GitHub | - Task 별 issue 생성 - 담당한 issue에 대한 branch 생성 후 PR & main에 merge |
Slack | - GitHub과 연동해서 레포지토리에 업데이트 되는 내용 실시간으로 확인 - 허들을 이용한 회의 및 결과 공유 |
Notion | - 타임라인 정리 - 칸반보드를 이용한 task 관리 |
Zoom | - 진행상황 공유 |
WandB | - Sweep을 통한 하이퍼 파라미터 최적화 |
(5) 팀원 소개
김동한 | 김성훈 | 김수아 | 김현욱 | 송수빈 | 신수환 |
---|---|---|---|---|---|
Github | Github | Github | Github | Github | Github |
Member | Team | Role |
---|---|---|
김동한 | Data, Model | - Extraction Reader Modeling(학습 및 추론) - Extraction Reader 아키텍처 수정(CNN Head) - Sparse Passage Retrieval(Retrieval 결과 분석) - EDA(데이터 토큰 개수 분포 분석) |
김성훈 | Data, Model | - Code Modularization - Sparse/Dense Passage Rrieval(구현 및 실험) - Generation Reader Modeling(LLM 학습 및 실험) - ML Pipeline |
김수아 | Model | - Question augmentation(KoBART) - Experimentation(top-k) |
김현욱 | Data, Model | - Generation Reader Modeling(학습 및 추론) - EDA(데이터 텍스트 퀄리티 분석) |
송수빈 | Model | - Extraction Reader Modeling(학습 및 추론) - Experimentation(실험 모델 목록 구성 및 결과 정리) - Logging & HyperParameter Tuning(Wandb Sweep) - Ensemble(앙상블 코드 작성, 모델 선정을 위한 상관관계 분석 코드 작성) |
신수환 | Data, Model | Sparse Passage Retrieval(BM25 성능 개선), 데이터 전처리(Data Cleaning) |
Step 1. 프로젝트에 필요한 모든 dependencies는 requirements.txt
에 있고, 이에 대한 가상환경을 생성해서 프로젝트를 실행
# 가상환경 만들기
$ python -m venv .venv
# 가상환경 켜기
$ . .venv/bin/activate
# 제공되는 서버 환경에 따라 선택적 사용
$ export TMPDIR=/data/ephemeral/tmp
$ mkdir -p $TMPDIR
# 필요 라이브러리 설치
$ pip install --upgrade pip
$ pip install -r requirements.txt
Step 2. Pre Processing 실행
# 작업환경 변경
$ cd pre_process
# 다음 주피터를 따라가며 KorQuAD 1.0 데이터 증강
$ data_augment_korquadv1.ipynb
# 다음 주피터를 따라가며 AIHub 데이터 증강
$ data_augment_aihub.ipynb
# 다음 주피터를 따라가며 DPR retrieval을 학습하기 위한 데이터 만들기
$ generate_DPR_dataset_korquad.ipynb
Step 3. DPR 모델 학습
utils/arguments_dpr.py 에서 DPR 학습을 위한 파라미터 변경
- model : 원하는 사전 학습된 모델 불러오기
- train_data : generate_DPR_dataset_korquad.ipynb 에서 생성한 데이터 경로
- valid_data : generate_DPR_dataset_korquad.ipynb 에서 생성한 데이터 경로
- q_output_path : Query embedding 모델 저장할 경로
- c_output_path : Context embedding 모델 저장할 경로
# ./level2-mrc-nlp-08 경로에서 실행
$ python train_dpr.py
Step 4. Retrieval를 위한 사전처리 진행
database/python get_embedding_vec.csv : BM25 모델 및 DPR의 embedding vector 저장
- model : 학습된 context embedding 모델 경로
- wiki_path : Wiki.doc 데이터 경로
- valid_data : Query-Passage 쌍 데이터의 검증 데이터 경로
- save_path : Embedding vector 저장 경로
test_retrieval.py
- model : 학습된 query embedding 모델 경로
- valid_data : Query-Passage 쌍 데이터의 검증 데이터 경로
- faiss_path : database/python get_embedding_vec.csv 에서 실행한 save_path 경로
- bm25_path : database/python get_embedding_vec.csv 에서 실행한 save_path 경로
- context_path : database/python get_embedding_vec.csv 에서 실행한 save_path 경로
test_retrieval_inference.py
- model : 학습된 query embedding 모델 경로
- test_dataset : Query-Passage 쌍 데이터의 테스트 데이터 경로
- faiss_path : 위와 동일
- bm25_path : 위와 동일
- context_path : 위와 동일
# 작업환경 변경
$ cd database
# 다음 코드를 실행하여 embedding vector 추출
$ python get_embedding_vec.csv
# BM25 및 DPR 성능 확인
$ cd ..
$ python test_retrieval.py
# Inference 시 사용할 retireve 된 데이터 생성
$ python test_retrieval_inference.py
Step 5. Reader 학습
utils/arguments_extraction_reader.py에서 extracion based model 학습을 위한 파라미터 변경
- model_name_or_path : 사전 학습된 모델 불러오기
- dataset_name : Query-Passage 쌍 데이터나 증강된 데이터 경로로 변경
- output_dir : 학습된 모델 및 평가 결과 저장 경로
# 다음 코드를 실행하여 extraction based model 학습
$ python train_extraction_reader.py
# 프로젝트 때는 사용하지 않았지만 generation based model 학습, 파라미터 변경은 위와 동일
$ python train_generation_reader_Seq2SeqLM,.py
$ python train_generation_reader_CausalLM,.py
Step 6. Inference 실행
utils/arguments_inference.py에서 inference 할 extraction based 모델의 파라미터 변경
- model_name_or_path : 학습이 완료된 모델 불러오기
- output_dir : Inference 결과 저장 경로
# 코드 50번째 줄에서 retireve 된 데이터 불러오는 경로 원하는 것으로 변경하면서 사용
$ python inference.py
Step 7. 앙상블 실행
# train_extraction_reader 실행 시 생성되는 predictions.json 값들로 상관분석 분석
$ correlation_exp.ipynb
# 상관분석을 통해 사용할 모델 선택 되었다면 그 모델들로 inference 시 생성된 nbest_predictions.json 파일들로 앙상블 진행 / 두가지 버전 모두 사용 가능
$ ensemble_v1.ipynb
$ ensemble_v2.ipynb
Task | Task Description |
---|---|
EDA | 데이터의 특성을 살펴보기 위해 중복 데이터 확인, 토큰 개수 분포, 데이터 퀄리티 체크 등 시각화 및 분석 |
베이스라인 모델 | Reader Model로 사용하기 적합한 pre-trained model 실험 및 선정 |
Retrieval | BM25, DPR Retrieval 기법 구현 및 실험 |
Reader Model | Transfer Learning CNN Head Cleaning |
Post-Processing | 후처리 모델 다양성 체크 앙상블 |
- 통합모델이 최선의 답을 도출할 때, 문서 내에 다른 위치에 있는 같은 단어임에도 start logit과 end logit 값이 달라 각 위치에 대한 확률이 분리되어 계산되는 현상이 발생하여 Inference 후처리 진행
- 텍스트가 동일한 경우 확률을 합산해 총 확률을 기반으로 답변을 선택하는 후처리 과정을 적용함
- 모델의 예측값을 벡터로 치환하여(오답을 1, 정답을 0) 모델 간의 상관관계를 분석함으로써, 모델들이 상호보완적인 작용을 하도록 함
- model1, model2이 있고 각각 5개를 예측했다고 하면 두 벡터 [1, 0, 0, 1, 1], [0, 1, 1, 0, 1]의 상관관계를 도출
-
다양하게 훈련된 여러 모델을 결합하여 모델들이 서로를 보완하여 더 좋은 결과를 낼 수 있도록 하기 위해 앙상블을 도입
-
확률합을 통해 soft voting (앞서 이야기 한 후처리 방식과 동일)
- 앙상블 할 모델들의 답변-확률 값을 불러오고 같은 단어에 대한 확률들을 sum
- 가장 높은 확률의 답변을 정답으로 채택
-
다수결 (majority voting)
Public Leader Board 순위
Private Leader Board 순위