/Boostcamp-ODQA

네이버 부스트캠프 | Open-Domain Question Answering(ODQA)

Primary LanguageJupyter Notebook

Open-Domain Question Anwering Competition - NLP 9조 (MnM)

MRC(Machine Reading Comprehension) dataset으로 Open-Domain Question Answering을 수행하는 task입니다.

질문에 관련된 문서를 찾는 Retriever와 찾아온 문서에서 질문에 대한 정답을 찾는 Reader로 구성됩니다.

MnM Team

김태일 문찬국 이재학 하성진 한나연

Members' Role

Member Role
김태일 실험 세팅, BM25, rerank, DPR 구현 및 실험
문찬국 협업 툴 관리, 실험 세팅, KorQuAD Fine-tuning, Curriculum Learning, Hyperparameter Tuning
이재학 EDA, Scheduler 실험, 성능 검증 코드 제작, Data Length 관련 실험, Inference 후처리, Ensemble
하성진 Pre-trained 모델 실험, KorQuAD Pre-training
한나연 EDA, Pre-trained 모델 실험, Elasticsearch, NER tagging

Score

▶️ Public Leaderboard: 1st / 11 image

▶️ Private Leaderboard: 1st / 11 image

Our Solution

  • Data Processing
    • Remove punctuation marks
  • Reader Model
    • klue\roberta-large + fine-tuning on KorQuAD + fine-tuning on our own train dataset + curriculum learning
  • Retriever Model
    • BM25
    • Elasticsearch BM25
  • Ensemble
    • Soft voting
    • Hard voting
    • Post processing

Dataset

아래는 제공하는 데이터셋의 분포를 보여줍니다.

data에 대한 argument 는 arguments.pyDataTrainingArguments 에서 확인 가능합니다.

데이터 분포

Evalutaion Metric

EM(Exact Match)와 F1 score 두 개의 평가지표를 사용하지만, EM기준으로 리더보드 등수가 반영되고, F1은 참고용으로만 활용됩니다.

Exact Match: 모델의 예측과 실제 답이 정확하게 일치할 때만 점수가 주어지고, 띄어쓰기나 문장부호를 제외한 후 정답에 대해서만 일치하는지 확인합니다. 또한 답이 하나가 아닐 수 있는데, 이런 경우는 하나라도 일치하면 정답으로 간주합니다.

EM

F1 Score: EM과 다르게 부분 점수를 제공합니다. 예를 들어, 정답은 "Barack Obama"지만 예측이 "Obama"일 때, EM의 경우 0점을 받겠지만 F1 Score는 겹치는 단어도 있는 것을 고려해 부분 점수를 받을 수 있습니다.

F1

Usage

1) Installation

  • 저장소를 clone한 후에 필요한 파이썬 패키지를 설치합니다.
  • Elasticsearch 설치와 사용법은 여기를 참고해주세요.
git clone https://github.com/boostcampaitech3/level2-mrc-level2-nlp-09.git
cd level2-mrc-level2-nlp-09
bash ./install/install_requirements.sh

2) Train model

arguments 에 대한 세팅을 직접하고 싶다면 arguments.py 에서 확인 가능합니다.

python train.py \
--output_dir ./models/train_dataset \
--learning_rate 3e-5 \
--per_device_train_batch_size 16 \
--eval_steps 500 \
--do_train \
--save_steps 500 \
--logging_steps 500 \
--do_eval \
--evaluation_strategy "steps" \
--num_train_epochs 3 

3) Inference

  • retrieval 과 mrc 모델의 학습이 완료되면 inference.py 를 이용해 odqa 를 진행해 predictions.json 이라는 파일이 생성됩니다.

  • 학습한 모델의 test_dataset에 대한 결과를 제출하기 위해선 추론(--do_predict)만 진행하면 됩니다.

  • 학습한 모델이 train_dataset 대해서 ODQA 성능이 어떻게 나오는지 알고 싶다면 평가(--do_eval)를 진행하면 됩니다.

  • wandb 가 로그인 되어있다면 자동으로 결과가 wandb 에 저장됩니다. 아니면 단순히 출력됩니다.

python inference.py \
--output_dir ./outputs/test_dataset/ \
--dataset_name ../data/test_dataset/ \
--model_name_or_path "Nonegom/roberta_finetune_twice" \
--index_name "origin-wiki" \
--top_k_retrieval 40 \
--do_predict

Code Structure

level2-mrc-level2-nlp-09
├── EDA
│   ├── EDA.ipynb
│   ├── EDA_tokenizer.ipynb
├── assets
├── elasticsearch
├── install
├── utils
│   ├── SOTA_comparison.ipynb
│   ├── ensemble_hardvoting.ipynb
│   ├── ensemble_softvoting.ipynb
│   ├── post_process.ipynb
├── arguments.py
├── elastic_setting.py
├── inference.py
├── retrieval.py
├── setting.json
├── sweep.yaml
├── train.py
├── train_sweep.py
├── trainer_qa.py
└── utils_qa.py

Git Commit Rule

- feat      : 새로운 기능 추가
- debug     : 버그 수정
- docs      : 문서 수정
- style     : 코드 formatting, 세미콜론(;) 누락, 코드 변경이 없는 경우
- refactor  : 코드 리팩토링
- test      : 테스트 코드, 리팩토링 테스트 코드 추가
- chore     : 빌드 업무 수정, 패키지 매니저 수정
- exp       : 실험 진행
- merge     : 코드 합칠 경우
- anno      : 주석 작업
- etc       : 기타