- 🍀 Naver Boost camp AI tech 2nd , Team CLUE
- 📎 Wrap-up report , 🖇️ presentation slide
✋ KLUE MRC(Machine Reading Comprehension) Dataset으로 주어진 질문에 대한 문서 검색 후 답변 추출하는 Task.
✋ Retriver 를 통해 wikipedia에서 Top-k 문서를 불러오고, Reader를 통해 문서 내 답변을 추출하는 모델을 구축, 실험 하여 주어진 질문에 정확한 답변을 찾아내는 모델을 만드는 것.
✋ 1일 팀 제출횟수는 10회로 제한되었습니다.
# data (51.2 MB)
tar -xzf data.tar.gz
👉 해당 레포 다운로드
git clone https://github.com/boostcampaitech2/mrc-level2-nlp-13.git
👉 Poetry를 통한 패키지 버전 관리
# curl 설치
apt-get install curl #7.58.0
# poetry 설치
curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python
# poetry 탭완성 활성화
~/.bashrc를 수정하여 poetry를 shell에서 사용 할 수 있도록 가상환경에 추가
poetry use [사용하는 가상환경의 `python path` | 가상환경이 실행중이라면 `python`]
# repo download 후 버전 적용 (poetry.toml에 따라 적용)
poetry install
mrc-level2-nlp-13
├── configs
│ └── example.json
├── model
│ ├── Reader
│ │ ├── RobertaCnn.py
│ │ └── trainer_qa.py
│ └── Retrieval
│ └── retrieval.py
├── inference.py
├── notebook
│ └── post_preprocessing.ipynb
├── ensemble
│ └── hard_vote.ipynb
├── augmentation
│ └── quesiton_generate.py
├── images
│ └── dataset.png
├── poetry.lock
├── pyproject.toml
├── readme.md
├── License.md
├── dense_retrieval_train.py
├── train_reader.py
└── utils
├── arguments.py
├── dense_utils
│ ├── retrieval_dataset.py
│ └── utils.py
├── logger.py
└── utils_qa.py
아래는 제공하는 데이터셋의 분포를 보여줍니다.
데이터셋은 편의성을 위해 Huggingface 에서 제공하는 datasets를 이용하여 pyarrow 형식의 데이터로 저장되어있습니다. 다음은 데이터셋의 구성입니다.
./data/ # 전체 데이터
./train_dataset/ # 학습에 사용할 데이터셋. train 과 validation 으로 구성
./test_dataset/ # 제출에 사용될 데이터셋. validation 으로 구성
./wikipedia_documents.json # 위키피디아 문서 집합. retrieval을 위해 쓰이는 corpus.
만약 데이터 증강을 통한 dataset을 사용하신다면, 이 디렉토리에 추가해주시고 config 내 "data_args" 를 변경해주시면 됩니다.
roberta 모델을 사용할 경우, token type ids를 사용안하므로 tokenizer 사용시 아래 함수의 옵션을 수정해야합니다. 베이스라인은 klue/bert-base로 진행되니 이 부분의 주석을 해제하여 사용해주세요 ! tokenizer는 train, validation (train.py), test(inference.py) 전처리를 위해 호출되어 사용됩니다. (tokenizer의 return_token_type_ids=False로 설정해주어야 함)
- 학습에 필요한 파라미터를 configs directory 밑에 .json 파일로 생성하여 실험을 진행합니다.
- 학습된 모델은 tuned_models/"model_name" directory에 bin file의 형태로 저장됩니다.
# train_reader.py
def prepare_train_features(examples):
# truncation과 padding(length가 짧을때만)을 통해 toknization을 진행하며, stride를 이용하여 overflow를 유지합니다.
# 각 example들은 이전의 context와 조금씩 겹치게됩니다.
tokenized_examples = tokenizer(
... ...
#return_token_type_ids=False, # roberta모델을 사용할 경우 False, bert를 사용할 경우 True로 표기해야합니다.
padding="max_length" if data_args.pad_to_max_length else False,
)
# train_reader argparser
-c, --config_file_path : train config 정보가 들어있는 json file의 이름
-l ,--log_file_path : train logging을 할 파일 이름
-n ,--model_name : 모델이 저장될 디렉토리 이름
--do_train : Reader모델 train flag
--do_eval : Reader모델 validation flag
- reader 학습 예시
python train_reader.py -c ./configs/exp1.json -l exp1.log -n experiments1 --do_train
- dense retriver 학습 예시
python train_reader.py -c ./configs/dense_exp1.json -l dense_exp1.log -n dense_experiment1 --do_train
MRC 모델의 성능 평가(검증)는 (--do_eval
) 플레그를 따로 설정해야 합니다. 위 학습 예시에 단순히 --do_eval
을 추가로 입력해서 훈련 및 평가를 동시에 진행할 수도 있습니다.
# mrc 모델 평가 (train/validation 사용)
python train_reader.py -c ./configs/exp1.json -l exp1.log -n experiments1 --do_train --do_eval
retrieval 과 mrc 모델의 학습이 완료되면 inference.py
를 이용해 odqa 를 진행할 수 있습니다.
-
학습한 모델의 test_dataset에 대한 결과를 제출하기 위해선 추론(
--do_predict
)만 진행하면 됩니다. -
학습한 모델이 train_dataset 대해서 ODQA 성능이 어떻게 나오는지 알고 싶다면 평가(--do_eval)를 진행하면 됩니다.
# ODQA 실행 (test_dataset 사용)
# wandb 가 로그인 되어있다면 자동으로 결과가 wandb 에 저장됩니다. 아니면 단순히 출력됩니다
# inference argparser
-c, --config_file_path : inference config 정보가 들어있는 json file의 이름
-l ,--log_file_path : inference logging을 할 파일 이름
-n ,--inference_name : inference 결과가 저장될 디렉토리 이름
-m , --model_name_or_path : inference에 사용할 모델 디렉토리의 이름
python inference.py -c infer1.json -l infer1.log --n infer1_result -m ./tuned_models/train_dataset/ --do_predict
inference.py
파일을 위 예시처럼 --do_predict
으로 실행하면 --inference_name
위치에 predictions.json
이라는 파일이 생성됩니다. 해당 파일을 제출해주시면 됩니다.
다음은 MRC 모델의 public & private datset에 대한 결과를 보여줍니다.
-
inference.py
에서 TF-IDF score의 경우 sparse embedding 을 훈련하고 저장하는 과정은 시간이 오래 걸리지 않아 따로 argument 의 default 가 True로 설정되어 있습니다. 실행 후 sparse_embedding.bin 과 tfidfv.bin 이 저장이 됩니다. 만약 sparse retrieval 관련 코드를 수정한다면, 꼭 두 파일을 지우고 다시 실행해주세요! 안그러면 존재하는 파일이 load 됩니다. -
모델의 경우
--overwrite_cache
를 추가하지 않으면 같은 폴더에 저장되지 않습니다. -
./predictions/ 폴더 또한
--overwrite_output_dir
을 추가하지 않으면 같은 폴더에 저장되지 않습니다.
This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.