Skip to content

Latest commit

 

History

History
184 lines (143 loc) · 10.9 KB

README.md

File metadata and controls

184 lines (143 loc) · 10.9 KB

Open-Domain Question Answering Solution

1. Introduction

본 과정은 NAVER Connect 재단 주관으로 인공지능과 딥러닝 Production의 End-to-End를 명확히 학습하고 실무에서 구현할 수 있도록 훈련하는 약 5개월간의 교육과정입니다. 전체 과정은 이론과정(U-stage, 5주)와 실무기반 프로젝트(P-stage, 15주)로 구성되어 있으며, 이 곳에는 그 세번 째 대회인 Open-Domain Question Answering 과제에 대한 Level2-nlp-14조 의 문제 해결 방법을 기록합니다.

Team KiYOUNG2

"Korean is all YOU Need for dialoGuE"

🔅 Members

김대웅 김채은 김태욱 유영재 이하람 진명훈 허진규
Github Github Github Github Github Github Github

🔅 Contribution

  • 진명훈   Project Management • Baseline Refatoring • Elastic Search • Masking • QA Convolution layer • Bart Denoising objective • Query Ensemble • Code Abstraction
  • 김대웅   Curriculum Learning • DPR • Question Embedding Vis • KoEDA • Context Summary • Post processing • Ensemble(hard voting)
  • 김태욱   Data versioning • Elastic search • Retrieval experiment • N-gram Convolution layer • Bart Denoising objective • Curriculum Learning • Post processing
  • 허진규   Data versioning • Curriculum Learning • AEDA • Masking • Reader • EDA • Human Labeling
  • 이하람   Generative model • Extractive & Generative Ensemble • DPR • K-fold • Context Summary
  • 김채은   Generative model • Extractive & Generative Ensemble • Underline Embedding Layer • Punctuation • Pivot Tanslation • Code • Data versioning • Context Summary
  • 유영재   Data versioning • Elastic search • Retrieval experiment • Data Augmentation • Post processing • Ensemble(hard & soft voting)

2. Project Outline

mrc_logo

"서울의 GDP는 세계 몇 위야?", "MRC가 뭐야?"

우리는 궁금한 것들이 생겼을 때, 아주 당연하게 검색엔진을 활용하여 검색을 합니다. 이런 검색엔진은 최근 MRC (기계독해) 기술을 활용하며 매일 발전하고 있는데요. 본 대회에서는 우리가 당연하게 활용하던 검색엔진, 그것과 유사한 형태의 시스템을 만들어 볼 것입니다.

Question Answering (QA)은 다양한 종류의 질문에 대해 대답하는 인공지능을 만드는 연구 분야입니다.다양한 QA 시스템 중, Open-Domain Question Answering (ODQA) 은 주어지는 지문이 따로 존재하지 않고 사전에 구축되어있는 Knowledge resource 에서 질문에 대답할 수 있는 문서를 찾는 과정이 추가되기 때문에 더 어려운 문제입니다.

odqa

본 ODQA 대회에서 우리가 만들 모델은 two-stage로 구성되어 있습니다. 첫 단계는 질문에 관련된 문서를 찾아주는 "retriever" 단계이고, 다음으로는 관련된 문서를 읽고 적절한 답변을 찾거나 만들어주는 "reader" 단계입니다. 두 가지 단계를 각각 구성하고 그것들을 적절히 통합하게 되면, 어려운 질문을 던져도 답변을 해주는 ODQA 시스템을 여러분들 손으로 직접 만들어보게 됩니다.

따라서, 대회는 더 정확한 답변을 내주는 모델을 만드는 팀이 좋은 성적을 거두게 됩니다.

mrc_fig

🏆 Final Score

lb

3. Solution

기계 학습은 인간의 학습 방식에서 아이디어를 얻었습니다. 때문에 저희도 이번 ODQA 문제를 푸는 방향을 사람과 같이 학습하는 모델 구축 으로 잡았습니다. 사람과 같이 학습한다는 것을 정의하기 위해 저희는 아래와 같은 방안을 제시했습니다.

  • 우리는 중요할 것이라 생각되는 부분에 밑줄을 긋는다 (Underlining)
  • 초-중-고의 순으로 국가에서 정한 커리큘럼을 이수한다 (Curriculum Learning)
  • 사람마다 학습을 위해 참고하는 자료가 다르다 (Data Augmentation)

실제로 초기 예측 구조를 구축한 다음 검증 데이터 세트에서 틀린 예제들을 분석한 결과, 저희는 아래와 같은 견해를 얻었습니다.

  • Reader 문제] 날짜 문제를 잘 못 풀더라! → PORORO 모델의 기학습 가중치 활용 (날짜를 상대적으로 잘 맞춤)
  • Reader 문제] 뒤에 조사가 붙은 채로 나오는 결과가 많더라! → 형태소 분석기 앙상블 활용
  • Reader 문제] 복잡한 의미 관계 추론을 힘들어 하더라! → 다양한 데이터로 다양한 모델에 태워서 앙상블
  • Retrieval 문제] 이상한 문서를 가져오더라! → Query 앙상블 + Title을 Context로 붙이기

저희는 위에서 얻은 견해를 기반으로 저희만의 solution을 4주 동안 개발하였으며 상세한 내용을 아래 발표 자료에 정리하였습니다.

다양한 데이터 세트와 모델을 활용하고 학습 방식에도 curriculum learning 등을 통해 학습시킨 후에 앙상블을 했을 때 성능이 많이 올랐습니다.

4. How to Use

.
├── assets/kiyoung2_odqa.pdf
├── configs/examples.yaml
├── solution
│   ├── args/base.py
│   ├── data
│   │     ├── metrics/__init__.py
│   │     └── processors
│   │           ├── /core.py
│   │           ├── /corrupt.py
│   │           ├── /mask.py
│   │           ├── /odqa.py
│   │           ├── /post.py
│   │           └── /prep.py
│   ├── ner/core.py
│   ├── reader
│   │     ├── architectures/__init__.py
│   │     │     └── models/__init__.py
│   │     ├── trainers/base.py
│   │     ├── /core.py
│   │     └── /readers.py
│   ├── retrieval
│   │     ├── dense/base.py
│   │     ├── elastic_engine
│   │     │     ├── /api.py
│   │     │     └── /base.py
│   │     ├── sparse/base.py
│   │     ├── /core.py
│   │     └── /mixin.py
│   └── utils
├── .gitignore
├── README.md
└── new_run.py

아래 명령어로 실행 가능합니다.

python new_run.py configs/examples.yaml

아래와 같이 모듈을 호출하여 사용할 수도 있습니다.

import os
from solution.args import HfArgumentParser
from solution.args import (
    MrcDataArguments,
    MrcModelArguments,
    MrcTrainingArguments,
    MrcProjectArguments,
)
from solution.retrieval import RETRIEVAL_HOST

parser = HfArgumentParser(
    [MrcDataArguments,
     MrcModelArguments,
     MrcTrainingArguments,
     MrcProjectArguments]
)
args = parser.parse_yaml_file(yaml_file="configs/example.yaml")
data_args, model_args, training_args, project_args = args

data_args.dataset_path = "Write YOUR dataset path"
data_args.context_path = "Write YOUR context file name"
data_args.rebuilt_index = True

retriever = RETRIEVAL_HOST["elastic_engine"]["elastic_search"](data_args)
retrieve.retrieve("윤락행위등방지법이 전문 개정되었던 해는?")

5. References

Paper

Software

Reader

Retrieval

Pre & Post processing

ETC