You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
본 프로젝트는 사전에 구축된 Wikipedia 데이터셋에서 질문에 대답할 수 있는 알맞은 문서를 Retriever를 활용하여 추출하고, Reader를 통해 추출한 문서에서 정답을 찾거나 생성하는 Retriever-Reader two-stage 모델을 구현하는 것을 목표로 한다.
평가 지표
주요 지표: EM (Exact Match)
참고 지표: F1 Score
최종 순위
분류
순위
EM
F1
private (최종 순위)
5
67.22
77.88
public (중간 순위)
12
64.17
74.89
데이터 구성
분류
샘플 수
용도
공개여부
Wikipedia
57k
Retriever 학습용
모든 정보 공개 (text, corpus_source, url, domain, title, author, html, document_id)
Train
3952
Reader 학습용
모든 정보 공개(id, question, context, answers, document_id, title)
Validation
240
Reader 학습용
모든 정보 공개(id, question, context, answers, document_id, title)
Test (Public)
240
제출용
id, question만 공개
Test (Private)
360
제출용
id, question만 공개
개발 환경
서버: AI Stages GPU (Tesla V100-SXM2) * 4EA
기술 스택: Python, Transformers, PyTorch, Pandas, WandB, Hugging Face, Matplotlib
운영체제: Linux
협업 도구: GitHub, Notion, Slack, Zoom
2. 팀 구성 및 역할
팀원
역할
박준성
협업 관리 (이슈/PR 템플릿 추가), 코드 리팩토링 (베이스라인 코드 재작성, Config 클래스), EDA 서버 개설 및 관리 (Page 시스템, 훈련용 데이터셋 EDA 페이지), Cross Encoder 구현, Retrieval 성능 측정 EDA (TF-IDF, BM25), 앙상블 구현 (soft voting), 모델 파이프라인 병합 (Retriever-Reader 연결), 데이터 증강 (KorQuad)
이재백
Dense Retriever 구현, Negative Sampling 구현 (in-batch, random, Hard negative sampling), 모델 조사 및 실험
강신욱
모델 탐색 및 실험, 기능 향상 시도 (가중치를 활용한 sparse와 dense 리트리버 결합, GPT를 활용한 dense retrieval의 네거티브 샘플링 생성)
홍성균
Sparse Retrieval 구현 (BM25), 코드 리팩토링 (main.py 병합, CPU 병렬처리, Reader/Retrieval Tokenizer 분리 적용), EDA 서버 증축 (DataEDA, TokenizerEDA), 실험 편의성 개선 (WandB 적용), Bug Fix (하이퍼파라미터 미적용 수정, Argumentparser 미적용 수정), 데이터 증강 (KorQuAD와의 병합)
백승우
Generation-based Reader 모델 구현, PEFT (Parameter Efficient Fine-Tuning) 기법 중LoRA (Low-Rank Adaptation) 구현, Generation-based 모델 조사 및 실험
김정석
한자 등 각 유니코드 블록에 해당하는 문자를 제거하는 전처리 함수 작성 및 EDA
3. 프로젝트 파일 구조
project/
│
├── notebooks/ # EDA 결과, 임시 코드를 위한 Jupyter 노트북 디렉토리
│ └── (EDA 결과 또는 임시 코드) # 실제 노트북 파일들
│
├── src/ # 소스 코드의 메인 디렉토리
│ ├── QuestionAnswering/ # 질문 답변 관련 모듈 디렉토리
│ │ ├── tokenizer_wrapper.py # 토크나이저 래퍼 클래스/함수
│ │ ├── trainer.py # 모델 훈련 관련 클래스/함수
│ │ └── utils.py # QA 관련 유틸리티 함수
│ │
│ ├── Retrieval/ # 검색 관련 모듈 디렉토리
│ │ ├── cross_encoder.py # Cross-encoder 모델 관련 코드
│ │ ├── dense_retrieval.py # 밀집 검색 관련 코드
│ │ ├── sparse_retrieval.py # 희소 검색 관련 코드
│ │ ├── hybrid_retrieval.py # 하이브리드 검색 관련 코드
│ │ ├── NegativeSampler.py # 일반 네거티브 샘플링 클래스
│ │ └── SparseNegativeSampler.py # 희소 검색 기반 네거티브 샘플링 클래스
│ │
│ ├── server/ # Streamlit 서버 관련 코드 디렉토리
│ │ ├── page/ # 페이지 구현 클래스 디렉토리
│ │ │ ├── DataEDA.py # 데이터 EDA 페이지 구현
│ │ │ ├── HomePage.py # 홈페이지 구현
│ │ │ ├── TokenizerEDA.py # 토크나이저 분석 페이지 구현
│ │ │ └── trainingDatasetQA.py # QA 데이터셋 분석 페이지 구현
│ │ │
│ │ └── utils/ # 서버 유틸리티 디렉토리
│ │ ├── data_loader.py # 데이터 로딩 관련 함수
│ │ └── Page.py # 페이지 관리 클래스
│ │
│ ├── config.py # 설정 파일 로드 및 파싱
│ ├── index.py # Streamlit 앱의 메인 엔트리 포인트
│ ├── main.py # 전체 모델 훈련 및 검증 관리
│ └── preprocess.py # 텍스트 전처리 함수
│
├── config.yaml # 기본 모델 및 데이터 경로 설정
└── dense_encoder_config.yaml # Dense Encoder 모델 설정
4. 프로젝트 수행 절차 및 방법
4.1 그라운드 룰
팀 Notion의 서버 현황판 활용
Git 관련 규칙 (commit convention, branch naming convention 등)
소통 관련 규칙 (상호 존중, 실시간 대화, 데일리 스크럼 등)
4.2 전체 프로젝트 수행 과정
프로젝트 기초 강의 수강 (09/30 - 10/09)
베이스라인 코드 분석 및 초기 설정 (10/10 - 10/11)
Retrieval 및 Streamlit 서버 초기 구현 (10/14 - 10/17)
모델 개선 및 데이터 증강 실험 (10/18 - 10/21)
모델 탐색 및 최적화 (10/22 - 10/23)
5. 프로젝트 상세
5.1 협업 툴
Notion: 실험 진행 현황, 서버 사용 현황, 프로젝트 일정 정리 및 실험 기록 정리.
Git: branch, commit convention 설정, issue 기능 활용, Release 기능 사용. 세부적인 버전 관리의 어려움 존재.
Zoom: 데일리 스크럼 및 피어세션을 통해 원활한 소통 유지.
5.2 파일 구조
초기 구조: 모든 파일을 src 폴더에 넣고, Retrieval과 QuestionAnswering 폴더로 구분.
변경 후: src 폴더에 server 폴더 추가, inference.py와 train.py를 통합하여 main.py 구축.
5.3 데이터 EDA
Streamlit 서버를 활용한 EDA 결과 배포
목적: 팀원이 훈련용 데이터셋을 쉽게 확인할 수 있도록 GPU 서버에 Streamlit 서버를 배포.
기능: 질문과 Context 전문을 보여주는 페이지, 정답 강조 기능, UNK 토큰 강조 기능.
데이터 증강 및 전처리
결과: 한자와 이스케이프 문자 등이 UNK 토큰으로 식별됨.
전처리 시도: 한자 제거 시도, KorQuAD를 활용한 데이터 증강, 특수문자 및 연속 공백 제거.
5.4 기능 개발 상세
Sparse Embedding
변경 사항: TF-IDF 대신 BM25 적용.
라이브러리: rank_bm25 사용.
Dense Embedding
모델: Query Encoder와 Passage Encoder 기반 Bi-Encoder 모델 구현.