문장 간 유사도 측정 프로젝트 회고

송수빈·2024년 10월 10일
0

boostcamp

목록 보기
2/10
post-thumbnail

프로젝트 개요

소개

Semantic Text Similarity (STS)란 두 텍스트가 얼마나 유사한지 판단하는 NLP Task입니다. 일반적으로 두 개의 문장을 입력하고, 이러한 문장쌍이 얼마나 의미적으로 서로 유사한지를 판단합니다.

우리는 STS 데이터셋을 활용해 두 문장의 유사도를 측정하는 AI모델을 구축할 것입니다. 유사도 점수와 함께 두 문장의 유사함을 참과 거짓으로 판단하는 binary 정보도 같이 제공하지만, 최종적으로 0과 5사이의 유사도 점수를 예측하는 것을 목적으로 합니다.

학습 데이터셋 9,324개, 검증 데이터셋 550개, 평가 데이터는 1,100개가 제공됩니다. 평가 데이터의 50%는 Public 점수 계산에 활용되어 실시간 리더보드에 표기가 되고, 남은 50%는 Private 결과 계산에 활용되어 대회 종료 후 평가됩니다.

  • id (문자열) : 문장 고유 ID입니다. 데이터의 이름과 버전, train/dev/test가 적혀 있습니다.
  • source (문자열) : 문장의 출처로 총 3가지 source 가 있습니다.
    • petition : 국민청원 게시판 제목 데이터
    • NSMC : 네이버 영화 감성 분석 코퍼스(Naver Sentiment Movie Corpus)
    • slack : 업스테이지(Upstage) 슬랙 데이터
  • sentence1 (문자열) : 문장 쌍의 첫번째 문장입니다.
  • sentence2 (문자열) : 문장 쌍의 두번째 문장입니다.
  • Label 점수: 0 ~ 5사이의 실수
    • 5점 : 두 문장의 핵심 내용이 동일하며, 부가적인 내용들도 동일함
    • 4점 : 두 문장의 핵심 내용이 동등하며, 부가적인 내용에서는 미미한 차이가 있음
    • 3점 : 두 문장의 핵심 내용은 대략적으로 동등하지만, 부가적인 내용에 무시하기 어려운 차이가 있음
    • 2점 : 두 문장의 핵심 내용은 동등하지 않지만, 몇 가지 부가적인 내용을 공유함
    • 1점 : 두 문장의 핵심 내용은 동등하지 않지만, 비슷한 주제를 다루고 있음
    • 0점 : 두 문장의 핵심 내용이 동등하지 않고, 부가적인 내용에서도 공통점이 없음
  • binary-label : 문장 쌍에 대한 유사도가 2.5점 미만인 경우엔 0으로, 2.5점 초과인 경우엔 1로 변환한 binary label 입니다.

평가 방법

피어슨 상관 계수(Pearson Correlation Coefficient ,PCC)는 두 변수 X 와 Y 간의 선형 상관 관계를 계량화한 수치로, 보통 상관관계라 함은 피어슨 상관관계를 칭합니다.
피어슨 상관계수는 -1~1 사이의 값을 가지며, +1은 완벽한 양의 선형 상관 관계, 0은 선형 상관 관계 없음, -1은 완벽한 음의 선형 상관 관계를 의미합니다.
피어슨 상관 계수는 정답과 예측이 일치하지 않더라도 증감율이 일치하면 1에 가까운 값을 보입니다. 반대로 정답값과 예측이 근사하더라도 증감율이 다르면 -1에 가까운 값을 보일 수 있습니다.
이는 정답을 정확히 예측하는 것 보다, 높은 값은 확실히 높게, 낮은 값은 확실히 낮게, 즉 전체적인 경향을 잘 예측하는 것이 중요함을 의미합니다.

대회 룰

  • [외부 데이터셋 규정] 본 대회에서는 외부 데이터셋 사용을 금지합니다. (외부 데이터에 의존하는 것이 아니라, 주어진 데이터셋을 기반으로 모델링 성능 개선에 집중해 보시길 바랍니다)
  • [기학습 가중치 사용] 저작권상 사용이 불가한 경우를 제외하고는 모든 기학습 가중치 사용은 허용됩니다.
  • [테스트셋 활용 가능 여부] 참가자는 모델 학습에 테스트셋을 활용하거나, 테스트셋의 정보를 학습에 활용하여 최종 결과를 낼 수 없습니다.
  • [데이터 증강] Train/Dev 데이터에 한해 증강 가능합니다. 다만 기술적/통계적 근거가 존재해야하며, 누구나 동일한 증강 결과물을 생성할 수 있어야 합니다.

프로젝트 진행

Overview

TaskTask Description
EDA데이터의 특성을 살펴보기 위해 label별 분포 등 시각화 및 분석
Augmentation데이터셋의 불균형성을 해소하기 위해 다양한 방법으로 데이터 증강 수행
Model Exploration데이터셋과 STS task를 수행하기 적합한 pre-trained model 선정
Second-stream with GNN단어들 사이의 유의어 관계를 모델링하기 위해 Graph Neural Networks (GNN)을 second-stream으로 NLP 모델에 통합하고 성능 평가
Contrastive LearningSTS Task에서 SOTA의 성능을 달성했던 Contrastive Learning을 본 프로젝트에 적용하여 성능 평가
Clustering문장 사이의 코사인 유사도를 바탕으로 라벨관의 상관관계를 탐구하여 모델에의 활용 방안 및 전처리 방법 고안
Soft Voting Ensemble증강된 데이터셋으로 학습한 다양한 model의 예측확률을 평균하여 여러 모델의 강점을 결합해 성능 향상

EDA (Exploratory Data Analysis)

  • train 데이터셋
    • 0.0 label에 20% 이상의 데이터가 집중되어 있음
    • 4.5에서 5.0 사이 label값에 해당하는 데이터가 매우 적음
  • dev 데이터셋
    • 모든 label에 걸쳐 상대적으로 균등한 분포

Data Augmentation

데이터 불균형은 모델이 자주 나타나는 라벨에 치우쳐 예측하게 되어, 드문 라벨을 제대로 예측하지 못하는 경향이 생기는 등 부정적인 결과를 가져올 수 있습니다. 이를 해결하기 위해서 다음과 같은 데이터 전처리 및 증강기법을 사용할 수 있습니다.

  • 언더샘플링(Under-sampling): 0.0 데이터의 개수를 줄여서 다른 라벨들과 비슷한 수준으로 맞추는 방법 (정보 손실 발생)
  • 오버샘플링(Over-sampling): 5.0과 같은 적은 양의 라벨 데이터를 복제해서 양을 늘리는 방법 (과적합 위험)
  • 데이터 증강(Data Augmentation): 문장 변환 기법을 사용하는 등 적은 양의 라벨에 해당하는 데이터를 증강하여 새로운 데이터를 생성
  • 비율 조정: 드문 라벨의 수를 데이터 증강을 통해 직접 조정함으로써 라벨 간의 비율을 조정

v1 | Down Sampling

label 별 빈도수range 별 빈도수
  • label=0.0인 데이터셋에서 1,000개 다운샘플링

v2 | Data Augmentation: Biassed

label 별 빈도수range 별 빈도수
  • label=0.0인 데이터셋에서 다운샘플링된 1000개의 행을 이용하여 label=(4.0, 5.0]인 데이터셋 augmentation

v3 | Data Augmentation: Uniform

label 별 빈도수range 별 빈도수
  • 데이터셋의 불균성을 해소하기 위해 데이터 개수가 적은 label 데이터에 대해 집중적으로 증강

v4 | Data Augmentation: Spellcheck

label 별 빈도수range 별 빈도수
  • label=0.0인 데이터셋에서 맞춤법 교정 라이브러리 hanspell이 적용된 776개의 행을 활용하여 4.8, 5.0 label 증강
  • V2 데이터셋 중 500개를 4.6, 4.5 label에 각각 450, 50개 할당
  • 0.2 ~ 4.4 label에 대해 sentence swap 수행

Model Exploration

배경 및 목적

본 프로젝트의 목적은 한국어 문장 쌍에 대한 유사도를 정확하게 예측하는 모델을 개발해 실수 범위로 정밀한 유사도 점수를 예측하는 것으로, 한국어 데이터셋에 적합한 pre-trained model을 선정하고, 이를 base 모델로 하여 STS 성능을 극대화하는 방향으로 진행했습니다. Hugging Face의 모델 허브에서 semantic text similarity tag로 필터링한 후, BERT기반 한국어 모델들(e.g. simcse-ko-bert, klue-roberta, kf-deberta)에 대해 성능 평가를 진행했습니다. 또한, 서버의 HW 환경을 고려한 효율적인 학습 및 추론을 위해 LLM보다 가벼운 Encoder 기반 모델을 선정했습니다.

실험 세팅 및 결과

  • 학습 및 평가 데이터 : 가공되지 않은 데이터
  • 학습 환경 : 모든 하이퍼 파라미터는 동일하게 설정
    • L1Loss, AdamW, Linear, get_linear_schedule_with_warmup
  • 평가 모델 및 결과
    • deberta 모델 중에서는 deliciouscat/kf-deberta-base-cross-sts을 선택했습니다. (KLUE와 KorSTS 데이터셋으로 학습된 DeBERTa 기반 모델)
    • roberta 모델 중에서는 sorryhyun/sentence-embedding-klue-large을 선택했습니다. (KlueNLI와 KlueSTS 데이터로 멀티태스크 학습된 RoBERTa-large 기반 모델)
    • 추가적으로, 추후 앙상블을 진행할 때 다양한 모델 간 독립성을 확보하기 위해 앞서 선택한 두 모델과 다른 계열이면서 성능이 가장 좋게 나온 snumin44/simcse-ko-bert-supervised도 함께 선택했습니다. (KorNLI 및 KorSTS 데이터셋으로 학습된 SimCSE 기반 한국어 BERT 모델)

Second-stream with GNN

배경 및 목적

STS(Semantic Textual Similarity) 문제에서 단어 사이의 유사도가 중요한 factor일 것이라는 가설을 세워 실험을 진행했습니다. 유사한 의미를 가진 단어들은 문장에서 비슷한 역할을 하며, 이들 간의 관계를 고려하는 것은 문장의 의미를 더 정확하게 파악하는데 도움이 될 것으라고 추정했습니다.

실험 세팅 및 결과

  • 실험 세팅 : 전처리 되지 않은 학습 데이터 문장 쌍에 대해 형태소 분석을 진행하고, 그 중에서 명사에 해당하는 토큰을 추출하여 각 토큰 당 등장 빈도수가 25개 이상인 토큰을 단어로 선정했습니다. 단어들을 직접 검수하면서 오류 및 불필요한 단어를 제거하고 남은 1,000개의 단어를 노드로 지정했습니다. 각 노드 별 유사도를 backbone 모델로 계산했습니다.

  • 평가 모델 및 결과

    ModelValid PearsonPublic Pearson
    deliciouscat/kf-deberta-base-cross-sts0.9260.9110
    deliciouscat/kf-deberta-base-cross-sts + GNN0.9290.9164

    제안하는 모델이 기존 backbone의 성능보다 더 좋은 것을 확인했지만, 모델 학습의 cost가 커지는 것 대비 성능의 차이가 미미한 것으로 판단했습니다. 사전 그래프 구축 작업의 정교함에 따라 성능의 폭이 커질 것으로 예상되어, 마지막 제출 전 시간이 남으면 진행할 것으로 결론지었습니다.

Contrastive Learning

배경과 목적

SimCSE(Gao et al., 2021)는 Contrastive Learning을 문장 임베딩에 처음 적용한 논문입니다. 이 논문은 문장의 의미를 잘 표현하는 벡터(숫자 집합)를 만드는 방법으로 그 해 STS Task에서 SOTA를 달성했습니다. 문장 임베딩이란 문장을 컴퓨터가 이해하고 처리할 수 있도록 문장을 숫자로 바꾸는 방법으로, 문장을 벡터로 변환하면 벡터 사이의 거리를 계산할 수 있습니다. Contrastive Learning은 비슷한 문장은 벡터 간 거리가 가까워야 하고, 다른 문장은 거리가 멀어야한다는 목표를 가지고 벡터를 학습시키는 방법을 의미합니다. 문장 간 유사도를 측정해야 하는 본 프로젝트의 특성과 부합하다고 생각하여, SimCSE의 Constrastive Learning 방식을 본 프로젝트의 적용 시키고자 하였습니다.

제안 모델

1. Unsupervised SimCSE (비지도 학습): 비슷한 문장이나 데이터를 구체적으로 알려주지 않고 모델이 스스로 학습하게 하는 방법입니다. 여기서는 문장을 입력한 뒤 dropout이라는 노이즈(잡음)를 섞어서 두 가지 다른 버전의 벡터를 만든 후, positive pairs(긍정 쌍)로 묶어 모델이 "이 둘은 비슷한 문장"이라고 학습하게 합니다.
2. Supervised SimCSE (지도 학습): 문장 쌍이 비슷하거나 다른 것을 미리 알려준 상태에서 모델을 훈련시키는 방법입니다.

이번 프로젝트에서는 시간 관계 상 Unsupervised 방식을 적용했습니다.

Cross-entropy objective with in-batch negatives

li=logesim(hi,hi+)/τj=1Nesim(hi,hj+)/τl_i = -\log {e^{sim(h_i, h_i^+)/\tau} \over \sum_{j=1}^N e^{sim(h_i, h_j^+)/\tau}}

모델을 학습시키는 방법으로는 교차 엔트로피 손실 함수를 사용합니다. In-batch negatives란 mini-batch 내의 데이터를 활용하여 negative 예시를 샘플링하는 방법입니다. 예를 들어, 배치 안에 쿼리 A와 그에 맞는 문서 A+, 쿼리 B와 그에 맞는 문서 B+가 있다면, 쿼리 A에 대한 negative는 문서 B+가 될 수 있고, 쿼리 B에 대한 negative는 문서 A+가 될 수 있습니다. 본 논문에서는 첫번째 문장과 다른 문장을 mini-batch 안에 넣고, 그 문장들을 negative로 하였습니다. 즉, A라는 문장과 A+라는 비슷한 문장을 학습할 때, B라는 문장을 negative pair로 삼아서 모델이 "A와 B는 다르다"라고 학습하게 합니다. 모델이 한 번에 여러 문장을 학습할 때, 그 중 일부를 "다른 문장"이라고 알아채게 만드는 방식입니다.

  • Cosine Similarity
    sim=h1Th2h1h2sim = {h_1^Th_2 \over ||h_1|| \cdot ||h_2||}
    문장 벡터들 사이의 유사성은 코사인 유사도를 통해 계산합니다. 두 벡터가 이루는 각도를 이용해 두 벡터가 얼마나 비슷한지 계산하는 것으로, 숫자가 1에 가까울수록 유사합니다. Cauchy-Schwarz inequality에 의해 두 벡터 간 내적으로 계산이 가능합니다.
  • Temperature Hyperparameter
    τ (타우)는 온도 하이퍼파라미터로, 모델이 선택을 얼마나 확신 있게 하는지 조정하는 역할을 합니다. 지수함수는 x 값이 커질수록 y값의 변화량이 크기 때문에, 큰 값은 더 크게하고 작은 값은 더 작게하는 특성이 있습니다.
    • τ < 1: e 값이 커지면 확률 값이 극단적으로 커집니다. 예측된 단어 중 확률이 가장 높은 단어를 선택할 가능성을 증가시키며, 생성된 텍스트가 일관성이 높아집니다.
    • τ > 1: e 값이 작아지면 확률 값이 비교적 고르게 분포됩니다. 모델이 여러 가능성을 열어두고 더 확률적으로 행동하며, 덜 확실한 예측을 할 가능성이 높아집니다.
    • τ = 1: 모델이 원래의 확률 분포를 그대로 사용합니다.

실험 세팅 및 결과

  • 실험 세팅 : Backbone모델에 SimCSE를 기반으로 문장 임베딩을 새롭게 학습시킵니다. 여기서 SimCSE 자체가 Contrastive Learning을 사용해 문장을 벡터로 임베딩하는 기법을 말합니다.
  • 평가 모델 및 결과
    ModelValidation PearsonPublic Pearson
    deliciouscat/kf-deberta-base-cross-sts0.9260.9110
    deliciouscat/kf-deberta-base-cross-sts + GNN0.9290.9164
    deliciouscat/kf-deberta-base-cross-sts + CL0.9290.9190
    Validation Pearson 기준으로는 Second-stream with GNN과 동일하지만 Public Pearson 점수는 더 높아진 것을 확인했습니다. 학습 cost와 성능 향상 폭을 생각했을 때, Contrastive Learning이 유의미한 것으로 판단되어 제안하는 모델을 사용하는 것으로 결정했습니다.

Clustering

배경 및 목적

STS(Semantic Textual Similarity) 문제에서 모델은 다음 두 가지 상황에서 어려움을 겪을 수 있다고 가정했습니다.

  • 두 문장의 벡터 코사인 유사도가 높지만 실제 label은 낮은 경우
  • 두 문장의 벡터 코사인 유사도가 낮지만 실제 label은 높은 경우

이를 해결하기 위해, 두 문장의 임베딩 벡터를 계산하여 코사인 유사도와 label 간의 상관관계를 분석하고, 그에 따른 클러스터를 형성하여 모델을 학습하고자 했습니다.

제안 모델


train.csv의 sentence_1, sentence_2를 사전 학습된 encoder 모델을 사용해 각각 임베딩 벡터로 변환한 후, 각 임베딩 벡터 간의 코사인 유사도를 계산하여 유사도와 실제 label 값 간의 상관관계를 확인했습니다. 대부분의 벡터들이 높은 코사인 유사도를 보이는 경향이 있었으며, 이는 Anisotropy problem 때문이라고 분석했습니다.

Anisotropy problem이란, 모델이 깊어지면서 임베딩 공간이 비균일하게 변하는 현상을 말합니다.

"모델이 깊어진다"는 표현은 모델이 많은 레이어(층)를 가지고 있다는 뜻으로, 모델이 깊어질수록 각 층이 입력 데이터를 점진적으로 변환하고, 더 복잡한 패턴을 학습할 수 있게 됩니다.
BERT 같은 트랜스포머 기반 모델들은 일반적으로 12개 이상의 레이어를 가집니다. 문장의 복잡한 문맥 정보를 학습하기 위해 깊은 구조를 가지게 되는데, 깊은 모델은 더 많은 정보와 상호작용을 학습하지만 그 과정에서 임베딩 벡터들이 특정 방향으로 집중되는 Anisotropy(비균일성) 문제가 발생할 수 있습니다.

Anisotropy(비균일성)이란 임베딩 벡터들이 특정 방향으로 지나치게 몰리는 현상을 의미합니다. 여기서 임베딩 공간이란 단어, 문장 등을 벡터로 표현한 후, 그 벡터들이 위치하게 되는 수학적인 공간을 말합니다. 벡터가 고르게 퍼져 있으면 임베딩 공간에서 의미 있는 거리를 측정할 수 있는데, 비균일한 경우 의미가 다른 문장들도 가까이 위치하게 되어 코사인 유사도가 제대로 작동하지 않게 됩니다. 모델이 깊어질수록, 모든 단어 또는 문장의 임베딩 벡터들이 특정한 방향으로 점점 집중되는 현상이 발생합니다. 이는 마치 모든 벡터들이 같은 쪽으로 쏠리는 것처럼 보이는데, 이러면 원래는 거리가 멀어야 할 벡터들(의미가 다른 문장들)도 상대적으로 가까워지는 문제가 생기게 됩니다.

모델이 깊어짐에 따라 Anisotropy problem이 발생하는 이유는 다음과 같습니다.

  • 벡터 변환 누적과 Self-Attention
    딥러닝 모델은 각 층(layer)을 통과할 때마다 입력 데이터를 변환하는데, 모델이 깊어질수록 이 변환이 여러 번 누적됩니다. 특히 BERT와 같은 트랜스포머 모델은 여러 층에서 Self-Attention 메커니즘을 통해 각 단어 간 관계를 계산하고, 이를 바탕으로 임베딩 벡터를 업데이트합니다. 각 층이 문맥 정보를 더 많이 반영하도록 벡터를 조정하지만, 층이 많아지면서 벡터가 점차적으로 특정한 패턴이나 방향으로 집중되기 시작합니다. 즉, 여러 층의 변환이 누적되면서 벡터들이 점점 하나의 축을 중심으로 정렬되는 현상이 나타나게 됩니다.
  • Normalized Embedding의 영향
    많은 트랜스포머 기반 모델에서 마지막 임베딩 벡터는 정규화(normalization) 과정을 거치게 됩니다. 이 과정에서 벡터의 크기보다는 방향성만 남게 되는데, 벡터의 크기를 통일시키고 방향성만 남기면 벡터들이 동일한 방향으로 수렴하는 경향이 커지면서 임베딩 공간이 비균일하게 변하게 됩니다.
  • 정보 손실 및 수렴 문제
    깊은 층을 거치면서 초기 임베딩에서 학습한 세밀한 의미 차이들이 여러 층을 통과하는 과정에서 점차 손실될 수 있습니다. 특히, 중요한 정보가 일부 벡터에만 집중되고, 다른 벡터들은 비슷한 패턴을 반복하게 되면 정보가 압축되고 수렴하는 현상이 발생하게 됩니다. 이로 인해, 서로 다른 의미를 가진 단어들의 벡터도 비슷한 방향으로 수렴하게 되어, 임베딩 공간에서 그 벡터들 간의 차이가 잘 드러나지 않는 문제가 생깁니다.

이에 코사인 유사도의 값을 적절한 threshold로 구분하여 데이터의 분포를 확인한 결과, 코사인 유사도가 0.982 이상인 데이터에서 label 값이 높은 경우가 많았음을 확인했습니다.

  • 코사인 유사도가 0.982 이상인 클러스터 분포
  • 코사인 유사도가 0.982 미만인 클러스터 분포

이에 따라 아래와 같이 두 개의 클러스터를 생성해 데이터를 구분하여 모델을 학습시켰습니다.

  • label 값이 큰 데이터셋을 기준으로 한 클러스터
  • label 값이 작은 데이터셋을 기준으로 한 클러스터

모델 학습 및 결과

  • 모델 학습 : 각 클러스터의 데이터를 deliciouscat/kf-deberta-base-cross-sts 모델로 학습했습니다. Public Pearson 측정 결과 0.9177의 성능을 확인할 수 있었습니다.

  • 결과 분석 : 모델 예측에서 발생한 몇 가지 문제와 그에 대한 분석을 진행했습니다.

    • 영어 단어가 포함된 경우: 예를 들어 "Bob stage"가 "밥 스테이지"로 변환된 경우, 코사인 유사도는 낮게 나왔으나 실제 의미는 동일하므로 실제 label 값은 높았습니다.
    • 맞춤법 오류: 맞춤법 오류로 인해 잘못된 tokenizing이 발생하여 의미가 다르게 해석된 경우
    • 불용어가 포함된 경우: 불용어가 포함되어 토큰으로 변환되면서 문장 간 의미 차이를 제대로 반영하지 못하는 경우
  • 전처리 개선 : 위의 문제를 해결하기 위해 다음 전처리 방법들을 추가 적용했습니다.

    • hanspell 라이브러리로 맞춤법 검사를 시행해 오류를 줄였습니다.
    • spacing 라이브러리로 띄어쓰기 오류를 검사하여 맞춤법 검사기에서 누락된 부분을 보완했습니다.
    • 감정 표현(이모지, ㅋㅋ, ㅠㅠ) 등을 제거해 문장의 본래 의미에만 집중하게 했습니다.
    • googletrans 라이브러리로 영어 단어를 한국어로 번역하여 모델이 언어 차이를 극복할 수 있도록 했습니다.

Soft Voting Ensemble

배경 및 목적

Soft Voting은 앙상블 학습에서 여러 모델의 예측 결과를 결합하여 최종 예측을 도출하는 기법입니다. 각 모델이 예측한 logit 값을 평균하거나 가중 평균하여 최종 예측을 만드는 방식으로, 분류 성능을 향상시키는 데 목적이 있습니다. 본 프로젝트에서는 데이터 증강(Data Augmentation)을 통해 생성된 여러 버전의 train data와 모델 탐색을 거쳐 선정된 다양한 모델 조합을 앙상블하여 최적의 성능을 도출하고자 하였습니다.

제안 방법

  • 단순 평균
    • 각 모델이 예측한 logit 값을 단순 평균하여 최종 예측을 결정함
    • 예를 들어, 모델 A와 모델 B의 예측값을 각각 AiA_iBiB_i라고 할 때, 최종 logit 값은 다음과 같이 계산됨
      단순 평균=Ai+Bi2단순\ 평균 = \frac {A_i + B_i}{2}
  • Valid Score 기반 가중 평균
    • 각 모델의 validation score(성능 점수)를 비율로 곱해 가중 평균을 적용
    • 성능이 높은 모델이 더 중요한 역할을 하도록 하기 위해, 모델의 validation score에 따라 가중치를 부여
    • 예를 들어, 모델 A의 validation score가 0.9, 모델 B의 validation score가 0.8인 경우, 가중 평균은 다음과 같이 계산됨
      가중 평균=Ai×0.9+Bi×0.80.9+0.8가중\ 평균 = \frac {A_i \times 0.9 + B_i \times 0.8}{0.9 + 0.8}
  • Min-Max 정규화 가중 평균
    • 단순히 validation score 기반 가중 평균을 사용할 때, 대부분의 앙상블 대상 모델이 0.92에서 0.93 사이의 유사한 validation score를 보여 가중치에 큰 차이를 주기 어려움

    • 더 좋은 성능을 보이는 모델과 그렇지 않은 모델 간의 차이를 명확히 하기 위해 적합한 가중치 정규화가 필요하다고 판단

    • Min-Max 정규화는 피처의 값을 0~1 범위로 조정하는 기법이지만, 본 프로젝트에서는 validation score를 0.8~1.2 범위로 조정하여 가중평균에 사용

    • 이를 위해 Min-Max 정규화 수식을 변형하여, xminx_{min}xmaxx_{max} 값을 각각 0.8과 1.2로 설정

      MinMax 정규화 가중 평균=0.8+xxminxmaxxmin×(1.20.8)Min-Max\ 정규화\ 가중\ 평균 = 0.8+\frac {x-x_{min}} {x_{max}-x_{min}}\times(1.2-0.8)

결과

모델활용 기법Validation PearsonMin-Max 정규화 가중 평균
deliciouscat/kf-deberta-base-cross-stsraw + Contrastive Learning0.9301.111
deliciouscat/kf-deberta-base-cross-stsraw + Cleaning0.9301.111
sorryhyun/sentence-embedding-klue-largeData v20.9230.800
snunlp/KR-ELECTRA-discriminatorData v20.9321.200
snunlp/KR-ELECTRA-discriminatorData v30.9301.111

위의 세 가지 방법을 비교한 결과, Min-Max 정규화 가중 평균을 적용한 경우 가장 높은 성능을 보였습니다. 92.98의 Public Pearson 점수를 기록하였고, 다른 기법들보다 우수한 결과를 확인할 수 있었습니다. 이 과정을 통해 다양한 모델의 조합과 그 성능을 극대화할 수 있었습니다.


리더보드 결과

Leader Board에서 Pearson 점수를 비교하였을 때 Public Score보다 0.105가 올라, 대회에 참여한 16팀 중 최종 4위를 기록하는 성과를 내었습니다.

  • Public Leader Board 순위 (중간 순위)

  • Private Leader Board 순위 (최종 순위)


프로젝트 회고

불균형한 데이터을 다루며 데이터 증강을 진행하면서 원래 문장과 증강된 문장들 간 유사도 측정에 코사인 유사도를 활용했습니다. 하지만 후에 모델팀의 Clustering 실험 결과, 전반적으로 코사인 유사도가 높은 값을 보이는 Anisotropy 문제가 존재한다는 것을 알게 되었습니다. 데이터 증강 작업에 집중하다 보니 상대적으로 적은 양의 데이터셋에 초점을 맞추는 경향이 있었고, 데이터셋 전체를 보는 시각이 부족했음을 느꼈습니다.
또한, 모델팀과 의견 교환이 원활하지 않아 이런 문제를 함께 논의할 수 없었던 점이 아쉬움으로 남습니다. 하지만 이를 개선하기 위해 다음 프로젝트를 진행하면서는 피어세션 시간마다 모델팀과 데이터팀이 진행 상황을 정기적으로 공유하는 체계를 마련하기로 했습니다. 이를 통해 상호 피드백을 통해 문제를 조기에 인지하고 해결할 수 있을 것이라 기대합니다.

향후 프로젝트에서는 데이터 증강 작업 시 개별 데이터의 처리뿐만 아니라, 전체 데이터셋의 특성과 균형을 고려하는 포괄적인 접근이 필요하다는 생각을 하게 되었습니다. 주어진 데이터셋이 너무 주관적이지 않은지, 모델이 학습하는 과정에서 혼동을 일으킬 수 있는 데이터가 포함되어 있지 않은지 충분히 고민하지 않았던 점이 아쉬움으로 남습니다. 룰 기반의 전처리 방식을 적용했다면 모델이 이해하기 좋은 데이터셋을 만들 수 있었겠다는 생각도 해보았습니다. 이번 프로젝트를 진행하면서 데이터를 다루었던 경험은 앞으로의 데이터 처리와 증강 작업에 있어 더 균형 잡힌 시각과 접근 방식을 갖추는 데 밑바탕이 되어줄 것 같습니다.

개인 회고

나는 내 학습 목표를 달성하기 위해 무엇을 어떻게 했는가?

  • NLP 기초 프로젝트 학습: 이번 프로젝트는 NLP 첫 프로젝트였기에, 기초부터 차근차근 쌓는 것이 중요하다고 판단하였습니다. 특히 Hugging Face 사용법에 대해 더 깊이 이해하고자, 단순히 강의만 듣는 것이 아니라, Hugging Face 공식 문서(https://huggingface.co/docs)를 참고해 더 많은 정보를 노션에 정리하며 학습하였습니다. 이 과정에서 토이 프로젝트 때 어렴풋이 사용했던 라이브러리나 메서드에 대한 이해를 높일 수 있었습니다.
  • 팀 역할 및 학습 목표: 데이터 팀에 배정받아 데이터 전처리 및 증강 역할을 수행했습니다. 동시에 다음 프로젝트에서는 모델링 과정에도 직접 참여할 수 있을 정도의 실력을 쌓고자 모델링 팀의 진행 과정을 지켜보며 모델링 역량을 키우려는 노력도 병행하였습니다. 이번 프로젝트에서는 모델링에 기술적으로 기여할 수 있는 부분이 많지 않았지만, 모델 팀이 작성한 코드를 꼼꼼히 살펴보면서 배운 내용을 앞으로 진행할 프로젝트에서 최대한 활용하고자 합니다.

어떠한 고민 속에서 모델의 성능을 향상하려 했는가?

  • 데이터 전처리 및 증강: 팀 내에서 데이터셋 편향 문제를 해결하기 위한 자료 조사를 주도하였고, 문맥을 고려한 한국어 텍스트 증강 기법(K-TACC)을 제안하였습니다. 이는 데이터 증강의 핵심적인 방법으로 채택되었고, 데이터셋의 여러 버전을 만드는 과정에서 이 방법을 활용해 다양한 실험을 진행하였습니다.
  • 데이터셋에 주어진 정보 활용: 데이터셋의 출처나 특성에 따라 모델을 분리해 사용하는 것이 성능에 영향을 미칠지 고민했습니다. 그러나 아직 모델링에 대한 자신감이 부족해 이를 적극적으로 제안하지는 못했습니다. 생각에만 그치지 않고 팀원들과 공유했다면, 서로 피드백을 주고받으며 아이디어를 발전시킬 수 있지 않았을까 하는 아쉬움이 남습니다.

협업 과정에서 잘된 점/아쉬운 점은 어떤 점이 있는가?

  • 라이브러리 오류 해결 과정: 데이터 증강 진행 중 hanspell 라이브러리 오류로 인해 혼자서는 문제를 해결하기 어려운 상황에 직면했습니다. 혼자서는 해결할 수 없는 문제라 판단해 팀원에게 도움을 요청하여 최종적으로 문제를 해결할 수 있었고, 이 과정에서 진행 중인 태스크를 공유하여 추가적인 도움을 받아 예상보다 일찍 데이터 증강 태스크를 완수할 수 있었습니다. 만일 혼자서 오류를 해결하려다 안돼서 포기했다면, 새로운 가설을 실험해볼 수 있는 또다른 데이터셋을 만들지 못했을 것입니다. 이 경험을 통해 어려움이 있을 때 주저하지 않고 팀원에게 도움을 요청하는 것의 중요성을 깨달았고, 앞으로도 이러한 적극적인 협업 자세를 유지해야겠다고 다짐했습니다.
  • 팀 별 분업의 한계: 모델 팀이 프로젝트에 적합한 모델을 찾는 과정부터 어떤 시행착오를 겪는 중이고 어떤 방향으로 나아가고 있는지에 대해 충분히 알지 못했던 점이 아쉬웠습니다. 이를 보완하기 위해 주말 동안 모델 팀이 공유한 자료를 꼼꼼히 살펴보았고, 모르는 부분은 적극적으로 질문하며 공부했습니다. 이 경험을 바탕으로 다음 프로젝트에서는 다른 팀과의 커뮤니케이션을 더욱 중시하고, 진행 상황을 적극적으로 파악하려 합니다.

프로젝트에서 협업 도구를 활용하며 어떤 경험과 교훈을 얻었는가?

  • GitHub 활용: 이번 프로젝트에서 팀 내 협업 도구로 GitHub를 사용했습니다. 실제 협업 과정에서 GitHub를 처음 사용해본 경험이었습니다. 특강에서 배운 commit, pull, push 등의 기본 개념을 실제 프로젝트에 적용해보면서 Git 사용법을 익힐 수 있었지만 익숙하지 않았던 탓에 여러 실수를 겪기도 했습니다. 특히, Master branch와 Branch를 혼동하여 롤백해야하는 상황에서 이후에 커밋된 모든 작업들이 사라질까 봐 걱정했던 경험이 기억에 남습니다. 그러나 이 경험을 통해 원하는 commit history로 안전하게 롤백 하는 방법을 배우는 등, 이렇게 실수를 통해 배운 것들은 따로 오답노트에 기록하여 추후 같은 실수를 방지하고자 했습니다. 다음 프로젝트에서는 Git을 더 적극적으로 활용하기 위해, 프로젝트가 끝난 후 부스트코스의 'GitHub으로 따라하는 버전관리' 강의를 수강하며 Git 사용법을 더욱 깊이 있게 익혔습니다.

배운 점과 앞으로의 목표

  • 무지에 대한 두려움을 넘어: 모르는 것을 두려워하지 않고, 오히려 팀원들과 적극적으로 아이디어를 나누는 것이 프로젝트를 발전시키는 데 중요한 역할을 한다는 점을 배웠습니다.
  • 모델링 역량 강화: 이번 프로젝트에서 데이터 팀의 역할에 충실했지만, 앞으로는 모델링에도 직접 참여할 수 있는 역량을 키우는 것이 목표입니다.
  • Git 활용 강화: Git을 더 잘 활용해 협업할 수 있도록, 이번 프로젝트에서 얻은 경험을 토대로 다음 프로젝트에서는 Git을 두려움 없이 완전히 활용하고자 합니다.
profile
🌱 🐜

0개의 댓글

관련 채용 정보