본문으로 건너뛰기

보정: 의미 있는 신뢰도

📍 현재 위치: III부 · 보정, 불확실성, 기권 — 7장. 지름길 측정: rsbench는 모델의 내부 개념이 옳은지를 측정함으로써 II부를 마무리했습니다; III부는 그 출력에 관해 더 겸손한 질문을 던지며 열립니다: 모델이 0.97이라고 말할 때, 그것은 100번 중 97번 옳은가?

이 시리즈의 모든 권은 하나의 주장에 하나의 숫자를 붙이며 끝났습니다: 3권은 트리플에 순위 점수를 붙였고, 4권은 논리식에 퍼지 정도를 붙였으며 유도에는 증명 점수를 붙였습니다. 그런데 그 숫자들 중 어느 것도 확률이라고 약속한 적이 없습니다. 하류의 어떤 소비자, 즉 사람 큐레이터, 기권 게이트, 또는 어느 유도를 먼저 검사할지 결정하는 검증기가 그 숫자를 확률로 읽는 순간, 그 숫자는 훈련받은 적 없는 의무를 떠맡게 됩니다. 보정(calibration)은 바로 그 의무의 이름이며, 이 장은 그에 대한 감사입니다. 우리는 그 약속을 정확히 정의하고, 두 가지 표준 도구, 즉 신뢰도 표와 기대 보정 오차(ECE)를 그 정의로부터 구축하며, 이 시리즈 자신의 지식 그래프 모델 위에서 그것들을 실행하고, 커밋된 실행이 실제로 보여주는 오보정을 읽어낸 뒤, 유보된 데이터에 맞춘 스칼라 하나라는 가능한 가장 작은 개입으로 그것을 수선합니다. 그 스칼라는 모델이 이미 내리고 있던 어떤 결정도 결코 바꿀 수 없음이 증명됩니다.

쉽게 말하면

많은 날에 걸쳐 "비 올 확률 70퍼센트"라고 말하는 일기예보관을 상상해 보십시오. 여러분은 뻔한 방법으로 그녀를 감사합니다: 그녀가 70퍼센트라고 말한 모든 날을 모아, 실제로 비가 온 비율을 확인하는 것입니다. 만약 그런 100일 가운데 약 70일에 비가 왔다면, 그녀의 "70퍼센트"는 의미가 있는 것이며, 그것을 근거로 소풍 계획을 세울 수 있습니다. 만약 40일에만 비가 왔다면, 그녀는 과신하고 있는 것이고 그 숫자는 장식에 불과합니다. 이 감사가 묻지 않는 것에 주목하십시오: 그녀가 좋은 예보관인지는 묻지 않습니다. 비가 절반쯤 오는 도시에서 항상 "50퍼센트"라고 말하는 신중한 예보관은 완벽하게 보정되어 있으면서도 완벽하게 쓸모없습니다. 보정은 신뢰도의 정직함을 감사하는 것이지 예보의 예리함을 감사하는 것이 아니며, 이 장은 신경망 모델의 점수에 대해 정확히 그 감사를 실행한 다음, 모델의 의견은 그대로 둔 채 그 말투(목소리의 톤)만을 그 숫자들이 실제로 말하는 바와 일치할 때까지 조정합니다.

이 장에서 다루는 내용

  • 정의된 약속: 이 시리즈의 점수들(마진, 정도, 증명 점수)이 왜 확률이 아닌지, 그리고 조건부 확률 진술 P(correctconfidence=p)=pP(\text{correct} \mid \text{confidence} = p) = p가 무엇을 말하는지를, 어떤 추정량이 등장하기 전에 모든 기호를 해독하며 다룹니다.
  • 정의로부터 구축한 신뢰도 표: 폭이 같은 열 개의 신뢰도 구간, 구간별 개수, 평균 신뢰도, 관측된 정확도; 커밋된 BEFORE 표를 한 줄씩 읽고, 이 규모에서는 왜 표가 곡선보다 나은지를 다룹니다.
  • 유도된 뒤 계산되는 ECE와 브라이어 점수: 개수로 가중된 절대 차이의 평균, 등폭 추정량 자체의 편향을 명명하기, 그리고 제곱 오차를 보정과 정련으로 나누는 고전적인 세 줄짜리 분해를 다룹니다.
  • 순위 점수가 오보정되는 이유: companion의 실제 훈련 설정 위에서 정밀하게 세운 목적 함수 불일치 논증과, 모델의 두 평가-분할 오류를 이름으로 짚어내는 것을 다룹니다.
  • 최소 수선책으로서의 온도 스케일링: 결정적인 황금분할 탐색을 통해 유보된 음의 로그가능도로 맞춘 스칼라 하나 τ\tau, ECE가 엄밀하게 개선된 커밋된 AFTER 표, 그리고 코드에 정확히 단언된 두 줄짜리 불변성 정리를 다룹니다.
  • 스칼라 하나가 고칠 수 없는 것, 그리고 그 너머에 있는 것: 커밋된 실행에 남아 있는 구간별 잔여 격차, Platt과 등장회귀(isotonic) 대안, 과적합에 대한 유보 사항, 그리고 지름길 교훈과 기권 게이트 사이에 놓인 보정의 자리를 다룹니다.

점수는 확률이 아니다

이 시리즈가 실제로 만들어낸 것을 떠올려 보십시오. 링크 예측은 모든 후보 트리플에 실수 하나를 매겼고, 전적으로 순위로만 채점되었습니다: 필터링된 평균 역순위(mean reciprocal rank, MRR)와 Hits@k는 오직 어느 점수가 더 큰지에만 신경 쓸 뿐, 그 점수의 값에는 결코 신경 쓰지 않습니다. 쌍선형 모델은 그 점수를 구체적으로 만들었습니다. ComplEx의 s=Re(eh,wr,et)s = \mathrm{Re}(\langle e_h, w_r, \overline{e_t} \rangle)는 세 자리 곱 ,,\langle \cdot, \cdot, \cdot \rangle의 실수부(Re\mathrm{Re})로 읽습니다: 머리 개체의 복소 임베딩 벡터 ehe_h, 관계의 벡터 wrw_r, 그리고 꼬리 개체 임베딩 ete_t의 켤레 복소수(윗줄 표기)를 좌표별로 곱한 뒤 그 좌표들을 더하는 것으로, 정확히 그 장에서 구축된 그대로입니다. 그 결과는 특정한 척도가 없는 실수이며, 아래의 커밋된 실행은 이 점수들이 16.9-16.9에서 +7.5+7.5까지 걸쳐 있음을 보여줄 것입니다. 4권의 T-노름은 퍼지 의미론(fuzzy semantics) 아래에서 최솟값이나 곱으로 합성되는, [0,1][0,1] 안의 만족 정도를 만들어냈으며, 이는 빈도로 읽을 수 없는 진리-정도 대수입니다. 그리고 신경 정리 증명은 최선의 유도를 따라 가장 약한 소프트 단일화(soft unification)로 증명을 채점했는데, 이 역시 유사도의 최댓값일 뿐 무언가의 가능성이 아닙니다. 각 숫자는 후보들의 순서를 매길 뿐, 그중 어느 것도 무언가를 세지는 않습니다.

확률로 읽는 것은 다르고 더 강한 계약이며, 현대의 신경망은 정확도가 뛰어난 경우에도 이를 위반한다고 알려져 있습니다 [1]. 정확히 진술해 봅시다. 각 입력에 대해 자신의 예측과 함께 신뢰도(confidence) p^[0,1]\hat{p} \in [0,1]("피-햇"이라고 읽으며, 모델 자신이 주장하는 확률, 0과 1 사이의 수)를 발표하는 감사 대상 시스템을 고정하고, Y{0,1}Y \in \{0, 1\}을 예측이 옳으면 11, 옳지 않으면 00결과 변수(outcome variable)라 합시다. 감사 대상 사례를 무작위로 하나 뽑습니다. 신뢰도가 취할 수 있는 모든 값 pp에 대해 다음이 성립할 때, 그 시스템은 완벽하게 보정되어 있다(perfectly calibrated)고 합니다.

P(Y=1    p^=p)  =  p.P\big(\,Y = 1 \;\big|\; \hat{p} = p\,\big) \;=\; p.

이 표기를 조각조각 해독해 봅시다. P()P(\cdot)는 사례의 무작위 추출에 대한 확률입니다. 세로 막대 \mid조건화(conditioning)입니다: 표현 P(AB)P(A \mid B)는 "BB가 성립하는 사례들 가운데서만 사건 AA의 확률"을 뜻하므로, 좌변은 "모델이 정확히 신뢰도 pp를 발표한 모든 사례 가운데, 실제로 옳았던 것의 비율"이라고 읽힙니다. 이 방정식은 이 비율이 발표된 숫자 그 자체와 같아야 한다고, 발표된 모든 숫자에 대해 요구합니다. 이는 앞의 비유에서 나온 예보관 감사를 조건부 확률로 적은 것이며, 빈도에 관한 약속으로서 셈으로써 확인할 수 있고, 바로 그 점이 이것을 철학적 입장이 아니라 경험적 도구로 만듭니다. 문헌에는 두 가지 읽기가 공존합니다: 이 장에서 쓰는 이진-예보 읽기(binary-forecast reading)는 p^\hat{p}가 특정 명제가 참이라는 주장된 확률이고 YY가 그것이 실제로 참인지를 표시하는 경우이며, 다중 클래스 분류기에 쓰이는 최상위-레이블 읽기(top-label reading)는 p^\hat{p}가 예측된 클래스에 부여된 확률인 경우입니다 [1]. 우리의 감사는 이진 감사, 즉 트리플이 참인지 아닌지를 다루므로 첫 번째 읽기가 곧바로 적용됩니다.

추정량으로 넘어가기 전에 한 가지 유보 사항을 비유를 되풀이하며 짚어 두겠습니다: 보정은 신뢰를 위해 필요할 뿐, 유용성을 위해 충분하지는 않습니다. 항상 기저율만 말하는 예보관은 보정되어 있지만 아무 정보도 주지 않습니다. 그래서 아래의 도구들은 짝을 이루어 등장합니다: 신뢰도 표와 ECE는 그 약속을 측정하고, 나중에 유도할 브라이어 점수는 그 약속 예리함을 함께 측정하되, 그 둘을 정확히 분리해 내는 대수를 갖추고 있습니다.

감사: 실행 예제 위의 실제 점수

companion examples/frontier/calibration.py는 인공적인 점수 스트림이 아니라 실제 모델을 감사합니다: 3권의 ComplEx 링크 예측기를 bilinear.train_complex(seed=0)(calibration.py 241번째 줄)을 호출하여 바이트 단위로 동일하게 재훈련한 것으로, 그 채점 함수 s=Re(eh,wr,et)s = \mathrm{Re}(\langle e_h, w_r, \overline{e_t} \rangle)bilinear.py 99–115번째 줄에 커밋되어 있는 것과 같은, 16개의 실수 차원을 가진 모델입니다. 라벨이 붙은 집합은 학술 세계를 이진 분류로 읽은 것입니다: kg.TRIPLES의 알려진-참인 열여덟 개 트리플 전부를 양성으로 삼고, 각각에 대해 시드가 붙은 여섯 개의 손상(corruption)을 음성으로 추가하여 총 108개를 만들며, 각 손상은 알려진-참인 트리플이나 중복이 아닐 때까지 다시 뽑히므로, 라벨이 붙은 126개의 트리플은 모두 서로 다르고 그 음성들은 실행 예제의 닫힌 세계 안에서 진짜로 거짓입니다(build_labelled, calibration.py 93–116번째 줄). 그다음 결정적인 계층화 분할이 126개를 63개짜리 보정 절반(calibration half)과 63개짜리 평가 절반(evaluation half)으로 나누는데, 전자는 수선책을 맞추는 데 쓰이고 아래에 인용되는 모든 BEFORE/AFTER 보정 지표는 후자에서 측정되며, 두 절반 모두 동일한 1대6의 양성-음성 클래스 비율을 유지합니다(split_indices, 119–130번째 줄).

이 감사를 공정하게 만드는 또 하나의 설계 선택을 짚어 두어야 합니다. ComplEx는 로지스틱 손실 L=softplus(ys)L = \mathrm{softplus}(-y \cdot s)로 훈련되었는데, 여기서 y{1,+1}y \in \{-1, +1\}은 라벨이고, ln\ln은 자연로그이며, eze^{z}는 지수 함수(상수 e2.718e \approx 2.718zz 거듭제곱한 것)이고, softplus(z)=ln(1+ez)\mathrm{softplus}(z) = \ln(1 + e^{z})입니다(bilinear.py 132–135번째 줄). 그 손실 아래에서 트리플이 참이라는 모델 자신의 내재된 확률은 정확히 σ(s)\sigma(s)이며, 이는 점수에 대한 시그모이드(sigmoid) σ(z)=1/(1+ez)\sigma(z) = 1/(1 + e^{-z}), 즉 1권에서부터 등장한, 임의의 실수를 (0,1)(0, 1) 안으로 짓누르는 함수입니다; 그 손실은 정확히 그런 읽기 아래에서 라벨의 음의 로그가능도입니다. 그러므로 BEFORE 열은 모델에 강요된 우리의 발명품이 아니라, 모델 자신의 훈련 목적 함수로부터 그대로 읽어낸 모델 고유의 확률 주장입니다. 커밋된 실행은 원재료로 시작합니다.

[1] the raw scores, read as probabilities
positives score in [ -9.492, 7.508], negatives in [ -16.895, -1.588]
the held-out kg.TEST positives (true facts never trained on):
triple score p=σ(s) p=σ(s/τ) split
(bob, advises, dave) -0.290 0.4281 0.4491 eval
(bob, authored, p1) -9.492 0.0001 0.0012 eval
(erin, affiliated, cmu) -4.436 0.0117 0.0419 cal
(bob, authored, p1) is TRUE but gets p = 0.0001: confidently
wrong — the failure a calibration metric exists to expose

가운데 행을 두 번 읽어 보십시오. 트리플 (bob, authored, p1)은 실행 예제 안에서 참입니다. 그것은 그저 3권의 분할 당시 훈련에서 유보되었을 뿐입니다. 모델은 그것에 확률 0.00010.0001을 부여합니다: 불확실한 것이 아니라 확신에 차서 틀린 것입니다. 순위 지표는 이를 부분적으로 용서할 수 있습니다(그 트리플은 그저 낮은 순위에 놓일 뿐이니까요). 하지만 확률로 읽으면 그럴 수 없습니다. "만 분의 일"이라고 말하는 시스템은 그 숫자를 신뢰하는 어떤 파이프라인에서도 그 참인 사실을 조용히 버릴 것이기 때문입니다. 아래의 도구들은 이 일화를 측정으로 바꿉니다.

정의로부터 구축한 신뢰도 표

그 정의는 p^=p\hat{p} = p에 조건을 거는데, 이는 연속적인 신뢰도에 대해서는 확률이 0인 사건이므로, 어떤 유한한 감사도 값 하나하나로는 그것을 확인할 수 없습니다. 표준 추정량은 이산화합니다: [0,1][0,1]M=10M = 10개의 등폭 구간(equal-width bins)으로 나누고(문자 MM은 구간의 개수로, companion의 N_BINS, calibration.py 75번째 줄), 각 예측을 그 신뢰도가 속한 구간에 배정하며, 각 구간의 평균 신뢰도를 그 관측된 정답 빈도와 비교합니다 [2]. 구간 bb는, b=0,1,,M1b = 0, 1, \ldots, M-1에 대해, 구간 [b/M, (b+1)/M)[\,b/M,\ (b+1)/M\,)을 덮으며 마지막 구간은 1.01.0도 포함합니다. 신뢰도 pip_i를 가진 예측의 구간 색인은 min(piM, M1)\min(\lfloor p_i \cdot M \rfloor,\ M - 1)이며, 여기서 \lfloor \cdot \rfloor바닥 함수(floor function), 즉 인수를 넘지 않는 가장 큰 정수입니다(reliability_bins, 135–153번째 줄). 구간 bb 안에서는 세 가지 통계량이 감사를 요약하며, ii는 그 구간에 떨어진 예측들을 색인하고 nbn_b는 그 개수를 셉니다.

confb=1nbibpi,accb=1nbibyi,\mathrm{conf}_b = \frac{1}{n_b} \sum_{i \in b} p_i, \qquad \mathrm{acc}_b = \frac{1}{n_b} \sum_{i \in b} y_i,

이는 그 구간의 평균 발표 신뢰도와 그 관측된 정확도, 즉 그 구성원들 가운데 라벨 11의 경험적 빈도입니다(ib\sum_{i \in b}는 그 구간 안의 각 예측마다 항 하나씩을 더합니다). 완벽한 보정은 모든 구간에서 이 두 열을 표본 잡음의 범위 안에서 일치시킵니다. 다음은 커밋된 BEFORE 표로, 분할의 평가 절반을 모델의 고유한 읽기 p=σ(s)p = \sigma(s) 아래에서 본 것입니다.

[2] BEFORE — reliability diagram of p = σ(s), 10 equal-width bins
(Naeini et al. 2015; table form of Niculescu-Mizil & Caruana 2005)
bin count conf acc gap(acc-conf)
[0.0,0.1) 54 0.0040 0.0185 +0.0145
[0.1,0.2) 1 0.1697 0.0000 -0.1697
[0.4,0.5) 1 0.4281 1.0000 +0.5719
[0.9,1.0] 7 0.9976 1.0000 +0.0024
(63 points; empty bins [2, 3, 5, 6, 7, 8] omitted)
ECE = Σ_b (n_b/N)·|acc_b − conf_b| = 0.0245 Brier = 0.0216 NLL = 0.1708
acc(0.5) = 0.9683 AUC = 0.9136

인쇄된 요약 줄의 두 약어는 자기 절이 나올 때까지 기다리게 해서는 안 됩니다: NLL은 음의 로그가능도(negative log-likelihood)로, 아래의 온도 스케일링 절에서 완전하게 정의되는 맞춤의 목적 함수이고, AUC는 수신자 조작 특성(receiver operating characteristic, ROC) 곡선 아래 면적으로, 불변성 절에서 정의되는 순수한 순위 통계량입니다; 둘 다 정확히 제 일을 하는 곳에서 다시 등장합니다.

이 읽는 법을 가르쳐 봅시다. 그려진 신뢰도 다이어그램에서, 값이 채워진 각 구간은 (confb,accb)(\mathrm{conf}_b, \mathrm{acc}_b)에 놓인 점이고 완벽한 보정은 대각선입니다. 대각선 아래에 있는 점, 즉 정확도가 신뢰도에 못 미치는 점, 마지막 열에서 음수 격차는 평범한 의미에서의 과신(overconfidence)입니다: 모델이 실제로 해낸 것보다 더 많이 약속했다는 뜻입니다. [0.1,0.2)[0.1, 0.2) 행이 그런 점 하나입니다: 단일한 음성 트리플이 0.16970.1697로 발표되었는데 거짓이었고, 격차는 0.1697-0.1697입니다. 참일 확률이라는 읽기의 낮은 쪽 끝에서는 역할이 뒤바뀝니다: [0.0,0.1)[0.0, 0.1) 행의 양수 격차(acc=0.0185\mathrm{acc} = 0.0185에 대해 conf=0.0040\mathrm{conf} = 0.0040)는 모델의 거의-0에 가까운 발표들이 아래쪽으로 너무 극단적이었다는, 즉 거짓에 대해 너무 확신했다는 뜻이며, 이는 반대편에서 본 같은 질병입니다. 양쪽 끝을 최상위-레이블 읽기(여러분이 어느 쪽을 주장하든 그쪽에 대한 신뢰도)로 접으면 두 행 모두 한 가지를 말합니다: 확률이 절반으로부터 너무 멀리 밀려나 있다는 것입니다. 이 진단을 붙들어 두십시오; 맞춰질 온도가 이를 단일한 숫자로 정량화할 것입니다.

이제 정직한 부분을 말할 차례이며, 이 장이 매끄러운 신뢰도 곡선이 아니라 표를 인쇄하는 이유이기도 합니다. 값이 채워진 네 행 가운데 두 행은 정확히 점 하나만을 담고 있으므로, 그 "정확도"는 0 또는 1의 단일한 베르누이 추출이며, 그 격차들(0.1697-0.1697+0.5719+0.5719)은 대부분 측정의 옷을 입은 표본 잡음일 뿐입니다. 꽉 찬 행들조차 눈에 보이는 오차 범위를 지니고 있습니다. [0.0,0.1)[0.0,0.1) 행은 accb=0.0185\mathrm{acc}_b = 0.0185에서 nb=54n_b = 54개의 점을 담고 있습니다; 빈도의 표준오차(추정된 비율이 겪는 무작위 요동의 전형적인 크기로, 개수의 제곱근이 커질수록 줄어듭니다)는 accb(1accb)/nb=0.0185×0.9815/540.018\sqrt{\mathrm{acc}_b(1 - \mathrm{acc}_b)/n_b} = \sqrt{0.0185 \times 0.9815 / 54} \approx 0.018로, 그 행 전체의 격차인 +0.0145+0.0145보다 더 넓습니다. [0.9,1.0][0.9,1.0] 행은 일곱 번의 시도 가운데 일곱 번의 성공을 보여줍니다. 만약 이 구간의 실제 정확도가 어떤 값 pp라면, 독립적인 일곱 사례에서 일곱 번 모두 정답을 볼 확률은 ppp=p7p \cdot p \cdots p = p^{7}일 것입니다; 그러므로 95퍼센트 하한은 일곱 중 일곱이 아직 5퍼센트 미만의 요행이 되지 않는 가장 작은 pp, 즉 p7=0.05p^7 = 0.05를 푸는 pp이고, 이는 p=0.051/7=eln(0.05)/70.652p = 0.05^{1/7} = e^{\ln(0.05)/7} \approx 0.652를 주므로, 그곳의 "정확도 1.0000"은 오직 "대략 3분의 2 이상"만을 인증합니다. 그런 구간들을 관통해 곡선을 그리면 데이터가 담고 있지 않은 정밀도를 지어내게 됩니다; 개수 열을 갖춘 표는 그 불확실성을 시야 안에 남겨 둡니다. 신뢰도 추정치는 그 구간 개수만큼만 좋으며, 그 개수는 추정치 옆에 함께 인쇄되어야 합니다.

이 표의 좋은 소식에 대해서도 두 번째 정직한 읽기가 있습니다. 0.50.5 임계값에서의 전체 정확도인 0.96830.96836363개 중 6161개로, 누가 승자이고 누가 패자인지 알아채기 전까지는 근사하게 보입니다. [0.9,1.0][0.9, 1.0]의 확신에 찬 일곱 번의 적중은 모두 훈련 트리플, 즉 모델이 1000 에포크 동안 암기한 엣지들입니다; 평가 분할에서의 유일한 두 오류는 정확히 그 안에 든 두 개의 유보된 kg.TEST 양성들입니다. 하나는 0.42810.4281의 (bob, advises, dave)로 [0.4,0.5)[0.4,0.5) 구간의 유일한 거주자이고, 다른 하나는 0.00010.0001의 (bob, authored, p1)로 [0.0,0.1)[0.0,0.1) 구간 안에 그 유일한 참 구성원으로 숨어 있습니다(0.0185×54=10.0185 \times 54 = 1). 감사의 양성들은 대체로 모델이 이미 본 사실들이며, 이는 그 정확도를 실제보다 좋아 보이게 만듭니다; 모델이 보지 못한 사실들이야말로 정확히 그 신뢰도가 실패하는 지점입니다. companion의 독스트링은 이것을 그대로 말하고 있으며(calibration.py 43–50번째 줄), 이 장이 그것을 되풀이하는 이유는 자기 자신의 표집 체제를 숨기는 보정 감사야말로 정확히 이 권이 퇴출시키려는, 검토되지 않은 종류의 점수이기 때문입니다.

유도된 ECE, 그다음 분해되는 브라이어 점수

표는 읽기 위한 것이고, 비교에는 숫자 하나가 필요합니다. 기대 보정 오차(expected calibration error, ECE)는 그 표를 개수로 가중된 절대 차이의 평균으로 뭉뚱그립니다 [2]:

ECE  =  b=0M1nbNaccbconfb,\mathrm{ECE} \;=\; \sum_{b=0}^{M-1} \frac{n_b}{N}\,\big|\,\mathrm{acc}_b - \mathrm{conf}_b\,\big|,

여기서 NN은 감사된 예측의 총 개수(여기서는 6363)이고, nb/Nn_b/N은 그중 구간 bb에 떨어진 비율이며, |\cdot|절댓값(absolute value), 즉 부호를 뗀 격차의 크기입니다. 이 공식의 각 선택은 저마다 할 일을 하고 있습니다. 절댓값은 과신하는 구간과 과소 확신하는 구간이 서로 상쇄되어 거짓된 0이 되는 것을 막습니다. 가중치 nb/Nn_b/N은 이 숫자를 하나의 기댓값으로 만듭니다: 이는 무작위로 뽑힌 예측 하나가 겪는 평균 보정 격차이며, 그래서 점 하나짜리 구간의 극단적인 격차는 정확히 점 하나 몫만큼만 셈에 들어갑니다. 빈 구간은 아무것도 기여하지 않습니다. companion의 구현은 그 공식을 그대로 옮긴 것입니다(ece, calibration.py 156–163번째 줄):

def ece(p: np.ndarray, y: np.ndarray) -> float:
"""Expected Calibration Error (Naeini et al. 2015):
ECE = Σ_b (n_b / N) · |acc_b − conf_b|
the count-weighted mean absolute gap between each bin's observed accuracy
and its mean confidence (empty bins contribute 0)."""
rows = reliability_bins(p, y)
return float(sum(r["n"] / len(p) * abs(r["acc"] - r["conf"])
for r in rows if r["n"] > 0))

커밋된 BEFORE 표 위에서 이 공식을 손으로, 값이 채워진 행마다 항 하나씩 돌려 봅시다.

ECE=5463(0.0145)+163(0.1697)+163(0.5719)+763(0.0024)=0.0124+0.0027+0.0091+0.0003=0.0245,\mathrm{ECE} = \tfrac{54}{63}(0.0145) + \tfrac{1}{63}(0.1697) + \tfrac{1}{63}(0.5719) + \tfrac{7}{63}(0.0024) = 0.0124 + 0.0027 + 0.0091 + 0.0003 = 0.0245,

이는 커밋된 인쇄값과 네 자리 모두 일치합니다. 그 가중치는 산술에서 눈에 보입니다: 극적인 0.57190.5719 격차가 겸손한 0.01450.0145 격차보다 더 적게 기여하는데, 전자는 점 하나에, 후자는 쉰넷에 걸쳐 있기 때문입니다.

이 추정량 자체에는 알려진 편향이 있으며, 나중에 발견되기보다는 지금 이름 붙여져야 합니다. 여기서처럼, 그리고 표준적으로 [2] 등폭(equal-width) 구간으로 나누면 데이터가 몇몇 구간에 몰리고 나머지는 비워 둘 수 있습니다; 그 대안인 등질량(equal-mass) 구간 나누기는 구간의 폭 대신 개수를 고정하여, 빈 구간을 데이터에 따라 달라지는 구간 경계와 맞바꿉니다. 어느 쪽도 근본적인 긴장을 피하지 못합니다: 한 구간 안에서 부호가 반대인 오보정은 절댓값을 취하기 전에 상쇄되어 ECE를 아래로 편향시키는 반면, accb\mathrm{acc}_b의 표본 잡음은 구간별 격차를 부풀려 ECE를 위로 편향시키며, 그 균형은 MMNN에 따라 달라집니다. ECE는 자신의 구간 나누기 손잡이에 값이 좌우되는 편향된 추정량입니다; 우리 규모에서는 그것이 표 자체에서 눈에 보이며, 미해결 부분 절에서 다시 다룹니다.

브라이어 점수(Brier score)는 이 모든 장치보다 수십 년 앞서 나온 것으로, 그저 결과에 대한 확률 예보의 평균 제곱 오차일 뿐입니다 [3],

BS  =  1Ni=1N(piyi)2,\mathrm{BS} \;=\; \frac{1}{N} \sum_{i=1}^{N} (p_i - y_i)^2,

여기서 pip_i는 발표된 확률이고 yi{0,1}y_i \in \{0,1\}는 결과입니다(brier, calibration.py 166–169번째 줄). 그 미덕은 그 대수가 분리해 내는 것에 있습니다. 그 합을 신뢰도 표의 구간별로 묶고, 구간 bb 안의 예보를 단일한 값 confb\mathrm{conf}_b로 이상화합니다(한 구간의 모든 예보가 일치할 때는 정확하며, 그렇지 않으면 구간 평균에서의 근사입니다). 제곱 안에 accb\mathrm{acc}_b를 더하고 뺀 뒤 전개해 봅시다.

BS=1Nbib[(confbaccb)+(accbyi)]2=1Nb[nb(confbaccb)2+2(confbaccb) ⁣ib(accbyi)+ib(accbyi)2].\mathrm{BS} = \frac{1}{N} \sum_b \sum_{i \in b} \big[(\mathrm{conf}_b - \mathrm{acc}_b) + (\mathrm{acc}_b - y_i)\big]^2 = \frac{1}{N} \sum_b \Big[ n_b(\mathrm{conf}_b - \mathrm{acc}_b)^2 + 2(\mathrm{conf}_b - \mathrm{acc}_b)\!\sum_{i \in b}(\mathrm{acc}_b - y_i) + \sum_{i \in b}(\mathrm{acc}_b - y_i)^2 \Big].

교차항은 accb\mathrm{acc}_b가 구간의 평균 라벨이라는 정의에 의해 사라집니다: ib(accbyi)=nbaccbnbaccb=0\sum_{i \in b}(\mathrm{acc}_b - y_i) = n_b\,\mathrm{acc}_b - n_b\,\mathrm{acc}_b = 0. 마지막 항은 yiy_i가 이진값이어서 yi2=yiy_i^2 = y_i이므로 단순해집니다: 제곱을 전개하면 ib(accbyi)2=nbaccb22accbnbaccb+nbaccb=nbaccb(1accb)\sum_{i \in b}(\mathrm{acc}_b - y_i)^2 = n_b\,\mathrm{acc}_b^2 - 2\,\mathrm{acc}_b \cdot n_b\,\mathrm{acc}_b + n_b\,\mathrm{acc}_b = n_b\,\mathrm{acc}_b(1 - \mathrm{acc}_b)를 얻습니다. 남는 것은 고전적인 두 부분짜리 분해로, 그 두 항에는 예보 검증 문헌이 보정과 정련이라는 이름을 붙였습니다 [4]:

BS  =  bnbN(confbaccb)2보정  +  bnbNaccb(1accb)정련.\mathrm{BS} \;=\; \underbrace{\sum_b \frac{n_b}{N}\,(\mathrm{conf}_b - \mathrm{acc}_b)^2}_{\text{보정}} \;+\; \underbrace{\sum_b \frac{n_b}{N}\,\mathrm{acc}_b\,(1 - \mathrm{acc}_b)}_{\text{정련}}.

첫 번째 항은 ECE의 제곱-격차 형제로, 모든 구간이 그 약속을 지킬 때 정확히 0이 됩니다. 두 번째 항은 정련(refinement)으로, 구간 안의 평균 베르누이 분산입니다: 이는 구간이 순수할 때, 즉 각 구간이 거의 전부 정답이거나 거의 전부 오답일 때 작아지며, 이는 신뢰도가 사례들을 얼마나 잘 분류하는지에 관한 성질이지 그 값이 정직한지에 관한 것이 아닙니다. 숫자 하나에 재료 둘, 대수 세 줄로 분리되었습니다. 커밋된 BEFORE 값은 ECE=0.0245\mathrm{ECE} = 0.0245에 대해 BS=0.0216\mathrm{BS} = 0.0216이며, 이 분해는 우리가 곧 확인하게 될 무언가를 예측합니다: 어떤 개입은 보정 항을 개선하면서 정련을 반대 방향으로 슬쩍 밀 수 있으므로, 브라이어와 ECE가 함께 움직일 필요는 없습니다.

순위 점수가 오보정되는 이유

BEFORE 표의 격차들을 단순한 불운으로 치부하고 싶어질 수 있습니다. 그것들은 불운이 아닙니다; 그것들은 훈련 목적 함수가 비쳐 보이는 것이며, 우리의 설정이 유리한 경우이기 때문에 이 논증은 정밀함을 요구합니다. 훈련 목적 함수는 학습기가 발표하는 확률에 저마다 특징적인, 측정된 왜곡을 남깁니다: 마진 극대화 학습기는 확률 질량을 가운데 쪽으로 미는 시그모이드 모양의 너무-온건한 왜곡을 남기고, 나이브 베이즈는 그것을 양 극단 쪽으로 밀며, 어느 쪽의 점수 분포도 사후적 매핑 없이는 좋은 확률이 되지 못합니다. 그리고 이는 여러 학습 방법에 걸친 체계적인 발견이지 민간 전승이 아닙니다 [5]. 지식 그래프 임베딩(knowledge-graph embedding, KGE) 모델은 그 스펙트럼의 먼 끝에 자리하며, 그 오보정 역시 추측이 아니라 측정입니다 [6]: 전형적인 KGE 파이프라인은 표집된 손상들에 대한 순위 손실을 최적화하고 오직 순위 지표만을 보고하므로, 훈련의 그 무엇도 점수의 척도를 결코 고정하지 않으며 오직 그 순서만을 고정합니다.

우리의 ComplEx는 전형적인 경우보다 우호적이며, 그 점이 논지를 더 날카롭게 만듭니다. 그것은 우도, 즉 로지스틱 손실로 훈련되었으므로 σ(s)\sigma(s)는 진짜 내재된 확률입니다. 하지만 무엇에 대한, 어디서 측정된 확률일까요? 세 가지 불일치가 훈련 목적 함수와 감사를 갈라놓습니다. 첫째, 음성 분포입니다: 훈련은 각 양성마다 정확히 하나의 균등한 손상을 자신만의 시드로 뽑았지만(bilinear.py 215–227번째 줄과 267–286번째 줄), 감사는 다른 시드로부터 양성마다 여섯 개를 제시하므로, 모델이 그에 맞춰 보정된 "거짓" 진술의 모집단은 지금 그것이 검사받는 모집단이 아닙니다. 둘째, 클래스 사전 확률(prior)입니다: 훈련 스트림은 일대일로 균형 잡혀 있었지만 감사는 일대육이며, 하나의 사전 확률 아래에서 보정된 확률은 다른 모든 것이 그대로 옮겨지더라도 다른 사전 확률 아래에서는 오보정됩니다. 셋째, 이 규모에서 지배적인 것으로, 15개의 양성 트리플에 대한 1000 에포크의 확률적 경사 하강법(stochastic gradient descent, SGD)은 암기이며, 암기는 훈련 집합 위에서 s|s|를 점점 더 크게 밀어붙임으로써 훈련 손실을 0으로 몰아가고, 시그모이드를 0과 1 쪽으로 포화시킵니다. 이는 대규모 현대 신경망에 대해 확인된 것과 같은 메커니즘으로, 용량과 음의 로그가능도 목적 함수가 결합하여 순위는 잘 매겨지지만 과신하는 확률을 낳습니다 [1]. 그러므로 우리 모델의 실패가 향하는 전체적인 방향은 아무것도 맞추기 전부터 예측 가능합니다: 확률이 너무 극단적이며, 양쪽 끝 모두 절반으로부터 밀려나 있다는 것입니다. 이제 우리가 맞출 수선책은 정확히 그것을 말해 주는 숫자 하나를 돌려줄 것입니다.

온도 스케일링: 스칼라 하나짜리 수선책

온도 스케일링(temperature scaling)은 확률 읽기 p=σ(s)p = \sigma(s)p=σ(s/τ)p = \sigma(s / \tau)로 대체하며, 시그모이드에 들어가기 전 모든 점수를 나누는 공유된 스칼라 하나 τ>0\tau \gt 0(그리스 문자 타우, "온도")를 씁니다 [1]. τ\tau가 1보다 크면 각 s/τs/\tau를 0쪽으로, 따라서 각 확률을 절반 쪽으로 줄여 과신하는 모델을 누그러뜨리며, τ\tau가 1보다 작으면 그 반대로 작동합니다. 이 맞춤은 분할의 보정 절반에 대한 음의 로그가능도(negative log-likelihood, NLL)를 최소화합니다. 라벨을 부호가 있는 형태 y±=2y1{1,+1}y^{\pm} = 2y - 1 \in \{-1, +1\}로 적으면 두 라벨 값 모두를 하나의 공식으로 다룰 수 있습니다. 항등식 두 개가 그 일을 해내며, 각각은 두 줄의 대수입니다. 첫째, 정의 σ(z)=1/(1+ez)\sigma(z) = 1/(1 + e^{-z})lnσ(z)-\ln \sigma(z)에 대입합니다: 역수의 로그는 부호가 뒤집히므로 lnσ(z)=ln(1+ez)-\ln \sigma(z) = \ln(1 + e^{-z})이고, 이는 softplus의 정의에 의해 softplus(z)\mathrm{softplus}(-z)입니다. 둘째, 1σ(z)1 - \sigma(z)를 공통분모 1+ez1 + e^{-z} 위에 올립니다: 분자는 (1+ez)1=ez(1 + e^{-z}) - 1 = e^{-z}가 되고, ez/(1+ez)e^{-z}/(1 + e^{-z})의 분자와 분모에 eze^{z}를 곱하면 1/(ez+1)=σ(z)1/(e^{z} + 1) = \sigma(-z)를 얻으므로 1σ(z)=σ(z)1 - \sigma(z) = \sigma(-z)이며, 따라서 첫 번째 항등식을 z-z에 적용하면 ln(1σ(z))=lnσ(z)=softplus(z)-\ln(1 - \sigma(z)) = -\ln \sigma(-z) = \mathrm{softplus}(z)입니다. 이제 z=s/τz = s/\tau로 두고 예제별 음의 로그가능도를 두 라벨 값 모두에서 확인해 봅시다: 양성 예제(y=1y = 1, 즉 y±=+1y^{\pm} = +1)는 lnσ(s/τ)=softplus(s/τ)-\ln \sigma(s/\tau) = \mathrm{softplus}(-s/\tau)를 기여하고, 음성 예제(y=0y = 0, 즉 y±=1y^{\pm} = -1)는 ln(1σ(s/τ))=softplus(+s/τ)-\ln(1 - \sigma(s/\tau)) = \mathrm{softplus}(+s/\tau)를 기여합니다. 두 경우 모두 단일한 표현 softplus(y±s/τ)\mathrm{softplus}(-y^{\pm} s / \tau)로 무너져 내립니다.

NLL(τ)  =  1Ni=1Nsoftplus ⁣( ⁣yi±siτ),\mathrm{NLL}(\tau) \;=\; \frac{1}{N} \sum_{i=1}^{N} \mathrm{softplus}\!\Big(\!-\frac{y^{\pm}_i\, s_i}{\tau}\Big),

이는 수치적 안정성을 위해 원시 점수로부터 계산됩니다(nll_at_tau, calibration.py 172–178번째 줄). 훈련과의 연속성에 주목하십시오: 이것은 ComplEx가 훈련받았던 바로 그 손실이며, 이제 하나만 남기고 모든 매개변수를 고정한 것입니다.

차원이 하나뿐이라면 결정적인 최적화기를 쓸 만하며, companion은 [0.05,20][0.05, 20] 구간에 대해 황금분할 탐색(golden-section search)을 사용합니다(fit_tau, 193–228번째 줄). 이 방법은 목적 함수가 그 구간 위에서 단봉(unimodal), 즉 감소하다가 증가함을 요구하는데, 여기서는 그것이 희망이 아니라 정리입니다: 온도 β=1/τ\beta = 1/\tau에서, 각 항 softplus(yi±βsi)\mathrm{softplus}(-y^{\pm}_i \beta s_i)β\beta에 대한 볼록 함수입니다(softplus는 볼록이고, 볼록 함수를 β\beta의 선형 함수와 합성해도 볼록성은 보존됩니다). 볼록 함수들의 음이 아닌 평균은 볼록하며, 한 변수의 볼록 함수는 단봉입니다; 사상 τ1/τ\tau \mapsto 1/\tau(화살표 \mapsto는 "…를 …로 보낸다"라고 읽습니다: 각 τ\tau1/τ1/\tau로 보내는 함수)는 τ>0\tau \gt 0 위에서 엄밀하게 단조이며, 단조로운 변수 변환은 단봉성을 보존합니다. 그러면 황금분할 탐색은 구간 축소로 작동합니다: 현재 구간의 φ=(51)/20.618\varphi = (\sqrt{5} - 1)/2 \approx 0.618 비율에 놓인 내부 탐침 두 개를 유지하고, 최솟값을 결코 담을 수 없다고 증명 가능한 쪽 끝을 버린 뒤, 반복합니다; 매 반복마다 구간 폭은 φ\varphi배가 됩니다. 커밋된 실행 흔적은 그 기하를 확인해 줍니다: 10회 반복 뒤 폭은 (200.05)φ10=19.95×0.00813=0.1622(20 - 0.05) \cdot \varphi^{10} = 19.95 \times 0.00813 = 0.1622로 인쇄된 1.622e-01과 정확히 같고, 80회 반복은 19.95φ804×101619.95 \cdot \varphi^{80} \approx 4 \times 10^{-16}을 남기는데 이는 어떤 인쇄된 자릿수보다도 훨씬 작으며, 전체 맞춤은 고정된 개수의 순수-함수 탐침이므로 비트 단위로 결정적입니다:

[3] temperature scaling (Guo et al. 2017): fit τ by NLL on the
calibration split, golden-section over [0.05, 20.0]
iter bracket width best NLL
10 1.622e-01 0.063194
20 1.319e-03 0.063191
30 1.072e-05 0.063191
40 8.718e-08 0.063191
τ* = 1.4172 (τ > 1: the raw reading was OVERconfident,
the direction Guo et al. report for modern networks; Tabacof &
Costabello measure the same uncalibrated reading for KGE models)
NLL on the calibration split: 0.0734 (τ=1) → 0.0632 (τ*)

맞춰진 온도는 τ=1.4172\tau^{\ast} = 1.4172입니다. 이 숫자 하나가 이 감사의 종합적인 평결입니다: 1보다 크므로 모델의 고유한 읽기는 과신하고 있었으며, 이는 정확히 목적 함수 불일치 논증이 예측한 방향이고, 시그모이드가 스스로 말하는 바를 뜻하려면 모든 원시 점수가 약 1.421.42배만큼 줄어들어야 합니다. companion은 그 방향을 서술하는 대신 단언합니다: assert tau > 1.0(calibration.py 291번째 줄). p=σ(s/τ)p = \sigma(s/\tau^{\ast})를 손대지 않은 평가 절반에 적용하면 커밋된 AFTER 표를 얻습니다:

[4] AFTER — the same evaluation split under p = σ(s/τ*)
bin count conf acc gap(acc-conf)
[0.0,0.1) 54 0.0156 0.0185 +0.0029
[0.2,0.3) 1 0.2459 0.0000 -0.2459
[0.4,0.5) 1 0.4491 1.0000 +0.5509
[0.9,1.0] 7 0.9860 1.0000 +0.0140
(63 points; empty bins [1, 3, 5, 6, 7, 8] omitted)
ECE 0.0245 → 0.0167 (strictly better, asserted)
NLL 0.1708 → 0.1387 (better on data τ never saw)
Brier 0.0216 → 0.0221 (a hair worse here: 63 points is a tiny sample,
and Brier mixes calibration with sharpness — reported, not hidden)

새 행 위에서 손 계산을 다시 돌려 봅시다: 5463(0.0029)+163(0.2459)+163(0.5509)+763(0.0140)=0.0025+0.0039+0.0087+0.0016=0.0167\tfrac{54}{63}(0.0029) + \tfrac{1}{63}(0.2459) + \tfrac{1}{63}(0.5509) + \tfrac{7}{63}(0.0140) = 0.0025 + 0.0039 + 0.0087 + 0.0016 = 0.0167. 개선은 질량이 있는 곳에서 일어납니다: 54개짜리 구간의 격차는 +0.0145+0.0145에서 +0.0029+0.0029로 떨어졌고, 7개짜리 구간의 신뢰도는 관측된 완벽함이라는 천장 아래에서 0.99760.9976에서 더 겸손한 0.98600.9860으로 누그러졌습니다. 두 이득 모두 그 맞춤이 결코 건드리지 않은 데이터에서 나온 것이며, companion은 그것들 없이는 발표를 거부합니다: assert after["ece"] < before["ece"](calibration.py 294–295번째 줄). 한편 브라이어 점수는 0.02160.0216에서 0.02210.0221로 한 치 잘못된 방향으로 움직였는데, 이는 정확히 그 분해가 허용한 갈라짐입니다: 확률을 절반 쪽으로 줄이는 것은 보정 항을 개선했지만 약간의 정련을 대가로 치렀고, 63개 점 위에서는 그 균형이 음으로 기울었습니다. companion은 이 퇴보를 숨기지 않고 그대로 인쇄하는데, 바로 그것이 이 권이 반사적인 습관으로 만들려는 보고 규범입니다.

보정 감사와 그 스칼라 하나짜리 수선책을 보여주는 세 패널 히어로 다이어그램입니다. BEFORE라는 제목의 왼쪽 패널은 커밋된 신뢰도 표를 완벽한 보정의 대각선 위의 수평 막대들로 보여줍니다: 대각선보다 살짝 위에 놓인, 개수 54의 무거운 막대 하나, 넓은 오차 수염이 붙은 개수 1짜리 얇은 막대 두 개, 그리고 신뢰도 0.9976에서 관측 정확도 1.0을 가진 개수 7의 막대가 오른쪽 위에 있으며, 그 아래에 요약 ECE 0.0245가 인쇄되어 있습니다. 가운데 패널은 온도 손잡이라는 제목으로, 원시 점수 축이 맞춰진 값 타우 스타 1.4172를 가진 시그마 오브 에스 나누기 타우라는 상자로 들어가는 것을 보여주고, 시그모이드가 절반 쪽으로 평평해지는 곡선과, 그 사상이 엄밀히 증가하므로 126개 트리플 전체의 정렬된 순서, 0.9136의 AUC, 0.9683의 임계값 정확도가 변하지 않은 채로 통과한다는 곁 메모가 있습니다. AFTER라는 제목의 오른쪽 패널은 재조정된 확률 아래에서 다시 그려진 같은 막대들을 보여주는데, 무거운 막대는 이제 격차 0.0029로 대각선에 바짝 붙어 있고 맨 위 막대는 신뢰도 0.9860으로 누그러졌으며, 요약 ECE 0.0167과 그 개선이 그 맞춤이 결코 보지 못한 평가 절반에서 측정되었다는 메모가 있습니다. 맨 아래 띠에는 이 장의 계약이 적혀 있습니다: 보정은 바뀌었지만 결정은 손대지 않았으며, 코드로 단언되었다는 것입니다. 유보된 우도로 맞춘 스칼라 하나가 모든 막대를 대각선 쪽으로 옮기는 동안, 단조성 정리는 단 하나의 순위나 임계값 결정도 움직이지 않는다는 것을 보증합니다. 저자가 AI의 도움을 받아 직접 제작한 원본 도해.

두 줄로 된 불변성 정리

온도 스케일링의 안전성 보증은 완전히 진술하고 증명하기에 충분히 작으면서도, 그런 격식을 갖출 만한 가치가 있는 정리입니다. 주장. 임의의 τ>0\tau \gt 0에 대해, 사상 ss/τs \mapsto s/\tau는 모든 엄밀한 순서와 모든 부호를 보존합니다. 증명. s1>s2s_1 \gt s_2인 두 점수를 아무거나 취합시다. 부등식의 양변에 양의 상수 1/τ1/\tau를 곱해도 부등식은 보존되므로 s1/τ>s2/τs_1/\tau \gt s_2/\tau이고, σ\sigma는 엄밀히 증가하므로(그 도함수 σ(z)=σ(z)(1σ(z))\sigma'(z) = \sigma(z)(1 - \sigma(z))가 어디서나 양수라는 것은 경사 하강법에서 유도되었습니다) σ(s1/τ)>σ(s2/τ)\sigma(s_1/\tau) \gt \sigma(s_2/\tau)입니다. 부호에 대해서는, 1/τ>01/\tau \gt 0이므로 s/τs/\tauss와 같은 부호를 가지며, σ(z)0.5\sigma(z) \ge 0.5는 정확히 z0z \ge 0일 때 성립하므로, 스케일링 전에 p0.5p \ge 0.5인 것은 스케일링 후에 p0.5p \ge 0.5인 것과 동치입니다. \square

그 귀결들은 저절로 나열됩니다. 확률들 사이의 모든 쌍별 비교가 변하지 않으므로, 126개 트리플 전체의 정렬된 순서가 변하지 않으며, 따라서 3권의 모든 순위 지표, 즉 필터링된 순위, MRR, Hits@k가 변하지 않습니다; AUC(수신자 조작 특성(receiver operating characteristic, ROC) 곡선 아래 면적)는, 정확히 양성-음성 점수 쌍 가운데 올바르게 정렬된 비율, 즉 동점은 절반으로 세는 비율(만-휘트니(Mann-Whitney) 형태, auc, calibration.py 181–188번째 줄)로 계산될 수 있으므로 변하지 않으며; 절반에서 임계값을 매겨 내린 모든 결정 역시 변하지 않으므로 정확도도 변하지 않습니다. companion은 이 정리가 부동소수점 위에서 저절로 살아남으리라 믿지 않습니다; 그것은 각 귀결을 근사가 아니라 정확하게 단언합니다(calibration.py 296–304번째 줄):

# (4) Order preservation, decision level: s/τ has the sign of s, so every
# 0.5-threshold decision — hence accuracy — is bit-identical.
assert np.array_equal(p_before >= 0.5, p_after >= 0.5)
assert before["acc"] == after["acc"]
# (5) Order preservation, ranking level: s ↦ s/τ is strictly increasing,
# so the full sorted order and the pairwise AUC are bit-identical.
assert np.array_equal(np.argsort(p_before, kind="stable"),
np.argsort(p_after, kind="stable"))
assert before["auc"] == after["auc"]

그리고 커밋된 실행이 이를 확인해 줍니다: acc 0.9683 = 0.9683 AUC 0.9136 = 0.9136 argsort(p) identical over all 126 triples. 전체 장부를, 도구별로 살펴봅시다:

도구무엇을 측정하는가BEFOREAFTERτ\tau가 그것을 움직일 수 있는가?
ECE평균 절대 신뢰도 격차0.02450.0167예: 표적
NLL라벨들의 로그가능도0.17080.1387예: 맞춤의 목적 함수
Brier제곱 오차 = 보정 + 정련0.02160.0221예, 어느 방향으로든
0.5에서의 정확도임계값 결정0.96830.9683결코 아니다(부호 보존)
AUC쌍별 순위0.91360.9136결코 아니다(순서 보존)

이것이 온도 스케일링이 최소의 수선책이자 표준적인 첫수인 이유입니다 [1]: 그것은 자유도 하나를 전적으로 단조 변환의 안전한 부분공간 안에서만 쓰며, 그곳에서는 모델이 결정하는 그 무엇도 손상될 수 없고 오직 자신의 결정을 얼마나 크게 외치는지만 바뀝니다.

스칼라 하나가 고칠 수 없는 것

τ\tau를 안전하게 만드는 바로 그 정리가 그것이 할 수 있는 일의 한계도 정합니다. AFTER 표의 잔여 격차를 되돌아봅시다. 한때 0.16970.1697로 발표되었던 단일한 거짓 트리플은 이제 0.24590.2459에 놓여 있습니다: 모든 확률을 절반 쪽으로 끌어당기는 것이 이 하나만은 위쪽으로 옮겼고, 그 구간 격차는 0.1697-0.1697에서 0.2459-0.2459로 커졌습니다. 그리고 이전에 0.42810.4281에서 참이었던 (bob, advises, dave)는 이후 0.44910.4491에서 참입니다: 절반에 더 가까워졌지만 여전히 잘못된 쪽에 있습니다. 그것은 어떤 τ\tau에 대해서도 항상 잘못된 쪽에 있을 것인데, s=0.290s = -0.290이 음수이고 그 사상이 부호를 보존하기 때문입니다. 모든 옳은 결정을 똑같이 보호하는 그 불변성은 모든 그른 결정 역시 똑같이 보호합니다. 점수 범위 전체에 걸쳐 그 모양이 달라지는 오보정, 즉 여기서는 과신하고 저기서는 과소 확신하며 어딘가에서는 임계값의 잘못된 쪽에 있는 오보정은 매개변수 하나짜리 계열을 넘어섭니다: 온도는 오직 전체 점수 축을 0을 중심으로 단 하나의 비율로 압축하거나 늘일 수 있을 뿐입니다.

그 너머의 메뉴는 더 많은 자유도를 쓰며, 위험도 커집니다. Platt 스케일링(Platt scaling)은 두 매개변수를 쓰는 아핀 사상 σ(as+b)\sigma(as + b)를 맞추므로, 점수를 이동시켜 임계값 자체를 움직일 수도 있으며, 불변성 보증을 대가로 전역적인 편향을 수선합니다 [5]. 등장회귀(isotonic regression)는 점수에서 확률로 가는, 데이터가 뒷받침하는 만큼 많은 유효 매개변수를 가진 임의의 비감소 계단 함수를 맞춥니다; 순위는 유지하지만(그 사상은 여전히 단조입니다) 서로 다른 점수들을 동점으로 뭉갤 수 있고, 작은 보정 집합에 손쉽게 과적합됩니다 [5]. 다중 클래스 시스템에서는 벡터 및 행렬 스케일링(vector and matrix scaling)이 각 클래스에 자신만의 온도를 부여하거나 전체 로짓 벡터에 아핀 사상을 부여하는데, 이는 규모가 커지면 그 추가된 자유도가 과적합을 일으키기 때문에 정확히 평범한 온도 스케일링보다 성능이 떨어진다는 것이 밝혀졌습니다 [1]. 이 모든 것을 관통하는 하나의 맥락은 과적합에 대한 유보입니다: 보정기 역시 하나의 모델이며, 데이터로 훈련되고, 원래 신경망이 자신의 훈련 집합을 암기했던 것과 똑같이 자신의 보정 분할을 암기할 수 있습니다. 그래서 fit_tau는 오직 63개의 보정 트리플만을 보고, 보고되는 모든 감사 지표는 나머지 63개에서 나오며(calibration.py 261–272번째 줄), 엄밀한-개선 단언이 의미 있는 것은 바로 그 때문입니다: 그것은 맞춤의 일반화를 인증하는 것이지, 맞춤 자체를 인증하는 것이 아닙니다.

지름길과 기권 사이에서

III부의 배치는 우연이 아니라 하나의 논증입니다. 앞 장은 모델의 내부 개념이 옳은지를 측정했습니다; 이 장은 그 출력 신뢰도가 정직한지를 측정했습니다; 다음 장은 그 정직한 신뢰도를 소비하여, 임계값 아래에서 답을 거부함으로써 커버리지와 위험을 맞바꿀 것입니다. 이 순서는 양방향으로 중요합니다. 하류에서, 선택적 예측기(selective predictor)는 그것이 임계값을 매기는 신뢰도만큼만 좋습니다: BEFORE 열 위의 기권 게이트는 (bob, authored, p1)을 p=0.0001p = 0.0001에서 조용히 버려 둘 것이고, 이는 최대의 확신을 갖고 틀린 것이며, 어떤 임계값도 입력이 거짓말을 하는 게이트를 구할 수 없습니다. 상류에서, 지름길 교훈은 오늘의 감사가 인증하는 것의 한계를 정합니다. 잘못된 개념을 배운 모델도 모든 신뢰도 검사를 통과할 수 있는데, 보정은 신뢰도에 조건을 걸 뿐 이유에는 조건을 걸지 않기 때문입니다: 그것은 발표의 정직함을 인증할 뿐, 그 배후의 의미론을 인증하지는 않습니다. 잘못된-개념 모델이 보정되어 있다면, 그것은 잘못된 것에 대해 보정되어 있는 것입니다. 그 간극을 좁히는 것은 살아 있는 연구 노선입니다: 신경-기호 모델의 개념 수준 신뢰도가 그 추론 지름길의 모호성을 추적하도록 만들어, 불확실성이 실제로 식별 불가능한 개념들 위에 정확히 내려앉게 하는 것은, 지름길 문헌에서 바로 BEARS의 프로그램입니다 [7]. 그리고 스칼라 신뢰도 전체에 대한 구조적 대안도 있는데, 이는 이 시리즈가 이미 구축해 둔 것입니다: 2권의 주석 논리는 사실에 구간 주석을 붙였는데, 이는 열린-세계 의미론을 가진 하한과 상한이며, "0.6과 1 사이 어딘가, 증거를 기다리는 중"이라는 것을 무지와 측정된 빈도를 하나의 숫자로 뭉개는 대신 일급 객체로 나타냅니다. 이 권을 마무리하는 SATORI 장들은 스칼라 신뢰도가 더 이상 여지를 남기지 않을 때 정확히 그 표현에 기댈 것입니다.

아직 풀리지 않은 부분

세 가지 정직한 공백을, 어려움이 커지는 순서로 살펴봅시다. 첫째, 추정량 자체입니다: 작은 표본에서 ECE는 편향되어 있고, 그 값은 구간의 개수와 위치에 좌우되며, 구간 안의 상쇄는 그것을 아래로 끌어당기는 한편 구간별 잡음은 그것을 위로 밀어 올리고, 이 장이 구현하는 등폭 방식은 최적이 아니라 하나의 관례입니다; 구간 나누기 문제는 이미 ECE라는 이름을 붙인 베이지안 구간 나누기 계열 연구의 동기가 된 문제였으며 [2], 그 이후로 어떤 단일한 추정량도 이를 해결하지 못했습니다. 우리의 63개 점짜리 감사는, 그 단일점 구간들과 "일곱 중 일곱"이라는 구간이 오직 "대략 3분의 2 이상"만을 인증한다는 사실과 함께, 이 문제를 축소판으로 보여줍니다. 둘째, 분포 이동입니다: 보정은 하나의 분포, 즉 감사가 표집한 바로 그 분포에 관한 성질이며, 배포 환경이 표류하면 조용히 저하되는데, 그 약속이 만료되었다는 모델 내부의 신호는 전혀 없습니다; 어제의 질의에 대해 보정된 모델은 오늘의 발표를 어제의 정직함으로 내놓으며, 그 만료를 탐지하려면 정의상 배포 환경이 갖고 있지 않은 라벨이 필요합니다. 셋째, 이 권에서 가장 심오한 것으로, 구조화된 출력에 대해서는 P(correctconfidence=p)P(\text{correct} \mid \text{confidence} = p) 안의 사건을 정의하는 것조차 미해결입니다. 열세 개의 개체에 대한 순위에서, 각 단계는 개별적으로 건전하지만 결론이 빗나갈 수 있는 증명에서, 답의 집합을 돌려주는 논리곱 질의에서 "확률 pp로 정답"이라는 것은 무엇을 뜻할까요? 이 장의 이진 감사는 트리플이 참이거나 거짓이기 때문에 성립했습니다; 이 권이 다루는 추론 시스템들은 내부 구조를 가진 객체를 내놓으며, 그런 것들을 위한 보정 이론, 즉 무엇에 조건을 걸어야 하는지, 무엇이 결과로 셈되는지, 신뢰도 표의 행이 대체 무엇인지는 이미 풀린 장이 아니라 열린 연구의 최전선입니다.

왜 중요한가

이 시리즈는 단지 점수가 매겨질 뿐 아니라 신뢰될 수 있는 답을 내는 시스템을 향해 올라가고 있으며, 보정은 숫자가 시스템 경계를 넘어갈 수 있게 해 주는 성질입니다. 한 모델 안에서는 점수가 후보들의 순서만 매기면 되며, 3권과 4권은 정당하게도 그 이상을 요구한 적이 없습니다. 그 점수가 다른 곳에서 소비되는 순간, 즉 다음 장의 기권 게이트에 의해서든, 어느 유도를 감사할지 결정하는 사람에 의해서든, 무엇을 증명할지 결정하는 SATORI의 검증기에 의해서든, 그 소비자는 그 숫자가 매번 같은 것을 뜻하기를 필요로 하며, P(correctconf=p)=pP(\text{correct} \mid \text{conf} = p) = p가 정확히 그 계약입니다. 이 장의 프로토콜은 여러분 자신의 연구로 옮겨가도록 일부러 이식 가능하게 만들어졌습니다: 이 책의 어떤 시스템이든 [0,1][0,1] 안의 점수, 즉 퍼지 만족 정도든, 질의-임베딩 답 가중치든, 증명 신뢰도든 내놓는다면, 구간을 나누고 세고 비교하는 30줄로 감사할 수 있고, 유보된 스칼라 하나로 수선할 수 있으며, 그 수선이 어떤 결정도 바꾸지 않았다는 것을 단언으로 지킬 수 있습니다. 정확도 숫자 옆에 신뢰도 표를 인쇄하는 것, 개수를 포함하고 퇴보까지 포함하여 인쇄하는 것은 값싼 일이며, 그것이 바로 모델을 보고하는 것과 여러분이 믿어도 될 모델을 보고하는 것 사이의 차이입니다.

핵심 용어

  • 보정(calibration): 조건부 확률의 약속 P(correctconfidence=p)=pP(\text{correct} \mid \text{confidence} = p) = p; 신뢰도 pp에서 나온 모든 발표 가운데, 비율 pp만큼이 옳다는 것입니다.
  • 신뢰도 표(reliability table, 신뢰도 다이어그램(reliability diagram)): 그 약속에 대한 구간별 추정량; 신뢰도 구간마다 개수 nbn_b, 평균 신뢰도 confb\mathrm{conf}_b, 관측된 정확도 accb\mathrm{acc}_b를 담으며, confb=accb\mathrm{conf}_b = \mathrm{acc}_b로부터의 편차가 오보정입니다.
  • 기대 보정 오차(expected calibration error, ECE): 개수로 가중된 절대 차이의 평균 b(nb/N)accbconfb\sum_b (n_b/N)\,\lvert \mathrm{acc}_b - \mathrm{conf}_b \rvert; 편향되어 있고 구간 나누기에 좌우되지만 없어서는 안 될 요약입니다.
  • 등폭 대 등질량 구간 나누기(equal-width vs equal-mass binning): 구간의 간격을 고정하는 것과 그 개수를 고정하는 것; 이 추정량의 주된 손잡이이며, 어느 쪽이든 그 편향의 원천입니다.
  • 브라이어 점수(Brier score): 예보와 결과 사이의 평균 제곱 오차 1Ni(piyi)2\frac{1}{N}\sum_i (p_i - y_i)^2; 보정 항과 정련 항으로 정확히 분해됩니다.
  • 정련(refinement): 구간 안의 베르누이 분산 b(nb/N)accb(1accb)\sum_b (n_b/N)\,\mathrm{acc}_b(1 - \mathrm{acc}_b); 신뢰도가 사례들을 순수한 구간으로 분류할 때 작아지며, 그 값이 정직한지와는 무관합니다.
  • 음의 로그가능도(negative log-likelihood, NLL): 맞춤의 목적 함수 1Nisoftplus(yi±si/τ)\frac{1}{N}\sum_i \mathrm{softplus}(-y^{\pm}_i s_i / \tau); 모델이 훈련받았던 바로 그 손실을, 자유 매개변수 하나로 재사용한 것입니다.
  • 온도 스케일링(temperature scaling): 유보된 NLL로 맞추는 스칼라 하나짜리 수선책 p=σ(s/τ)p = \sigma(s/\tau); τ>1\tau \gt 1은 과신을 누그러뜨리고 τ<1\tau \lt 1은 과소 확신을 날카롭게 합니다.
  • 순서 보존(order preservation): τ>0\tau \gt 0ss/τs \mapsto s/\tau가 모든 엄밀한 부등식과 모든 부호를 보존한다는 두 줄짜리 정리; 그래서 순위, AUC, 임계값 결정은 손대지지 않습니다.
  • 황금분할 탐색(golden-section search): τ\tau를 맞추는 데 쓰이는 결정적인 1차원 최소화기; 단봉성을 요구하며, 반복마다 구간을 φ0.618\varphi \approx 0.618배로 줄입니다.

이 다음으로 이어지는 것

보정된 신뢰도는 원재료입니다; 다음 장은 그것을 소비하는 기계를 만듭니다. 기권은 모델에 "저는 답하기를 거부합니다"라는 세 번째 출력을 부여하고, 보정된 확률을 하나의 다이얼로 바꿉니다: 신뢰도 임계값을 훑으며 그 아래의 모든 것을 거부하고, 커버리지(시스템이 얼마나 자주 답하는가)를 위험(답이 얼마나 자주 틀리는가)과 맞바꿉니다. 위험-커버리지 곡선, 그 위에 사는 선택적 예측 보증들, 그리고 답을 거부하는 것이 추측하는 것보다 더 값어치 있는 때는 언제인가라는 질문이, 이 장의 감사가 하나의 운영 정책으로 바뀌는 지점입니다.


Companion 코드: examples/frontier/calibration.py는 실행 예제로부터 라벨이 붙은 집합을 구축하고, 3권에서 재훈련된 ComplEx(examples/neural/bilinear.py)로 그것을 채점하며, 신뢰도 표, ECE, 브라이어, AUC를 그 정의로부터 구현하고, 보정 절반에 대한 황금분할 탐색으로 온도를 맞추며, 이 장의 네 가지 주장을 단언합니다: 그 맞춤이 자신의 목적 함수를 낮춘다는 것, 측정된 방향이 과신이라는 것, ECE가 유보된 데이터에서 엄밀하게 개선된다는 것, 그리고 어떤 결정이나 순위나 AUC도 움직이지 않는다는 것입니다. 이 장의 모든 숫자를 바이트 단위로 재현하려면 python3 examples/frontier/calibration.py를 실행하십시오.