5.1 일반화 : 머신 러닝의 목표
머신러닝의 근본적인 이슈 : 최적화와 일반화 사이의 줄다리기
ㄴ 최적화(optimization)는 가능한 훈련 데이터에서 최고의 성능으 얻으려고 모델을 조정하는 과정
ㄴ 일반화(generalization)는 훈련된 모델이 이전에 본 적없는 데이터에서 얼마나 잘 수행되는지 의미
5.1.1 과소적합과 과대적합
훈련 초기에 최적화와 일반화는 상호 연관되어 있음. 훈련데이터의 손실이 낮아질수록 테스트 데이터의 손실도 낮아짐 → 과소적합(underfitting)
훈련 데이터에서 훈련을 특정 횟수만큼 반복하고 난 후에는 일반화 성능이 더 이상 높아지지 않으며 검증 세트의 성능이 멈추고 감소되기 시작함 → 과대적합(overfitting)
5.1.2 딥러닝에서 일반화의 본질
매니폴드(manifold) : 선형(유클리드) 공간과 비슷하게 보이는 부모 공간의 저차원 부분공간
ㄴ 예) 평면상의 매끄러운 한 곡선은 2D 공간 안에 있는 1D 매니폴드이다.
매니폴드 가설
- 머신 러닝 모델은 가능한 입력 공간 안에서 비교적 간단하고, 저차원이며, 매우 구조적인 부분 공간(잠재 매니폴드(latent manifold))만 학습하면 된다.
- 이런 매니폴드 중 하나 안에서 두 입력 사이를 보간(interpolation)하는 것이 항상 가능하다. 즉, 연속적인 경로를 따라 한 입력에서 다른 입력으로 변형할 때 모든 포인트가 이 매니폴드에 속한다.
샘플 사이를 보간하는 능력은 딥러닝에서 일반화를 이해하는 열쇠이다.
(14장에서 자세히 다룰 예정)
지역 일반화(local generalization) : 근사적으로 학습된 데이터 매니폴드에서 보간을 통해 딥러닝의 일반화가 달성되지만 보간이 일반화의 전부라고 가정하는 것은 실수다. 보간은 이전에 본 것과 매우 가까운 것을 이해하는 데 도움을 줄 수 있을 뿐이다.
궁극 일반화(extreme generalization) : 인지 메커니즘은 추상화, 세상에 대한 상징적 모델, 추론, 논리, 상식, 일반적으로 이성이라고 부르는 세상에 대한 선천적 능력 등을 말하며 직관이나 패턴 인식과는 다르다. 후자는 사실상 대체로 보간에 해당하지만 전자는 그렇지 않다.
딥러닝이 작동하는 이유
잠재 매니폴드를 학습하는 데 특히 잘 맞는 몇 가지 속성이 있다.
- 딥러닝 모델은 입력에서부터 출력으로 매끄럽고 연속적인 매핑을 구현한다. 필수적으로 미분 가능해야 하기 때문에 매끄럽고 연속적이어야 한다(그렇지 않으면 경사 하강법을 사용할 수 없다). 이런 매끄러움은 동일한 속성을 가진 잠재 매니폴드를 근사하는 데 도움이 된다.
- 딥러닝 모델은 (모델 구조에 대한 가정을 바탕으로) 훈련 데이터에 있는 정보의 형태를 반영하는 식으로 구조화되는 경향이 있다. 특히 이미지 처리 모델(8~9장)과 시퀀스 처리 모델(10장)에서 그렇다. 더 일반적으로 심층 신경망은 학습한 표현을 계층적이고 모듈 방식으로 구조화되며 이는 자연적인 데이터가 구성되는 방식을 반영한 것이다.
가장 중요한 훈련 데이터
- 데이터가 보간할 수 있는 매니폴드를 형성하는 경우에만 일반화할 수 있다.
- 특성이 유익하고 잡음이 적을수록 입력 공간이 더 간단하고 구조적이기 때문에 더 잘 일반화할 수 있다. 데이터 큐레이션(data curation)과 특성 공학(feature engineering)은 일반화에 필수적이다.
따라서 딥러닝 모델을 향상시키는 가장 좋은 방법은 더 좋고, 더 많은 데이터에서 훈련하는 것이다. 입력 데이터 매니폴드를 조밀하게 커버하면 일반화 성능이 더 좋은 모델을 만든다. 딥러닝 모델이 훈련 샘플 사이를 단순히 보간하는 것 이상을 수행하리라고 기대해서는 안된다. 따라서 가능한 쉽게 보간하기 위해 할 수 있는 모든 일을 해야 한다. 딥러닝 모델에서 찾게 될 것은 무엇을 모델이 넣었는지에 달려 있다. 바로 모델 구조에 인코딩된 가정과 훈련에 사용된 데이터다.
데이터를 더 수집하는 것이 불가능하면 차선책은 모델이 저장할 수 있는 정보량을 조정하거나 모델 곡선의 매끄러운 정도에 제약을 추가하는 것이다. 네트워크가 적은 개수의 패턴만 기억하거나 매우 규칙적인 패턴만 기억할 수 있다면 최적화 과정은 일반화 가능성이 높은 가장 눈에 띄는 패턴에만 모델의 초점을 맞추도록 할 것이다. 이런 방식으로 과대적합과 싸우는 과정을 규제(regularization)라고 한다. 5.4.4절에서 규제 기법에 대해 자세히 알아본다.
5.2 머신 러닝 모델 평가
5.2.1 훈련, 검증, 테스트 세트
검증 세트 없이 훈련 세트와 테스트 세트 2개만 사용하면 훨씬 간단하지만, 모델을 개발할 때 항상 모델의 설정을 튜닝하기 때문에 사용하지 않는다. 하이퍼파라미터를 변경하면서 검증 세트에서 모델의 성능을 평가하여 이런 튜닝을 수행한다. 본질적으로 이런 튜닝도 어떤 파라미터 공간에서 좋은 설정을 찾는 학습이다. 결국 검증 세트의 성능을 기반으로 모델의 설정을 튜닝하면 검증 세트로 모델을 직접 훈련하지 않더라도 빠르게 검증 세트에 과대적합될 수 있다.
데이터를 훈련, 검증, 테스트 세트로 나누는 것은 간단해 보일 수 있지만 데이터가 적을 때는 몇 가지 고급 기법을 사용하면 도움이 된다. 대표적인 세 가지 평가 방법인 단순 홀드아웃 검증(hold-out validation), K-겹 교차 검증(K-flod cross-validation), 셔플링(shuffling)을 사용한 반복 K-겹 교차 검증(iterated K-fold cross-validation)을 살펴본다.
단순 홀드아웃 검증
데이터의 일정량을 테스트 세트로 떼어 놓는다. 남은 데이터에서 훈련하고 테스트 세트로 평가한다.
K-겹 교차 검증
이 방식에서는 데이터를 동일한 크기를 가진 K개의 분할로 나눕니다. 각 분할 i에 대해 남은 K - 1개의 분할로 모델을 훈련하고 분할 i에서 모델을 평가한다. 최종 점수는 이렇게 얻은 K개의 점수를 평균한다. 이 방법은 모델의 성능이 데이터 분할에 따라 편차가 클 때 도움된다. 홀드아웃 검증처럼 이 방법은 모델의 튜닝에 별개의 검증 세트를 사용한다.
셔플링을 사용한 반복 K-겹 교차 검증
이 방법은 비교적 가용 데이터가 적고 가능한 정확하게 모델을 평가하고자 할 때 사용한다. K-겹 교차 검증을 여러 번 적용하되 K개의 분할로 나누기 전에 매번 데이터를 무작위로 섞는다. 최종 점수는 모든 K-겹 교차 검증을 실행해서 얻은 점수의 평균이다. 결국 P * K개(P는 반복 횟수)의 모델을 훈련하고 평가하므로 비용이 매우 많이 든다.
5.2.2 상식 수준의 기준점 넘기
사용할 수 있는 여러 평가 방법 외에도 마지막으로 알아야 할 것은 상식 수준의 기준점이다.
데이터셋으로 작업을 시작하기 전에 항상 넘어야 할 간단한 기준점을 정해야 한다. 이 임계값을 넘으면 제대로 하고 있음을 알 수 있다. 모델이 실제 입력 데이터에 있는 정보를 사용하여 일반화되는 예측을 만들고 있으므로 계속 진행할 수 있다. 이 기준점은 랜덤한 분류기의 성능이거나 머신 러닝을 사용하지 않고 생각할 수 있는 가장 간단한 방법이 될 수 있다.
예를 들어 MNIST 숫자 분류 예제에서 간단한 기준점은 (랜덤한 분류기의 성능인) 0.1보다 높은 검증 정확도입니다. IMDB 예제에서는 0.5보다 높은 검증 정확도입니다. 로이터 예제에서는 클래스가 불균형하므로 0.18~0.19 근처가 될 것입니다. 이진 분류 문제에서 90% 샘플이 클래스 A고 10%가 클래스 B에 속한다면 항상 클래스 A로 예측하는 분류기도 0.9의 검증 정확도를 달성합니다. 따라서 이보다 더 높은 성능을 내야 합니다.
이전에 아무도 해결하지 못했던 문제를 다룰 때 참고할 수 있는 상식 수준의 기준점을 가지는 것이 필수적입니다. 단순한 해결책보다 낫지 않다면 쓸모없는 모델입니다. 아마도 잘못된 모델을 사용하거나 처음부터 머신 러닝으로 해결할 수 없는 문제일지 모릅니다. 칠판으로 돌아가 처음부터 다시 생각해 보세요.
5.2.3 모델 평가에 대해 유념해야 할 점
평가 방식을 선택할 때 다음 사항을 유의해야 한다.
- 대표성 있는 데이터 : 훈련 세트와 테스트 세트가 주어진 데이터에 대한 대표성이 있어야 한다. 예를 들어 숫자 이미지를 분류하는 문제에서 샘플 배열이 클래스 순서대로 나열되어 있다고 가정하자. 이 배열의 처음 80%를 훈련 세트로, 나머지 20%를 테스트 세트로 만들면 훈련 세트에는 0~7 숫자만 담겨 있고 테스트 세트에는 8~9 숫자만 담긴다. 이런 이유 때문에 훈련 세트와 테스트 세트로 나누기 전에 데이터를 무작위로 섞는 것이 일반적이다.
- 시간의 방향 : 과거로부터 미래를 예측하려고 한다면(예를 들어 내일의 날씨, 주식 시세 등) 데이터를 분할하기 전에 무작위로 섞어서는 절대 안 된다. 이렇게 하면 미래의 정보가 누설되기 때문이다. 즉, 모델이 사실상 미래 데이터에서 훈련될 것이다. 이런 문제에서는 훈련 세트에 있는 데이터보다 테스트 세트에 있는 모든 데이터가 미래의 것이어야 한다.
- 데이터 중복 : 한 데이터셋에 어떤 데이터 포인트가 두 번 등장하면(실제 데이터셋에서 아주 흔한 일), 데이터를 섞고 훈련 세트와 검증 세트로 나누었을 때 훈련 세트와 검증 세트에 데이터 포인트가 중복될 수 있다. 이로 인해 훈련 데이터의 일부로 테스트하는 최악의 경우가 된다! 훈련 세트와 검증 세트가 중복되지 않는지 확인하자.
모델 성능을 신뢰 있게 평가할 수 있는 방법을 갖추면 머신 러닝의 핵심인 최적화와 일반화 사이의 긴장, 과소적합과 과대적합 사이의 균형을 모니터링할 수 있습니다.
5.3 훈련 성능 향상하기
최적적합 모델을 얻으려면 → 과대적합되어야 함 (경계가 어디인지 미리 알지 못하기 때문에 경계를 찾으려면 넘어가야 함)
문제를 다루기 시작할 때 초기 목표 : 약간의 일반화 능력을 보이고 과대적합할 수 있는 모델을 얻는 것
이런 모델을 얻고 난 후 과대적합과 싸워 일반화 성능을 개선하는 데 초점을 맞춤
이 단계에서 일반적으로 발생하는 세 가지 문제
- 훈련이 되지 않음 : 시간이 지나도 훈련 loss가 줄어들지 않음
- 훈련은 잘 시작되었으나 모델이 의미 있는 일반화를 달성하지 못함 : 상식 수준의 기준점을 넘어설 수 없음
- 시간이 지남에 따라 훈련과 검증 손실이 모두 줄어들고 기준점을 넘어설 수 있지만 과대적합되지 않을 것 같음. 여전히 과소적합 상태
이런 이슈를 해결하여 머신 러닝 프로젝트의 첫 번째 이정표(상식 수준의 기준점을 넘을 수 있어 약간의 일반화 능력이 있고 과대적합할 수 있는 모델을 얻는 것)를 달성하는 방법을 알아본다.
5.3.1 경사 하강법의 핵심 파라미터 튜닝하기
훈련이 시작되지 않거나 너무 일찍 중단되는 상황
이런 상황이 발생하면 항상 경사 하강법 과정에 대한 설정에 문제가 있음.
ㄴ 옵티마이저 선택, 모델 가중치의 초깃값 분포, 학습률, 배치 크기 (모든 파라미터는 상호 의존적)
ㄴ 일반적으로 학습률과 배치 크기를 튜닝하는 것으로 충분
30~40% 정도의 훈련 정확도와 검증 정확도에 빠르게 도달하지만 이를 넘어서지 못함.
비슷한 상황에 처했다면 다음을 시도해보라.
- 학습률을 낮추거나 높인다. 너무 높은 학습률은 이전 예제처럼 최적적합을 크게 뛰어넘는 업데이트가 일어날 수 있음. 너무 낮은 학습률은 훈련을 너무 느리게 만들어 멈추어 있는 것처럼 보일 수 있음.
- 배치 크기를 증가시킨다. 배치 샘플을 더 늘리면 유익하고 잡음이 적은 (분산이 낮은) 그레디언트가 만들어짐.
5.3.2 구조에 대해 더 나은 가정하기
모델이 훈련되지만 일반화되지 않는 상황
ㄴ 아마도 맞닥뜨릴 수 있는 최악의 머신 러닝 상황 - 접근 방식에 근본적으로 잘못된 무언가가 있다는 의미
- 단순하게 입력 데이터에 타깃 예측을 위한 정보가 충분하지 않을 수 있음. 즉, 현재 방식으로는 문제를 풀 수 없음.
- 현재 사용하는 모델의 종류가 문제에 적합하지 않을 수 있음. 즉, 구조에 대한 올바른 가정을 내려야 함.
5.3.3 모델 용량 늘리기
검증 손실이 정점에 도달해서 역전되지 않고 멈추어 있거나 매우 느리게 좋아지는 것 같음. 검증 손실이 0.26에 도달한 후 그 지점에서 정체되어 있음. 모델을 훈련했지만 훈련 데이터에서 여러 번 반복한 후에도 과대적합되지 못함.
항상 과대적합이 가능함. 훈련 손실이 줄어들지 않는 문제와 마찬가지로 이런 문제는 항상 해결할 수 있음.
과대적합할 수 없는 것처럼 보인다면 모델의 표현 능력이 부족한 것.
ㄴ 용량이 더 큰 모델이 필요. 즉, 더 많은 정보를 저장할 수 있는 모델 → layer 추가, layer 크기 증가, 현재 문제에 더 적합한 종류의 layer를 사용할 수 있음.
모델이 빠르게 훈련되고 8번째 에포크 이후에 과대적합되기 시작함.
5.4 일반화 성능 향상하기
5.4.1 데이터셋 큐레이션
데이터를 사용하여 샘플 사이를 부드럽게 보간할 수 있다면 일반화 성능을 가진 딥러닝 모델을 훈련할 수 있음.
근본적으로 불연속적(주어진 문제에 지나치게 잡음이 많거나 리스트 정렬)인 경우 딥러닝은 도움 X
적절한 데이터셋으로 작업하고 있는지 확인하는 것이 중요
- 데이터가 충분한지 확인. (입력에서 출력을 매핑하는 공간을 조밀하게 샘플링해야 함)
- 레이블 할당 에러 최소화. (입력을 시각화하여 이상치 확인, 레이블 교정)
- 데이터 정제와 누락된 값 처리. (다음 장에서 다룸)
- 많은 특성 중에서 어떤 것이 유용한지 확실하지 않다면 특성 선택 수행.
데이터의 일반화 가능성을 향상시키는 매우 중요한 한 방법은 특성 공학(feature engineering)이다.
5.4.2 특성 공학
특성 공학 : 데이터와 머신 러닝 알고리즘에 관한 지식을 사용하는 단계
모델에 데이터를 주입하기 전에 (학습이 아닌) 하드코딩된 변환을 적용하여 알고리즘이 더 잘 수행되도록 만들어 준다.
예를 들어 시계 바늘의 검은색 픽셀을 따라 각 바늘 끝의 (x, y) 좌표를 출력하는 간단한 파이썬 스크립트를 만든다.
그다음 간단한 머신 러닝 알고리즘을 사용하여 이 좌표와 적절한 시각의 관계를 학습할 수 있다.
다른 방법으로는 좌표를 바꾸어 (x, y) 포인트를 이미지 중심에 대한 극좌표(각 시계 바늘의 각도)로 나타낼 수 있다. 이렇게 특성을 준비하면 문제가 너무 쉬워져서 머신 러닝이 전혀 필요하지 않다. 간단한 반올림 연산과 딕셔너리 참조만으로 하루의 시간을 추정하기 충분다.
이것이 특성 공학의 핵심. 특성을 더 간단한 방식으로 표현하여 문제를 쉽게 만든다. 잠재 매니폴드를 더 매끄럽고, 간단하고, 구조적으로 만든다. 이렇게 하려면 일반적으로 해당 문제를 아주 잘 이해하고 있어야 한다.
딥러닝 이전에는 특성 공학이 머신 러닝 워크플로에서 가장 중요한 부분이었다. 전통적인 얕은 학습 방법의 알고리즘들은 스스로 유용한 특성을 학습할 만큼 충분히 넓은 가설 공간을 가지고 있지 않다. 따라서 알고리즘에 데이터를 표현하는 방식에 성공 여부가 달려 있다.
다행히 최신 딥러닝은 대부분 특성 공학이 필요하지 않다. 신경망이 자동으로 원본 데이터에서 유용한 특성을 추출할 수 있기 때문.
심층 신경망을 사용할 때 특성 공학에 대해 신경 써야하는 이유
- 좋은 특성은 적은 자원을 사용하여 문제를 더 멋지게 풀어낼 수 있다. 예를 들어 시계 바늘을 읽는 문제에 합성곱 신경망을 사용하는 것은 어울리지 않는다.
- 좋은 특성은 더 적은 데이터로 문제를 풀 수 있다. 딥러닝 모델이 스스로 특성을 학습하는 능력은 가용한 훈련 데이터가 많을 때 발휘됩니다. 샘플 개수가 적다면 특성에 있는 정보가 매우 중요해진다.
5.4.3 조기 종료 사용하기
딥러닝에서는 항상 지나치게 파라미터가 많은 모델을 사용.
즉, 잠재 매니폴드를 학습하기 위해 필요한 최소한 것보다 훨씬 많은 자유도를 가짐. 딥러닝 모델을 끝까지 훈련하지 않기 때문에 이런 과도한 파라미터는 문제가 되지 않는다. 모델을 끝까지 훈련하면 일반화가 전혀 되지 않을 것. 항상 훈련 손실이 최솟값에 도달하기 훨씬 전에 훈련을 중단하게 됨.
훈련 중 일반화 성능이 가장 높은 정확한 최적적합의 지점(과소적합과 과대적합 사이의 정확한 경계)을 찾는 것
ㄴ 일반화 성능을 향상시킬 수 있는 가장 효과적인 방법 중 하나.
이전 장의 예제에서 최상의 검증 점수를 내는 에포크 횟수를 찾기 위해 필요보다 오랫동안 모델을 훈련했다. 그다음 정확히 해당 에포크 횟수 동안 새로운 모델을 다시 훈련했다. 이것이 기본이지만 중복 작업이며 종종 많은 비용이 든다. 그 대신 에포크가 끝날 때마다 모델을 저장하고 최상의 에포크를 찾은 후 저장된 모델을 재사용할 수 있다.
케라스에서는 일반적으로 EarlyStopping 콜백(callback)을 사용하여 이를 처리한다. 검증 지표가 더 이상 향상되지 않으면 바로 훈련을 중지하고 그 전까지 최상의 검증 점수를 낸 모델을 남길 수 있다. (7장에서 콜백을 사용하는 방법 설명)
5.4.4 모델 규제하기
규제(regularization) 기법은 훈련 데이터에 완벽하게 맞추려는 모델의 능력을 적극적으로 방해하는 일련의 모범 사례.
ㄴ 모델의 검증 점수를 향상시키는 것이 목적
ㄴ 모델을 더 간단하고 더 평범하게, 곡선을 부드럽고 더 일반적으로 만드는 경향을 가지기 때문에 모델을 ‘규제’한다고 말함.
ㄴ 따라서 모델이 훈련 세트에 덜 특화되고 데이터의 잠재 매니폴드를 조금 더 가깝게 근사함으로써 일반화 능력을 높일 수 있음.
모델 규제는 항상 정확한 평가 절차를 따라야 하는 과정. → 측정이 가능한 경우에만 일반화를 달성할 수 있다.
가장 널리 사용되는 규제 기법을 알아보고 4장의 영화 분류 모델에 실제 적용하여 성능을 향상시켜 보겠습니다.
너무 작은 모델은 과대적합되지 않는다는 것을 이미 배웠습니다. 과대적합을 완화시키는 가장 간단한 방법은 모델 크기(층의 수와 층에 있는 유닛 개수로 결정되는 학습 가능한 파라미터 개수)를 줄이는 것입니다. 모델의 기억 용량에 제한이 있다면 훈련 데이터를 단순히 외워 버리지 못할 것입니다. 따라서 손실을 최소화하기 위해 타깃에 대한 예측 성능을 가진 압축된 표현을 학습해야 합니다. 정확히 이런 표현이 우리 관심 대상입니다. 동시에 기억해야 할 것은 과소적합되지 않도록 충분한 파라미터를 가진 모델을 사용해야 한다는 점입니다. 모델의 기억 용량이 부족해서는 안 됩니다. 너무 많은 용량과 충분하지 않은 용량 사이의 절충점을 찾아야 합니다.
안타깝지만 알맞은 층의 수나 각 층의 유닛 개수를 결정할 수 있는 마법 같은 공식은 없습니다. 데이터에 알맞은 모델 크기를 찾으려면 각기 다른 구조를 (당연히 테스트 세트가 아니고 검증 세트에서) 평가해 보아야 합니다. 적절한 모델 크기를 찾는 일반적인 작업 흐름은 다음과 같습니다. 먼저 비교적 적은 수의 층과 파라미터로 시작합니다. 그다음 검증 손실이 감소되기 시작할 때까지 층이나 유닛 개수를 늘리는 것입니다.
가중치 규제 추가
- L1 규제: 가중치의 절댓값에 비례하는 비용 추가(가중치의 L1 노름(norm)).
- L2 규제: 가중치의 제곱에 비례하는 비용 추가(가중치의 L2 노름). L2 규제는 신경망에서 가중치 감쇠(weight decay)라고도 부름.
가중치 규제는 일반적으로 작은 딥러닝 모델에서 사용.
대규모 딥러닝 모델은 파라미터가 너무 많기 때문에 가중치 값을 제약하는 것이 모델 용량과 일반화에 큰 영향을 미치지 않는 경향이 있음. 이런 경우 드롭아웃이라는 다른 규제 방법 선호.
드롭아웃(Dropout)
신경망을 위해 사용되는 규제 기법 중에서 가장 효과적이고 널리 사용되는 방법 중 하나.
모델 layer에 드롭아웃을 적용하면 훈련하는 동안 무작위로 층의 출력 특성을 일부 제외시킴(0으로 만듦).
신경망에서 일반화 성능을 극대화하고 과대적합을 방지하기 위해 가장 널리 사용하는 방법
- 훈련 데이터 추가 수집. 또는 더 나은 데이터 수집.
- 더 나은 특성 개발.
- 네트워크의 용량 감소.
- (작은 모델을 만들기 위해) 가중치 규제 추가.
- 드롭아웃 추가.
5.5 요약
'AI 입문 > Deep Learning' 카테고리의 다른 글
7장 - 케라스 완전 정복 (0) | 2023.01.15 |
---|---|
6장 - 일반적인 머신 러닝 워크플로 (0) | 2023.01.14 |
4장 - 신경망 시작하기 (1) | 2023.01.11 |
3장 - 케라스와 텐서플로 소개 (0) | 2022.11.16 |
2장 - 신경망의 수학적 구성 요소 (0) | 2022.11.09 |