6.4 - 6.5 오버피팅을 제거하기 위한 올바른 학습과 하이퍼파라미터 튜닝
6.4 바른 학습
바른 학습 (오버피팅 방지) 부터 천천히 살펴보자.
1. 오버피팅 ? (Overfitting)
오버피팅 이란 훈련 데이터에서의 학습에 굉장히 모델이 강건해지다보니 오히려 테스트 데이터(범용적 데이터)에서 성능의 저하가 굉장히 뚜렷하게 나타날 수 있다는 것이다.
아래의 경우 흔하게 일어나는 현상이다.
(1) 매개변수가 많아서 표현력이 높은 모델
(2) 훈련데이터의 수가 적은 경우
오버피팅을 해결하기 위하여 여러 방법이 있지만, weight decay (Regularization, 초깃값 설정 등), Dropout, BN(Batch Normalization)등의 방법들이 존재한다.
2. 언더피팅 ? (Underfitting)
언더피팅이란 오버피팅의 절반정도는 반대어 이다.
훈련데이터에서의 퍼포먼스가 사람의 인식률이나 규범이 되는 BaseLine 에 대비하여 너무 낮고, 테스트 데이터에서 또한 낮은 경우 이렇게 표현한다.
(1) 매개변수가 입력된 훈련데이터를 학습하기에 너무 표현력이 낮은 경우
(2) 모델에 대비하여 훈련데이터가 많은 경우 (1번의 표현과 다소 중첩된 것이 보인다.)
(3) 데이터의 수가 너무 적은 경우에도 발생한다.
언더피팅을 해결하기에는 모델의 복잡도 (layer 를 늘려 갖거나 노드를 늘려주는 방법)를 높게 가져갈 수 있겠고, 모델에 Regularization이 적용되어있다면 규제를 낮추거나 없애주어도 좋다. 끝으로 Early Stopping 이 방법이 될 수 있다. 다소 어색하겠지만, 학습을 충분하게 유지하자는 것이다. 다만 오버피팅의 위험이 있으니 오버피팅 직전까지 학습을 유지하는 것이다.
위의 그림을 보면 회귀(Regression) 을 떠올려보자 복잡한 데이터를 해석하기엔 불가피하게 Nonlinear Regression의 적용이 필요하다.
Nonlinear function 을 estimate 하기 위해서는 polynomial regression 을 갖게 되는데 각 figure 세개에서 첫번째 Degree 1 의 경우 1차 선형 회귀인데 이 경우가 언더피팅이라 할 수 있다. Degree 4 인 두번째 figure 는 데이터의 추세를 어느정도 따라가지만 예외가 다소 존재하고 있다. 적절한 학습이 이것을 말한다. 이렇게 학습을 한다면 테스트 데이터의 불가피하게 추세를 벋어난 데이터에도 적당한 에러를 갖게하고 넘어갈 것 이다. 마지막 figure 는 Degree 15로 너무 높은 차수를 보이다보니 결과적으로 훈련데이터에서는 거의 벋어난 데이터가 없어보이지만, 만약 테스트 데이터에서 학습을 진행하면 추세를 벋어난 거의 모든 데이터를 outlier 와 같이 바라볼 수 있다는 것이다. 이것이 오버피팅이 된다.
Bias? Variance?
나는 이것의 이해가 조금은 힘들었다. 하지만 정말 간결하게 표현 그대로를 바라보자.
만약 Variance 를 변동성이라고 생각하자. Bias 를 말 그래도 편견을 갖고있는 모델이라면?
High Variance 는 오버피팅의 모델을 지칭하게 될 것이다. 커다란 변동성을 가지고 있는 모델이라는 것이다. 이전의 figure 를 보면 degree 15 의 플랏은 오버피팅으로 지칭하였는데 이유가 모든 학습데이터에 대하여 너무 많은 변동성을 갖고 하나하나 적합시키다 보니 발생하는 현상이었다.
High Bias 는 언더피팅의 모델을 지칭하게 된다. 만약 모델의 어떤 선입견이 있다면? 그렇다면 당연하게 학습 데이터의 변동은 커녕 degree 1 과 같이 별다른 이해없이 간략하게 예외를 무시하는 것이다. 위의 다트판 처럼 low bias, low variance 를 갖는 모델을 성립하고 싶지만, 현실적으로 쉬운 문제는 아니다. 따라서 적절하게 상황에 맞는 판단으로 모델을 근사하게 맞추어 가는 것이 목적이다.
서론이 길었다. 이번 챕터의 문제 바른 학습을 위한 오버피팅 방지부터 시작해보자
1. 가중치 감소
이전 포스팅에서 가중치의 초깃값 생성 문제에 대한 글을 보면 우리는 가장 단순하게 학습할 가중치가 작게 유지하고 싶다는 것을 보였다. 학습할 가중치가 매우 크다는 것은 그만큼 오버피팅의 위험이 늘어난다는 것이다. 그래서 단순하게 초기화된 가중치를 낮은 값으로 유지하게 되면 이후 갱신될 가중치가 작지 않겠냐는 발상이었다.
하지만, 이제는 현실적으로 학습과정에서 큰 가중치에 대하여 그에 상응하는 큰 페널티를 부과하는 것으로 오버피팅을 막자는 concept 을 갖는 Regularization 을 알아보겠다.
Regularization 을 알아보기 전 사전에 필요한 것들을 수박 겉핥기로 빠르게 집고 넘어가자
(1) Norm
Norm 은 벡터의 크기(길이)를 측정하는 방법이다.
복잡하게 보일 것이다. 직관적으로 p는 norm 의 차수가 된다. p=1 이면 L1 Norm p=2이면 L2 Norm 마치 하이퍼 파라미터 같은 것이다.
각 경우에 대하여 추가로 설명하겠다.
(2) L1 Norm
p = 1 인 경우이다. p의 값을 수식에 대입하면 ||x||_1 = (sum |x|) 와 같은 간단한 수식이 된다. 만약 x 가 (x1, x2, x3, ... , xn) 과 같은 벡터라면 x 의 L1 norm 은 각 x1, x2, x3, ... , xn 의 값에 절대값을 취하고 모두 더한 것이다. 이것을 맨하튼 노름이라고 부르는 것은 염두하길..
(3) L2 Norm
p = 2. 마찬가지로 대입하면 ||x||_2 = root(sum x^2) 원소 각각을 제곱하고 더한 뒤 루트를 취해다라는 것이다. 어디서 많이 보았을 것이다. 우리가 중학교 과정에서도 배울 법한 것이다. 만약 원점 (0, 0) 과 x=(x1, x2) 라는 좌표가 주어졌고 원점으로부터 x 까지의 직선거리를 구하라고 한다면 root(x1 ^ 2 + x2 ^ 2) 으로 계산하지 않았는가? 결과적으로 Eulidean Norm 이라고 부를 수 있다. 유클리디안 거리는 직선 거리를 뜻하기 때문이다.
(4) L1 L2 Norm 의 차이
빨간색, 파란색, 노란색이 맨하튼 거리가 될 것이고, 녹색이 유클리디언 거리이다.
왜 이것을 보였을까 결과적으로 L1 Norm 의 경우 시작점과 목적지가 같으면 여러가지 경로를 갖을 수 있다. 하지만 L2 Norm 은 하나의 가장 짧은 길만은 선택한다고 생각할 수 있다.
(5) L1 Loss, L2 Loss
L2 Loss 와 L1 Loss 의 직관적 차이는 ?
첫번째, L2 Loss 의 경우 에러를 제곱하여 더하기 때문에 만약 훈련 데이터 안에 Outlier 에 취약하다. (제곱하여 계속해서 더해가기 때문에 에러가 굉장히 커질 것 이다.)
두번째, L1 Loss 의 경우 0인 지점에서 미분이 불가능하다. 이전의 포스팅에서 언급되었지만, 이런 경우 Gradient 계열의 optimizer 를 사용할 때 유의해야한다.
드디어 정규화에 대하여 알아볼 수 있게 되었다.
(1) L1 Regularization (Lasso)
(2) L2 Regularization (Ridge)
우리의 설명은 물론 N=M 인 경우일 것이다. (그래야 학습에 문제가 없다 - 학습할 데이터의 수와 추정 데이터 수는 같아야 하므로...)
보통의 경우 Loss function term 를 2로 나누어주는 것이 있는데 해당 수식에 포함되지 않아 언급한다. 2로나누는 이유는 사실 미분할 때 summation 에 제곱이 내려와 서로 상쇄되기에 간편한 연산 때문에 사용하는 것이다. 그리고 lambda 를 2로 나누거나 N 으로 나누는 경우가 있는데 이것은 연구에 따라 다르기 때문에 넘어가겠다. lambda 는 0에 가까울수록 정규화 효과를 없애는 것이다.
저렇게 lambda 를 포함한 항을 더하는 것이 왜 정규화 작용을 할까?
우리가 학습해야할 가중치가 W 이라면 Loss function 에 특정 weight term 이 커다란 상수 대략 100000000이라는 상수 lambda 를 곱했다고 가정하자 그렇다면 전체 Cost 는 굉장히 커지게 되고 gradient descent 와 같은 optimizer 를 이용하여 갱신을 할 때, 너무 커져버린 weight 텀은 굉장히 줄여줄 수 있도록 갱신할 것이다. 이러한 연산 작용 때문에 정규화 항의 의미가 부여되는 것이다.
L1 & L2 Regularization 차이점 ?
L1 Norm 과 L2 Norm 을 a, b 에 각각 적용해보면 L2 Norm 은 각각의 벡터에 대해 항상 특정 값을 내지만, L1 Norm 은 특정 요소 (b에서 0 인 term)없이도 같은 값을 나타낼 수 있다는 것이다. 이것으로 다시 아래의 그림을 보면 이해가 가능하다. 특정 feature 가 0 이 되어도 시작점과 목적지가 같은 이동경로를 표현할 수 있다는 것이다.
자세하게 더 알고 싶다면 한번 쯤 보길 바란다.
https://light-tree.tistory.com/125
딥러닝 용어 정리, L1 Regularization, L2 Regularization 의 이해, 용도와 차이 설명
제가 공부하고 정리한 것을 나중에 다시 보기 위해 적는 글입니다. 제가 잘못 설명한 내용이 있다면 알려주시길 부탁드립니다. 사용된 이미지들의 출처는 본문에 링크로 나와 있거나 글의 가장
light-tree.tistory.com
이런 특징으로 인하여 L1 은 feature selection 를 원하는 경우 사용될 수 있다.
feature selection 을 원한다는 것을 Cost 를 줄이기 위해서는 특정 feature 가 아예 사라질 수 있다는 것이니 유의해야한다.
L2 regularization 이 자주 사용되는 것은 특정 feature 를 아예 삭제하지는 않고 약화시켜 함께 학습을 하고 있기 때문이다.
2. Dropout
신경망 모델이 복잡해지면 가중치 감소 전략으로는 과적합을 막기에 한계가 존재한다. 이에 따라 너무 많아진 노드와 레이어에서 특정 노드(뉴런)을 임의로 삭제하면서 학습하는 방법을 고안한다. 이것이 곧 Dropout 에 대한 내용이다.
단순하고 직관적인 아이디어이니 자세한 설명은 필요하지 않은 것 같아 주의사항만 언급한다.
* Training set 에서 train 시에는 데이터를 흘릴 때마다 삭제할 뉴런을 무작위로 선택하여 삭제하고 학습을 진행한다. 하지만 Test 시에는 모든 뉴런에 신호를 전달한다.
기계학습(Machine Learning)에서 자주 애용하게 되는 앙상블 학습과 Dropout 에 대한 것을 언급하고 넘어가고 싶다.
앙상블 학습은 개별적으로 학습시킨 여러 모델(weak learner)의 출력을 평균 내어 추론하는 방법이다. 신경망의 맥락에서 보면, 가령 같은 (혹은 비슷한) 구조의 네트워크를 5개 준비하여 따로 학습을 진행하고, 시험 때는 그 5개의 출력을 평균 내어 답하는 것이다. 앙상블 학습을 수행하면 신경망의 정확도가 몇% 정도 개선된다는 것이 실험적으로 알려져 있다.
앙상블 학습은 드롭아웃(Dropout)과 밀접하다. 학습 때 뉴런을 무작위로 삭제하는 행위를 매번 다른 모델을 학습시키는 것으로 해석할 수 있기 때문이다. 언급하지 않았지만 드롭아웃의 추론 때는 뉴런의 출력에 삭제한 비율을 곱하는 과정이 앙상블학습에서 여러 모델의 평균을 내는 것과 같은 효과를 얻는 것이다.
6.5 적절한 하이퍼파라미터 값 찾기
신경망에는 하이퍼파라미터가 다수 등장한다. 예를 들어 각 층의 뉴런의 수, 배치 크기, 학습률(learning rate), 가중치 감소(weight decay) 등이다.
1. 검증 데이터
지금까지의 이 카테고리 안의 모든 내용은 데이터셋을 훈련 데이터와 시험 데이터라는 두 가지로 분리해 이용하였다. 훈련 데이터로는 학습을 하고, 시험 데이터로는 범용 성능을 평가했다. 하지만 하이퍼파라미터를 다양한 값으로 설정하고 검증할 때, 사용할 데이터 셋을 들여오는 것이다. 훈련 데이터셋만 있으면 되는 것이 아닌가? 그렇지 않다 훈련 데이터셋은 말 그대로 훈련만을 위한 것이지 검증을 하기 위함이 아니다. 설계된 모델이 잘 훈련하는가 중간 평가를 시행한다고 생각하면 간단하다. 시험 데이터는? 당연히 이 또한 사용하면 안된다. 왜냐하면 시험 데이터는 범용성을 얼마나 띌 수 있는지 지표를 제시해주는 데이터셋인데, 사전에 하이퍼파라미터의 학습을 이곳에서 진행하게 되면 결과적으로는 하이퍼파라미터에 대하여 시험 데이터셋에서 과적합을 띄게 되기 때문이다.
하이퍼파라미터를 조정할 때는 하이퍼파라미터 전용 확인 데이터가 필요한데, 이것이 일반적으로 검증 데이터(validation data)라고 불리는 데이터 셋이다.
각 데이터가 주로 확인하기 위한 것들
훈련데이터 : 매개변수 학습
검증 데이터 : 하이퍼파라미터 성능 평가
시험 데이터 : 신경망의 범용 성능 평가
2. 하이퍼파라미터 최적화
하이퍼파라미터를 최적화 할 때의 핵심은 하이퍼파라미터의 '최적 값'이 존재하는 범위를 조금씩 줄여간다는 것이다. 범위를 조금씩 줄이려면 우선 대략적인 범위를 설정하고 그 범위에서 무작위로 하이퍼파라미터 값을 골라낸(샘플링) 후, 그 값으로 정확도를 평가한다.
신경망의 하이퍼파라미터 최적화에서는 그리드 서치(Grid Search) 같은 규칙적인 탐색보다는 무작위로 샘플링해 탐색하는 것이 좋은 결과를 낸다고 알려져 있다.
하이퍼파라미터의 범위는 '대략적으로' 지정하는 것이 효과적이다. 실제로 0.001 ~ 1,000 (10^-3 ~ 10^3)와 같이 '10의 거듭제곱' 단위로 범위를 지정한다. 이를 '로그 스케일(log scale)로 지정' 한다고 한다.
(1) 하이퍼파라미터 값의 범위를 설정
(2) 설정된 범위에서 하이퍼파라미터의 값을 무작위로 추출
(3) 샘플링한 하이퍼파라미터 값을 사용하여 학습하고, 검증 데이터로 정확도를 평가한다.
(단, 신경망의 특성 상 오래걸릴 수 있기에 epoch 은 작게 설정한다.)
(4) (1)과 (2)단계를 특정 횟수(100회 등) 반복하며, 그 정확도의 결과를 보고 하이퍼파라미터의 범위를 좁힌다.
하이퍼파라미터의 최적화 방법은 실용적이다. 하지만 수학이나 어떤 체계라기 보단 경험과 직관에 의존적이다. 조금 더 수학적인 방법을 이용한 최적화 방법은 베이즈 최적화를 소개할 수 있다.
(베이즈 최적화는 이후 포스팅에서 한번즈음 다루겠다.)