STUDY/ML DL

Training, Validation, Test 데이터와 K-Fold Cross Validation

sed 2026. 5. 9. 19:20
SMALL

Training, Validation, Test DATA

딥러닝을 공부하다 보면 `training data`, `validation data`, `test data`라는 말을 자주 보게 된다.

 

training data는 모델을 학습시키는 데이터이고, test data는 학습이 끝난 모델을 평가하는 데이터이다.

 

그런데 validation data는 조금 헷갈릴 수 있다.

학습 데이터도 아니고, 최종 테스트 데이터도 아닌 것 같은데 왜 필요한지 애매하기 때문이다.

 

이번 글에서는 training, validation, test data의 차이를 먼저 정리하고, 이어서 K-fold cross validation까지 살펴보고자 한다.

 

 

Training data

Training data는 모델을 직접 학습시키는 데이터이다.

 

예를 들어 강아지와 고양이를 분류하는 모델을 만든다고 하자.

모델에게 강아지 사진을 보여주면서 “이건 강아지다”, 고양이 사진을 보여주면서 “이건 고양이다”라고 알려주는 과정이 training이며, 모델은 이 training data를 이용해서 내부 파라미터를 학습한다.

 

여기서 말하는 파라미터는 딥러닝에서 weight와 bias 같은 값을 의미한다.

즉, training data는 모델의 weight와 bias를 업데이트하는 데 사용되는 데이터이다.

 

간단히 말하면 training data는 모델이 공부하는 데 쓰는 연습 문제라고 볼 수 있다.

 

Test data

Test data는 학습이 끝난 모델을 최종적으로 평가하기 위한 데이터이다.

중요한 점은 test data는 모델이 처음 보는 데이터인 unseen data여야 한다는 것이다.

 

우리의 목표는 training data를 잘 맞추는 모델을 만드는 것이 아니다.

진짜 목표는 처음 보는 데이터에 대해서도 잘 예측하는 모델을 만드는 것이다.

 

예를 들어 모델이 training data에 있는 강아지 사진만 잘 맞춘다면 큰 의미가 없다.

처음 보는 강아지 사진이나 고양이 사진을 보여주었을 때도 잘 맞춰야 좋은 모델이라고 할 수 있다.

 

그래서 test data는 일종의 실전 문제라고 볼 수 있다. 따라서 test data는 학습 과정에 사용되면 안된다.

test data의 정의 자체가 '처음보는 데이터'인데, 학습 과정에서 test data를 사용해버리면 더 이상 처음 보는 데이터가 아니게 된다.

그렇게 되면 모델이 진짜 새로운 데이터에 대해서도 잘하는지 알 수 없다.

 

train loss 만 보면 안되는 이유

모델을 학습시키면 보통 traning loss는 계속 줄어들고, 결국 우리는 loss가 최소화된 지점을 찾는 것이 목표이므로 이것이 좋다고 볼 수 있다. 실제로 epoch이 늘어날수록 모델은 traning data에 더 맞춰질 것이므로 좋아보인다.

 

그러나 이렇게 되면 어느 순간 모델이 traning data를 외워버릴 수 있다. 모델이 과적합(overfitting)된다는 것이다.

 

오버피팅이 발생하면 traning data에 대해서는 loss가 낮지만 unseen data에 대해서는 성능이 떨어진다.

족보에 대한 것만 외워서, 새로운 문제가 나왔을 때 대처를 못하는 것과 같다고 볼 수 있다.

 

따라서 적당한 시점에서 학습을 멈춰야 한다.

그럼 'test loss를 보면서 test loss가 가장 낮은 지점에서 멈추면 되지 않을까?' 하고 생각할 수 있다.

 

절~대 안된다

test data는 최종 평가용 데이터이므로 test loss를 보고 epoch을 정하거나 모델을 선택하면, 결국 치팅을 하는 것이다.

 

이는 향후 모델 성능에 대해 제대로 평가할 수 없게 된다는 점에서 문제가 된다.

또한 다른 새로운 데이터에 대해서 잘 할 수 있는지 알 수 없다.

 

따라서 test data는 학습과 모델 선택이 모두 끝난 뒤 마지막에 최종 성능을 확인하는 용도로 사용해야 한다.

 

 

Validation data

따라서 필요한 것은 validation data이다.

validation data는 traning data의 일부를 따로 떼어내서 만든다.

이 데이터는 모델의 weight와 bias, 즉 하이퍼파라미터를 직접 업데이트 하는 데 사용하지 않는다.

이는 gradient 계산에는 참여하지 않는다는 것이다.

 

대신 몇 epoch까지 학습할지, 어떤 모델 구조를 사용할지, learning rate를 어떻게 설정할지 등 정할 때 사용한다.

모델이 학습을 통해 자동으로 찾는 값이 아니라, 사람이 정하거나 실험을 통해 선택해야 하는 값인 하이퍼파라미터를 정하는 것이다.

 

epoch 수
learning rate
batch size
layer 개수
node 개수
모델 구조

 

이러한 값들이 hyperparameter에 해당한다.

 

조금 더 쉽게 비유하면 이렇게 볼 수 있다.

training data   → 연습 문제
validation data → 모의고사 문제
test data       → 수능 문제
 

연습 문제로 공부를 하고, 모의고사를 보면서 공부 방향을 조정한다.
그리고 마지막 수능 문제로 최종 실력을 평가한다.

딥러닝에서도 마찬가지이다.

Training data로 모델을 학습시키고, validation data로 학습 방향이나 모델 구조를 선택한다.
그리고 모든 선택이 끝난 뒤 test data로 최종 성능을 확인한다.

 

Validation data는 특히 epoch을 정할 때 많이 사용된다.

모델을 학습시키면 training loss는 계속 줄어들 수 있지만 validation loss는 어느 순간부터 다시 증가할 수 있다.

이 경우 모델이 training data에 과하게 맞춰지고 있다는 의미일 수 있다.

 

따라서 학습을 멈추는 기준은 training loss가 아니라 validation loss를 기준으로 잡는 것이 좋다.

예를 들어 validation loss가 가장 낮았던 epoch이 있다면, 그 시점의 모델을 선택할 수 있다.
이런 방식을 early stopping이라고 한다.

 

다만 validation data를 사용한다고 해서 완벽한 방법이 되는 것은 아니다.
Validation loss를 기준으로 hyperparameter를 고르는 것이기 때문에, 어느 정도 validation data에 맞춰지는 현상은 생길 수 있다.

 

Test data는 끝까지 남겨두고, validation data를 중간 점검용으로 사용하는 것이 더 안전하다.

 

 

Validation data는 모델 구조를 선택할 때도 사용할 수 있다.

 

예를 들어 모델 1과 모델 2가 있을 때, 모델 2는 훨씬 복잡한 모델이라 training loss를 더 잘 줄일 수 있다.
하지만 validation loss를 확인했을 때 모델 1의 validation loss가 더 낮다면, 모델 1을 선택하는 것이 더 낫다.

왜냐하면 우리가 원하는 것은 training data를 잘 외우는 모델이 아니라, 처음 보는 데이터에 잘 일반화되는 모델이기 때문이다.

 

즉, 모델을 고를 때는 training loss가 아니라 validation loss를 기준으로 판단해야 한다.

 

Validation data의 한계

그런데 데이터가 적을 때는 validation data를 따로 떼어내는 것도 부담이 될 수 있다.

 

예를 들어 전체 데이터가 120개밖에 없다고 해보자.
이 중에서 test data로 20개를 따로 빼두면, training에 사용할 수 있는 데이터는 100개가 남는다.

전체 데이터 120개
training data 100개
test data 20개
 

그런데 이 100개 중에서 다시 validation data를 20개 떼어낸다면, 실제 학습에 사용하는 데이터는 80개밖에 남지 않는다.

데이터가 충분히 많다면 괜찮지만, 데이터가 적을 때는 이 20개도 아쉬울 수 있다.

 

또 다른 문제는 validation data가 편향될 수 있다는 점이다.

 

예를 들어 강아지와 고양이를 분류하는 데이터가 있다고 하자.
1.jpg부터 100.jpg까지 training data가 있는데, 이 중 앞의 20개를 validation data로 사용한다고 해보자.

 

그런데 우연히 앞의 20개가 전부 강아지 사진이라면 어떻게 될까?

그러면 validation data는 고양이에 대한 정보를 제대로 담고 있지 않게 된다.


이 validation data를 기준으로 모델을 고르면, 모델이 강아지 데이터에 더 유리한 방향으로 선택될 수 있다.

 

즉, validation data가 전체 데이터를 잘 대표하지 못하면 모델 선택도 편향될 수 있다.

이런 문제를 줄이기 위해 사용하는 방법이 K-fold cross validation이다.

 

 

K-Fold Cross Validation

K-fold cross validation은 데이터를 K개의 묶음으로 나눈 뒤, validation data의 위치를 바꿔가며 여러 번 학습과 검증을 반복하는 방법이다.

 

예를 들어 K를 5로 설정했다고 하자.

아까 training data가 100개 있다고 했으므로, 이를 5개의 fold로 나눈다.

전체 training data 100개

Fold 1: 1번 ~ 20번
Fold 2: 21번 ~ 40번
Fold 3: 41번 ~ 60번
Fold 4: 61번 ~ 80번
Fold 5: 81번 ~ 100번
 

5-fold cross validation에서는 이 중 하나의 fold를 validation data로 사용하고, 나머지 4개의 fold를 training data로 사용한다.

 

첫 번째 학습에서는 Fold 1을 validation data로 사용한다.

Validation: Fold 1
Training:   Fold 2 + Fold 3 + Fold 4 + Fold 5
 

 

두 번째 학습에서는 Fold 2를 validation data로 사용한다.

Validation: Fold 2
Training:   Fold 1 + Fold 3 + Fold 4 + Fold 5
 

 

이런 식으로 validation data의 위치를 계속 바꿔가며 총 5번 학습한다.

1번째: Fold 1 검증, 나머지 훈련
2번째: Fold 2 검증, 나머지 훈련
3번째: Fold 3 검증, 나머지 훈련
4번째: Fold 4 검증, 나머지 훈련
5번째: Fold 5 검증, 나머지 훈련
 

 

이렇게 하면 특정 validation data 하나에만 의존하지 않아도 된다.
각 데이터가 한 번씩 validation data 역할을 하게 되므로, validation 결과가 특정 구간에 치우치는 문제를 줄일 수 있다.

 

K-Fold에서 validation loss 평균 구하기

K-fold cross validation을 하면 총 K개의 validation loss가 나온다.

 

5-fold라면 validation loss가 5개 나온다.

Validation loss 1
Validation loss 2
Validation loss 3
Validation loss 4
Validation loss 5
 

 

이 5개의 validation loss를 평균내면, 해당 모델 또는 hyperparameter 설정이 전반적으로 얼마나 좋은지 판단할 수 있다.

평균 validation loss
= 5개 validation loss의 평균
 

이 평균 validation loss가 낮을수록 더 좋은 설정이라고 볼 수 있다.

중요한 점은 특정 validation split 하나만 보고 판단하지 않는다는 것이다.

여러 validation 조합에서의 성능을 평균내기 때문에, 더 안정적으로 모델을 평가할 수 있다.

 

 

K-Fold로 hyperparameter 선택하기

K-fold cross validation은 hyperparameter를 선택할 때 사용할 수 있다.

예를 들어 hyperparameter 세트가 3개 있다고 하자.

세트 1: learning rate = 0.01, batch size = 32, 모델 구조 A
세트 2: learning rate = 0.001, batch size = 32, 모델 구조 B
세트 3: learning rate = 0.001, batch size = 64, 모델 구조 C
 

이제 각 세트에 대해 5-fold cross validation을 수행한다.

 

세트 1에 대해 5번 학습하고, validation loss 5개를 구한 뒤 평균을 낸다.
세트 2도 똑같이 5번 학습하고 평균 validation loss를 구한다.
세트 3도 같은 방식으로 평균 validation loss를 구한다.

 

그러면 최종적으로 세 개의 평균 validation loss가 나온다.

세트 1의 평균 validation loss
세트 2의 평균 validation loss
세트 3의 평균 validation loss
 

이 중 평균 validation loss가 가장 낮은 세트를 선택하면 된다.

 

즉, K-fold cross validation은 특정 validation data 하나에만 의존하지 않고, 여러 validation 조합을 사용해 hyperparameter를 더 안정적으로 선택하는 방법이다.

 

 

Hyperparameter를 고른 뒤에는 어떻게 할까?

K-fold cross validation을 통해 hyperparameter를 골랐다면, 그 다음에는 선택된 hyperparameter로 모델을 다시 학습시킬 수 있다. 이때는 validation data를 따로 떼어내지 않고, training data 전체를 사용해서 새롭게 학습시키기도 한다.

 

예를 들어 처음에 test data 20개를 따로 빼두고, training data 100개로 K-fold cross validation을 했다고 하자.
K-fold를 통해 가장 좋은 하이퍼파라미터를 고르고, 그것을 사용해 training data 100개 전체로 모델을 다시 학습시킬 수 있다.

왜냐하면 validation data의 목적은 hyperparameter를 정하는 것이기 때문이다.


이미 hyperparameter를 정했다면, 이제는 validation data를 따로 남겨둘 필요가 줄어든다.

데이터가 적을수록 training data 전체를 사용해서 최종 모델을 다시 학습시키는 것이 도움이 될 수 있다.

 

그 후 마지막으로 남겨두었던 test data 20개를 사용해 최종 성능을 평가한다.

 

정리하면 순서는 다음과 같다.

1. 전체 데이터에서 test data를 먼저 분리한다.
2. 남은 training data로 K-fold cross validation을 한다.
3. 평균 validation loss가 가장 낮은 hyperparameter를 고른다.
4. 선택된 hyperparameter로 training data 전체를 다시 학습한다.
5. 마지막에 test data로 최종 평가한다.
 

여기서도 test data는 끝까지 건드리지 않는 것이 중요하다.

 

Ensemble 앙상블

K-fold cross validation 과정에서는 fold마다 하나씩 모델이 만들어진다.

5-fold라면 총 5개의 모델이 만들어진다.


이 모델들은 서로 다른 training data 조합을 보고 학습했기 때문에, 서로 조금씩 다른 판단을 할 수 있다.

 

이때 5개의 모델을 버리지 않고 더 좋은 성능을 위해 함께 사용하는 방법을 앙상블이라고 한다.
Ensemble은 여러 모델의 예측 결과를 합쳐서 최종 판단을 내리는 방식이다.

 

가장 단순한 방법은 majority voting, 즉 다수결이다.

 

예를 들어 강아지와 고양이를 분류한다고 하자.
하나의 사진을 5개의 모델에 모두 보여준다.

모델 1 → 강아지
모델 2 → 강아지
모델 3 → 고양이
모델 4 → 고양이
모델 5 → 고양이
 

이 경우 고양이라고 판단한 모델이 3개이므로, 최종 결과를 고양이로 정한다.

이것이 hard voting 방식이다.

 

또 다른 방법으로 soft voting이 있다.

Soft voting은 단순히 어느 클래스라고 말했는지만 보는 것이 아니라, 각 모델이 출력한 확률값을 평균내는 방식이다.

 

예를 들어 어떤 모델은 강아지일 확률을 99%라고 하고, 다른 모델은 고양이일 확률을 51%라고 할 수 있다.
이 경우 단순한 한 표로만 보면 정보가 부족할 수 있다.

Soft voting은 이런 확률값까지 반영해서 최종 예측을 정한다.

 

즉, K-fold cross validation으로 hyperparameter를 고른 뒤 최종 모델을 하나 다시 학습시킬 수도 있고, K-fold 과정에서 만들어진 여러 모델을 ensemble해서 사용할 수도 있다.

 

K-Fold Cross Validation의 핵심

K-fold cross validation 자체는 데이터를 K개의 fold로 나누고, validation fold를 바꿔가며 검증하는 방식이다.

즉, 핵심은 다음과 같다.

데이터를 K개로 나눈다.
각 fold를 한 번씩 validation data로 사용한다.
나머지 fold는 training data로 사용한다.
각 validation loss를 구한다.
그 평균으로 성능을 판단한다.
 

이 방법을 이용해서 hyperparameter를 고를 수 있다.
다만 hyperparameter 선택은 K-fold cross validation의 활용 방식 중 하나라고 보면 된다.

 

즉, K-fold cross validation은 “데이터를 어떻게 나누어 검증할 것인가”에 대한 방법이고, 이를 이용해 모델 선택이나 hyperparameter 선택을 할 수 있다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

LIST