[비전공자를 위한 딥러닝] 3.2 엄한 교육 vs 느슨한 교육 - 오버피팅 문제

 


모델을 "잘" 학습시킨다는 건 무엇을 의미할까?

단순히 에포크를 높여 데이터셋을 여러 번 학습하면 될까? 모델이 학습을 많이하면 성능이 조금씩이나마 계속 증가하지 않을까?

여기까지 잘 따라온 비전공 독자라면 위의 답변에 동의할지도 모른다. 왜냐하면 우리가 다뤘던 학습이란 "엄한 교육"이었기 때문이다. 순전파를 통해 비용을 계산하고, 비용을 역전파시키며 가중치들을 각각 최적의 위치로 업데이트시켜가는 과정이 학습이었다.

하지만 과연 이게 학습의 전부일까? 사실 딥러닝이 유행하기 훨씬 이전에 머신러닝에서부터 오버피팅(overfitting) 문제는 항상 존재했다. 이 장에서는 오버피팅 문제와 그 해결책인 "느슨한 교육"에 대해 알아보자.





개와 고양이 이미지를 분류하는 모델을 학습시키려고 하는 학생 A의 경우를 생각해보자.
A는 열심히 데이터를 수집했지만 결과적으로 다음과 같은 데이터셋(데이터 집합)을 얻게 되었다.
  • 개가 있는 이미지의 경우 낮에 찍힌 사진과 밤에 찍힌 사진이 골고루 있다.
  • 고양이가 있는 이미지의 경우 낮에 찍힌 사진만 있다.

이러한 경우에 학습을 진행했을 때 어떤 결과가 나올까?




A가 학습한 모델을 가지고 사진을 촬영하면 개인지 고양이인지 알려주는 앱으로 만들었다고 하자. 개와 고양이를 키우는 친구에게 사용해보라고 보내준다면, 다음과 같은 피드백을 받을 것이다.
  • 개를 촬영할 경우 아주 잘 예측한다.
  • 고양이를 촬영할 경우 낮에 찍은 사진은 보통 잘 예측하는데, 밤에 찍은 사진은 대부분 개라고 예측한다.

왜 이런 현상이 일어날까?
학습을 진행하면서 모델이 (정확히는 모델 속의 가중치들이) 최적화되는데, 그 최적화되는 대상은 바로 입력으로 주어지는 데이터셋이다. 즉, 데이터셋의 전반적인 특징들을 학습하여서, 추론을 할 때 새로운 데이터가 들어오면 학습된 특징들을 사용해 개인지 고양이인지 판단하는 것이다.

따라서 학습을 할 때 데이터셋에 밤에 찍은 고양이 사진이 존재하지 않았기 때문에, 학습이 끝난 뒤 추론을 진행할 때 밤에 찍은 고양이 사진이 들어오면 고양이로 잘 예측하지 못하는 것이다. 모델의 입장에서 생각해보면, 입력되는 이미지의 다양한 특성들을 파악하면서 학습을 하고 있는데, 밤에 찍은 이미지가 들어올 때마다 단 한 번의 예외도 없이 정답이 ‘개’인 것이다. 그러면 당연히 밤에 찍은 사진에 대해서 ‘개’라고 예측하는 방향으로 학습이 진행되지 않을까? 최소한 ‘밤’이라는 특성과 ‘개’라는 특성이 매우 가까운 관계를 가질 것이다.



이렇게 학습을 진행하면서 모델이 데이터셋에 최적화되는 것을 적합(fit) 혹은 피팅(fitting)이라고 한다. 이때 모델이 데이터셋에 너무(over) 피팅되어서, 데이터셋과 조금만 다른 데이터가 들어와도 예측을 잘 못하는 경우가 생긴다. 이것이 바로 과적합, 혹은 오버피팅(overfitting)이다.

데이터셋에 포함된 개와 고양이 이미지들이, 현실에 존재하는 다양한 개와 고양이 이미지들을 대표할 수 있다면 오버피팅이 발생하지 않을 수 있다. 다시 말해 밤에 찍은 고양이 이미지들을 추가로 확보해 데이터셋에 포함해준다면 좀 더 좋은 모델을 만들 수 있다. 학습에 사용된 데이터셋과 조금 다른 데이터에 대해서도 잘 예측을 하는 모델을 일반화된(generalized) 모델이라고 한다.

하지만 현실적으로 학습이 끝난 뒤 모델을 사용할 때, 즉 추론을 할 때 어떤 이미지들이 들어올지 전부 알 수는 없고, 알 수 있다고 하더라도 그 광범위한 데이터를 수집하기는 힘들 것이다. 다행히도 오버피팅을 피하고 일반화된 모델을 만들 수 있는 학습 방법들이 존재한다. 이 방법들에 대해서 알아보자.




1. 데이터셋 분할

가장 단순하면서도 대부분이 기본적으로 사용하는 방법은 데이터셋 분할(dataset split)이다. 간단히 말해 수집된 데이터셋 중에 20%를 따로 떼어내 시험 데이터셋(test set)으로 두는 것이다. 나머지 80%의 데이터셋을 훈련 데이터셋(train set)이라고 하는데, 이 훈련 데이터셋만 가지고 학습을 진행한다. 학습이 끝난 후에 미리 떼어둔 시험 데이터셋으로 모델의 일반화 성능을 테스트할 수 있다.




미니배치가 하나씩 학습되면서 손실(loss)이 계산되는데, 데이터 1개에서 구한 오류(error)의 합을 손실이라고 한다고 보면 된다. 1 에포크가 지나고 전체 데이터의 오류를 합한다면 비용(cost)이 된다. 무언가 잘못된 경우가 아니라면, 일반적으로 학습이 진행됨에 따라 모델이 점차 훈련 데이터셋에 적합해지면서 손실은 감소할 것이다.

하지만 학습이 끝난 뒤 시험 데이터셋으로 모델을 테스트해보면 학습 중 마지막으로 확인한 손실보다 크게 나올 것이다. 학습 당시에 한 번도 들어온 적이 없는, 모델이 한 번도 본 적이 없는 시험 데이터셋이 들어왔기 때문에 어느 정도 일반화가 되었다 하더라도 어느 정도 예측을 덜 잘할 수밖에 없는 것이다. 사실은 학습 중 매 에포크 마다 확인한 훈련 정확도(train accuracy)보다, 학습이 끝난 뒤의 시험 정확도(test accuracy)가 모델에 대한 객관적인 평가라고 할 수 있다.

1장의 비유를 다시 가져와보자. 문제지 10권 중 8권을 기계에게 주면서 반복 학습을 시키는 것이다. 예측하고 정답과의 차이를 구해 더 정확한 예측을 하게 되는 과정을 반복하면서, 기계는 8권의 문제지에 적합(fit)해진다. 학습이 끝난 후에 나머지 2권의 문제지를 주면서 어디 한 번 실력을 테스트해보면 객관적인 기계의 문제해결력을 확인할 수 있는데, 그 점수는 당연히 8권을 점점 잘 풀다가 맞은 최고 점수보다는 낮을 것이다.



자, 이렇게 학습이 끝난 뒤 모델의 일반화 성능을 테스트할 수 있게 되었다. 하지만 학습이 진행되고 있는 중에 학습이 잘 되고 있는지, 또 학습을 어느 순간에 그만둬야 하는지를 판단하기는 힘들다. 최대 에포크를 각각 1~100까지 준 100가지 학습을 진행한 뒤 그 결과를 확인한다면 비교가 가능하겠지만, 너무 비효율적이다.




그렇다면 80%로 떼어낸 훈련 데이터셋에서 또다시 20%를 떼어내, 검증 데이터셋(validation set)을 만들어 매 에포크 마다 테스트해보자. 즉, 매 에포크 마다 60%의 훈련 데이터셋으로 모델을 학습하고, 학습 시에 한 번도 본 적이 없는 20%의 데이터로 검증을 하는 것이다. 데이터셋을 나누어 학습을 진행하는 절차를 요약해보면 다음과 같다.



이렇게 하면 학습이 진행되면서 훈련 데이터셋에 모델이 적합되어가는 정도와, 그 모델의 일반화 성능이 변해가는 정도를 동시에 확인할 수 있게 된다.



위와 같이 훈련 데이터셋의 손실이 점차 낮아지면서, 검증 데이터셋의 손실도 함께 낮아지는 것이 이상적인 학습 상황이라고 할 수 있다.



하지만 위와 같이 훈련 데이터셋의 손실은 점차 낮아지는데, 검증 데이터셋의 손실이 어느 순간부터 오히려 높아지는 경우가 생길 수 있다. 이것이 바로 오버피팅이 발생하는 지점이라고 볼 수 있다. 즉, 모델이 훈련 데이터셋에 과하게 적합되어서, 학습에 사용되지 않은 검증 데이터셋에 대해서는 예측을 잘 못하게 되는 것이다. 이럴 경우에는 단순히 그 지점에서 학습을 중단하는 조기 중단(early stopping)을 통해 그나마 덜 오버피팅된 모델로 만족할 수도 있고, 뒤에 설명할 다양한 오버피팅 방지법들을 활용해 새로 학습하는 방법이 있다.



반대로 훈련 데이터셋의 손실이 낮아지지도 않고 심지어 검증 데이터셋의 손실이 더 낮은 경우도 발생할 수 있는데, 이는 과소적합(underfitting)이 발생한 경우다. 대부분 데이터의 양이 너무 작거나, 모델이 너무 단순해서 데이터셋의 특징을 잘 추출하지 못하는 경우에 발생한다.




2. 데이터 증강

일반적으로 데이터의 수가 많으면 오버피팅은 잘 발생하지 않는다. 정확하게는 데이터가 현실에 존재하는 다양한 형태들을 빠짐 없이 잘 아우르고 있을 경우에 오버피팅이 발생하지 않는다. 위의 예시에는 밤에 찍힌 고양이 사진이 데이터셋에 없기 때문에, 밤에 찍힌 고양이 사진에 대해서는 예측을 못하는 상황이다. 그렇다면 밤에 고양이를 찍으러 돌아다녀야하는 수밖에 없는 걸까? 다행히도 컴퓨터 소프트웨어적으로 해결하는 방법이 있다. 이미지를 모델에 넣기 전에 인위적인 필터들을 사용해 변형(transform)을 시키는 것이다.

이때 필터를 아무 거나 쓰는 것이 아니라, 우리가 가진 데이터셋을 살펴본 뒤 어떤 부분을 보완해야할 지 고민해서 선택하는 것이다. 위의 예시에서는 밤에 찍힌 고양이 사진이 없기 때문에, 이미지의 노출(exposure), 밝기(brightness)를 변경하는 필터를 사용하면 도움이 될 수 있다. 낮에 찍은 고양이 사진들 중 일부를 어둡게 만들어 모델에 넣어준다면, 밤에 찍힌 고양이 사진을 데이터셋에 추가하는 것과 유사한 효과를 낼 것이라 짐작할 수 있다.

이러한 필터 변환은 일반적으로 무작위(random)로 일어나게 지정한다. 즉, 이미지가 모델에 들어갈 때 일정한 확률로 이러한 변환이 실행되게 하는 것이다. 주의할 점은 이렇게 하면 데이터셋의 이미지 형태가 다양해지기 때문에, 에포크를 더 늘려줘야한다는 것이다. 그 이전에 데이터셋을 20바퀴 돌려서 어느 정도 학습이 되었다면, 변환들이 추가된 이후에는 30바퀴는 돌려야 데이터셋의 늘어난 다양성까지 잘 학습할 수 있게 되는 것이다.

가장 많이 사용되는 데이터 증강 라이브러리 중 하나인 albumentations의 변환들이 이미지를 어떻게 바꾸는지 살펴볼 수 있는 링크를 소개한다.




3. 일반화 항 추가

머신러닝에 대해 검색하다 보면 L1-놈(norm), L2-놈(norm) 등의 용어를 본 적이 있을 것이다.


아주 간단하게만 언급하고 넘어가자면, 손실 혹은 비용을 계산할 때 가중치들의 값을 더하는 것이다. L1의 경우 절대값을, L2의 경우 제곱한 값을 더하게 된다. 비용의 왼쪽에 있는 오차제곱항의 경우 시그마는 '모든 데이터에 대해서 더해라'는 의미고, 일반화 항에 있는 시그마는 '모든 가중치들에 대해서 더해라'는 의미다.


손실과 비용이란 모델이 학습할 때 줄여나가는 것을 목적으로 하는 것이기 때문에, 이 일반화 항은 가중치들의 값이 줄어드는 방향으로 영향을 준다.

학습을 진행하다보면 특정한 가중치의 값이 지나치게 커져서, 추출된 수많은 특성들 중 단 몇 개만 사용해서 예측을 하게 되는 경우가 생길 수 있다. 위의 예시의 경우, '밤'이라는 특성이 활성화된다면 무조건 '개'라고 예측하는 경우를 생각하면 된다. 만약 학습을 진행할 때 L2-놈과 같은 일반화 항이 비용 함수에 포함되어 있었다면, 특정한 가중치가 비약적으로 큰 값을 갖게 되는 것을 견제하기 때문에, 조금 더 일반화된 모델을 얻을 수 있었을 것이다.




4. 드롭아웃

드롭아웃(dropout)이란 학습을 진행할 때 무작위적으로 지정한 층에 있는 몇 개의 노드를 누락시키는 방법이다.

5개의 노드 중 1개가 드롭아웃 되도록 확률(비율)을 0.2로 설정한 경우


누락되는 노드는 순전파가 일어날 때마다, 즉 새로운 미니배치가 입력될 때마다 지정한 비율만큼 무작위적으로 선택된다. 이렇게 되면, 매 학습이 일어날 때마다 일정한 수의 다른 노드들이 학습에서 배제되게 된다. 일반화 항을 추가하여 특정한 가중치가 비약적으로 큰 값을 갖게 되는 것을 방지하는 것과 비슷하게, 드롭아웃을 통해 모델의 학습이 특정한 노드(특성)들에만 집중되는 일을 방지할 수 있다.

쉽게 말해 학습을 진행할 때 무작위로 몇 개의 부품을 빼고 진행하면서, 특정한 부품 없이도 전반적으로 잘 예측할 수 있는 일반화된 모델을 만들어가는 것이다. 주의할 점은 한 에포크가 끝난 뒤에 검증(validation)을 할 때나, 모든 학습이 끝난 뒤 테스트(test)를 할 때에는 드롭아웃을 적용하지 않고 모든 부품을 다 사용해야한다는 것이다.






이 외에도 오버피팅을 방지하는 다양한 방법들이 있다. 다양한 방법들을 공부하는 것도 좋지만, 더 중요한 것은 이러한 방법들의 목적을 정확히 아는 것이라고 생각한다.
모델은 훈련 데이터셋만으로 학습을 진행하는데, 학습이 너무 엄하고 지나치게 되면 오버피팅이 발생한다. 따라서 학습을 진행할 때, 너무 과하게 학습하지 않도록 오히려 학습에 방해가 되는 장치들을 마련한다. 학습 자체가 불가능해질 정도는 아니지만, 훈련 데이터셋 외의 데이터에 대해서도 예측이 가능한 일반화된 모델을 만드는 것이 목적이다. 모델이 어떤 문제를 해결하는지에 따라, 또 다루는 데이터셋의 특징에 따라 다양한 일반화 방법이 사용되는데, 언제나 핵심은 '적당히 느슨하게' 모델을 학습하는 것이다. 



댓글 쓰기

0 댓글