항목 | 내용 |
---|---|
프로젝트 주제 | 문장 속 단어(Entity)에 대한 속성과 관계를 예측하는 관계 추출(Relation Extraction) 업무를 수행 |
프로젝트 구현 내용 | • 단어 간 관계를 의미하는 30개 라벨 각각에 대해, subject와 object가 해당 클래스에 속할 확률을 예측 • 평가 지표로는 1) no-relation class를 제외한 micro F1 score, 2) 모든 클래스에 대한 AUPRC가 사용 |
진행 기간 | 2024년 1월 3일 ~ 2024년 1월 18일 |
Notion, Slack, Zoom 을 통해 회의를 진행했으며, 코드의 경우는 모듈화하여 Make파일로 자동화하여 관리했습니다. 이때, Github을 통해 코드 공유를 진행했으며, Wandb를 이용해 실시간으로 실험을 관리했습니다.
구희찬 | 김민석 | 손유림 | 오태연 | 이상수 | 최예진 |
---|---|---|---|---|---|
전반적인 프로젝트 과정을 모두 경험할 수 있도록 분업을 하여 협업을 진행했으며, 초기 개발 환경 구축 단계부터 Github을 연동하여 세부 task 마다 issue와 branch를 생성하여 각자의 task를 수행했다. 이를 통해 코드 버전 관리와 코드 공유가 원활하게 이루어질 수 있었다.
이름 | 역할 |
---|---|
구희찬 | 환경 설정 및 템플릿 관리, 베이스라인 코드 리팩토링, 데이터 라벨 검수, 모델 아키텍쳐 개선(3-classification, LSTM layer), Github issue 관리 및 PR merge, 하이퍼파라미터 튜닝 실험, 검증 데이터셋 비율 변경 실험, 사용성 개선 및 사후분석용 유틸 제작 |
김민석 | 환경 설정 및 템플릿 관리, 베이스라인 모델 탐색 및 실험, 모델 아키텍쳐 개선(LSTM layer, Focal Loss 적용 및 실험), 전처리(query 추가), 검증 데이터셋 생성 및 코드 작성, 전반적인 방법론 정리, 실험 결과 사후 분석 |
손유림 | 베이스라인 모델 실험, 사전 조사 및 방법론 정리, 모델 개선 관련 논문 발제(entity marking, TAPT), 전처리 및 증강 시도(entity marking, 역번역, 한자 제거, MLM), 모델링 실험(3-classification) |
오태연 | 전반적인 방법론 정리 및 노션 관리, WandB 관리, EDA 및 데이터 분석, 전처리 및 증강 시도(label reverse, MLM증강, 소스 스페셜 토큰 추가), tokenizer 분석, 모델 아키텍쳐 개선(LSTM layer), 실험 결과 사후 분석 코드 작성 및 결과 비교 |
이상수 | 베이스라인 모델 실험 및 비교, 모델 아키텍쳐 개선(3-classification, Huggingface Roberta 코드 분석 및 LSTM layer 추가), 전처리 및 증강 시도(역번역 및 entity 추출), 하이퍼파라미터 튜닝 실험, 데이터 라벨 분석 및 실험 결과 사후 분석 |
최예진 | 모델 아키텍쳐 개선(3-classification, Early Stopping, Trainer 코드 분석), 전처리 및 증강 시도(data copy, backtranslation), 검증 데이터셋 생성 및 코드 작성, 데이터 분석 및 실험 결과 사후 분석, 앙상블 코드 작성 |
- 전체 데이터에 대한 통계는 다음과 같습니다.
train.csv
: 총 32470개test_data.csv
: 총 7765개 (정답 라벨 blind = 100으로 임의 표현)
- column 1: 샘플 순서 id
- column 2: sentence.
- column 3: subject_entity
- column 4: object_entity
- column 5: label
- column 6: 샘플 출처
분류 | 내용 |
---|---|
모델 | • 실험한 모델 : 최종적으로 klue/roberta-large 사용klue/roberta-large , klue/roberta-base , klue/roberta-small , monologg/koelectra-base-v3-discriminator , snunlp/KR-ELECTRA-discriminator , beomi/kcbert , xlm/roberta-large , kykim/bert-kor-base , kykim/electra-kor-base • LSTM layer 추가 : Classification 단계에서 LSTM layer를 추가해줌으로써 일부 토큰의 결과 벡터만을 사용하던 기존 구조 개선, 문장 전체 벡터를 활용할 수 있는 LSTM layer를 추가 |
데이터 전처리 | • (Typed) Entity Marker : entity의 위치 정보를 marker로 제공하고 entity의 유형을 제공해서 학습 성능 향상을 시도 • 데이터 Query 추가하기 : BERT의 QA Task 학습 방식을 적용하고자 함- sentence 앞 부분에 질문 형태의 쿼리 추가 (예시 : [SUB]와 [OBJ]의 관계는 무엇인가? [SEP] [sentence] [SEP]) • Source 스페셜 토큰 추가 : 소스별 타겟값의 분포가 다른 것을 확인, 쿼리문 앞에 3가지 소스 스페셜 토큰을 추가해줌 - [W_PED],[W_TR], [POL] • 한자 제거 : 토큰 결과의 UNK 최소화를 위함. 가장 많이 UNK로 토큰화되었던 한자어 제거 |
데이터 증강 및 조정 | • Label Reverse 증강 : 서로 상충되는 의미의 라벨과, subject와 object를 바꿔도 괜찮은 라벨의 경우 subject와 object를 반대로 swap하여 데이터 증강, 10939개의 데이터 증가 • Back-Translation 증강 : GoogleTrans 라이브러리를 활용해 문장을 영어로 번역한 후, 이를 다시 한국어로 번역하여 데이터 증강 • MLM 증강 : BERT 기반 모델들의 MLM 학습 방식에서 착안, [MASK] 부분이 기존 문장과 다른 새로운 token으로 패러프레이징 될 것임을 가정하고,증강에 활용 |
아키텍쳐 보완 | 1. 과적합 방지 • Early Stopping : patience 조정 • Hyperparameter Tuning : epoch, learning_rate, batch_size, load_best_model 등 2. 불포 불균형 해결 • binning 모델링 • 특정 라벨 증강 시도 및 no_relation 라벨 undersamping • source별 불균형 해소 시도 • Loss Function 변경 (Focal Loss) |
검증 전략 | • 9:1, 8:2, 95:5 비율과 random, stratify의 방식으로 valid set 생성해서 평가 • 최종적으로 리더보드에 제출하여 모델 성능 검증 • Valid set에 대한 predict 값과 정답값을 비교하는 difference.csv 파일 및 히트맵을 생성하여 정성평가 |
앙상블 방법 | • 데이터 전처리와 모델링 기법, 증강 데이터 적용 후 학습한 모델 중 가장 성능이 좋은 모델 10개를 선정하여 soft voting 앙상블을 진행 • 성능이 좋은 모델들 중 최대한 다양한 b종류의 모델과 여러 데이터셋이 섞이도록 Soft Voting, Weighted Voting 진행 • 성능 개선 : micro f1 75.1084(단일모델 최고) →76.4576 (앙상블) |
📦level2-klue-nlp-04
┣ code
┃ ┣ custom_robertamodel.py
┃ ┣ dict_label_to_num.pkl
┃ ┣ dict_num_to_label.pkl
┃ ┣ focal.py
┃ ┣ focal_loss.py
┃ ┣ heatmap.py
┃ ┣ inference.py
┃ ┣ load_data.py
┃ ┣ metrics.py
┃ ┣ modify_path.py
┃ ┣ split_valid_random.py
┃ ┣ split_valid_stratify.py
┃ ┣ train.py
┃ ┗ train_source.py
┣ config
┃ ┗ default_config.yaml
┣ dataset
┃ ┣ test
┃ ┃ ┗ test_data.csv
┃ ┣ train
┃ ┃ ┗ train.csv
┣ model_ensemble
┃ ┣ ensemble.py
┃ ┣ ensemble_model.py
┃ ┗ utils.py
┣ utils
┃ ┣ add_query.py
┃ ┣ add_source_token.py
┃ ┗ preprocessing.py
┣ prediction
┃ ┗ sample_submission.csv
┣ .gitignore
┣ README.md
┣ Makefile
┣ read_config.sh
┣ setup.cfg
┣ pyproject.toml
┗ requirements.txt
dataset
의 하위 디렉토리인test
에test.csv
,train
에train.csv
파일을 준비한다.code
디렉토리로 이동하고split_valid_*.py
파일을 실행하여 validation 데이터를 생성한다.config
디렉토리의default_config.yaml
을 복사하여config.yaml
파일을 생성하고 원하는 Hyperpatameter를 설정한다.- 상위 디렉토리인
level2-klue-nlp-04
으로 이동하여make run
을 입력하면 학습과 함께 추론이 완료된다.- ‘config’로 시작하는 파일을 만들고
make all
을 입력하면 여러 config 파일을 시작한다.
-
예시
┣ config ┃ ┣ config.yaml ┃ ┣ config2.yaml ┃ ┣ config3.yaml ┃ ┣ config4.yaml ┃ ┗ default_config.yaml
- ‘config’로 시작하는 파일을 만들고