RSNA Knee, Part 1: 학습 라벨과 검증 기준
그림은 눌러서 확대할 수 있습니다. 좁은 화면에서는 넓은 표와 수식을 좌우로 움직여 보세요.
8월 19일, 내 RSNA Knee 시스템의 Public AUC는 0.921에 도달했다. 다음 실험에서는 무엇을 바꾸는 게 좋을까. 판독문을 다른 언어 모델로 읽거나, 무릎을 더 세밀하게 보여 주거나, 다른 데이터로 사전학습한 encoder를 쓸 수 있다. 모두 그럴듯한 선택이지만, 먼저 각 실험으로 무엇을 확인할 수 있는지 구분해야 한다. 라벨 표의 품질, 영상 모델의 성능, 여러 모델을 합친 ensemble의 성능은 모두 AUC로 표현해도 평가하는 대상이 다르다.
한 실험에서 그 차이가 뚜렷하게 드러났다. 판독문 라벨을 수정하자 전문가 주석과의 일치도를 나타내는 AUC는 0.8700에서 0.8809로 올랐다. 그러나 수정한 설정으로 학습한 영상 모델은 전문가 주석이 있는 holdout에서 0.8322를 기록했다. 이전 설정의 0.8400보다 낮았다. 두 비교는 평가 표본과 절차가 달라서 한쪽의 변화가 다른 쪽을 일으켰다고 볼 수는 없다. 여기서 확인하고 싶은 것은 분명하다. 라벨 표의 점수는 오르는데, 그 표로 학습한 모델의 성능은 왜 좋아지지 않을까?
최근 실험에서는 이 질문을 여러 방향에서 살폈다. 라벨을 세분하자 판독문에 적혀 있지 않은 소견에 부여한 값도 학습 손실의 상당 부분을 차지했다. 더 좁은 crop과 더 큰 이미지가 주는 이득은 일부 겹쳤다. 30 epoch 결과로 우선순위를 낮췄던 encoder는 적응할 시간을 더 주자 일부 성능을 회복했다. 각 결과를 해석하려면 학습 목표값, 학습에서 제외한 영상의 예측, 예측을 채점하는 기준을 나눠 봐야 한다. 모델이 충분히 학습한 뒤 비교했는지도 중요하다.
학습 라벨과 검증 기준
0편에서는 MRI 한 검사에서 열두 소견을 예측하고, 학습에는 판독문에서 얻은 라벨을 사용하는 기본 구성을 설명했다. 여기서 report reader는 영상의학 판독문을 읽어 소견별 라벨로 바꾸는 언어 모델이다. MRI를 직접 보거나 독립적인 임상 진단을 내리는 모델은 아니다.
한 검사의 soft target을 $q_i^{(\ell)}$, 영상 모델의 예측을 $p_i=f_\theta(X_i)$, 검증에 쓰는 이진 기준 라벨을 $y_i^{(r)}$로 구분하겠다. 위첨자 $\ell$은 학습 라벨을 만든 방식을, $r$은 검증 기준을 뜻한다. 학습 라벨에는 확률이나 불확실성을 나타내는 수치를 넣을 수 있다. 반면 AUC를 계산하려면 어느 검사를 양성 또는 음성으로 볼지 정해야 한다. MRI 입력이 같더라도 학습 목표값을 바꾼 실험인지, 채점 기준을 바꾼 비교인지에 따라 결과의 의미가 달라진다.
초기에는 판독문을 더 잘 읽는 것만으로도 라벨의 품질이 크게 좋아졌다. 전문가 주석이 제공된 58개 검사에서 규칙 기반 라벨의 macro AUC는 약 0.812였고, Sonnet으로 만든 라벨은 약 0.873이었다. 판독문을 더 충실히 해석할 이유는 충분했다. 그러나 이후 Sonnet과 Opus 라벨을 rank averaging으로 합친 실험에서는 라벨의 일치도만으로 모델 성능을 판단할 수 없었다.
| 비교 | 이전 설정 | 수정한 설정 |
|---|---|---|
| 전문가 주석 57건에 대한 라벨 AUC | 0.8700 | 0.8809 |
| 전문가 주석 holdout에서 영상 모델 AUC | 0.8400 | 0.8322 |
라벨 표 비교에는 57건을 사용했다. 앞서 규칙 기반 라벨과 Sonnet을 비교한 58건 평가와는 표본이 같지 않다.
언어 모델은 판독문의 명시적 표현, 진단 결론, 불확실성을 설명한 문장을 이용한다. 영상 모델은 선택한 촬영 방향과 slice에서 소견을 배워야 한다. 라벨 표가 소수의 전문가 주석에 더 잘 맞더라도, 전체 학습 데이터에 부여하는 양성 비율과 확신의 정도, 모델에 구별하도록 요구하는 사례는 달라질 수 있다. 이 실험만으로 성능 하락의 원인 하나를 특정하지는 못했다. 다만 라벨 표의 좋은 점수가 그 표로 학습한 영상 모델의 평가를 대신할 수 없다는 점은 분명했다.
예측과 학습 라벨의 rank 변환
AUC는 예측값의 순서로 결정된다. 한 모델의 예측값 전체에 엄격히 증가하는 함수를 똑같이 적용하면, 수치적 tie를 제외하고 양성과 음성의 순서는 유지된다. 출력 척도가 다른 모델들을 합칠 때 rank averaging을 고려한 이유도 이 성질 때문이다.
그러나 percentile rank는 분포 안에서의 상대적 위치다. 60번째 percentile에 있는 검사가 해당 소견을 가질 확률이 60%라는 뜻은 아니다. 대부분의 판독문에 그 소견이 없다면 음성인 검사에도 중간 정도의 rank가 매겨질 수 있다. 확률 라벨을 rank로 대체하면 영상 모델이 맞춰야 할 수치가 바뀐다.
Binary cross-entropy는 이 라벨 값을 그대로 사용한다.
\[\mathcal L(q,p)=-q\log p-(1-q)\log(1-p).\]모델의 logit을 $z$, 예측 확률을 $p=\sigma(z)$라고 하면 gradient는 다음과 같다.
\[\frac{\partial\mathcal L}{\partial z}=p-q.\]설명용 예로 모델이 현재 0.20을 예측한다고 하자. 라벨이 0.02라면 logit에 대한 gradient는 +0.18이므로, gradient descent는 logit과 예측 확률을 낮춘다. Rank 변환으로 라벨이 0.60이 되면 gradient는 −0.40이 된다. 같은 영상에 대해 이번에는 예측을 높이는 방향으로 학습한다. 라벨 표의 AUC를 유지하는 변환도 학습 방향은 반대로 바꿀 수 있다.
그림 1. 예측을 0.20으로 고정한 설명용 예시다. 두 라벨 표현은 서로 반대 방향의 업데이트를 만든다. 손실함수의 작동 방식을 보여 주는 그림이며, 관측된 모델 점수 변화의 원인이나 크기를 추정한 결과는 아니다.
Rank 기반 라벨도 유용할 수 있다. 다만 확률의 의미가 그대로 유지되는 것은 아니므로, 학습 목표가 바뀐 실험으로 평가해야 한다. 신뢰도에 따른 가중치는 또 다른 변경이다. 라벨 값은 그대로 두고 각 셀이 손실에 기여하는 정도를 바꾼다. 다음 라벨 실험에서도 이 차이가 중요했다.
판독문 미언급과 학습 손실
wide 라벨은 판독문의 불확실성을 더 세밀하게 표현하려는 시도였다. 먼저 소견이 없다고 명시한 경우와 아예 언급하지 않은 경우에 어떤 값을 줄지 정해야 했다. 소수의 전문가 주석에서 명시적 부정에 해당하는 소견 셀 196개 중 4.1%는 영상 주석상 양성이었다. 미언급 셀 177개에서는 그 비율이 13.6%였다. 여러 검사와 소견에서 모은 셀이므로 각각을 독립적인 환자처럼 볼 수는 없다. 그래도 미언급을 명시적 부정보다 강한 음성 근거로 처리할 이유는 없었다.
초기 표에서는 이 순서가 뒤집혀 있었다. 기존 라벨과의 낮은 상관 0.557을 처음에는 다른 학습 신호의 징후로 해석했지만, 순서를 바로잡자 상관은 0.878로 올라갔다. 수정 뒤에야 라벨을 더 세분하는 것이 영상 모델에도 도움이 되는지 비교할 수 있었다.
수정한 표로 학습한 모델도 판독문 기반 기준들로 채점했을 때 AUC가 대략 0.013–0.027 낮아졌다. 다만 소견별 결과에는 큰 차이가 있었다.
| 판독문에서 언급하지 않은 비율에 따른 소견 구분 | 영상 모델 AUC의 평균 변화 |
|---|---|
| 미언급 비율이 11% 미만인 소견 다섯 개 | +0.0068 |
| 미언급 비율이 30%를 넘는 소견 여섯 개 | −0.0323 |
나머지 소견 하나의 미언급 비율은 두 구간 사이에 있었다. 소견별 미언급 비율과 점수 변화의 순위상관은 −0.657로 보고됐다. 판독문에서 대체로 언급하는 소견에는 세분한 라벨이 유용해 보였고, 성능 하락은 자주 생략되는 소견에 집중됐다.
이 차이는 손실 가중치와 관련이 있을 수 있다. 학습 가중치는 $w_i=0.25+0.75c_i$였고, $c_i$는 판독 모델의 신뢰도였다. 매우 불확실한 셀에도 양의 가중치가 남는다. Logit gradient는 $w_i(p_i-q_i)$이므로, 모델은 이 셀에서도 지정된 라벨 값에 가까워지도록 학습한다. 가중치가 작으면 업데이트의 크기만 줄어든다. 미언급 셀이 많을수록 그 셀에 부여한 값을 재현하는 일이 학습에서 큰 비중을 차지할 수 있다.
다른 조건을 맞추고 신뢰도가 낮은 wide 라벨 셀을 masking한 실험에서는 +0.0083의 개선이 보고됐다. Paired 비교 구간은 [+0.0055, +0.0112]였다.1 판독문 셀의 약 66%가 미언급인 Fracture는 +0.0475, Contusion은 +0.0138이었다. 라벨을 더 세분하는 것뿐 아니라 어떤 셀에서 학습할지도 성능에 영향을 줄 수 있다는 결과다.
그림 2. 미언급 비율로 나눈 결과와 masking 결과는 서로 다른 비교다. 전자는 수정한 wide 라벨 모델을 기준 모델과 비교하고, 후자는 wide 라벨 학습에서 masking만 바꾼다. Masking의 구간은 해당 비교에서 검사들을 재표집해 얻었다고 보고된 값이며, 모든 라벨 방식의 불확실성을 나타내지는 않는다.
평가에서는 같은 결과를 조심해서 해석해야 한다. 미언급을 음성으로 처리하는 기준 라벨은 모델이 그 기록 관행을 재현할수록 좋은 점수를 줄 수 있다. 따라서 미언급 셀을 학습에서 빼고 기준 라벨과의 일치도가 낮아졌다고 해서, 실제 영상 소견의 예측도 나빠졌다고 단정할 수는 없다. Masking으로 학습할 셀이 하나도 남지 않은 검사도 빠졌다. Wide 표에서는 40건이었으므로 양쪽에 공통으로 남은 검사들에서 비교해야 한다. 소견별 변화와 여러 검증 기준을 함께 살펴볼 수는 있지만, 라벨 표의 점수나 masking 실험 하나로 임상적 정확도까지 판단할 수는 없다.
Crop·해상도와 입력 범위
영상 입력을 바꾼 실험에서는 다른 양상이 보였다. 입력 크기를 336픽셀로 고정하고 물리적 crop을 130 mm에서 100 mm로 줄이자, 같은 held-out 검사들의 예측을 비교했을 때 약 0.005를 얻었다. 160 mm로 넓히면 0.0015를 잃었고, 더 좁은 80 mm에서는 이득이 0.0019에 그쳤다. 시험한 범위에서는 중간 크기의 crop이 유리했다. 소견을 더 크게 보여 주는 이점과 주변 정보나 해부학적 범위를 잘라내는 손실이 함께 작용한 결과일 수 있다.
입력 해상도를 높여도 비슷한 효과를 얻을 수 있었다. Crop 130 mm를 유지하면서 입력을 336픽셀에서 448픽셀로 늘리면 약 0.003을 얻었다. 그런데 448픽셀과 crop 100 mm를 함께 쓰면 약 +0.0053으로, 336픽셀에서 crop만 100 mm로 줄인 결과와 거의 같았다. 두 개선 폭을 독립적으로 더하면 조합의 효과를 과대평가하게 된다.
Pixel pitch를 보면 이득이 겹친 이유를 짐작할 수 있다. 출력 영상의 명목상 pixel pitch는 물리적 폭을 픽셀 수로 나눈 값이다. 130 mm를 448픽셀로 나타내면 출력 픽셀당 약 0.290 mm로, 100 mm를 336픽셀로 나타낸 0.298 mm와 가깝다. 두 변경 모두 작은 구조를 더 많은 입력 픽셀로 표현한다. 이는 전처리한 입력의 성질이지, 보간으로 MRI의 원래 촬영 해상도를 높였다는 뜻은 아니다.
그림 3. 336픽셀, crop 130 mm를 기준으로 paired 비교에서 얻은 변화량을 반올림했다. 두 변경을 합쳐도 crop만 줄인 것보다 거의 좋아지지 않았다. 비슷한 출력 pitch는 이득이 겹치는 이유를 설명하지만, field of view가 다르므로 두 입력이 동등한 것은 아니다.
Pitch만으로 모든 차이가 설명되지는 않는다. 336픽셀, crop 100 mm는 pitch가 거의 같은 448픽셀, crop 130 mm보다 약 0.002 높았다. Crop은 입력에 들어오는 해부학적 구조와 배경도 바꾼다. 이 결과에 따라 더 작은 입력을 우선 사용하려 한다. 이 조합에서 추가 이득이 확인되지 않은 큰 입력에 연산을 더 쓸 이유는 적다.
영상 입력 실험은 판독 모델을 바꾼 실험보다 검증 기준의 영향도 덜 받았다. 시험한 후보들에서 영상 쪽 변경의 변화량은 기준 라벨을 바꿔도 약 0.0002–0.0009만 달라졌다. 라벨 쪽 변경은 0.0068–0.0073만큼 달라졌고 부호가 바뀌기도 했다. 이 결과로 특정 판독 모델을 정답으로 정할 수는 없다. 다만 기준을 바꿔도 개선 방향이 유지되는 실험과, 결론을 더 신중히 내려야 하는 실험을 구분할 수 있다.
OOF와 기준 라벨의 역할
Out-of-fold 예측은 학습에 쓴 영상을 다시 평가해 성능을 높게 보는 문제를 줄인다. 다섯 fold로 나누면 각 검사는 해당 fold를 학습하지 않은 모델로 예측한다.
\[p_i^{\mathrm{OOF}}=f_{\theta_{-k(i)}}(X_i),\]여기서 $k(i)$는 그 검사가 속한 fold다. 같은 판독문이 반복된 검사들도 한데 묶어, 판독문 중복으로 생길 수 있는 정보 유출을 줄였다. 이렇게 얻은 OOF는 각 영상을 학습에서 제외한 예측이다. 채점에 쓰는 판독문 기반 라벨까지 독립적인 임상 정답이 되는 것은 아니다.
특정 모델이나 ensemble $P$의 기준 라벨별 점수는 다음과 같이 쓸 수 있다.
\[S_r(P)=\frac{1}{12}\sum_{t=1}^{12} \operatorname{AUC}\!\left(y_t^{(r)},p_{P,t}^{\mathrm{OOF}}\right).\]기준 라벨은 소견별로 어느 검사를 양성 또는 음성으로 볼지 정한다. 불확실한 문장이나 미언급을 해석하는 방식이 바뀌면 AUC 계산에 들어가는 양성–음성 쌍도 달라진다. 영상 예측 배열이 같아도 점수가 바뀌는 이유다.
그림 4. 영상이 학습에서 제외됐는지와 기준 라벨이 독립적인지는 별개다. OOF는 영상 모델이 해당 검사를 학습했는지 다룬다. 판독 모델이 소견을 얼마나 정확하고 독립적으로 정의했는지까지 보장하지는 않는다.
학습 라벨과 검증 기준이 같은 판독 모델이나 유사한 해석 방식을 공유할 때 이 구분이 특히 중요하다. 점수가 올랐다면 해당 해석과의 일치도가 높아졌다는 것은 알 수 있다. 소수의 전문가 주석으로는 사례를 직접 살펴보고, 판독문 기반 기준 라벨로는 전체 데이터에서 후보를 비교할 수 있다. Public AUC는 제출한 시스템을 대회의 채점 표본에서 평가한다. 이 결과들을 함께 보면 어디서 판단이 엇갈리는지 알 수 있지만, 한 측정으로 다른 측정을 대신할 수는 없다.
최저 AUC 목적함수의 한계
나는 한 기준에서만 좋아지는 것을 피하려고 세 점수의 최솟값을 최대화했다.
\[S_{\min}(P)=\min_r S_r(P).\]가장 낮은 점수부터 개선해야 하니 보수적인 방식처럼 보인다. 그러나 세 점수는 기준 라벨부터 다르다. 점수의 절대 수준은 후보의 성능과 무관한 이유로도 달라질 수 있다. 한 기준의 점수가 계속 낮고 그 격차가 후보를 바꿔 얻는 변화보다 훨씬 크다면, 비교하는 내내 그 기준 하나가 최솟값을 결정한다.
실제로 그런 일이 일어났다. 후보 ensemble 200개를 추출해 확인했더니, 200개 모두 규칙 기반 v1 점수가 가장 낮았다. 확인한 후보 집합 안에서는 다음이 성립했다.
\[S_{\min}(P)=S_{\mathrm{v1}}(P).\]기록된 후보 하나를 보면 결과가 더 분명하다.
| 평가 기준 | 기존 ensemble | 변화 | 후보 ensemble |
|---|---|---|---|
| 규칙 기반 v1 | 0.8210 | +0.0058 | 0.8268 |
| Opus reader | 0.8791 | −0.0048 | 0.8743 |
| GPT reader | 0.8835 | −0.0046 | 0.8788 |
점수와 변화량은 각각 반올림했다. 표의 수치를 더하면 마지막 자리가 다를 수 있다.
후보의 최솟값은 올랐지만 다른 두 기준의 점수는 모두 떨어졌다. 두 점수와 v1의 초기 격차가 컸기 때문에, 이 정도의 하락은 최솟값을 바꾸지 못했다. 여러 기준을 균형 있게 반영하려던 규칙이 이 비교에서는 한 기준에서의 개선만 보상한 셈이다.
그림 5. 기록된 사례와 후보 200개는 같은 작동 방식을 보여 준다. v1의 점수 수준이 낮아서 최솟값을 계속 결정한다. 이 결론은 평가한 후보들에 한정된다.
이 결과를 보고 최솟값 대신 Opus와 GPT의 평균을 주 지표로 삼고, v1은 별도의 거부 기준인 veto로 남겼다. 이제 두 기준의 점수 변화가 모두 조합 선택에 반영된다. 두 기준이 독립적이거나 유일하게 옳다는 뜻은 아니다. 소견별 변화, 전문가 주석, 실제 대회 결과와 함께 해석해야 한다.
Encoder의 적응과 추가 학습
검증 기준을 정해도 새 모델을 충분히 학습시켰는지 따로 확인해야 한다. Rad-dino에서는 학습을 더 할지, 다른 후보에 시간을 쓸지 판단할 필요가 있었다. 이 encoder는 흉부 X선으로 사전학습됐고, 입력 구조를 바꾸지 않고 DINOv2-base를 대체할 수 있었다. 나머지 recipe를 고정하면 초기화의 효과를 비교할 수 있을 것으로 생각했다.
학습할 block 여섯 개와 backbone 학습률 $8\times10^{-6}$, 30 epoch 조건에서 rad-dino의 성능은 낮았다. 세 검증 기준으로 각각 조합을 고른 결과, 다섯 fold 어디에서도 선택되지 않았다. 그런데 최고점을 기록한 epoch는 29, 29, 30, 30, 29였다. DINOv2에 맞춘 recipe를 고정하면서 다른 초기화에도 같은 학습량이면 충분하다고 가정한 것이다. 초기화가 다르면 fine-tuning에 필요한 학습량이나 방식도 달라질 수 있다.
이를 확인하려고 첫 fold에서 두 가지 재시험을 했다.
| Rad-dino 학습 조건 | GPT 기반 기준 라벨에 대한 첫 fold 최고 AUC |
|---|---|
| 원래의 30 epoch | 0.8356 |
| 같은 학습을 60 epoch까지 연장 | 0.8417 |
| 12 block 전체 학습, 학습률 $2\times10^{-5}$, 30 epoch | 0.8429 |
| DINOv2 대조군 | 0.8795 |
학습을 연장한 run은 epoch 48에서 최고점을 찍고 0.8393으로 끝났다. 두 재시험에서 약 0.006–0.007을 회복했지만 대조군과의 격차는 여전히 컸다. 추가 학습에서 회복되는 정도까지 확인했으므로 이 계열의 우선순위는 낮추려 한다. 이미 완성한 OOF는 다른 모델과 조합할 수 있도록 남겨 둔다.
다만 최고점이 마지막 epoch 부근에 몰렸다는 이유만으로 학습이 부족했다고 볼 수는 없다. 주기적으로 학습률을 올렸다 내리는 방식에서는 각 cycle 끝에 학습률이 작아진다. 다음 cycle에서 큰 이득이 없어도 최고점은 끝에 몰릴 수 있다. 이번에는 실제로 학습을 연장해 최고점을 지난 뒤 점수가 낮아지는 구간까지 확인했다. 전체 block을 열고 학습률을 바꾼 시험도 적응 전략 하나를 더 비교한 것이지, 가능한 모든 recipe의 성능을 확인한 것은 아니다.
단독 성능만으로 결론 내리지 않도록 조합 결과도 함께 봤다. 기존 일곱 계열 조합에 rad-dino를 추가한 local 비교에서는 세 기준의 최솟값이 0.0007만 낮아졌다. 단독 성능의 격차보다 훨씬 작았다. 다만 작은 비중으로 섞으면 약한 모델의 영향도 작아지므로, 이 결과만으로 상보성이 확인됐다고 할 수는 없다. 추가 학습이 필요한지는 별도로 시험할 만한 질문이었다. 범위를 정한 재시험에서 회복 폭을 확인한 지금은, 다음 큰 학습에 쓸 시간을 다른 후보에 배정하려 한다.
다음 실험의 비교 기준
다음 실험에서는 “AUC가 올랐는가?”와 함께 무엇을 바꿔 얻은 결과인지 확인하려 한다. 학습 라벨에서는 판독 모델이 정한 순서, 실제 목표값, 손실 가중치를 구분해야 한다. 영상 입력에서는 두 변경이 비슷한 세부 정보를 늘리는지, 서로 다른 범위를 보여 주는지 비교할 수 있다. Encoder를 바꿀 때는 기존 recipe에서의 성능과 충분히 적응시킨 뒤의 성능을 나눠 봐야 한다.
아직 최종 모델을 정할 단계는 아니다. 서로 다른 특징을 활용하는 모델을 더 학습하고 각각의 완전한 OOF를 확보하려 한다. 그 예측들을 바탕으로 어떤 조합이 유용한지, 어느 조합을 9시간 추론 한계 안에서 평가할 수 있는지 비교할 것이다.
이 비교 기록에는 채점에 쓴 기준 라벨이 명시돼 있지 않다. 따라서 보고된 local 개선 폭을 현재 주 지표의 개선 폭이나 임상·Public 성능과 직접 비교할 수는 없다. ↩︎
