Post

UMUD 챌린지 ⑨ — 셀 단위 보정과 곡률 비용: public을 private의 대리로 쓰는 법

UMUD 챌린지 ⑨ — 셀 단위 보정과 곡률 비용: public을 private의 대리로 쓰는 법

⑧편 이후 12일이 지났습니다. 그동안 public 최고점은 0.22868 → 0.22102 → 0.21657 → 0.21478 → 0.21289 → 0.21214 → 0.21135로 내려왔습니다. 하지만 순위는 1위에서 2~3위로 밀렸습니다. 이 글은 그 12일 동안 생긴 세 가지 변화를 정리합니다. 첫째, 로컬 검증 세트를 판정에서 내려놓았습니다. 둘째, 화면 종류 × 지표 × R 구간마다 따로 보정하기 시작했습니다. 셋째, 그 보정을 너무 세게 하면 오히려 손해라는 것을 숫자로 확인했습니다.

대회 진행 중이라 코드와 대회 이미지는 싣지 않습니다. 그림은 모두 기록된 점수로 직접 그린 차트입니다. ‘실측’은 public에 낸 제출로 확인한 값이고, 나머지는 ‘추정’입니다.

1. public 점수 흐름

public 추이 우리 public 최고점(파랑)과 다른 팀 최고점(빨강). 숫자 아래는 그날 우리 순위

날짜판public무엇을 바꿨나
10/9E0.22868 (1위)PA·FL·MT를 각각 겨냥한 변경 세 개를 결합. 효과가 거의 그대로 더해졌다(단일 합의 78%)
10/12PAhi0.22682PA 당김을 조금 더 세게. 그날 다른 팀이 0.21657로 올라와 3위
10/13M3lo880.22102PA 계산에서 일부 구성원을 빼고, 당김 하한을 0.88로
10/15D2revPA0.21657첫 셀 이동판. 2위 회복
10/16d_resel0.21478셀을 다시 골라 4칸만 이동
10/17P3big0.21289TEL1088 화면 PA를 더 올림(중첩 사슬로 확인)
10/18P3shrink700.21214셀 이동을 0.7배로 줄인 판
10/19grp0.21135셀 묶음마다 배율을 달리 줌

10/9에 0.22868로 1위가 됐지만 사흘 만에 역전당했습니다. 1위 팀(Kragglenote2)은 그 뒤 하루에 0.002~0.004씩 점수를 내렸고, 오늘 아침 기준 0.20241입니다. 우리는 하루 약 0.0008씩 따라가고 있습니다. 13회차 직후에는 2위였지만, 같은 날 Talha가 0.21037로 올라와서 지금은 3위입니다. 4위 팀(0.21225)과의 차이도 0.0009뿐입니다.

솔직히 public 1위를 따라잡기는 어렵습니다. 그래서 이 기간 후반부의 고민은 점점 “public을 더 올릴까”에서 “public에서 얻은 것 가운데 private까지 가져갈 수 있는 것이 무엇인가”로 옮겨 갔습니다.

2. 로컬 검증 세트가 테스트 장비를 대표하지 못한다

⑧편 끝에서 “테스트에만 있는 영상을 겨냥한 규칙은 로컬 검증으로 판별할 수 없다”고 썼습니다. 그 뒤 일주일 동안, 판별을 못 하는 정도가 아니라 로컬과 public이 반대로 움직이는 사례가 연달아 나왔습니다.

시도로컬 판정public 실측
구조가 다른 5번째 분할망(10/8)NeuAge −0.011, 통과+0.0059
CNN 직접 회귀를 5번째 구성원으로(10/14)사전 등록 기준 통과, NeuAge −0.023~−0.025+0.010~+0.012
전체 데이터로 학습한 방향 구성원 3판(orifull3)중립+0.0249 (z≈3.8)
PA 당김 하한 0.88벤치 +0.0031로 악화개선(최고점 갱신에 기여)

특히 회귀 구성원은 아팠습니다. 학습 전에 기준을 고정해 두고 정직하게 판정했고, 로컬에서는 깔끔하게 통과했습니다. 그런데 public에서는 0.01이나 나빠졌습니다. 로컬 NeuAge는 Esaote 장비로 찍은 영상입니다. 그 장비에서 근막을 놓치는 문제를 고쳐 준 이득이 테스트 장비(Telemed·태블릿·S12L3)로는 옮겨 가지 않은 것으로 보입니다.

같은 무렵 주최측이 토론 게시판 질문에 답해 주었습니다. 가장 중요한 내용은 public/private 분할이 무작위라는 것이었습니다. 사람이나 클립 단위로 묶어서 나눈 것이 아니라는 뜻입니다. 이 한 문장으로 판정 기준이 바뀌었습니다.

  • 분할이 무작위라면 public 약 102장은 private 207장과 같은 분포에서 뽑은 표본입니다.
  • 그렇다면 public에서 얻은 이득이 private으로 옮겨 가지 않는 이유는 두 가지뿐입니다. 하나는 표본 잡음이고, 다른 하나는 여러 판 중 좋은 것을 고르면서 생기는 선택 편향(승자의 저주)입니다.
  • 반면 로컬 세트는 장비도, 평가자도 다릅니다. 이 차이는 표본을 늘려도 줄어들지 않습니다.

결론은 분명했습니다. public이 private의 가장 좋은 대리 지표이고, 로컬은 참고용으로 내린다. 다만 public을 판정 기준으로 쓰면 과적합 위험이 바로 생깁니다. 이 문제는 6절에서 다룹니다.

3. 셀 단위 보정

3-1. 셀이란

⑦·⑧편에서 효과가 컸던 규칙은 모두 “어디를 고칠지”를 정한 규칙이었습니다. 모든 영상에 똑같이 적용한 규칙은 최대 이득의 12~37%만 얻었습니다. 반면 문제 있는 영상만 골라 고친 규칙은 92%를 얻었습니다. 이 생각을 끝까지 밀고 가면, 테스트 영상을 다음 세 축으로 나눈 칸이 됩니다.

  • 화면 종류: TEL1200, TEL1088, TAB, S12L3 등
  • 지표: PA, FL, MT
  • R 구간: R = FL·sin(PA)/MT가 0.85보다 작은지, 0.85~0.95인지, 0.95~1.05인지 등

이 칸 하나하나를 셀이라고 부르겠습니다. 셀마다 “이 칸의 PA를 몇 도 올리거나 내린다”는 상수 이동 하나만 허용합니다. 모델은 건드리지 않습니다. 측정이 끝난 숫자에 평가자 관례 쪽으로 보정을 더하는 것입니다. 장비마다 계통 편향을 따로 보정하는 것과 같은 발상입니다.

3-2. 가산 모형: 제출 하나를 영상 단위로 쪼개 보기

셀은 47개나 되는데 public 판정은 하루 5회뿐입니다. 셀마다 따로 제출해 볼 수는 없습니다. 그래서 그동안 낸 제출 전부를 하나의 모형에 넣었습니다.

대회 점수는 영상별 오차의 평균입니다. 그러니 어떤 제출의 public 점수는 “public에 속한 영상들의 기여를 더한 값”입니다. 어느 영상이 public에 속하는지는 모르지만, 분할이 무작위라는 것은 압니다. 따라서 무작위 public 마스크를 여러 번 뽑습니다. 그리고 셀별 편향이 지금까지 낸 제출 수십 개의 점수를 가장 잘 설명하도록 적합합니다. 이것이 가산 모형입니다. 날마다 그날 결과를 넣어 다시 적합했습니다(fit6 → fit8 → fit10 → fit11).

이 모형의 성적은 이랬습니다. 모두 그날 결과를 빼고 적합해서 그날을 맞혀 본 값입니다.

  • 10/14(fit6): 부호 5/5, 쌍 순서 10/10. 크기는 실제의 0.5~0.6배로 낮게 잡았습니다.
  • 10/16(fit10): 셀 이동판 3개의 부호를 모두 맞혔습니다. 실측/예측은 0.55~0.88배였습니다. 다만 FL을 늘리는 판 2개는 부호를 틀렸습니다.
  • 10/18(fit11): TEL1088 PA는 방향은 맞혔지만 크기를 실측의 0.6배로 봤습니다. 작은 셀과 FL 이동은 부호를 틀렸습니다.

정리하면 이 모형은 큰 셀의 방향은 잘 맞히고, 작은 셀과 FL은 믿을 수 없습니다. 그래서 이후에는 모형이 “좋다”고 해도, 3가지 적합 × 8가지 설정 = 24판 모두에서 Δ<0이어야만 후보로 올렸습니다. 날짜를 하나씩 빼고 적합해도(LODO) 부호가 유지돼야 한다는 조건도 붙였습니다.

3-3. 중첩 사슬: 셀 묶음의 몫을 직접 읽기

모형 예측만으로는 불안했습니다. 그래서 public에서 셀 묶음의 효과를 직접 읽는 방법을 짰습니다.

서로 겹치지 않는 영상을 바꾸는 두 이동은 점수 차가 정확히 더해집니다. 점수가 영상별 오차의 평균이기 때문입니다. 그러니 기준판 W에 묶음을 하나씩 누적해서 얹은 다섯 판을 내면, 이웃한 두 판의 차분이 곧 그 묶음 하나의 public 몫이 됩니다. 이것을 중첩 사슬이라고 불렀습니다. 10/17 결과는 다음과 같습니다.

사슬public차분읽은 것
W + TEL1088 PA +0.35°0.21365−0.00113TEL1088 PA 올림은 이득
… + 0.7°까지0.21297−0.000680.7°까지 키워도 아직 이득
… + S12L3 0.95~1.05 PA(45행)0.21289−0.00008거의 0
… + 영상 8장 미만 셀의 PA(8행)0.21306+0.00017손해 → 제외
… + FL 줄임(11행)0.21427+0.00121손해 → 제외

제출 다섯 번으로 묶음 다섯 개의 실측 몫을 한꺼번에 얻었습니다. 이 결과로 정리된 것은 두 가지입니다. FL 쪽은 늘려도 손해이고 줄여도 손해이니, FL 셀은 손대지 않습니다. 반면 TEL1088 PA는 아직 포화하지 않았습니다. 이후 1.05°까지 올려도 −0.0003의 이득이 더 있었습니다.

3-4. 곡률 비용: 다 옮기면 손해

10/18에는 의외의 결과가 나왔습니다. 셀 이동량을 모두 0.7배로 줄인 판(P3shrink70)이 원래 판(P3big)보다 0.00075 좋았습니다. 가산 모형은 반대로 +0.0005를 예측했으니 부호를 틀린 셈입니다.

이유는 오차 지표의 모양에 있습니다. 영상 하나의 오차는 이동량에 대해 2차 함수처럼 휩니다. 셀 평균으로는 이동이 맞는 방향이어도, 그 셀 안에서 이미 맞던 영상은 이동만큼 손해를 봅니다. 이동량이 커질수록 이 손해가 제곱으로 커집니다. 이것을 곡률 비용이라고 불렀습니다. 앞서 10/16 분석에서도 이미 보였던 현상입니다. 두 판의 실측을 2차식으로 분해하면 선형 항은 −0.0121, 곡률 항은 +0.0076이었습니다.

그래서 이동 배율 α를 축으로 곡선을 그렸습니다. α=0은 M3lo88(셀 이동 없음), α=1은 P3big입니다. 10/18에는 실측 세 점(0, 0.7, 1.0)으로 2차 곡선을 적합했습니다.

\[f(\alpha) = 0.22102 - 0.02332\,\alpha + 0.01519\,\alpha^2,\qquad \alpha^* \approx 0.77\]

10/19에는 이 곡선을 보고 미리 두 점을 더 찍었습니다.

배율 곡선 파란 점 세 개로 곡선을 그린 뒤, 빨간 점 두 개를 새로 냈다

α판곡선 예상실측
0.55a550.212790.21337
0.85a850.212170.21200

예상과 실측의 오차는 0.0002~0.0006 정도였습니다. 다섯 점을 함께 보면 최적 배율은 0.75~0.85 사이이고 바닥이 평평합니다. 모형이 고른 크기를 그대로 다 옮기는 것은 지나칩니다. 약 0.8배가 맞습니다. 같은 날 셀 묶음마다 배율을 따로 준 grp가 0.21135로 최고점을 냈습니다. 하지만 grp의 이득은 P3shrink70보다 0.0008 좋은 수준입니다. 셀 축은 거의 다 짜냈습니다.

4. 실패한 것들

이 기간에 셀 축만 판 것은 아닙니다. 모델 쪽과 데이터 쪽도 끝까지 시험했고, 모두 닫았습니다.

  • nnS (nnU-Net 시드 2판 추가, 중앙값): 24판 모두 +0.0020~+0.0040 악화했습니다. 다른 구성원에서 통했던 시드 중앙값 안정화가 이 구성원에는 일반화되지 않았습니다.
  • oriS (방향 구성원 5 fold 중앙값): +0.0098~+0.0110로 24판 모두 악화했습니다. 지금의 측정 규칙이 fold 0 판에 맞춰져 있어서(공적응), 다른 판으로 바꾸면 무엇이든 손해입니다.
  • AdaBN (BN 통계만 테스트 화면에 맞춰 재추정): 12판 조합에서 −0.0010이 나왔지만 24판 중 1판이 양수였습니다. 판 수를 바꾸면 −0.0003으로 줄었습니다. 이득이 안정적이지 않았습니다.
  • dl 미세조정: 검증 Dice는 올랐습니다(다발 0.224 → 0.365). 하지만 FL이 길어지고 PA가 낮아져 public 예측이 +0.004~+0.019로 크게 나빠졌습니다. 분할이 정답에 가까워진다고 평가자 관례에 가까워지는 것은 아닙니다.
  • mt 10판 (독립 학습 판을 6판에서 10판으로): +0.0003~+0.0005로, 24판 중 2판만 개선됐습니다. 판 수를 늘리는 축도 닫았습니다.
  • CNN 직접 회귀: 단독으로는 기준보다 약 0.10 나빴습니다. 픽셀 단위로 회귀하다 보니 장비 축척 차이에 약하고, FL 오차가 9~19mm였습니다. 5번째 구성원으로 넣으면 로컬은 통과했지만 public은 +0.010이었습니다(2절).
  • 추가 데이터: 테스트 장비로 찍고 평가자 측정값이 붙은 공개 영상은 없었습니다. 찾은 외부 세트 두 개는 진단에만 썼습니다. 그 진단에서 나온 제안(FL 펼치기, TEL1088 PA 내리기)도 관문을 통과하지 못했습니다(+0.0010~+0.0366).

이 외에 10/8~10/9에 한 실험들도 모두 불통과였습니다. 테스트를 닮게 흐리고 어둡게 만든 증강은 시드 잡음이 효과를 덮었습니다. 비등방 증강을 넓히는 시도도 통과하지 못했습니다. 기록을 보면 새 구성원을 더하거나 다른 학습 판으로 바꾸는 시도는 public에서 거의 매번 졌습니다(10/9까지 8연패, 그 뒤 회귀 구성원과 orifull3도 실패). 셀 이동이 남은 유일한 축이었던 이유입니다.

5. private을 위한 고민

5-1. 셀 이동은 private으로 얼마나 옮겨 가나

public에서 고른 셀 이동은 두 가지 이유로 private에서 줄어듭니다.

  1. 승자의 저주: 47셀 중 public에서 좋아 보인 셀을 골랐으므로, 그 셀의 진짜 편향은 보이는 것보다 작습니다.
  2. 곡률 비용: private에서도 똑같이 붙습니다.

private 모형으로 계산하면 손익분기 이월률은 판마다 0.35~0.57이었습니다. public 이득의 절반 정도가 private으로 넘어가지 않으면 오히려 손해라는 뜻입니다. 더 곤란한 것은 따로 있습니다. 셀 편향이 실제로 얼마나 큰지를 나타내는 τ를 데이터로 가릴 수 없었습니다. 우도가 0.2~0.9에서 평평했습니다. τ가 0.6 이상이면 셀 판이 private에서도 이득이지만, 그보다 작으면 손해입니다.

10/18 재분석에서 계산한 셀 층의 private Δ(셀 이동 없는 M3 대비)는 이렇습니다.

판publicprivate Δ 추정private 개선 확률
P3big (전부 이동)0.21289+0.0024—
P3shrink70 (0.7배)0.212140.00000.49
M3prot50 (보호판)0.21726−0.00090.85

public에서 가장 좋은 판이 private에서도 가장 좋은 것은 아닙니다. M3prot50은 public 점수로는 한참 뒤지지만 private 기대값은 가장 좋습니다. 이 판은 다음 조건을 모두 통과한 셀 4개만, 이동량을 절반으로 줄여 얹은 판입니다.

  • 셀에 들어가는 영상이 30장 이상
  • 사슬 실측이 양수 방향
  • 날짜를 하나씩 빼고 적합해도 16/16 같은 부호
  • 이동량이 표준오차의 2배 이상

5-2. 최종 2개를 고르는 원칙

Kaggle은 직접 체크한 최종 2개 중 private이 좋은 쪽으로 순위를 매깁니다. 그래서 두 개는 서로 다른 위험에 거는 것이어야 합니다. 지금 세운 원칙은 다음과 같습니다.

  • public 트랙과 private 선택을 분리합니다. public 순위는 낸 제출 중 최고점으로 자동 결정되니 따로 관리할 필요가 없습니다. 최종 2개는 private 기대값만 보고 고릅니다.
  • 한 판은 셀 보정이 없는 규칙판으로 둡니다. F(public 0.23042)는 물리·관례 근거가 있는 규칙만 담았습니다. 셀 가정(τ)이 틀려도 무너지지 않습니다.
  • 다른 판은 셀을 보수적으로 얹은 보호판으로 둡니다. 현재 권고는 {F, M3prot50}입니다. 셀 편향을 크게 믿는다면 {M3prot50, P3shrink70}이 대안입니다. 55가지 가정 가운데 기대 최솟값과 3위 안 확률 기준으로는 앞의 쌍이, 1위 확률 기준으로는 뒤의 쌍이 가장 자주 1등이었습니다.
  • 경쟁자의 public 변동으로 쌍을 바꾸지 않습니다. 10/10에 미리 적어 둔 규칙입니다. 상대 점수를 보고 흔들리면 그것 자체가 public 과적합입니다.

최종 결정은 11/13에 다시 계산한 뒤 내립니다.

6. 방법론 회고: 초음파 측정의 눈으로 보면

이 대회의 정답은 “참값”이 아니라 평가자가 잰 값입니다. 초음파 근육 구조 측정에서 PA·FL·MT는 같은 영상이라도 평가자와 프로토콜에 따라 몇 도, 몇 mm씩 달라집니다. 이 관점에서 이번 12일을 돌아보면 이렇습니다.

타당했던 것

  • 보정 단위가 물리적으로 의미 있었습니다. 화면 종류는 곧 장비·프로브·축척이고, R은 FL·sin(PA)와 MT가 서로 맞는지 보는 기하 일관성 지표입니다. “장비별 계통 편향을 장비별로 보정한다”는 것은 측정 과학에서 Bland-Altman 편향 보정을 장비마다 하는 것과 같은 논리입니다. 아무 영상 묶음에나 상수를 얹은 것이 아닙니다.
  • 방향에 기전이 있었습니다. 가장 크게 통한 이동(긴 화면의 R이 작은 영상에서 PA 올리기)은 ⑦편부터 세 번 이상 같은 방향으로 확인된 “평가자는 더 가파른 다발을 고른다”는 관례 가설과 일치합니다.
  • 분할 무작위라는 외부 사실에 근거했습니다. public을 대리 지표로 쓴 것은 편의 때문이 아니라 주최측 답변 덕분입니다. 이 답변이 없었다면 같은 선택은 위험했을 겁니다.

위험했던 것

  • public 102장에 47셀을 맞췄습니다. 셀 하나에 들어가는 public 영상은 평균 두어 장입니다(추정). 셀 이동은 본질적으로 public 영상을 외우는 쪽으로 미끄러지기 쉽습니다.
  • 표본 안 평가였습니다. 10/14 탐색에서는 같은 64개 제출로 셀을 고르고 평가했습니다. 모형이 −0.002~−0.006이라고 한 결합판 10개가 반박 단계에서 모두 무너졌습니다.
  • 외부 데이터와 신호가 엇갈렸습니다. 외부 Telemed 세트에서 우리 PA는 정답보다 +0.64° 높았습니다. 그런데 public은 TEL1088 PA를 더 올리라고 했습니다. 평가자 관례가 데이터셋마다 다르다는 뜻일 수 있습니다. 하지만 public 쪽 신호가 잡음일 가능성도 완전히 지우지 못했습니다.

public 과적합을 어떻게 막았나

장치무엇을 막나
판정 기준을 계산 전에 시각과 함께 파일로 고정결과를 보고 기준을 고치는 일
24판 모두 Δ<0 + 날짜별 LODO 부호 유지특정 적합·특정 날짜에만 맞는 후보
모형 Δ에 0.4~0.5를 곱해 할인, 선택 편향 κ=0.8 반영승자의 저주
중첩 사슬로 묶음별 실측모형 예측만 믿는 일
배율 0.7~0.8로 축소, 보호판은 n≥30 셀만 절반 크기로곡률 비용과 작은 셀의 잡음
public 트랙과 최종 선택 분리, 경쟁자 변동 무시public 순위를 위한 선택이 private을 해치는 일
모든 판을 저장소 스크립트 한 줄로 바이트 재현기억에 의존한 “그때 그 판”

그래도 남는 사실이 있습니다. public으로 고른 것은 public 위에서는 늘 낙관적으로 보입니다. 그래서 최종 2개 중 하나는 셀 가정과 무관한 판으로 남겨 둡니다. 이것이 이번 기간에 얻은 가장 중요한 판단입니다.

7. 다음

  • 내일 14회차는 grp 위에서 묶음 배율을 미세하게 조정해 봅니다. 예상 이득은 0.00013 이하라서 사실상 마지막 셀 탐침입니다.
  • 남은 시간은 private 쌍 재계산과 재현성 점검에 씁니다. M3prot50도 스크립트 한 줄로 재현되게 만들어야 합니다.
  • public 1위와의 격차는 0.0089입니다. 셀 축만으로 이 격차를 닫기는 어렵습니다. 격차를 정말 닫으려면 측정 모형 자체가 바뀌어야 합니다. 그런 아이디어가 나오면 다시 쓰겠습니다.
This post is licensed under CC BY 4.0 by the author.