04-29 02:46
Notice
Recent Posts
Recent Comments
관리 메뉴

Scientific Computing & Data Science

[Artificial Intelligence / Posts] 교차검증 (Cross-validation) 본문

Artificial Intelligence/Posts

[Artificial Intelligence / Posts] 교차검증 (Cross-validation)

cinema4dr12 2017. 9. 30. 18:13

Written by Geol Choi | 


이번 포스팅은 교차검증에 대한 간단한 개념만 설명합니다.

개요

머신러닝 모델을 설계하다보면 설계에 필요한 파라미터들이 있습니다. 즉, 모델의 동작을 위해 결정되어야 할 파라미터들인데 이 파라미터들에 의해 모델 성능이 크게 영향을 받는 경우가 많습니다.


이렇게 머신러닝 모델을 설계하기 위해 필요한 파라미터들을 Hyperparameters라고 합니다. 사실 Hyperparameters를 정하는 것은 여간 까다로운 일이 아닙니다. 왜냐하면 정해야 할 파라미터가 1~2개라면 큰 문제가 없겠지만 파라미터가 1개씩 추가될 때마다 검증의 복잡도는 기하급수적으로 증가하기 때문입니다.


게다가 각 Hyperparameter에 대하여 범위를 어떻게 정해야 하며 그 범위 내에서 몇 개의 수준(Levels)으로 정해야 할지 검증을 위해 추가로 정해야 할 것들도 많습니다. 이에 더해 Hyperparameters 간에 검증 결과가 독립적이라면 문제가 덜 복잡하지만 상관관계가 있다면 여간 골치 아픈 것이 아닙니다.


그럼에도 Hyperparameters를 선정하는 작업을 가볍게 여겨서는 안 됩니다. 시간이 부족하다는 이유로 임의로 값을 정해서 학습시킨 후 바로 테스트에 적용하는 것은 리스크가 클 수 있습니다. 사실, 리스크가 크다기 보다는 학습 모델의 효과성이 떨어질 수 있습니다 (그럼에도 우리는 낮은 성능 결과를 얻을 때 좋지 않은 Hyperparameters 보다는 구성된 모델 자체의 성능을 의심할 때가 많습니다).


그래서 우리는 항상 구성한 모델에 대해서 너무 낙관적이어서는 안 됩니다. Cross-validation(교차검증)은 이러한 문제를 완벽히 해결해 줄 수는 없어도 좀 더 납득할 만한 Hyperparameters의 튜닝을 할 수 있는 도구입니다.


사실, 좀 더 근본적으로는 교차검증은 과도적합(Overfitting)을 방지하기 위한 도구 중 하나입니다. 무슨 말인가 하면, 모델을 평가하기 위해 Dataset을 Train Set과 Validation Set으로 분리하고, Train Set에 대하여 학습시킨 후, Train Set에 대하여서는 모델이 매우 잘 적합되었는데 이상하게도 Validation Set에 대하여는 적합하지 않을 수 있습니다. 이처럼 특정 Dataset에 대해서는 매우 잘 맞는데 이외의 Dataset에 대하여는 적합하지 않은 경우를 과도적합(Overfitting)이라고 합니다. 이러한 문제를 방지하기 위한 Techniques는 많습니다 - 이를 정규화(Regularization)이라고도 합니다. Cross-validation 또한 이러한 문제가 일어나지 않도록 즉, 특정 Dataset에만 잘 맞는 Overfitting이 일어나지 않도록 다양하게 Train Set과 Validation Set을 지정하여 검증하는 방법으로 명시적인 검증을 할 수 없는 경우 간접적으로 모델을 검증할 수 있는 효과적인 방법입니다.

k-Fold Cross Validation

k-Fold Cross Validation은 Train Dataset을 균등하게 k개의 그룹(Fold라고 합니다)으로 나누고 (k - 1)개의 Test Fold와 1개의 Validation Fold로 지정합니다. 그리고나서 총 k회 검증을 하는데, 각 검증마다 Test Fold를 다르게 지정하여 성능을 측정합니다. 이런 식으로 k회 검증이 완료되면 각 Hyperparameter에 대한 검증 결과를 평균을 내어 Hyperparameters를 튜닝합니다.


이 과정을 좀 더 자세하게 정리하면 다음과 같습니다:

  1. 전체 Dataset이 Train Dataset과 Test Dataset으로 주어집니다.

  2. Train Dataset을 나눌 k를 지정하고, 가급적 균등하게 그리고 랜덤으로 k개의 데이터 Fold로 나누되 
    (k - 1)개의 Fold는 Test용으로 1개는 Validation용으로 지정합니다.

  3. 튜닝하고자 하는 Hyperparameters를 정합니다.

  4. 정해진 Hyperparameters에 대하여 각각 검증하고자 하는 범위와 실험세트(요인 수준)를 정합니다.

  5. k개로 나누어진 Train Dataset 데이터 그룹에 대하여 서로 다른 Validation Fold를 지정하면서 아래의 오퍼레이션을 k번 반복합니다:
    · (k - 1)개의 Train Fold에 대하여 학습을 시킵니다.
    · 나머지 1개의 Validation Fold에 대하여 성능을 측정합니다. 즉, 앞서 학습된 파라미터를 이용하여 Validation Fold를 이용하여 결과를 얻습니다.

  6. 5번에서 얻은 각 Hyperparamer의 k개의 결과에 대한 평균을 계산하여 이 평균값을 각 Hyperaparameter로 지정합니다.

  7. 마지막으로, 6번에서 얻은 Hyperparameters를 적용하여 Test Data에 대하여 모델을 1회 평가합니다.


위의 과정이 이해가 잘 되시는지요? 이해를 돕기 위해 아래의 그림으로 한 번 더!! 설명하도록 하겠습니다.





Train Data를 5개의 Fold로 나누었습니다. 1번째 시도에서는 Fold 1~4가 Train Fold로, Fold 5가 Validation Fold로 지정되었습니다. Fold 1~4에 대하여 각 Hyperameter의 값을 변경해가며 모델을 학습시킨 후 Fold 5에 대하여 모델의 결과를 얻습니다. 이러한 방식으로 2~5번째 시도를 모두 마무리하여 각 시도에서의 각 Hyperparameter들의 값의 평균을 구합니다. 마지막으로, 전체 Train Data를 이용하여 앞서 얻은 Hyperparameters를 갖는 모델을 학습시킨 후 Test Data로 이를 검증합니다.

k-Nearest Neighbors 적용 예

머신러닝의 Classification의 가장 기초가 되는 알고리즘인 k-Nearest Neighbors(kNN)에 5-Fold Cross-validation은 어떻게 적용할 수 있을까요? kNN에 있어 대표적인 Hyperparameter는 k, 즉 새로운 데이터를 분류할 때 이 데이터에 가장 가까운 Metric을 갖는 데이터 몇 개를 정할 것인가하는 것입니다. 이 정해야 할 몇 개가 kNN의 k입니다 (그런데 k-Fold도 k라고 되어 있어 다소 헷갈리기도 합니다. 그래서 혼동을 방지하기 위해 5-Fold Cross-validation을 예로 들었습니다).



5-Fold Cross-validation을 이용한 kNN 알고리즘의 Hyperparameter 튜닝 예. [Image from Stanford Univ. CS231n]



5-Fold Cross-validation을 하는 과정은 앞서 설명드린 과정을 그래도 한 것입니다. 위의 그래프에서 가로축은 kNN의 k(테스트 데이터의 Metric에 대하여 가장 가까운 k개의 데이터)를, 세로축은 k의 값에 따라 Validation Fold를 변경해가며 얻은 Cross-validation의 정확도를 나타낸 것입니다.


5-Fold Cross-validation을 수행하였으므로 세로축 각 k에 대하여 5개씩의 결과를 얻었습니다. 이에 대한 평균값을 구한 것이 파란색 라인입니다. 파란색 라인을 따라가다 보면 대략 k = 7에서 가장 높은 정확도를 얻었음을 알 수 있습니다. 따라서, 주어진 Dataset에 대해서는 kNN 모델의 k값을 7로 정해서 사용하는 것이 가장 효과적임을 알 수 있습니다.

그 밖에...

Cross-validation에는 모든 가능성을 검증해 보는 Exhaustive Cross-validation(소모적 교차검증) 방법과 모든 가능성에 대해 검증하지는 않는 Non-exhaustive Cross-validation(비소모적 교차검증) 방법으로 분류할 수 있습니다.


그러나, Train Dataset을 한 가지 경우에 대해 k개의 Fold로 나누는 k-Fold Cross-validation은 당연히 Non-exhaustive Cross-validation에 속합니다. 현실적으로는, 즉 실무에서는 Exhaustive Cross-validation을 사용하기는 거의 불가능합니다 (사실 그럴 필요도 없습니다. 왜냐하면, 데이터가 동일한 모집단에서 추출되며 동일한 데이터도 많기 때문에 모든 가능성을 검증하는 것은 시간 낭비이기 때문입니다).


k-Fold Cross-validation은 Non-exhaustive Cross-validation의 대표적인 방법이며, 전체 Dataset에 대하여 랜덤으로 Train Set(\(d_0\))과 Test Set(\(d_1\))을 분리하여 검증하는 Holdout 방법이 있습니다 (일반적으로 \(d_0 > d_1\) 입니다). Holdout 방법이 k-Fold와 다른 점은, Train Set과 Test Set의 Data 개수가 검증할 때마다 달라진다는 점입니다.


실무에서는 k-Fold 조차도 계산량이 어마어마하기 때문에 다른 방법을 고려하기는 어렵습니다. 따라서, 교차 검증은 k-Fold만 제대로 해도 Hyperparameters를 튜닝하는데 많은 도움이 될 수 있을 것이라 생각됩니다.

Comments