Post

UMUD 챌린지 ⑭ — 같은 근섬유, 다른 근막선: 이틀 동안 50여 개 가설을 닫고 찾은 관례 차이

UMUD 챌린지 ⑭ — 같은 근섬유, 다른 근막선: 이틀 동안 50여 개 가설을 닫고 찾은 관례 차이

⑬편은 “관문은 익숙한 변화에만 쓸 수 있다”로 끝났습니다. 그 뒤 이틀(10/31~11/1)은 방식을 바꿨습니다. 가설 하나를 오래 붙잡는 대신, 하루 30개 안팎의 가설을 사전 등록·킬스위치·관문의 세 단계로 빠르게 걸러 내는 쪽으로 운영했습니다. 이틀 동안 기록한 실험 항목이 50개를 넘었고, public 최고점은 그대로 0.20943입니다.

점수는 그대로지만 이번 이틀에는 이유를 하나 찾았습니다. 같은 근섬유를 골라도 우리 FL이 평가자보다 길게 나오는 이유가 무엇인지, 그리고 그 차이가 왜 로컬 검증 세트로는 고쳐지지 않는지입니다.

대회 진행 중이라 코드와 대회 이미지는 싣지 않습니다. 표는 실험 기록 숫자로 직접 만들었습니다. “추정”이라고 적은 것은 실측이 아니라 해석입니다.

1. 방법론: 하루 30개를 거르는 깔때기

가설이 많아지면 가장 위험한 것은 “결과를 보고 기준을 고르는 것”입니다. 그래서 모든 가설을 같은 순서로 통과시켰습니다.

단계하는 일비용이틀간 여기서 멈춘 비율(대략)
0. 사전 등록가설, 판정 지표, 문턱, 반박 의견을 계산 전에 파일로 적는다없음—
1. 킬스위치 K0가설의 전제가 데이터에서 성립하는지 CPU로 먼저 본다분 단위절반 이상
2. 킬스위치 K1~K4학습·추론 후 부작용 지표(PA 편향, FL MAE 등)가 문턱을 넘는지 본다GPU 시간나머지 대부분
3. 로컬 판정로컬 6세트(벤치·NeuAge·자른 사본)에서 개선인지분 단위일부
4. 관문과거 제출로 맞춘 영상별 오차 모형으로 public Δ를 예측초 단위거의 전부
5. 제출관문까지 통과한 판, 또는 정보가 필요한 판만하루 5칸—

K0가 가장 많은 일을 했습니다. 예를 들어 “9개 구성원 근막선의 합의선으로 다시 재면 FL 흩어짐이 줄 것”이라는 가설은 먼저 테스트에서 흩어짐 비를 계산해 보고(0.828, 문턱 0.80 이하) 학습 없이 닫았습니다. “근막선을 따라 영상을 펴서 다발 헤드를 다시 학습”하는 가설은 펴고 되돌렸을 때 원래 라벨이 얼마나 보존되는지(Dice 0.956, 문턱 0.98)에서 멈췄습니다. GPU를 한 번도 켜지 않은 채 닫힌 가설이 절반이 넘습니다.

사전 등록이 실제로 쓸모 있었던 순간도 있었습니다. 결과를 본 뒤 버그를 발견해 다시 돌린 경우에는 “추가 1: 첫 결과 본 뒤, 버그”처럼 언제 무엇을 알았는지를 등록 파일 아래에 덧붙였습니다. 판정이 바뀌지 않았다는 것도 함께 적었습니다. 결과를 본 뒤의 수정이 판정을 뒤집었는지 나중에 확인할 수 있게 하려는 것입니다.

이틀 동안 닫은 축을 묶으면 이렇습니다.

  • 학습 쪽: EMA 가중치, 군집 균형 샘플러, 라벨 없는 자르기 일관성 손실, nnU-Net fold 평균과 seed 평균, 좁은 화면 outpainter, 근섬유 군집 하나를 빼고 학습
  • 측정 쪽: 근막 연장 방식, FL 각도 결합, 띠 중심까지 FL, 영상별 리샘플, 입력 회전으로 각 이득 추정, 순위 모형으로 평가자의 근섬유 고르기 흉내
  • 합치기 쪽: 계열 간 불일치 영상 덮어쓰기, 머리별 fold 섞기, 구성원별 OOD 거르개, 원본·반전 합의 맵

2. 진단: 같은 근섬유를 골라도 FL이 3.75mm 길다

거르기만 한 것은 아닙니다. FL 오차를 “어떤 근섬유를 골랐느냐”와 “고른 근섬유를 어떻게 재느냐”로 나눠 보려고, 평가자가 그린 근섬유와 우리 후보 중 같은 근섬유로 짝지을 수 있는 것만 모았습니다(두 선이 1mm 안). NeuAge 세트에서 820쌍이 나왔습니다.

같은 근섬유인데도 우리 길이가 평가자보다 중앙값 +3.75mm(피험자 평균 +6.96mm) 길었습니다. 이 차이를 네 조각으로 나눴습니다.

성분뜻피험자 평균 (mm)비중
A 각근막에 대한 근섬유 각이 다르다+1.0315%
B 근막·끝점근섬유가 닿는 근막선의 위치가 다르다+4.4163%
C 외삽 위치외삽한 현이 놓인 가로 위치가 다르다+1.6424%
E 곡선−현평가자는 꺾은선, 우리는 직선−0.12−2%

처음 가설은 “각도(A)가 주원인”이었습니다. 실제로는 15%에 그쳐 사전 기준(50% 이상)에서 불통과였습니다. 87%는 근막선 쪽(B+C)이었습니다. 근섬유를 제대로 골라도, 그 근섬유가 끝나는 근막선을 우리가 다른 곳에 긋고 있었다는 뜻입니다.

그래서 근막선만 따로 비교했습니다. 평가자가 그린 근막선은 거의 완벽한 직선이고, 화면 밖까지 길게 그려져 있었습니다(그린 길이/화면 폭 중앙값 표층 1.67배). 우리 선과의 차이를 위치별로 재 보니 교점 쪽은 바깥으로, 반대쪽은 안쪽으로 벌어졌습니다. 평행 이동이 아니라 회전입니다.

위치표층 차이 (mm, + = 우리 선이 바깥)심층 차이
교점 쪽 화면 경계+0.16−0.05
교점 쪽 3cm 밖+0.53+0.16
반대쪽 3cm 밖−0.40−0.76

우리 두 근막선이 평가자 선보다 근섬유 쪽으로 약 0.55° 돌아가 있었습니다. 근막과 근섬유 사이 각이 작아지니, 화면 밖으로 연장한 근섬유가 근막을 더 멀리서 만나 FL이 길어지고 PA는 낮아집니다. 연장 방식(안쪽 가장자리 대신 띠 중심, 강건 맞춤 대신 최소제곱)을 바꿔도 회전은 줄지 않았습니다. 회전은 연장 규칙이 아니라 분할망이 그린 근막 띠의 모양 자체에 있습니다.

3. 그 회전은 학습 라벨과는 맞다

그러면 근막 헤드를 더 잘 학습시키면 될까요? 여기서 흥미로운 사실이 나왔습니다.

  • 우리 구성원들의 근막 중앙선은 학습 마스크의 정답 직선과 0.09mm 안에 있습니다. 학습 라벨 기준으로는 이미 거의 완벽합니다.
  • 같은 선이 외부 평가자(NeuAge 세트의 사람이 그린 선)와 비교하면 0.55° 돌아 있습니다.

즉 0.55°는 모델의 오차가 아니라 라벨 출처 사이의 관례 차이입니다(추정). 학습 마스크를 만든 사람들은 근막 띠의 안쪽 가장자리를 이 각도로 그었고, 측정값을 매긴 평가자들은 다르게 그었습니다. 라벨에 충실하게 학습할수록 이 관례를 그대로 배웁니다.

이 결론 때문에 근막선을 학습으로 고치려는 축(공유 직선 근막 헤드, 열별 경계 정제기, 근막 합의선, 근막선으로 펴서 다시 학습)을 한꺼번에 닫았습니다. 고칠 대상이 학습 라벨 안에 없기 때문입니다. 영상마다 회전량을 라벨 없이 추정할 신호가 있어야 하는데, 아직 찾지 못했습니다. 고정 각도로 돌리는 보정은 이미 10월 초에 기각됐습니다.

4. 정보 제출 두 건: 로컬 전문가와 test 평가자는 반대 방향이다

진단을 확인하려고 11/1에 정보 제출을 두 칸 썼습니다. 채택할 생각 없이, 관례 방향을 public으로 확인하려고 낸 판입니다.

(1) 로컬 상수 재적합. 앙상블 뒤 보정 상수(FL 배율, PA 이동 등)를 public 없이 로컬 6세트만으로 중첩 교차검증해 다시 맞췄습니다. 로컬 바깥 fold에서는 −0.0117(6세트 중 5세트 개선)로 등록 기준을 넉넉히 통과했습니다. 재적합이 원한 방향은 FL을 1.5% 짧게, PA를 약 0.2° 낮게였습니다.

(2) 측정 프로토콜 맞추기. 주최측이 밝힌 공개 측정 도구의 수동 측정 코드를 한 줄씩 대조했습니다. 근막 직선 연장, 국소 PA, 세로 MT, 축척은 이미 같았고, 남은 차이는 “세 값의 합치기를 평균으로 하느냐 중앙값으로 하느냐”뿐이었습니다. FL만 평균으로 바꾼 판은 로컬 −0.0014였습니다.

정보 제출로컬 Δ관문 예측public 실제
로컬 상수 재적합−0.0117+0.0068 (24판 중 0판 개선)+0.0106 (0.22006)
FL 합치기 = 평균−0.0014+0.0022 (24판 중 1판)+0.0020 (0.21138)

둘 다 로컬에서 좋아졌고, public에서 나빠졌습니다. 첫째 판이 특히 분명합니다. 로컬 전문가 라벨이 원하는 방향(FL 짧게, PA 낮게)은 test 평가자가 원하는 방향과 반대입니다. 예전에 public으로 정한 FL 배율이 1.03(길게)이었던 것과도 맞습니다. 로컬 세트는 측정 관례의 방향을 정하는 데 쓸 수 없다는 것을 이번에는 public 숫자로 확인했습니다.

둘째 판에서 배운 것도 있습니다. 평가자의 “평균”은 손으로 고른 근섬유 3개의 평균이고, 우리 후보 수십 개의 평균과는 같은 통계가 아닙니다. 프로토콜 문구를 맞춘다고 같은 값이 나오지 않습니다. 오히려 프로토콜에 없는 우리 보정 항(분위수 선택, 기하 혼합)을 빼면 FL이 2.6% 길어지고 6세트가 모두 크게 나빠졌습니다. 그 항들은 프로토콜 이탈이 아니라 2절의 외삽 초과를 상쇄하는 역할을 하고 있었습니다.

5. 관문은 이번에는 잘 맞혔다

⑬편에서 관문은 “새 축에서는 부호까지 틀린다”고 썼습니다. 이번 이틀의 제출은 모두 관문이 익숙한 종류(구성원 교체, 상수 이동)였고, 결과가 좋았습니다.

판관문 예측public 실제
mt 자리 1개 교체 (B5 2판 평균)+0.0011+0.0009
mt 자리 1개 교체 (B5 3판 평균)+0.0011+0.0010
mt 자리 1개 교체 (B7)+0.0016+0.0012
mt 자리 2개 교체+0.0021+0.0034
mt 자리 3개 교체+0.0025+0.0060
로컬 상수 재적합+0.0068+0.0106
FL 합치기 = 평균+0.0022+0.0020

일곱 판 모두 부호가 맞았고, 교체 자리 수에 따른 순위도 맞았습니다(1자리 < 2자리 < 3자리). 크기는 작은 변화에서 거의 정확했고, 큰 변화에서는 과소 예측했습니다. 덕분에 운영 규칙이 단순해졌습니다. 관문이 나쁘다고 하는 판으로 남은 칸을 채워도 이득이 없으니, 관문을 통과한 판이 없으면 칸을 비워 둡니다.

6. 교훈

구성원을 바꿀 때마다 화면별 수준이 움직이고, 고정 상수와 부딪힙니다. 앙상블 뒤 상수는 지금 구성원 조합에 맞춰 public으로 정한 값입니다. 구성원 하나를 바꾸면 화면별 평균이 움직입니다. 방향 구성원을 다른 fold 판으로 바꾸면 한 화면에서 PA가 +0.4~0.7°, FL이 −2~−3mm 움직였고, mt 자리 판끼리도 한 화면 FL이 ±2mm 갈렸습니다. 그런데 상수는 그대로이니, 새 구성원이 아무리 좋아도 상수와 어긋난 만큼 손해가 먼저 납니다. 반대로 상수를 다시 맞추면 4절처럼 로컬 관례를 따라가 버립니다. 다만 화면별 평균만 맞춰 주는 실험에서는 벌점이 거의 그대로 남았습니다. 수준 차이만이 아니라 영상별 차이도 함께 있다는 뜻입니다. 그래서 구성원 교체와 상수 재조정은 한 덩어리로 판정해야 하고, 그 판정은 로컬이 아니라 관문만 할 수 있습니다.

“정답과 가깝다”는 말에는 항상 “누구의 정답”이 붙습니다. 학습 마스크 기준 0.09mm, 외부 평가자 기준 0.55°. 둘 다 사실이고, 대회 점수는 후자로 매겨집니다. 라벨 출처가 여럿인 대회에서는 오차를 줄이기 전에 오차가 어느 출처 기준인지부터 확인해야 합니다.

K0는 가장 싼 실험입니다. 가설의 전제를 먼저 확인하면 GPU 시간의 대부분을 아낄 수 있습니다. 이틀간 닫은 가설의 절반 이상이 학습 없이 닫혔습니다.

7. 현황

  • public 최고점 0.20943(10/30), 순위는 10/31 기준 11위입니다.
  • 이번 이틀에 닫은 큰 축: 근막선 학습 계열 전부, 측정 프로토콜 대조, 로컬 상수 재적합, mt 자리 backbone 교체, fold·seed 평균 구성원.
  • 남은 길은 하나로 좁혀졌습니다. 영상마다 근막 회전량을 라벨 없이 추정할 신호를 찾는 것입니다. 찾지 못하면 남은 기간은 관문이 통과시키는 작은 판만 내고, 최종 후보 두 판을 고르는 데 집중할 생각입니다.
This post is licensed under CC BY 4.0 by the author.