Data/머신러닝 & 딥러닝

심층 신경망 성능 향상시키기(1) / Train, Dev, Test sets

빛날희- 2021. 8. 2. 22:45

부스트 코스의 딥러닝 2단계: 심층 신경망 성능 향상시키기 강의를 수강하며 내용정리한 포스팅입니다.


▶ Train/ Dev/ Test sets의 역할과 데이터 분할

 

train, dev, test 셋을 정하는 것은 알고리즘의 편향과 분산을 더 효율적으로 측정할 수 있도록 하기 때문에 모델의 성능을 높이기 위한 과정을 효율적으로 만든다. 즉 세 세트를 잘 설정하는 것만으로 모델의 성능향상에 긍정적으로 기여할 수 있다. 

 

일반적으로 모델링할 때, train 데이터로 모델을 학습시키고 dev 데이터 셋으로 다양한 모델 중 어떤 모델의 성능이 좋은지 테스트한다. dev 데이터 셋을 통해 나온 최적의 학습성능을 가진 모델로 test 데이터 셋에서 모델의 비편향을 추정하고 모델이 얼마나 잘 작동하는지 확인한다. 

 

머신러닝에서는 통상 학습데이터를 70%, test(dev) 데이터를 30%로 설정하는 것이 오랜시간 연구되어오면서 찾게된 관행이었다. 그러나 딥러닝에서는 train의 비중을 더욱 키우고 dev와 test 데이터는 최적의 모델을 찾고 검증해보는 용도로 상대적으로 작은 비중을 사용하기도 한다. 일반적으로 딥러닝에선 100만 개 샘플 이상의 매우 큰 크기의 데이터셋을 사용하기 때문에 train을 98%, dev와 test 셋을 각각 1%씩 분할하기도하며 train을 99%, dev와 test는 0.5%씩 분할하기도한다.

 

그러나 데이터의 크기가 그리 크지 않은 경우엔 머신러닝에서 통상적으로 사용되어 온 분할 크기로 train셋에 70, dev셋에 30을 사용하는 경우가 있기도 하다. 이렇게 데이터를 분할하는 경우 dev셋이 test셋이라고 불리기도 하며, 비편향 추정이 필요없을 경우 이렇듯 test 데이터셋을 따로 구축하지 않을 수 있다. 

 

 

 

▶ 좋은 데이터 분할이란

데이터를 나눌 때 신경써야 하는 부분은 바로 train과 test 사이의 분포를 일치시켜야한다는 것이다. 

 

사용자의 증상에 해당하는 병명을 분류하는 모델이 있다고 해보자. 우리가 만일 train 데이터 셋으로 사용자가 직접 입력한 증상텍스트를 사용하고 test 데이터 셋으로 환자의 증상에 대해 의사가 전문적인 용어를 사용해 기술한 텍스트를 사용한다면 test 셋에서 그 성능이 낮아질 수 밖에 없다. train셋에는 환자가 일상적으로 사용하는 용어로 서술된 증상이 있는 반면 test 셋에는 의학적인 용어로 서술된 증상이 있어 두 데이터 간 텍스트의 특징이 다르기 때문이다. 따라서 train에서 사용자 중심의 증상 텍스트를 사용한다면 test에서도 사용자 중심의 증상 텍스트를 사용함으로써 두 데이터 간 분포를 일치시켜야한다. 

 

dev 데이터가 있다면 dev와 test 데이터 간의 분포만 일치시키고 train 데이터 셋에는 그 외의 데이터들을 추가하여 양을 늘려 학습시킬 수 도 있다. 그러나 이 경우에도 역시 train의 분포를 나머지 두 데이터 셋의 분포와 일치시킬때 그 성능이 향상된다는 점은 기억해두어야 한다.