본문 바로가기
YES - 개발일지

[Upstage AI Lab 5기 부트캠프] NLP 경진대회

by YES - IT SPOT 2025. 2. 2.
반응형

안녕하세요!
패스트캠퍼스 Upstage AI Lab 5기 수강생 ‘예스잇(YES-IT)’입니다.

 

이번 Upstage AI 부트캠프에서는 일상 대화 요약 모델을 만드는 NLP 경진대회에 참여하게 되었어요.
우리 팀 "Eagle’s Road"는 NLP 모델 성능을 극대화하기 위해 다양한 접근 방식을 실험하며, 협업의 가치를 경험한 소중한 시간을 보냈습니다.

 

단순히 주어진 데이터를 처리하는 것이 아니라, 더 나은 요약을 위한 데이터 분석, 프롬프트 엔지니어링, 그리고 모델 최적화까지 고민하며 여러 시행착오를 거쳤는데요.
특히, 저는 데이터를 중심으로 접근하며 EDA를 적극적으로 활용했고, 이를 기반으로 딥러닝 모델 실험을 최적화하는 과정에서 중요한 인사이트를 얻을 수 있었습니다.

그러다 보니 단순히 실험을 반복하는 것이 아니라, EDA를 더 효과적으로 활용하고, 프롬프트를 어떻게 구성해야 할지까지 깊이 고민하게 되더라고요.

 

이 글에서는 NLP 경진대회를 준비하면서 겪었던 모든 과정을 솔직하게 공유하려고 해요.
데이터 분석을 어떻게 활용했는지, 모델 실험에서 어떤 문제를 만났고 어떻게 해결했는지, 그리고 최종적으로 어떤 성과를 얻었는지 단계별로 정리해 보겠습니다.

 

그럼, 시작해볼까요? 🚀

 

 


1. 막막함에서 출발한 1위 여정, 우리는 이렇게 시작했어요

NLP 경진대회 목표

 

NLP 경진대회가 시작되자마자 우리는 “어떻게 하면 1위를 할 수 있을까?”라는 질문을 던졌어요. 하지만 처음부터 무작정 팀을 나누고 역할을 정하는 대신, 처음부터 끝까지 모든 과정을 직접 경험해보기로 했어요. 왜냐하면, 경진대회의 전체적인 흐름을 직접 경험해야 어떤 접근이 효과적인지, 어디에 시간을 더 투자해야 하는지 명확해질 거라고 생각했거든요.

 

 

📌 먼저, 전체 프로세스를 직접 경험해보기

 

우리는 첫 5일 동안 베이스라인 코드 실행 → 데이터 이해 → 모델 학습 → 성능 평가까지 경진대회의 전 과정을 빠르게 훑어보는 데 집중했어요.
처음엔 막연했지만, 직접 해보면서 자연스럽게 고민이 생기기 시작했어요.

  • 모델을 바꾸는 것만으로 성능이 좋아질까?
  • 데이터를 분석하면 좀 더 효과적인 방향을 찾을 수 있지 않을까?
  • 하이퍼파라미터를 어떻게 조정해야 최적의 성능을 낼 수 있을까?
  • 데이터 증강을 활용하면 요약의 품질이 향상될까?
  • 프롬프트를 다르게 구성하면 더 나은 요약이 가능할까?

이렇게 실험을 반복하면서, 저는 점점 더 데이터의 중요성을 실감하게 되었어요.
"우리가 먼저 데이터를 제대로 이해하지 않으면, 어떤 모델을 써도 한계가 있겠다."
이런 결론에 도달한 후, 저는 단순히 모델을 바꾸는 것이 아니라, 데이터 자체를 더 깊이 탐구하는 것이 먼저라는 생각이 들었어요. 결국 딥러닝 모델의 성능을 극대화하려면, 모델 자체만큼이나 학습 데이터의 구조와 품질이 중요하다는 점을 깨닫게 되었죠."
그래서 자연스럽게 데이터 분석을 담당하기로 결심했고, 이 방향을 중심으로 팀을 나누기로 했습니다.

 

NLP 경진대회 개요

 

🚀 역할 분담: 데이터 분석과 모델 실험, 그리고 협업 방식

 

우리는 단순히 역할을 나누는 것이 아니라, 각자의 강점을 살려 더 효과적인 실험을 진행할 방법을 고민했어요.
그렇게 해서 자연스럽게 두 개의 팀이 형성되었습니다.

  • 🧐 데이터 분석 팀
    → 데이터를 깊이 들여다보며 EDA(탐색적 데이터 분석), 데이터 정제, 프롬프트를 활용한 토픽 재분류 및 데이터 증강 등을 수행하여 모델 학습을 위한 데이터 다양성을 확보
  • 🛠️ 모델 실험 팀
    → 베이스라인 모델을 기반으로 다양한 모델 실험, 하이퍼파라미터 튜닝, 프롬프트 엔지니어링을 수행

하지만 단순히 역할을 나눈다고 해서 바로 성과가 나오는 것은 아니었어요.
데이터 분석과 모델 실험이 따로따로 진행되면 시너지가 생기지 않기 때문이었죠.
그래서 우리는 데이터 분석 과정에서 나온 인사이트를 모델 실험에 즉각 반영하는 방식으로 협업을 하기로 했습니다.
데이터 팀이 분석한 내용을 모델 팀이 활용하고, 모델 팀이 실험한 결과를 다시 데이터 팀이 보완하는 유기적인 실험 과정이 만들어졌죠.

이제부터, 우리가 어떤 방식으로 실험을 진행했고, 어떤 시행착오를 겪었는지 본격적으로 이야기해볼게요. 🚀

 

 


2. NLP 경진대회 문제 이해 및 데이터 분석 중심의 접근

 

처음 주어진 데이터를 봤을 때, 단순히 모델을 돌리는 것만으로는 좋은 요약을 생성하기 어렵겠다는 느낌이 들었어요.
그래도 기대를 안고 베이스라인 코드를 실행하고, 리더보드에 첫 결과를 제출했죠.
놀랍게도 첫 점수는 47점대로 생각보다 높은 출발이었어요.

"오, 이 정도면 시작이 나쁘지 않은데?"
자연스럽게 점수가 더 빠르게 상승할 것이라는 기대를 하게 되었어요.
그런데 두 번째 결과에서 48점대가 나오긴 했지만, 상승 폭은 미미했고, 이후로는 점수를 올리는 게 점점 더 어려워졌어요.
단순히 모델을 변경하거나 하이퍼파라미터를 조정하는 것만으로는 근본적인 개선이 어렵다는 걸 실감하게 됐죠.

 

📌 첫 번째 고민: 점수 정체 구간을 어떻게 넘을 것인가?

 

모델 실험을 반복하면서 몇 가지 의문이 들었어요.

  • 점수가 초반에는 높았는데, 왜 이후로는 크게 오르지 않을까?
  • 단순히 모델을 바꾸는 것만으로 해결될 문제일까?
  • 데이터 자체에 문제가 있어서 모델이 더 좋은 요약을 학습하지 못하는 건 아닐까?

이런 질문들에 대한 답을 찾기 위해, 우리는 단순한 모델 실험이 아니라 데이터 자체를 더 깊이 분석하는 방향으로 초점을 맞췄습니다.

 

🧐 데이터 분석이 핵심 전략이 된 이유

 

점수 정체 구간을 돌파하려면, 모델이 학습하는 데이터부터 철저하게 분석해야 한다는 결론에 도달했어요.그래서 단순한 데이터 정제 작업을 넘어서, 프롬프트를 활용한 토픽 재분류와 데이터 증강까지 적극적으로 시도하기로 했습니다.

대화문 유사도 분석산점도를 활용한 군집화 실험도 진행하며, 데이터가 모델 학습에 미치는 영향을 깊이 탐구했어요.

데이터를 제대로 정리하고 모델이 학습할 수 있도록 최적화하는 것이 결국 점수 향상의 가장 확실한 방법이라는 걸 깨달은 순간이었죠.
이제, 본격적으로 데이터 분석을 어떻게 진행했는지 이야기해볼게요. 🚀

 

 


3. 데이터 분석 및 전처리 과정

 

점수 정체 구간을 해결하기 위해, 우리는 단순한 데이터 정제 작업을 넘어서 데이터를 더욱 정밀하게 분석하는 방법을 고민했어요.
단순히 텍스트를 정제하는 것만으로는 성능 향상이 크지 않을 것 같았기 때문에, 데이터의 구조적 특징을 파악하고, 모델이 더 효과적으로 학습할 수 있도록 데이터를 최적화하는 방향으로 접근했습니다.

 

 1️⃣ 대화문 유사도 분석: 패턴을 찾다 

 

저작권 문제로 데이터 공개가 불가하여 모자이크 처리

먼저, 유사한 대화문이 반복해서 등장하는지 확인하기 위해 TF-IDF 벡터화와 코사인 유사도를 활용한 대화문 유사도 분석을 진행했어요. 이를 통해 비슷한 구조의 대화가 다수 존재한다는 점을 발견했고, 이러한 데이터가 모델의 학습에 과적합(overfitting) 문제를 유발할 가능성이 있다는 점을 인지했어요.

 

🔹 어떻게 진행했을까?

  • TF-IDF 벡터화를 적용해 각 대화문을 수치화
  • 코사인 유사도를 계산하여 유사한 대화문을 식별
  • 토픽 이상치를 직접 수정하며 유사한 대화문을 발견하여, 이를 기준으로 임계값을 추정하여 적용
  • 중복된 대화문이 존재하지만, 각각의 요약문이 다르게 제공된 경우 이를 활용하기로 결정

분석 결과, 중복성이 높은 대화문은 정리했지만, 동일한 대화문에 서로 다른 요약문이 존재하는 경우가 많았어요. 이 점을 활용하여 하나의 대화문에 두 개의 요약문을 배치하는 방식으로 데이터를 구성했고, 이를 통해 모델이 같은 대화문에서도 다양한 요약을 학습할 수 있는 기회를 만들었어요. 결과적으로, 보다 풍부한 요약 패턴을 학습할 수 있도록 유도하면서 모델의 일반화 성능을 높이는 데 기여했습니다.

 

 2️⃣ 산점도 분석을 활용한 토픽 재분류 

 

DBSCAN을 활용한 군집화 실험

 

초기에 제공된 데이터에는 토픽 정보가 있었지만, 일부 토픽이 명확하지 않거나 잘못 표기된 경우가 있었어요.
이를 해결하기 위해 먼저 토픽 길이를 확인하고, 이상치를 손수 수정하는 작업을 진행했어요. 이후 산점도 분석과 군집화 실험을 통해 토픽을 시각적으로 분석하고 정제하는 과정을 거쳤습니다.

 

🔹 어떻게 진행했을까?

  • 토픽 길이를 분석하고, 이상치 데이터를 직접 수정하여 정제
  • TF-IDF 벡터화를 적용해 각 텍스트 데이터를 수치화
  • 차원 축소 기법(PCA → t-SNE) 적용하여 최종적으로 2차원으로 축소
  • DBSCAN을 활용해 군집화 실험을 진행하며, eps와 min_samples 값을 조정하면서 최적의 클러스터링을 탐색

DBSCAN 군집화를 활용하여 토픽을 시각적으로 분석해 보았지만, 완벽한 군집을 형성하는 데 한계가 있었어요. 토픽이 명확하게 나뉘지 않거나, 일부 데이터가 군집화되지 못하는 문제점이 발생했죠. 이를 통해 기존의 자동화된 군집화 방법만으로는 토픽을 효과적으로 정리하는 것이 어렵다는 결론을 내리게 되었어요.

 

🔹 토픽 재분류: Solar API를 활용한 프롬프트 기반 접근
군집화의 한계를 확인한 후, 프롬프트를 활용한 토픽 재분류 방법으로 방향을 전환했어요.

  • Solar API를 이용해 요약문을 기반으로 토픽을 재분류
  • 총 13개의 카테고리를 미리 정의하고, 프롬프트를 통해 해당 기준에 맞춰 자동 분류 진행
  • 마지막으로, 직접 데이터를 검토하며 최종 데이터 클리닝 및 정제 과정 수행

이러한 과정을 통해 토픽을 보다 일관된 기준으로 정리할 수 있었고, 기존보다 더 의미 있는 주제별 분포를 가진 데이터셋을 구축할 수 있었어요. 특히, 군집화와 Solar API를 결합한 방법을 통해 데이터를 재분류하는 데에는 효과적이었지만, 최종적으로 모델의 성능 향상에는 뚜렷한 개선을 가져오지는 못했다는 한계도 확인할 수 있었습니다.

 

 3️⃣ 데이터 증강: 더 다양한 요약문과 대화문을 만들다 

 

데이터 증강 기법

 

기존 데이터만으로는 모델이 충분히 다양한 패턴을 학습하기 어려웠어요. 특히, 같은 대화문이라도 다양한 표현으로 요약할 수 있도록 데이터를 확장하는 과정이 필요하다고 생각했어요. 이를 위해 프롬프트 기반 요약 생성과 다중 번역 기법을 활용하여 데이터 증강을 진행했습니다.

 

🔹 어떻게 진행했을까?

  • 프롬프트를 활용한 요약문 생성
    → Solar API를 활용하여 대화문을 기반으로 새로운 요약문을 생성
    → 기존 요약문과는 다른 스타일과 표현을 사용한 요약문을 추가하여 데이터 다양성 확보
  • 다중 번역(백트랜슬레이션) 기법 적용
    → googletrans를 이용하여 한국어-영어-한국어 방식으로 번역해 새로운 요약문을 생성
    → 하지만 기존 번역 경험을 바탕으로, 더 자연스러운 요약을 위해 한국어-영어-일본어-한국어 방식의 다중 번역을 활용
    → 이렇게 변환된 요약문을 summary2로 저장하여 모델이 더 다양한 표현을 학습할 수 있도록 구성
  • 대화문에도 다중 번역을 적용하여 재해석
    → 기존 대화문 역시 번역본이었기 때문에, **동일한 다중 번역 과정(한국어-영어-일본어-한국어)**을 거쳐 dialogue2를 생성

이러한 방법을 통해 기존보다 더 다양한 표현을 가진 요약문과 대화문을 확보할 수 있었어요. 하지만, 기대했던 것과 달리 리더보드 점수 상승에는 별다른 영향을 주지 못했다는 한계도 확인할 수 있었습니다.

 

🚀 데이터 분석을 통해 얻은 인사이트

 

처음에는 모델을 바꾸고 하이퍼파라미터를 조정하는 것이 성능 향상에 가장 중요한 요소라고 생각했어요. 하지만 실험을 거듭할수록 모델이 학습하는 데이터 자체가 성능을 결정짓는 중요한 요소라는 점을 깨닫게 되었죠.

 

대화문 유사도 분석을 진행하면서, 단순히 중복성을 제거하는 것보다 하나의 대화문에 여러 개의 요약문을 배치하는 방식이 더 효과적일 수 있다는 점을 확인했어요. 이를 통해 모델이 더 다양한 요약 패턴을 학습할 수 있도록 유도할 수 있었고, 데이터가 단순히 많다고 해서 좋은 것이 아니라 어떤 방식으로 구성되는지가 더 중요하다는 점을 다시 한번 깨닫게 되었죠.

 

또한, 기존 토픽 분류 방식이 다소 불완전하다는 것을 발견하고, 이를 개선하기 위해 DBSCAN 군집화 실험을 진행하고 Solar API를 활용한 프롬프트 기반 토픽 재분류를 시도했어요. 하지만 결과적으로 데이터 정리는 가능했지만 모델 성능 향상에는 큰 영향을 주지 못했다는 한계도 경험했어요. 토픽을 보다 일관된 기준으로 정리할 수는 있었지만, 성능 개선에는 직접적인 영향을 주지 못했기 때문에, 데이터의 구조뿐만 아니라 내용적인 부분에서도 개선할 방법이 필요하다는 점을 느꼈습니다.

 

데이터 증강 과정에서도 비슷한 경험을 했어요. Solar API를 활용한 요약문 생성과 다중 번역을 통해 데이터를 다양화했지만, 이 과정에서 생성된 요약문이 모델 성능 향상에 직접적으로 기여하지 못했다는 점도 중요한 경험이었어요. 특히, 단순히 데이터를 늘리는 것이 아니라 질적으로 더 나은 데이터를 만드는 방법을 고민해야 한다는 점을 다시금 깨닫게 되었죠.

 

결론적으로, 데이터는 곧 모델의 성능을 결정짓는 가장 중요한 요소이며, 단순히 정제하는 것을 넘어서, 모델이 학습하기 좋은 데이터 구조를 설계하는 것이 필요하다는 점을 깨달은 과정이었습니다.

 

 


4. 모델 실험 및 개선 과정

 

모델 실험 인사이트

 

데이터 분석을 마친 후, 본격적으로 모델 성능을 향상시키기 위한 실험을 진행했어요. 초반에는 베이스라인 모델을 기반으로 실험을 진행했지만, 점수가 쉽게 상승하지 않았고, 하이퍼파라미터 튜닝을 포함한 다양한 시도를 하면서 모델 성능을 최적화하는 과정을 거쳤습니다. 처음 실험은 베이스라인 모델을 재현하고, 이를 기준으로 점진적으로 개선해 나가는 방식으로 진행했어요.

 

KoBART, KoT5와 같은 한국어 사전학습 모델을 활용했고, 이후 더 성능이 좋은 모델을 탐색하는 과정에서 LLaMA, Gemma2, SOLAR 모델도 실험해 보았어요. 다양한 모델을 실험하는 과정에서, 단순히 모델을 바꾸는 것만으로는 성능 향상에 한계가 있다는 점을 깨닫게 되었고, 이후에는 프롬프트 엔지니어링과 하이퍼파라미터 튜닝을 병행하며 최적의 설정을 찾는 작업을 진행했습니다.

 

하이퍼파라미터 튜닝에서는 모델의 학습률, 배치 크기, warmup steps, weight decay 등의 변수를 조정하며 성능 변화를 확인했어요. 특히, WandB Sweep을 활용하여 여러 조합을 자동으로 실험하는 방식을 도입해 보다 효과적으로 최적의 조합을 찾을 수 있도록 했어요. 하지만, 메모리 이슈로 인해 큰 모델을 활용한 실험에서는 배치 크기와 입력 길이를 조정해야 하는 한계가 있었어요.

 

이를 보완하기 위해 LoRA(저비용 어댑터)와 QLoRA(저메모리 어댑터) 기법을 활용하여 모델 학습 속도를 최적화하는 방식도 시도했어요. 이러한 실험 과정에서 앙상블 기법도 적용해 보았어요. 다양한 모델을 조합하여 더 나은 성능을 내는 방법을 고민했지만, 단순히 모델을 합치는 것만으로는 리더보드 점수가 획기적으로 상승하지는 않았어요. 특히, 프롬프트를 활용한 실험도 진행했지만, base 모델 대비 점수 향상이 크지 않았다는 점도 확인할 수 있었어요.

 

저 역시 데이터 분석을 마친 후, 다시 딥러닝 모델 실험을 진행했어요. 특히, 단순한 모델 변경이 아닌 Contrastive Learning과 Knowledge Distillation 기법을 활용하는 방식을 시도해 보고 싶었어요. Contrastive Learning을 적용해 dialogue1-dialogue2, summary1-summary2 간 유사도를 학습하는 방식을 활용하고, Knowledge Distillation을 통해 MT5-large나 KoBART-large를 Teacher로 설정하고, 이를 기반으로 Student 모델을 학습시키는 방법을 고민했어요.

 

하지만 베이스라인 코드가 아니라 처음부터 모델을 직접 구현하며 오류를 수정해야 했기 때문에, 시간이 다소 오래 걸리는 문제가 발생했어요. 또한, 학습 데이터 구조를 조정하는 과정에서 Cross-validation을 적용하고, ROUGE 스코어뿐만 아니라 요약문의 카테고리 일치도나 일관성까지 검증하는 실험을 추가하려 했지만, 충분한 시간 내에 이를 최적화하지 못했던 점이 아쉬웠어요. 무엇보다도, 메모리 이슈로 인해 실험이 중단된 것이 가장 큰 아쉬움으로 남았어요. 모델 크기가 커질수록 배치 크기를 줄여야 했고, 결국에는 실험을 끝까지 진행하지 못하는 상황이 발생했어요. 결국 제한된 시간 안에서 최적의 결과를 얻기 위해 베이스라인 코드를 수정하는 방향으로 실험을 진행할 수밖에 없었어요.

 

결과적으로, 모델 자체의 성능보다도 데이터의 품질과 모델이 학습하는 정보의 구조적 특성이 더 중요한 요소라는 점을 다시 한번 확인하게 되었어요. 모델 실험을 거듭하며, 단순한 하이퍼파라미터 조정보다는 모델이 학습할 데이터를 어떻게 구성하고, 모델이 요약을 생성하는 방식을 어떻게 유도할 것인지에 대한 고민이 더욱 필요하다는 점을 느끼게 된 과정이었습니다.

 

 


5. 우리의 선택과 전략, 그리고 1등

 

리더보드 중간 및 최종 점수 결과

 

Upstage AI 부트캠프에서 진행된 NLP 경진대회에서 우리는 모델 실험과 데이터 분석을 거듭하며 성능을 높이기 위해 다양한 시도를 했어요. 초반에는 점수가 쉽게 상승했지만, 어느 순간 점수 정체 구간에 부딪히면서 전략을 바꿀 필요성을 느꼈어요. 그 과정에서 단순한 모델 변경만으로는 한계를 극복할 수 없다는 걸 깨닫고, 데이터 분석과 전처리를 더욱 정교하게 다듬는 방향으로 전략을 수정했어요. 베이스라인 모델을 실행했을 때 첫 점수는 47점대로 비교적 높은 편이었어요. 그래서 빠르게 50점 이상을 기대했지만, 이후 48점대에서 점수가 좀처럼 오르지 않았어요.

 

모델을 변경하고, 하이퍼파라미터를 조정하고, 프롬프트 엔지니어링을 적용하는 등 다양한 실험을 했지만, 결과적으로 딥러닝 모델의 성능을 극대화하려면 모델 자체의 최적화뿐만 아니라, 학습 데이터의 구조와 품질을 정제하는 과정이 필수적이라는 사실을 깨닫게 되었어요. 데이터 정제를 통해 중복성을 제거하고, 대화문 유사도를 활용해 동일한 의미를 가진 데이터 구조를 개선하며, 토픽 재분류를 시도하고, 프롬프트를 활용해 요약문의 표현을 다양화하는 등 데이터 중심의 접근법을 유지했어요. 그 과정에서 일부 실험은 기대만큼의 성과를 내지 못했지만, 결국 우리가 선택한 방향이 맞았다는 걸 리더보드 최종 결과에서 확인할 수 있었어요.

 

마지막 실험을 마치고 제출한 결과, 우리는 리더보드 1위에 올랐습니다. 🎉 데이터를 분석하고 정제하는 과정이 단순한 전처리가 아니라, 모델 성능을 결정짓는 중요한 과정이라는 사실을 다시금 경험하게 되었어요. 결국 모델을 잘 설계하는 것도 중요하지만, 모델이 학습하는 데이터 자체가 더욱 중요한 요소라는 점을 이번 경진대회를 통해 확실히 깨달았어요. 처음에는 단순히 모델을 바꿔보고, 하이퍼파라미터를 조정하는 것이 성능 향상의 핵심이라고 생각했지만, 실험을 반복할수록 데이터를 어떻게 구성하고 모델이 학습할 정보를 어떻게 설계하는지가 더 중요한 문제라는 것을 실감했어요. 특히, 제한된 리소스와 시간 내에서 최적의 결과를 도출하기 위해서는, 단순히 새로운 기술을 적용하는 것보다 기존 데이터를 깊이 분석하고, 가장 효과적인 개선 방법을 찾는 것이 더 현실적인 접근이라는 것도 알게 되었어요.

 

이번 경진대회를 통해 데이터 분석의 중요성, 모델 실험의 한계, 그리고 협업의 가치까지 많은 것을 배우고 경험할 수 있었어요. 비록 모든 실험을 다 진행하지는 못했지만, 우리가 선택한 방향성과 전략이 옳았다는 것을 1등이라는 결과로 증명할 수 있어서 더욱 의미 있었던 도전이었습니다. 🚀

반응형
LIST

댓글