홀드아웃은 올랐는데, LB는 떨어졌다
이전 글에서는 [SRC] 프리픽스와 장기학습 seed 앙상블을 정리했다.
au 계열 세션을 별도 집단으로 보고, 입력 앞에 [SRC] au 또는 [SRC] sim을 붙였고, 장기학습한 base seed들을 고정 비율로 앙상블했다.
그 결과 v23a에서 다음 점수까지 도달했다.
v23a holdout: 0.7572
v23a LB: 0.7758666688
이 시점까지의 흐름은 비교적 명확했다.
좋은 seed를 늘리고, 고전 ML 블렌드를 일정 비율로 섞으면 점수가 조금씩 올랐다.
그래서 다음 단계에서도 비슷하게, 부족한 부분을 찾아 보완하면 더 올라갈 수 있을 것이라고 생각했다.
하지만 v23a 이후의 실험은 기대와 달랐다.
홀드아웃에서는 좋아 보이는 실험이 실제 LB에서는 떨어지는 경우가 반복됐다.
이전까지는 holdout이 어느 정도 방향을 알려준다고 생각했지만, 이 구간부터는 그 믿음이 흔들리기 시작했다.
이번 글에서는 v23a 이후 진행한 실패 실험들을 정리한다.
실패라고 해도 의미 없는 실험은 아니었다. 오히려 이 구간에서 무엇이 통하지 않는지 확인하면서, 이후 실험 방향을 좁힐 수 있었다.
v23a 이후의 문제의식
v23a는 당시 기준으로 가장 안정적인 제출이었다.
구조는 단순했다.
0.6 × 평균(seed45, seed46, seed47, seed48)
+
0.4 × 고전 ML 블렌드
복잡한 결합기를 강하게 학습하지 않았고, seed 평균과 고전 ML을 고정 비율로 섞었다.
그런데 여기서 더 올리려면 새로운 개선 축이 필요했다.
단순히 seed를 하나 더 추가하는 것만으로는 상승폭이 점점 작아질 수 있다고 봤다.
그래서 다음에는 현재 모델이 자주 헷갈리는 부분을 직접 보완하는 실험을 시도했다.
가장 먼저 눈에 들어온 것은 여전히 탐색 계열 클래스였다.
read_file
grep_search
glob_pattern
list_directory
이 네 클래스는 고전 ML 단계부터 계속 병목이었다.
트랜스포머와 seed 앙상블을 거치면서 성능은 많이 올랐지만, 마지막까지 헷갈리는 케이스가 남아 있었다.
그래서 v23a 이후 첫 번째 방향은 이 탐색 계열 클래스를 더 잘 구분하는 것이었다.
라벨 노이즈인가, 표현력 부족인가
처음에는 데이터 자체에 라벨 노이즈가 많은 것인지도 의심했다.
같은 입력처럼 보이는 샘플에 서로 다른 라벨이 붙어 있다면, 모델이 아무리 좋아도 일정 수준 이상은 맞히기 어렵다.
그래서 비슷한 입력끼리 묶어보고, 같은 입력 패턴 안에서 라벨이 얼마나 흔들리는지 확인했다.
초기에는 꽤 많은 노이즈가 있는 것처럼 보였다.
하지만 나중에 더 정교하게 확인해보니, 그 판단은 너무 거친 기준에서 나온 오측정에 가까웠다.
풀 트랜스크립트 기준으로 보면 대부분의 입력은 고유했고, 완전히 같은 입력에 서로 다른 라벨이 붙은 경우는 거의 없었다.
즉, 문제는 “라벨이 엉망이라서 못 맞히는 것”이라기보다, 모델이 아직 충분히 구분하지 못하는 쪽에 가까웠다.
특히 탐색 계열 클래스는 top-1으로 보면 많이 틀렸지만, top-2 안에는 정답이 들어오는 경우가 많았다.
top-1: 0.604
top-2: 0.815
이 결과는 중요한 힌트였다.
모델이 완전히 엉뚱한 클래스를 고르는 것이 아니라, 후보 두 개 정도까지는 잘 좁히고 있었다.
다만 마지막 선택에서 read_file과 glob_pattern, grep_search와 list_directory 같은 클래스 사이를 자주 틀렸다.
그래서 “후처리나 specialist 모델로 마지막 선택만 잘 바꿔주면 좋아지지 않을까?”라는 가설을 세웠다.
v24: 탐색 4형제 specialist
v24에서는 탐색 계열 클래스를 보완하기 위한 specialist를 만들었다.
기존 모델이 전체 14개 클래스를 예측한다면, specialist는 특히 헷갈리는 탐색 계열 클래스에 집중하는 역할을 기대했다.
목표는 단순했다.
기본 앙상블이 대략적인 후보를 잘 좁혀준다면, 탐색 계열에 해당하는 샘플에서는 specialist가 더 정교한 결정을 내려줄 수 있지 않을까?
홀드아웃에서는 꽤 좋아 보였다.
v24: holdout +0.0124
이 수치만 보면 제출해볼 만했다.
기존 v23a 이후 의미 있는 개선폭으로 보였고, 탐색 계열 병목을 직접 겨냥한 실험이었기 때문에 방향도 납득이 됐다.
하지만 LB 결과는 반대였다.
v24 LB: 0.7697683433
v23a보다 오히려 내려갔다.
이 결과는 꽤 충격적이었다.
홀드아웃에서는 좋아졌는데, 서버에서는 개선이 아니라 손해가 났다.
이때부터 “holdout에서 특정 약점을 보완하는 방식이 실제 테스트셋에도 그대로 통할까?”라는 의문이 커졌다.
탐색 4형제 specialist는 로컬 holdout의 오류에는 잘 맞았지만, 서버 테스트셋의 오류 분포에는 맞지 않았던 것으로 보인다.
즉, specialist가 실제 일반화된 개선이라기보다 holdout에 특화된 보정이었을 가능성이 있었다.
v25: seed 교체
다음으로는 seed 구성을 바꿔봤다.
v23a에서는 seed45, seed46, seed47, seed48을 사용했다.
여기서 일부 seed를 다른 seed로 교체하면 더 다양한 결정 경계를 얻을 수 있지 않을까 생각했다.
그래서 s45를 s51로 교체한 조합을 시도했다.
결과는 다음과 같았다.
v25 LB: 0.7748409894
나쁘지는 않았지만 v23a를 넘지 못했다.
이 실험은 “아무 seed나 추가하거나 교체한다고 좋아지는 것은 아니다”라는 점을 보여줬다.
seed 앙상블은 분명 효과가 있었지만, 이미 강한 seed 조합에서는 멤버 하나를 바꾸는 것만으로 쉽게 개선되지 않았다.
특히 v23a에 포함된 seed들이 이미 꽤 균형 잡힌 조합이었다면, 단순 교체는 오히려 안정성을 낮출 수 있었다.
v26: 자기증류 실험
지금까지의 방식으로는 한계가 있다고 판단했다.
따라서 새로운 방법을 찾던 중 자기증류를 시도해보기로 했다.
기본 아이디어는 이렇다.
강한 앙상블 모델은 각 클래스에 대한 확률 분포를 낸다.
이 확률 분포에는 단순한 정답 라벨보다 더 많은 정보가 들어 있을 수 있다.
예를 들어 어떤 샘플의 정답이 read_file이라고 해도, 앙상블이 다음과 같이 예측했다면:
read_file: 0.45
glob_pattern: 0.40
list_directory: 0.10
이 샘플은 read_file이 정답이지만, glob_pattern과도 매우 헷갈리는 케이스라는 정보를 담고 있다.
자기증류는 이런 soft label을 사용해서 더 작은 학생 모델을 학습시키는 방식이다.
강한 앙상블의 판단을 학생 모델이 따라 배우면, 더 안정적인 모델이 나올 수 있다고 기대했다.
홀드아웃에서 학생 모델은 나쁘지 않았다.
student holdout: 0.7585
하지만 제출 결과는 좋지 않았다.
v26 LB: 0.7640960177
v23a 대비 큰 폭으로 떨어졌다.
이 결과를 보고, 이번 문제에서는 자기증류가 앙상블의 장점을 충분히 보존하지 못한다고 판단했다.
앙상블은 여러 seed의 미묘한 차이를 평균내면서 안정성을 얻고 있었는데, 이를 하나의 학생 모델로 압축하는 과정에서 그 다양성이 사라진 것으로 보인다.
또는 학생 모델이 holdout의 soft label에는 잘 맞았지만, 서버 테스트셋에서 필요한 결정 경계는 제대로 유지하지 못했을 수도 있다.
어쨌든 이 실험은 “강한 앙상블을 학생 모델로 압축하면 제출이 가벼워지고 성능도 유지될 수 있다”는 기대와 다르게 끝났다.
au 가중 강화
이전 글에서 [SRC] 프리픽스와 au 집단이 중요한 역할을 했다고 정리했다.
그렇다면 서버 테스트셋에서 au 비중이 더 높다면, au 성능을 더 올리는 것이 LB 개선으로 이어질 수 있지 않을까?
이 가설도 확인해봤다.
학습에서 au 샘플의 가중치를 높여보니, 로컬 기준으로는 au 성능이 실제로 올랐다.
au ×1: au 0.883
au ×3: au 0.926
au ×5: au 0.916
특히 ×3에서 au 성능이 가장 좋았다.
전체 지표도 크게 망가지지 않았기 때문에 제출해볼 만했다.
하지만 LB에서는 큰 이득이 없었다.
v27 LB: 0.7751608972
v28 LB: 0.7755004009
둘 다 v23a 근처까지는 갔지만, 넘지는 못했다.
이 결과는 au 축이 이미 v23a에서 어느 정도 반영되어 있었다는 뜻으로 해석했다.
[SRC] 프리픽스와 기존 seed 앙상블만으로도 au 정보가 충분히 들어갔고,
추가로 au 가중치를 높이는 것은 서버 점수 개선으로 이어지지 않았다.
즉, au는 중요한 발견이었지만, 이 시점에서는 더 밀어붙일 만한 미개척 축은 아니었다.
클래스 prior 조정
이후에는 클래스별 prior를 살짝 조정하는 실험도 했다.
모델이 특정 클래스를 너무 많이 예측하거나 적게 예측한다면, 클래스별 확률에 상수를 곱해 결정 경계를 조금 움직일 수 있다.
예를 들어 ask_user가 과소예측되고 있다고 판단하면 해당 클래스 확률을 1.3배로 키워볼 수 있다.
반대로 web_search가 과대예측된다면 0.85배로 줄여볼 수 있다.
시도한 조정은 다음과 같았다.
ask_user × 1.3
web_search × 0.85
list_directory × 0.8
하지만 결과는 모두 좋지 않았다.
각각 LB가 소폭 하락했다.
이 실험을 통해 v23a의 결정 경계가 생각보다 예민하게 맞춰져 있다는 느낌을 받았다.
겉으로 보기에는 특정 클래스가 조금 부족하거나 많아 보였지만, 단순한 prior 조정으로는 서버 점수를 올릴 수 없었다.
클래스별 확률을 손으로 조정하는 방식은 로컬에서는 그럴듯해 보여도, 서버에서는 오히려 균형을 깨뜨릴 수 있었다.
그 외 기각한 실험들
이 구간에서는 제출까지 가지 않았거나, 중간 검증에서 제외한 실험들도 많았다.
대표적으로 입력 길이를 768까지 늘리는 실험이 있었다.
긴 history를 더 많이 보면 성능이 오를 수 있다고 생각했지만, 실제로는 기대만큼 좋아지지 않았다.
오히려 긴 입력은 추론 비용과 서버 안정성 문제를 다시 키울 수 있었다.
epoch을 더 늘리는 실험도 했다.
이전에는 6~8 epoch에서 좋은 seed들이 나왔기 때문에, 더 오래 학습하면 좋아질 가능성도 있었다.
하지만 이후 확인에서는 6 epoch 부근이 피크에 가까웠고, 7 epoch 이후부터는 오버피팅의 흐름이 보였다.
다른 백본도 일부 실험했다.
mDeBERTa, BERT, ELECTRA 계열을 확인했지만, 당시 구성에서는 RoBERTa 계열을 명확히 넘지 못했다.
LLM을 teacher로 사용하는 방식도 생각해봤지만, few-shot 기준 성능이 기존 앙상블보다 낮아 실전 투입하기 어려웠다.
모델 수프도 시도했지만, head permutation 문제로 성능이 크게 무너졌다.
서로 다른 seed의 head가 같은 의미의 뉴런 정렬을 가진다고 가정하기 어려웠기 때문에, 단순 평균이 통하지 않았다.
이 실험들은 대부분 직접적인 점수 상승으로 이어지지 않았지만, 적어도 막연히 열려 있던 선택지들을 하나씩 닫아주는 역할을 했다.
이 구간에서 바뀐 생각
v23a 이전까지는 비교적 단순한 흐름이었다.
좋은 입력을 만들고, 좋은 seed를 늘리고, 고전 ML을 섞으면 점수가 올라갔다.
하지만 v24 이후에는 상황이 달라졌다.
홀드아웃에서 좋아 보이는 실험이 서버에서 그대로 좋아지지 않았다.
특히 specialist나 자기증류처럼 로컬 검증에서는 설득력 있어 보였던 실험이 LB에서는 크게 밀렸다.
이 시점부터는 holdout을 절대적인 기준으로 보기 어려워졌다.
물론 holdout은 여전히 필요하다.
아이디어를 빠르게 걸러내고, 명백히 나쁜 실험을 제거하는 데는 유용하다.
하지만 v23a 이후처럼 점수 차이가 매우 작아진 구간에서는, holdout이 서버 방향을 정확히 알려주지 못했다.
결국 이 구간에서 얻은 결론은 다음에 가까웠다.
holdout은 실험 필터로는 유용하지만,
최종 선택 기준으로는 부족할 수 있다.
특히 서버 테스트셋의 분포가 로컬 holdout과 조금이라도 다르면, holdout에 맞춘 보정은 오히려 LB를 깎을 수 있었다.
정리
v23a 이후에는 여러 개선 시도를 했다.
v24: 탐색 4형제 specialist
v25: seed 교체
v26: 자기증류
v27~v28: au 가중 강화
CA: 클래스 prior 조정
기타: 768 token, 장기 epoch, 다른 백본, 모델 수프 등
하지만 이 실험들은 대부분 v23a를 넘지 못했다.
v23a LB: 0.7758666688
v24 LB: 0.7697683433
v25 LB: 0.7748409894
v26 LB: 0.7640960177
v27 LB: 0.7751608972
v28 LB: 0.7755004009
이 구간의 핵심은 성공이 아니라 실패였다.
탐색 계열 specialist는 holdout에서는 좋아졌지만 서버에서는 떨어졌다.
자기증류는 학생 모델의 holdout이 괜찮았지만 LB를 크게 반납했다.
au 가중 강화와 클래스 prior 조정도 v23a를 넘지 못했다.
결국 v23a 이후의 실험을 통해, 단순한 후처리나 holdout 맞춤 보정으로는 더 이상 안정적인 상승을 만들기 어렵다는 것을 확인했다.
다음 단계에서는 다시 새로운 축이 필요했다.
같은 RoBERTa seed를 더 다듬는 것이 아니라, 다른 방식으로 오류를 내는 모델이 필요했다.
이후 실험은 아키텍처 다양성 쪽으로 넘어간다.
RoBERTa seed를 계속 늘리는 대신, 다른 백본을 섞었을 때 앙상블에 새로운 정보가 생기는지 확인하는 방향으로 진행했다.
'고민의 흔적.. > AI Agent 행동예측 해커톤' 카테고리의 다른 글
| (연구일지 #8 고전 ML 개선)Dacon AI Agent 행동 예측 대회 (0) | 2026.07.11 |
|---|---|
| (연구일지 #7 새 아키텍처 축 탐색과 정체)Dacon AI Agent 행동 예측 대회 (0) | 2026.07.11 |
| (연구일지 #5 SRC와 seed 앙상블)Dacon AI Agent 행동 예측 대회 (0) | 2026.07.09 |
| (연구일지 #4 채점 환경 분석)Dacon AI Agent 행동 예측 대회 (0) | 2026.07.08 |
| (연구일지 #3 Transformer stacking)Dacon AI Agent 행동 예측 대회 (0) | 2026.07.04 |