MRC 모델을 학습시키는 코드입니다.
이 코드를 이용해 MRC 모델을 학습시켰습니다.
다음과 같은 예시로 모델을 학습시킬 수 있습니다.
$ python train.py --output_dir /opt/ml/models/kobert-korquad\
--dataset_name squad_kor_v1 \
--model_name monologg/kobert \
--do_train True \
--do_eval True \
--num_train_epoch 3 \
--learning_rate 2e-5 \
--per_device_train_batch_size 16 \
--per_device_eval_batch_size 40 \
--warmup_steps 500 \
--logging_steps 100 \
--save_total_limit 1 \
--save_strategy epoch \
--save_steps 2000 \
--logging_dir /opt/ml/models/baseline/logs \
--evaluation_strategy epoch \
--fp16 True --fp16_backend amp --fp16_opt_level O2\
--report_to wandb --run_name kobert-korquad-data \
이 포맷은 train.sh
파일에 저장되어 있습니다.
Dense Passage Retrieval을 위한 모델을 학습시키는 코드입니다.
결과적으로는 성능이 너무 좋지 않아 이 코드로 학습시킨 모델은 사용하지 않았습니다.
다음과 같은 예시로 모델을 학습시킬 수 있습니다.
$ python DPR_train.py -name 2 -lr 2e-5
이 포맷은 train.sh
파일에 저장되어 있습니다.
학습시킨 모델로 inference를 수행하는 코드입니다.
retrieval을 포함하고 있으며 ODQA(Open Domain Question Answering)를 수행하는 코드입니다.
다음과 같은 예시로 inference를 수행합니다.
$ python inference.py --output_dir /opt/ml/models/roberta/inference \
--model_name Dongjae/mrc2reader \
--tokenizer_name xlm-roberta-large\
--dataset_name /opt/ml/input/data/data/test_dataset \
--do_predict \
--retrieve_topk 30 \
--overwrite_output_dir \
--per_device_eval_batch_size 40
이 포맷은 inference.sh
파일에 저장되어 있습니다.
TF_IDF 알고리즘을 이용해 question과 가장 관련이 높은 문서를 반환합니다.
지정한 topk 만큼의 문서를 점수와 함께 데이터 프레임의 형태로 반환합니다.
다음과 같이 사용합니다.
from retrieval import SparseRetrieval
sparse_retriever = SparseRetrieval(tokenize_fn=tokenize,
data_path="/opt/ml/input/data/data",
context_path="wikipedia_documents.json")
# sparse_embedding
sparse_retriever.get_sparse_embedding()
df_sparse = sparse_retriever.retrieve(datasets['validation'], topk=data_args.retrieve_topk)
DPR_train.py
로 학습시킨 모델로 retrieval을 하기 위한 코드입니다.
하지만 학습에 실패하면서 실제로 사용하진 않았습니다.
명수님이 구현하신 dense retrieval입니다.
명수님의 DPR 모델을 사용하는 것은 위의 DPR.py
코드를 사용할 수도 있지만
명수님이 구현하신 utils_qa_ms.py
를 사용하기 위해 명수님의 코드를 사용하였습니다.
사용법은 다음과 같습니다.
from retrieval_dense import DenseRetrieval
dense_retriever = DenseRetrieval(p_path='thingsu/koDPR_context', q_path='thingsu/koDPR_question',
bert_path='kykim/bert-kor-base')
# dense_embedding
dense_retriever.get_dense_embedding()
df_dense = dense_retriever.retrieve(datasets['validation'], topk=data_args.retrieve_topk)
명수님이 구현하신 sparse retrieval입니다.
역시 utils_qa_ms.py
를 사용하기 위해 명수님의 코드를 사용하였습니다.
사용법은 retrieval.py
와 같습니다.
inference나 train에 필요한 util들이 구현되어 있는 코드입니다.
주로 최종 답안을 결정하거나 후처리를 하기 위해 이 코드를 많이 사용합니다.
명수님이 구현하신 이 util에 맞추기 위해 명수님의 retrieval 구현을 사용하였습니다.
kss 라이브러리를 이용하여 wiki docs를 일정한 길이로 잘라 저장하는 노트북입니다.
이 과정 중에 데이터에 대해 간단한 전처리를 수행합니다.
dense retrieval를 테스트합니다.
또한 sparse retrieval과 결합을 테스트합니다.
dense retrieval과 sparse retrieval의 점수를 더해 상위 30개의 문서 중 정답 문서가 들어 있을 확률을 측정합니다.
이 과정에서 dense retrieval에 곱해질 최적의 상수값 k값을 구합니다.
위 코드를 기반으로 p3 competition에서 EM: 56.25% F1: 70.68% 의 점수를 달성할 수 있었습니다.