---
# System prepended metadata

title: MRC 랩업 리포트
tags: [랩업 리포트]

---

---
tags: '랩업 리포트'
---

# MRC 랩업 리포트

<!--
# 팀 리포트 가이드 및 예제
- 분량 제한 : 그림 제외 2-3장
- 파일명은 리포트_level#_프로젝트명_팀번호로 통일해주세요.
- 팀 리포트의 목적은 대회 기간동안 팀 내의 기획, 준비, 협업 과정을 기록하는 것입니다.
- 직관적이고 명확하게 우리 팀의 노력을 정리하여 보여주세요!
    - 한 마디로, 이 프로젝트의 미니 포트폴리오를 만들어 주시면 됩니다.
- 이렇게 차곡차곡 쌓인 기록물이 캠프가 끝나는 5개월 후, 여러분의 자산이 될 것입니다.
- 가이드 목차는 다음과 같습니다.
-->

[TOC]

ODQA MRC - Run & Learn 랩업 리포트
===

프로젝트 주제
---

![](https://i.imgur.com/nMZF3bl.png)

- 목표: 주어진 질문에 대해서 관련 문서를 찾고 답을 내는 모델을 제작

활용 장비 및 재료
---
![](https://img.shields.io/badge/-Ubuntu-%23E95420?style=for-the-badge&logo=ubuntu&logoColor=white) ![](https://img.shields.io/badge/-ElasticSearch-%23005571?style=for-the-badge&logo=elasticsearch&logoColor=white) ![](https://img.shields.io/badge/-VS%20Code-%23007ACC?style=for-the-badge&logo=Visual-Studio-Code&logoColor=white) ![](https://img.shields.io/badge/-Pytorch-%23EE4C2C?style=for-the-badge&logo=Pytorch&logoColor=white) ![](https://img.shields.io/badge/-Github-%23181717?style=for-the-badge&logo=Github&logoColor=white)

프로젝트 구조
---

![](https://i.imgur.com/AkDinBS.png)


프로젝트 팀 구성 및 역할
===

- 강석민 : 코드 리펙토링, Sparse & Dense Retrieval 시도
- 김종현 : 데이터 전처리 및 어그멘테이션 시도, Elastic Search 적용 시도
- 김태현 : Extraction based 모델 실험, 커스텀 모델 Freeze 실험
- 오동규 : Dataset 전처리, Post processing을 통한 XLM 모델 성능 향상 시도
- 윤채원 : LSTM, Conv layer 추가한 커스텀 모델 구현, Span Masking
- 최재혁 : Retrieval 성능 개선, Elastic Search 구현 및 성능 향상
- 허은진 : Generation based 모델 실험, Deep한 커스텀 모델 실험, Curriculum Learning 시도 


프로젝트 수행 절차 및 방법
===

<!--
(데이터) -> Data Augmentation, Validation Dataset build, Distant Supervision

(Reader) -> EDA, Generation-based Model 사용, Span Masking, Custom Layer 사용, Curriculum Learning, Transfer Learning, Hyperparameter Tuning,

(Retrieval) -> elastic search, DPR, sparse(형태소 분석기 별로?)

(앙상블) -> hard voting, doc_score 기반 soft voting
-->

데이터
---

### 학습 데이터
![](https://i.imgur.com/DhGC4EE.png)

![](https://i.imgur.com/geMaFCs.png)

- Train: 3952, Validation: 240
- KorQuad_v1 형태의 데이터셋이 주어진다.

### 위키피디아 데이터

![](https://i.imgur.com/Oh6tJnD.png)

- 총 60613개의 위키데이터가 주어진다.
- 해당 위키데이터는 Retrieval을 실행할 때 활용된다.

**Data Preprocessing**
    - 중복된 내용의 문서 제거
    - KLUE 논문에 제시된 전처리 방식 적용
    - 정답에 외국어가 속해 있는 경우를 고려해 외국어 전처리 기준 완화
    - 뉴스 기사 관련 정보 전처리 기준 완화
    - 문단 분리 기호(ex. '\\n') 제거

**Validation Data Split by Difficulty**

훈련 모델의 정확한 평가를 위해 데이터의 예측 난이도를 기준으로 검증데이터를 재구성. 
  - 기존에 주어진 훈련 데이터 (train: 3952개, validation: 240개)
  - 데이터의 예측 난이도 평가 방법
      - 주어진 훈련 데이터 4192개를 5개의 세트로 분리
      - Huggingface에서 MRC task로 Fine-tuning된 모델을 로드
      - 5개의 세트 중 1개의 세트로만 불러온 모델을 학습
      - 나머지 4개의 데이터 세트에 대해 prediction을 수행 => 각각의 데이터에 대해 4개의 모델에 대한 예측 결과가 생성됨
      - 각 데이터에 대한 정답률을 기준으로 데이터의 예측 난이도를 평가하였다.
  - 평가된 난이도를 기준으로 검증데이터 내에 난이도가 높은 데이터와 낮은 데이터가 적절히 분포할 수 있도록 구성하였음

**Distant Supervision**
위키피디아 문서를 훈련용 데이터 셋에 추가하여 학습에 활용할 데이터 크기를 늘리기 위한 방법
  - 기존 훈련용 데이터셋의 'Question'을 쿼리로 활용하여 쿼리와 유사한 위키피디아 문서 확인
  - 유사 문서 상위 k개(hyper parameter) 중 'answer'가 exact match로 포함된 문서는 Positive example, 포함되지 않은 문서는 Negative example 분류
  - Positive example과 Negative example의 비율을 달리하여, 혹은 둘 중 하나만 훈련용 데이터에 추가하여 모델 학습 시 활용
  - 유사 문서 2개는 Hard Negative example로 유사하지 않은 임의의 문서 2개는 Soft Negatvie example로 훈련용 데이터에 추가 후 모델 학습 및 하이퍼파라미터 튜닝 시 기존 모델에 비해 EM 스코어가 2점 가량 상승함을 확인

**Question Generation**
위키피디아 문서를 활용하여 새로운 '질문-지문-답변' 형태의 데이터를 생성하는 방법
    - komoran 형태소 분석기 활용, 명사(NNG)만을 추출하여 문서 별 answer 추출, answer가 2개 이상 존재하는 경우 해당 문서 제외(지문과 답변을 1:1로 매핑하기 위함)
    - 위키피디아 문서내 임의의 명사를 'answer', 위키피디아 문서를 'context'로 사전 학습된 Question Generation 모델의 입력으로 사용
    - 생성된 질문을 활용하여 '질문-지문-답변' 형태의 새로운 데이터 확보
    - 아쉽게도 모델의 성능 향상에 기여하지 못함. 올바르지 못한 '질문-답변'으로 이루어진 일부 데이터가 오히려 악영향을 끼쳤을 것으로 판단

**Back Translation**
    - 학습 데이터 내에 존재하는 지문과 질문을 다른 언어로 번역하고 번역된 텍스트를 다시 한국어로 변역하는 data augmentation 방법론
    - 현재 텍스트에 대해 같은 의미를 가지지만 형태가 다른 텍스트로 변경하여 모델이 더 다양한 단어를 학습하고, 의미적 유사관계를 파악하는데 도움이될 수 있다고 판단하였다.



Reader
---
- **Sigopt를 이용한 하이퍼파라미터 최적화**
  - klue/roberta-large 모델의 validation 데이터 EM 스코어를 75까지 올림
- **Generation Model를 사용하여 성능 향상 시도**
  - T5, BART를 이용하여 Answer Generation
  - T5 Encoder만 사용해서 Extraction-based Question Answering
- **Transfer Learning 시도**
  - 학습된 klue/roberta 모델에 LSTM, Conv layer를 추가 한 다음 backbone 모델을 Freeze한 후에 학습
  - Freeze한 모델을 다시 대회용 데이터로 추가 학습
  - Backbone과 Output layer에 learning rate를 다르게 설정하여 학습
- **LSTM/Convolution을 Head에 추가한 커스텀 모델 제작**
  - LSTM
  - LSTM + Convolution
  - 다양한 Convolution Layer 추가
      - n-gram 기반의 아이디어 적용
      - 서로 다른 conv layer를 병렬적으로 학습하고 concat
  - Convolution with Max Pooling
- **Span-masking을 통한 Multi-task Learning**
  - 지문 내에서 정답 단어를 예측하는 MRC 태스크와 더불어 Pre-trained 모델의 objective인 Masked Language Modeling 태스크를 함께 학습.
  - Random Masking이 아닌 연속된 단어의 Span에 마스크를 씌어 모델의 contextual representation 학습이 용이하도록 하였음
- **Curriculum Learning 시도**
  - 데이터의 난이도를 1~4로 나누어서 순차적으로 학습 (학습되지 않은 모델로 예측하여 난이도 측정)
      - 모델이 학습 단계에서 쉬운 데이터부터 학습을 시작하고, 점차 어려운 데이터로 학습을 진행하면서 예측을 위한 세부적인 표현 학습이 가능하도록 하는 방법.
- **Post Processing**
    - 정답을 형태소별로 분리한 후 조사가 나오면 버림
    - 형태소 분석기에 따라 다르게 처리되는 부분 처리
        - '의'와 '는'과 같은 처리가 잘 안되는 조사 예외처리
- **모델 앙상블**

Retrieval
---
- **TF-IDF에서 BM25로 변경**
- **명사 기준 Retrieval**
    - 초기에 적용하여 Top10 스코어 84점을 기록
- **Elastic search 적용**
    - nori 토크나이저로 Top10 88점을 기록
- **Okt 기반으로 직접 제작한 토크나이저 적용**
    - Top10 90점을 기록
- **DPR기반으로 Dense Retrieval 적용**
    - 학습 데이터수가 부족하여 잘 되지는 않았음

Ensemble
---
- hard voting
    - 만들어진 정답 결과를 기준으로 빈도수에 따라 voting


프로젝트 수행 결과
===

- 프로젝트 결과물이 도출된 과정을 세부적으로 기록한다. 활용된 기술(구현 방법), 핵심
- 기능, 검증 결과 등을 상세히 기재한다. 프로젝트의 과정이 잘 드러날 수 있도록 데이터
- 전처리 과정부터 활용까지 전체적인 프로세스를 확인할 수 있도록 단계별로 작성한다.


모델선정
---

**Extraction Based Model**
- 다양한 모델을 이용하여 실험하여 최종적으로 klue/roberta-large 채택
- klue/roberta-large + LSTM, XLM-Roberta-large, SpanMasking-Model을 앙상블에 활용

**Generation Based Model**
- MT5, ke-t5 모델을 사용하여 실험
    - Validation Score 상에서 성능이 50~60점
- BART를 이용한 성능 향상 시도
- MT5 Encoder만 사용하여 Extractive QA를 시도했지만 성능이 나오지 않아서 사용X

![](https://i.imgur.com/VXtCRCx.png)

모델 평가 및 개선
---

- Transfer Learning, Curriculum Learning을 통한 성능 개선 시도
- 모델에 Custom Output Layer를 추가하여 모델 학습
- Span Masking을 추가하여 성능 개선 시도
- Distant Supervision 훈련을 통해 EM 스코어 향상

![](https://i.imgur.com/2QUjxBQ.png)

모델 성능
---
- EM Score
    - 단일 모델 성능: 66
    - 앙상블 모델 성능: 70

최종 리더보드 결과
---

![](https://i.imgur.com/MgXDLoU.png)

- 싱글 모델은 66점 정도 였지만, 앙상블을 통해서 최종으로 70점에 도달하였다.

자체 평가/프로젝트 후기
===
잘한 점들
---
- Todo list 공유
- 하나의 베이스라인으로 협업
- Git branch를 이용하여 실험한 코드 관리
- 노션을 이용하여 파트 분배 및 실험 기록 공유
- 게더타운으로 실시간 협업
- 다양한 실험 시도
    - 결과적으로 다양한 모델의 결과를 앙상블해서 최종 스코어가 10점 올라감

시도 했으나 잘 되지 않았던 것들
---

- 고유명사 기반으로 질문생성 및 훈련
- Dense Retrieval 를 통한 문서 검색
- 요약문을 통한 문서검색
- Span-masking으로 모델 훈련
- 생성모델(BART, T5)을 통한 생성기반 Reader
- Curriculum Learning

다음에 시도해 보고 싶은 것들
---

- Github Project를 통한 이슈 관리 및 문서관리
- 커스텀 모델 제작
- Ranking 모델 추가
- 대회 제출 시 정보를 입력. 최종 제출시 확인할 내용 입력