Post

RSNA 무릎 ④ — 잣대가 틀렸다: 닫힌 축 하나를 다시 열고, 다시 닫기까지

RSNA 무릎 ④ — 잣대가 틀렸다: 닫힌 축 하나를 다시 열고, 다시 닫기까지

③편은 “우리가 가진 세 자(OOF·gold58·public LB)가 전부 우리 효과보다 거칠다”는 글이었습니다. 이번 글은 그 결론의 절반이 틀렸다는 이야기입니다.

대회 진행 중이라 코드와 대회 이미지는 싣지 않습니다. ‘실측’은 다른 조건을 그대로 두고 한 가지만 바꾼 비교로 확인한 값입니다.

1. 같은 자인데 눈금이 다섯 배 달랐다

저는 몇 주 동안 “교차검증 4겹의 95% 구간은 ±0.0043”이라는 숫자를 잣대로 써 왔습니다. 그보다 작은 차이는 잡음이라고 보고 축을 닫았습니다.

그런데 어느 설정 하나를 바꾼 비교에서, 겹별 차이의 표준편차가 0.0008로 나왔습니다. 제가 쓰던 잣대의 5분의 1입니다.

둘은 다른 것을 재고 있었습니다.

 무엇의 산포인가겹 난이도
±0.0043짝짓지 않은 겹 평균그대로 들어간다
±0.0008같은 겹에서 설정 하나만 바꾼 차이상쇄된다

겹마다 환자 구성이 다르니 평균 성능도 다릅니다. 그 변동이 ±0.0043의 대부분입니다. 그런데 같은 겹 안에서 A와 B를 비교하면 그 변동은 양쪽에 똑같이 들어가 빼면 사라집니다. 짝지은 비교(paired comparison)의 기본인데, 저는 몇 주 동안 짝짓지 않은 산포를 짝지은 비교의 잣대로 쓰고 있었습니다.

2. 그래서 과거의 판정을 다시 봤다

잣대가 다섯 배 촘촘해졌다면, “구간이 0을 포함해서” 닫은 축들은 잘못 닫혔을 수 있습니다.

기록을 뒤지니 모순이 하나 나왔습니다. 요약 색인에는 어떤 축이 “닫힘 — +0.0012, 구간이 0을 포함”이라고 적혀 있는데, 본문 다른 곳에는 같은 축이 “오염으로 미판정“이라고 적혀 있었습니다.

추적해 보니 이랬습니다. 그 판정의 원자료는 겹별로 +0.0018 · +0.0034 · +0.0021 · -0.0046이었고, 나중에 네 겹 중 둘이 오염된 것으로 확인됐습니다. 통합값을 +0.0028에서 +0.0012로 끌어내리고 구간을 터뜨린 것이 바로 그 오염된 -0.0046이었습니다. 저는 그때 “판정했다”는 기술은 철회했으면서, 요약 색인은 고치지 않았습니다.

오염을 피한 겹만 짝지어 다시 재니 +0.0032가 나왔습니다. 우리가 채택한 유일한 축(학습률 2배, +0.0035)과 같은 크기입니다.

닫힌 축이 두 결함의 겹침으로 닫혀 있었던 것입니다 — 오염된 음수 하나와, 틀린 잣대.

3. 다시 열었다

지침에는 “닫힌 축은 다시 열지 않는다”가 있습니다. 좋은 규칙입니다. 다시 열 때는 마음이 바뀐 것이 아니라 닫힘의 근거에 결함이 있었다는 점을 분명히 적고 열어야 합니다.

그래서 근거를 적고, 현재 계보에서 깨끗한 네 겹을 두 가지 데이터 캐시에서 독립으로 돌렸습니다. 결과를 보기 전에 채택 기준도 못박았습니다.

4. 그리고 다시 닫았다

1
2
3
캐시 A   +0.0004 · +0.0007     평균 +0.0006   (2/2 양수)
캐시 B   +0.0001 · -0.0017     평균 -0.0008   (1/2 양수)
통합     평균 -0.0001

두 캐시의 부호가 엇갈렸습니다. 사전에 적어 둔 세 조건(문턱 미달·구간이 0 포함·부호 엇갈림)에 전부 걸려 닫았습니다.

이번 닫힘은 지난번과 다릅니다. 네 겹이 전부 깨끗하고, 짝지은 비교이고, 두 조건에서 독립으로 쟀습니다. 근거를 남기고 닫은 것입니다.

5. 진짜 수확은 따로 있었다

왜 과거(+0.0032)와 현재(+0.0006 / -0.0008)가 이렇게 다를까요. 그 사이에 기준선이 달라져 있었습니다.

1
2
3
그때 기준선   0.9040
지금 기준선   0.9147 ~ 0.9180
그 사이에 들어간 것: 학습률 2배 · 증강 조정 · 기반 교체

약한 기준선에서 잰 이득은 강한 기준선으로 그 크기 그대로 옮겨오지 않습니다. 먼저 들어간 개선들이 이미 같은 종류의 오차를 줄여 놓았기 때문입니다.

이것은 추정이었는데, 며칠 뒤 두 번째 사례가 나왔습니다. 대회 지표가 순위인데 학습은 확률을 맞추는 손실을 쓰고 있어서, 순위에 직접 정렬된 손실 항을 켜 봤습니다. 옛 기준선 위에서는 +0.0015였는데 현재 계보에서는 음수였습니다. 같은 패턴입니다.

이제 추정이 아니라 운영 규칙으로 씁니다.

과거 기록의 양수를 보고 축을 열지 않는다. 열려면 현재 계보에서 직접 재고, 그 비용(약 6시간)을 치를 값이 있는지 먼저 따진다.

오늘 두 축에 각각 반나절씩 썼고 둘 다 음수였습니다. 이 규칙이 없었으면 같은 비용을 몇 번 더 치렀을 것입니다.

6. 세 가지 메모

첫째, 잣대는 질문마다 다시 재야 합니다. 짝지은 차이의 산포는 축마다 달랐습니다 — 예측이 많이 닮는 변경(입력 배분)은 0.0002, 손실 자체를 바꾸는 변경은 0.0020. “±0.0043”도 “±0.0008”도 보편 상수가 아닙니다. 그래서 축마다 자기 산포를 재는 작은 도구를 만들어 쓰고 있습니다.

둘째, 요약은 본문보다 빨리 낡습니다. 철회한 값이 요약 색인에 ‘닫힘’의 근거로 남아 있었습니다. 본문은 고쳤는데 색인은 안 고쳤습니다. 색인이 있는 문서는 색인도 같이 고쳐야 합니다.

셋째, 사전 등록은 양방향이 아닙니다. 결과를 보기 전에 기준을 적는 것은 약한 양수를 채택으로 합리화하는 것을 막기 위함입니다. 반대로 새 정보가 들어와 추가 측정이 무의미해졌다면, 근거를 적고 규칙을 철회하는 쪽이 맞습니다. 실제로 이번에 한 번 철회했습니다 — 비용을 늘리는 쪽이 아니라 줄이는 쪽이었기 때문입니다.

다음

추론 쪽은 이제 거의 다 닫혔습니다. 가중치·구성·혼합 비율을 어떻게 바꿔도 점수가 움직이지 않습니다. 남은 것은 학습 쪽인데, 거기엔 다른 문제가 있습니다 — 학습 쪽 개선은 리더보드로 검증할 수가 없습니다. 전이 비율을 측정해 보니 리더보드에서 읽히려면 지금까지 찾은 최대 축의 세 배가 넘는 효과가 필요합니다. 그 이야기는 다음 글에서 하겠습니다.

This post is licensed under CC BY 4.0 by the author.