[간단 정리]

[간단 정리] model calibration 에 대해 알아보자 (1)

hskimim 2021. 11. 4. 01:40

model distilation 논문을 보면, teacher model이 주어진 input 에 대한 예측값, 더 정확히는 특정 class labels 에 할당된 predicted probability 을 사용해 student model 을 학습시킨다. 이는, 모델이 주는 probability 는 모델의 knowledge 라고 할 수 있음을 시사한다.

 

calibration 이란 예측된 probability 가 옳음의 우도 (likelihood of correctness) 를 나타내게 하는 task 를 의미한다.   논문의 예시를 가지고 와보면, 100개의 예측값이 있다고 하고 모델이 특정 class label 에 대한 예측 probability/confidence (probability 는 불확실성을 내포하기 때문에, probability 값의 정도는 예측값에 대한 confidence 라고 할 수 있다..) 으로 0.8을 반환했을 때, 80개 정도가 잘 분류되면 perfect calibration 이며, calibration task 는 이를 목표로 한다.

perfect calibration

시각화를 통해 calibration 에 한발짝 더 다가가보자.

아래는 sklearn User Guide에서 가져온 이미지로 "calibration curve" 라고 불리는 plot 이다. 해당 plot 은 binary label 에 한정하여, calibration 의 경향을 보여주는 지표이며. multi-class 에 대해서는 one-to-rest 의 방법으로 만들어서 전자의 class 에 대한 calibration 에 집중하는 형태가 있고, sklearn.calibration.calibration_curve 함수는 이를 모두 지원한다.

 

calibration curve plot 의 x-axis 는 모델이 특정 입력값에 대해 positive(1)로 반환한 predicted probability를 기준으로 나열한 것이다. 실제로는 binning을 사용하며 [0,1] 사이의 값을 균등하게 또는 weighted 의 형식으로 categorize 를 한다.

y-axis 는 x-axis 에 매칭되는 입력값들이 실제로 positive(1)인 통계량을 의미한다. 이에 따라, calibration curve 가 y=x 의 기울기가 1인 일직선을 따르면, perfect calibration 이 된다. 

calibration curve


calibration 이라는 task 가 있다는 것은, machine learning 모델이 poorly-callibrated 의 경향이 존재한다는 것을 의미한다. 이는 모델의 특성에 따라 충분히 예상되는 결과이며, poorly-calibrated 되는 경향성 (probability distribution) 또한 다 다르다. 아래 이미지는 위와 같은 sklearn User Guide에서 가져온 이미지로 같은 데이터에 대해, 각기 다른 예측 확률 분포를 보여주고 있다.  

different machine learning models show different probability distribution

model calibration은 다양한 형태로 이뤄지는데, 하나는 train dataset 에서 model 을 학습시켜서, 학습된 확률값 p_hat 를 가지고 validate dataset 에서 이를 post-processing 하여 p_hat_calibrated 을 취하는 방식이 있다. 또 다른 하나는 모델을 train dataset 학습하는 과정에서 calibration 을 돕는 테크닉을 사용하는 방식으로 해당 테크닉들이 가지는 파라미터들을 fine-tuning 하기 위해 validate dataset 이 사용된다.

 

calibration 테크닉에 대해서 다루기 전, calibration 에 대한 성능 지표들이 무엇이 있는지 최소한으로 한 번 알아보려 한다. 지금까지 읽어오는 데에 큰 어려움이 없었다면, 성능 지표에 대한 부분도 큰 문제 없이 이해할 수 있을 것이다.


수식에 대한 이미지의 캡쳐는 논문을 참고하였다. (1), (2)

Expected Calibration Error (ECE)

논문을 읽다보면, 제일 많이 나오는 성능 지표이다. 말 그대로 평균값을 사용하는데 수식은 아래와 같다.

 

ECE formula

predicted probability 와 이에 응하는 real probability 의 차이의 절댓값을 평균낸 것이다. 위의 calibration curve 로 설명해보자면, scatterplot 에 y = x 선을 그리고 각 data point가 선에서 떨어진 만큼의 거리를 평균낸 것이라고 할 수 있다. 

 

위의 식의 문제점에 문제점이 있는데, 바로 probability distribution 을 나누는 것에서 발생한다. 예로 들어 설명해보자면, 위의 그림에서 Naive Bayes 모델과 같이 predicted probability distribution 이 양 끝의 tail 에 치우쳐져 있는 경우를 생각해보자. 이런 경향성에도 불구하고 [0,1] 의 구간을 균등하게 0.1로 10개 나눠서 10개의 data point 를 가지고 평균을 낸다면, 전체를 대표할 만한 평균값을 얻기 어려울 것이다. 이에 따라, 아래의 weighted ECE 는 각 binning 에 속한 모델의 예측값을 가충평균을 사용하여 성능 지표를 계산한다.

weighted ECE formula

Maximum Calibration Error (MCE)

모델의 calibration 이 중요한 분야는 모델의 예측에 대한 risk 가 높은 분야가 많다. 이에 따라, poorly-calibrated 경우에 민감하게 반응하는 것이 중요하기 때문에, miss-calibrated 된 경우들 즉, 거리들의 최댓값을 성능 지표로 사용하는 경우이다. 

MCE

위의 방법들이 실질적으로 널리 사용되지만, 모델의 predicted probability 의 분포를 히스토그램으로 binning 한다는 것이 어찌보면 approximation 의 형태를 띄기 때문에, 더 좋은 근사에 대한 제시들이 많이 이뤄지고 있다. 기존의 방법론이 가지는 한계점과 이를 보안하여 제시된 방법론에 대해 하나 알아보고 성능 지표 설명을 마쳐보겠다.

 

Adaptivity : 

bin 의 크기를 작게 만들게 되면, 추정하는 데이터 셋에서는 정확한 성능 지표를 계산할 수 있겠지만, 데이터가 존재하지 않는 bin이 많아지는 sparse 한 추정량이 만들어지면서, less-general 해진다. 이에 따라 위의 weighted 방법과 유사한 adaptive binning 을 제시하는 성능 지표가 존재한다.

 

Class Conditionality : 

모델이 특정 class label 에 대해 가장 높은 확신으로 이야기하는 특정 label 에만 집중하며 성능 지표를 보는 것은, 2 번째 혹은 3 번째 class label 에 대한 calibration 성능을 보장할 수 없기 때문에, K개의 class 에 대한 성능을 독립적으로 보는 것에 대해 이야기한다.

 

Norm :

각 데이터 포인트와 y = x 선 간의 거리에 대한 측정을 어떤 것을 사용할 지에 대해서이다. 논문에 따르면 L1 보다 L2 가 calibration 최적화에 더 효과적이었다고 한다. 근데 모든 데이터, 모든 모델에 대해 그런 것은 아니었기 때문에, 분명한 경향성은 크게 보이지 않았다.

Adaptive Calibration Error (ACE)

Adaptive Calibration Error (ACE)

절대값 안에 있는 식은 위의 ECE 와 동일하다고 보면 된다. K 는 클래스의 갯수이며 클래스 별로 ECE 를 측정하여 이를 평균낸다. R 은 데이터가 총 N 개일 때 이를 N/R 로 나누게 되는데, 즉 하나의 bin 에 들어있는 데이터 수를 의미한다. 쉽게 말하면 weighted ECE 는 균등 bin 을 쓰고 가중 평균을 사용했지만, adaptive ECE 의 경우 각 bin 에 같은 수의 데이터가 있게끔 하는 것이다. 


느꼈겠지만, calibration 에 대한 metric 을 계산할 때, 개선의 여지가 많은 부분은 predicted probability 와 이에 대응하는 true y 에 대한 binning 에 대한 것이다. sklearn 에서 지원하는 calibration_curve 는 이러한 니즈에 맞춰 probability distribution 을 고려하는 옵션인 strategy argument 를 지원하며, 디폴트는 'uniform' 이니, 'quantile' 로 조정해서 사용하면 된다. 아래는 해당 부분에 속하는 실제 sklearn 소스 코드이다.

    if strategy == "quantile":  # Determine bin edges by distribution of data
        quantiles = np.linspace(0, 1, n_bins + 1)
        bins = np.percentile(y_prob, quantiles * 100)
        bins[-1] = bins[-1] + 1e-8
    elif strategy == "uniform":
        bins = np.linspace(0.0, 1.0 + 1e-8, n_bins + 1)
    else:
        raise ValueError(
            "Invalid entry to 'strategy' input. Strategy "
            "must be either 'quantile' or 'uniform'."
        )

다음으로는 머신 러닝에서 사용되는 calibration method 에 대해 하나씩 알아보려고 한다. 우선 sklearn.calibration.CalibratedClassifierCV 모듈에 대해 알아본다. 글이 많이 길어진 관계로 2편에서 하도록 하겠다.