--- 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 모델 추가 - 대회 제출 시 정보를 입력. 최종 제출시 확인할 내용 입력