English

KNOWLEDGE · 기계 학습

train-val-test는 레거시인가?

아니다. calib은 학습이 끝난 뒤 데이터로 정하는 값, 곧 확신의 크기를 고치는 온도 T와 확률을 판정으로 바꾸는 threshold(임계값)를 위해 하나 더 두는 칸이다. 원리는 train-val-test와 같다. 무언가를 정한 데이터로는 그 결정을 공정하게 잴 수 없다.

train은 가중치를 정하고, val은 하이퍼파라미터와 쓸 모델을 고르고, test는 아무것도 정하지 않고 성적만 잰다. 학습이 끝난 뒤에도 정할 것이 남는다. 모델이 말하는 확률을 얼마나 믿을지(온도 T), 확률이 얼마를 넘으면 “불량”이라고 할지(threshold)다. 이 둘도 데이터에 맞춰 정하는 값이라, 어느 데이터로 정하느냐에 따라 성적이 부풀거나 무너진다. 온도 보정 논문은 하이퍼파라미터를 고른 그 val로 정해도 된다고 적었다. calib은 그 일을 떼어 맡는 칸이다.

Temperature는 값을 보정하고, threshold는 값의 채택 유무를 조정한다.

출처: 온도 보정을 검증 세트에서 정하기: Guo 외 2017 §4 · 학습 데이터로 보정하면 치우친다: Niculescu-Mizil·Caruana 2005 §2.1

  1. 01 직접 해보기T와 threshold를 어느 칸에서 정할까
  2. 02 T확신의 크기만 고친다
  3. 03 threshold확률을 판정으로 바꾼다

01 직접 해보기

T와 threshold를 어느 칸에서 정할까

학습 데이터 2,000개를 다 맞힌 모델이 있다(합성 데이터, 클래스 10개). 클래스 0을 놓치면 안 되는 “불량”이라 하고, 불량의 95%를 잡는 threshold를 정한다. T와 threshold를 정할 칸을 바꿔 보자. test가 보고한 성적과, 배포 뒤 처음 보는 데이터 27,000개의 실제 성적이 함께 바뀐다.

train2,000개
가중치
val1,000개
모델 고르기
calib1,000개
Tthreshold
test1,000개
성적 보고
배포 뒤27,000개
실제 성적
T를 정할 칸
threshold를 정할 칸
test가 보고한 값배포 뒤 실제
확신 − 정확도0이면 확신이 정직하다+0.6%p+0.3%p
불량 재현율목표 95%94.0%94.4%

calib에서 정한 T(2.62)로 확신이 정확도에 맞는다(배포 뒤 +0.3%p). calib에서 딱 95%로 정한 threshold는 test에서 94.0%, 배포 뒤 94.4%다. test는 정직한 추정이라 뽑을 때마다 위아래로 흔들린다.

점 하나가 val·calib·test를 새로 뽑은 한 번이다(100번). 가로는 배포 뒤 실제 재현율, 세로는 test가 보고한 재현율이다. 점선 대각선은 보고와 실제가 같은 자리이고, 그 위는 test가 부풀려 보고한 것이다.

100번 뽑으면 test 보고 평균 94.5%, 배포 뒤 평균 94.3%. test는 95% 이상이라고 했는데 실제는 95% 아래였던 때는 14번이다.

뽑기 1 / 100

숫자: 이 페이지가 합성 데이터(참 확률을 아는 10클래스)와 작은 신경망 12개로 직접 계산했다. 뽑을 때마다 val 정확도가 가장 높은 모델을 쓴다. threshold는 정한 데이터에서 딱 95%가 되는 점수(불량 n개 중 ⌈0.95n⌉번째)다.

02 T

T는 확신의 크기만 고친다

“90%라고 말한 예측 100개 중 90개가 맞는” 상태를 보정되었다고 한다. 요즘 신경망은 보정이 나쁘다. 10년 전 신경망과 다른 점이다. CIFAR-100에서 110층 ResNet의 확신도는 정확도보다 훨씬 높았고, ECE(확신도와 실제 정답 비율의 평균 차이)가 16.53%였다.

온도 보정은 로짓(softmax에 들어가기 전의 점수) z를 T로 나눈 뒤 softmax를 한다. T가 1보다 크면 확률이 평평해지고, 작으면 뾰족해진다. 로짓 (3, 1, 0)은 T = 1에서 84 / 11 / 4%, T = 2에서 63 / 23 / 14%다. 모든 로짓을 같은 수로 나누므로 1등 클래스는 바뀌지 않는다. 그래서 정확도는 그대로이고 확신의 크기만 바뀐다.

T는 calib에서 NLL(정답 클래스에 준 확률에 −log를 씌운 평균)이 가장 작아지는 값 하나로 정한다. 틀린 답을 확신할수록 NLL이 크다. 자신감이 지나쳐지는 까닭도 NLL에 있다. 학습 데이터를 다 맞힌 뒤에도 확신을 키우면 학습 데이터의 NLL은 더 줄어서, 오래 학습하면 정확도는 그대로인데 확신만 커진다.

막대는 그 확신도 구간에서 실제로 맞힌 비율이다(배포 뒤 27,000개, 구간 15개, 예측이 20개 미만인 구간은 그리지 않음). 대각선에 붙을수록 보정이 잘 된 것이다.

평균 확신도 93.5%정확도 80.7%ECE 12.8%

이 모델은 T = 1에서 평균 93.5%를 확신하지만 80.7%만 맞힌다. calib에서 정한 T = 2.62에서는 평균 확신도가 80.9%로 내려오고 ECE가 0.6%가 된다. 같은 일을 train에서 하면 T는 0.05가 나온다. 학습 데이터에서는 확신할수록 NLL이 줄기 때문이다.

출처: 보정의 정의, 신뢰도 도표, ECE(구간 15개): Guo 외 2017 §2 · 온도 보정과 정확도: §4.2 · NLL 과적합: §3 · ResNet 110의 ECE: 표 1 · 도표의 숫자: 이 페이지의 합성 실험

03 threshold

threshold는 확률을 판정으로 바꾼다

모델은 확률을 내고, 판정은 threshold가 한다. “불량일 확률이 t 이상이면 경보”처럼. IOU·NMS에서 본 YOLOv1의 신뢰도 기준 0.2도 threshold다. 0.5는 기본값일 뿐이다. 01의 모델로 직접 움직여 보자. 점 하나가 calib의 예시 하나이고, threshold보다 오른쪽에 있으면 경보가 울린다.

확률
놓침 비용 ÷ 헛경보 비용

잡은 불량놓친 불량헛경보경보 없는 정상

위 줄은 calib의 불량 106개, 아래 줄은 정상 894개다. 가로는 불량 확률이고, 0 가까이의 작은 확률을 넓게 보려고 로그 눈금으로 그렸다(0.0001보다 작으면 왼쪽 끝). 세로선이 threshold이고, t*는 비용식이 고른 자리다. 선을 끌거나 슬라이더로 움직인다.

calib (정한 데이터)배포 뒤 27,000개
잡은 불량재현율101 / 106 (95.3%)94.4%
헛경보정상 중 경보가 울린 비율72 (8.1%)8.6%
경보 중 진짜정밀도58.4%54.5%
비용놓침 × 9 + 헛경보1171,000개당 127

threshold 0.0912: calib의 불량 106개 중 101개를 잡고(95.3%) 정상 894개 중 72개에 헛경보를 낸다. 배포 뒤에는 불량의 94.4%를 잡는다. 놓침이 9배 비싸면 배포 뒤 비용은 1,000개당 이 threshold 127, t*(0.100) 126, calib에서 가장 싼 threshold(0.119) 127.

threshold를 내리면 놓친 불량이 줄고 헛경보가 는다. 어디가 좋은지는 비용이나 목표가 정한다. 확률이 참이라면 기대 비용이 가장 작은 threshold는 t* = 헛경보 비용 ÷ (헛경보 비용 + 놓침 비용)이다. 두 비용이 같으면 0.5, 놓침이 9배 비싸면 0.1이다. 놓침이 9배 비쌀 때 t* = 0.1의 배포 뒤 비용은 1,000개당 126으로, 0.5(216)보다 훨씬 싸고 calib에서 가장 싼 threshold(127)와 거의 같다. 이 식은 확률의 크기를 그대로 믿는다. “보정 안 함”을 누르면 같은 t*의 비용이 141로 올라, calib에서 가장 싼 threshold(128)보다 비싸진다. 그래서 T를 먼저 정한다.

비용을 숫자로 매기기 어려우면 목표로 정한다. “불량의 95%를 잡는다”면 calib의 불량을 점수 순으로 세우고 95% 자리를 읽는다(calib에서 딱 95%). 이 모델의 threshold는 0.09다. 클래스가 10개라 불량 확률이 9%만 넘어도 경보를 울려야 95%를 잡는다.

정한 데이터 위에서는 언제나 95% 이상이다. 새 데이터에서는 아니다. 불량 n개 중 k번째 점수를 threshold로 쓰면 새 불량이 그 위에 올 확률은 k/(n+1)이다. n = 100이면 딱 95%(k = 95)는 95/101 = 94.1%다. k를 ⌈(n+1) × 0.95⌉로 하나 올리면 평균이 95%를 넘는다(+1 보정).

그래도 한 번 뽑은 calib의 결과는 흔들린다. 흔들림은 calib 전체가 아니라 threshold가 걸린 쪽, 곧 불량의 개수로 정해진다.

불량 30개 calib 300개 불량 99개 calib 1,000개 불량 296개 calib 3,000개 85% 90% 95% 100%

calib을 2,000번 새로 뽑아 ⌈(n+1) × 0.95⌉번째 점수로 threshold를 정하고 새 데이터에서 잰 재현율. 막대는 5~95% 범위, 세로 선은 평균(96.6%, 95.4%, 95.1%), 점선은 목표 95%.

클래스가 여럿이면 T가 예시들 사이의 순서까지 바꿀 수 있다. 그래서 threshold는 쓸 T를 정한 뒤의 확률에서 정한다.

출처: 비용과 threshold, 0.5: Elkan 2001 §1.3 식 2, §2 · k/(n+1)과 +1 보정: Angelopoulos·Bates §1, 정리 1 · 점, 비용, 흔들림: 이 페이지의 합성 실험

정리

새 규칙이 아니라, 같은 원리를 한 번 더 쓴 것

  1. 한 칸에 결정 하나. train은 가중치, val은 모델 고르기, calib은 T와 threshold를 정하고, test는 아무것도 정하지 않는다. 칸의 수는 데이터로 정하는 단계의 수 + 1이다.
  2. 어디서 정했는지가 성적을 바꾼다. train에서 정하면 무너지고, test에서 정하면 test가 부풀린다. 모델을 고른 val에서 함께 정해도 대개 괜찮다. 이 페이지의 실험에서도 차이가 작았다.
  3. 따로 두는 때가 있다. 장비나 현장이 바뀌어 T와 threshold만 다시 정할 때, val로 아주 많이 골랐을 때 calib을 따로 둔다.

오해train-val-calib-test가 새 표준이라 늘 넷으로 나눠야 한다.

실제로는학습 뒤에 데이터로 정하는 값이 없으면 calib은 필요 없다. 데이터가 적으면 val에서 T와 threshold를 함께 정해도 된다. 온도 보정 논문도 검증 세트에서 T를 정했다.

오해온도 보정을 하면 정확도가 오른다.

실제로는1등 클래스가 그대로라 정확도는 같다. 바뀌는 것은 확신의 크기다.

확인됨정의, 식, 절 번호와 인용한 수치는 원문과 대조했다. 이 페이지의 숫자는 합성 데이터로 직접 계산했고, 이론(k/(n+1), 베타 분포)과 맞는지 테스트로 확인했다.

가설실제 영상 모델과 실제 장비 변화에서도 방향은 같고 크기만 다를 것이다. val로 아주 많이 골랐다면 T와 threshold도 치우칠 것이다(후보 12개인 이 실험에서는 보이지 않았다).

모름정해진 분할 비율은 찾지 못했다. calib의 크기는 threshold가 걸린 쪽의 표본 수가, test의 크기는 재려는 지표의 오차가 정한다.

출처: Guo 외 2017 §4 · Niculescu-Mizil·Caruana 2005 §2.1 · Ovadia 외 2019 §4.2

자주 묻는 질문

train-val-test 분할은 이제 레거시인가?

아니다. train은 가중치를, val은 하이퍼파라미터와 모델을 정하고, test는 아무것도 정하지 않고 성적만 잰다. calib은 학습이 끝난 뒤 데이터로 정하는 온도 T와 threshold가 있을 때 하나 더 두는 칸이다. 온도 보정 논문(Guo 외 2017 §4)은 하이퍼파라미터를 고른 검증 세트로 보정해도 된다고 적었다.

보정 세트(calibration set)와 검증 세트(validation set)는 무엇이 다른가?

검증 세트는 모델과 하이퍼파라미터를 고르고, 보정 세트는 고른 모델의 출력을 읽는 법(온도 T, threshold, 컨포멀 예측의 q̂)을 정한다. 데이터가 적으면 검증 세트에서 함께 정하기도 한다(Guo 외 2017 §4, Niculescu-Mizil·Caruana 2005 §2.1). 보정을 학습 데이터로 하면 치우친다(같은 §2.1).

온도 보정(temperature scaling)이란?

로짓을 온도 T로 나눈 뒤 softmax를 하는 보정이다. T가 1보다 크면 확률이 평평해져 자신감이 줄고, 작으면 뾰족해진다. T는 보정 세트에서 NLL(교차 엔트로피)이 가장 작아지는 값 하나로 정한다(Guo 외 2017 §4.2).

온도 보정을 하면 정확도가 오르나?

아니다. 모든 로짓을 같은 양수로 나누므로 가장 높은 클래스가 바뀌지 않아 정확도는 그대로다(Guo 외 2017 §4.2). 바뀌는 것은 확신의 크기다. CIFAR-100의 110층 ResNet은 ECE가 16.53%에서 1.26%로 줄었다(같은 논문 표 1).

분류 threshold(임계값)는 0.5로 두면 안 되나?

0.5는 두 틀림의 비용이 같고 확률이 참일 때만 맞는다. 비용으로 정하면 threshold는 헛경보 비용 ÷ (헛경보 비용 + 놓침 비용)이고, 놓침이 9배 비싸면 0.1이다(Elkan 2001 식 2). “불량의 95%를 잡는다” 같은 목표라면 보정 세트의 점수에서 그 자리를 읽고, 성적은 test에서 따로 잰다.

컨포멀 예측(conformal prediction)도 보정 세트를 쓰나?

쓴다. 보정 세트 n개의 점수 1 − (정답 클래스의 확률)에서 ⌈(n+1)(1−α)⌉번째 값을 threshold로 하고 그 threshold를 넘는 클래스를 모두 답 후보로 내면, 같은 분포의 새 데이터에서 정답이 후보에 들 확률이 1 − α 이상이다. 보정 세트가 1,000개면 포함률이 대개 0.88~0.92다(Angelopoulos·Bates §1, §3.2).

장비나 데이터가 바뀌면 보정을 다시 해야 하나?

그렇다. i.i.d. 검증 데이터에서 한 보정은 분포가 바뀐 데이터에서의 보정을 보장하지 않는다(Ovadia 외 2019 §4.2). 모델은 그대로 두고 새 환경의 데이터로 보정 세트를 새로 모아 T와 threshold를 다시 정할 수 있다. 이 페이지의 합성 실험에서는 잡음이 1.3배인 데이터에서 옛 값의 재현율이 83.8%였고, 새 데이터 1,000개로 다시 정하자 95.4%가 되었다.

출처: Guo 외 2017(§4, §4.2, 표 1) · Niculescu-Mizil·Caruana 2005 §2.1 · Elkan 2001 식 2 · Angelopoulos·Bates(§1, §3.2) · Ovadia 외 2019 §4.2

더 보기

이 페이지의 숫자는 합성 데이터(클래스 10개, 30차원 정규분포)와 은닉층 2개의 신경망 12개로 직접 계산했다. 같은 계산을 테스트로 이론과 맞춰 보았다. 실제 영상 모델의 숫자는 다를 수 있다.