안녕하세요~


이번글에서도 역시 overfitting을 피하는 방법에 대해서 설명해보려고해요. 

Overfitting을 피하는 방향성에 대해서 잠깐 요약해드리면 아래와 같아요.


DNN(Deep Neural Network)가 학습할 때 training dataset에 너무 치중된다는 뜻은 DNN 가중치값들이 training dataset에 최적화되어 있다고 할 수 있어요. 이 말을 바꿔말하면 DNN이 가중치값들의 분포 (가중치분포)가 training dataset에 지나치게 치우쳐있다라고 말할 수 있겠어요.


하지만 이렇게 되면 validation dataset을 classification할 경우에 잘 못 하는 경우가 생겨요. (예를들어, training dataset이 단색의 강아지라고 했을 때, DNN이 너무 지나치게 학습하면 달마시안(얼룩달룩한 강아지) 같은 종류는 강아지가 아니라고 분류할지도 몰라요)


이러한 이유때문에 training dataset을 잘 분류하되 validation dataset도 잘 분류하는 목적으로 학습을 시켜야해요. 그렇게 하려면 training dataset으로 학습할 때, training dataset에 치우쳐 질 수 있는 가중치값들의 분포를 완화시켜주면서도 training dataset을 여전히 잘 분류해주는 가중치분포를 찾을 필요가 있어요.


자 그렇다면 이러한 '철학'을 갖고 있으면서 DNN의 overfitting을 피하는 방법을 제시해줄 Batch Normalization에 대해서 알아보도록 할게요~!





<1. Internal covariate shift>


Batch normalization을 사용하는 이유는 DNN의 internal covariate shift 성향을 피하기 위해서라고 해요. 그래서 지금 부터 internal covariate shift라는 용어를 하나하나 풀이하면서 설명해보도록 할게요.



1) Covariate(공변량)


Covariate은 변수개념이에요. 우리가 들었던 변수의 종류는 크게 두 가지 '독립변수', '종속변수'가 있었죠? 


보통 우리는 독립변수들이 종속변수에 얼마나 영향을 주는지 알고 싶어합니다. 하지만, 대게는 잡음이 섞여 독립변수와 종속변수간의 관계를 명확하게 밝히지 못하는 경우가 많아요. 이렇게 종속변수에 대하여 독립변수와 기타 잡음인자들이 공유하는 변량을 공변량(covariate)이라고 해요.


쉽게 말하자면 독립변수와 종속변수의 관계를 명확하게 밝히려할때 방해가 될 수 있는 요인을 공변량이라고 생각하면 되요.




2) Covariate shift


Covariate shiftmachine learning에서 아래 그림과 같이 training datatest datadata distribution이 다른 현상을 의미해요. Covariate shift의 정의는 covariates distriubtion의 변화를 의미하는데요. (뒤에서 설명하겠지만 DNN이라는 것을 입력 데이터 (독립변수; training data)에 대해 분류(종속변수; test data)를 잘할 수 있는지를 보는건데, 중간에 방해를 하는 요소들(covariates)의 분포가 어떤 현상에 의해서 변하기 때문에 이렇게 이름을 붙인건 아닌가 싶어요) 


<사진1>


DNN은 training data를 잘 학습시켜, test(validation) data을 잘 분류해주기를 원해요. 그러기 위해서는 DNN 모델이 가지고 있는 가중치 분포가 training data와 test data관점에서 모두 동일해야합니다. 그런데, overfitting이 되면 당연히 가중치들을 다른 분포들을 갖겠죠?




3) Internal covariate shift


우리가 training dataset을 학습시킨다고 가정해볼게요. 그럼 가중치가 학습을 하다보면 아래 사진과 같이 이전 레이어의 값에 따라서 다음 레이어의 가중치값이 영향을 받을 거에요. 


아무런 규제없이 이런식으로 가중치들이 제멋대로 학습하다보면 매개변수 값의 범위가 넓어지게 될수가 있어요. 그리고 매개변수의 값들의 변동이 심해지게는 현상을 Internal Covariate Shift 라고 합니다


예를 들어하나의 hidden layer1은 x1 (입력data)를 받아 W1x1연산 후, activation function 결과를 거쳐 다음 hidden layer2의  (x2=y1=W1x1이 됩니다, hidden layer2의 입력값에 영향력을 미치는 것은 W1x1 인데이를 보면, W1의 변화에 따라 hidden layer2의 시작점이 매우 달라질 수 가 있다는 것을 의미해요.


<사진2>


만약DNN 모델이 위의 '사진2'처럼 형성이 되었는데, W1이 너무 많이 수정되어 아래 '사진3'처럼 DNN모델이 변하게 된다면이는 classification 하는데 있어서 매우 불안정할 수 밖에 없다는 것을 직관적으로 이해할 수 있을 거에요

<사진3>


다시아래 사진을 보도록 할게요. 위와 같은 internal covariate shift 이유로 overfitting이 일어났을때 어떻게 하면 좋을까요? 쉽게 말해, 아래의 training dataset과 test dataset의 가중치 분포를 동일하게 만들어주려면 어떻게 해야할까요? 답은 굉장히 쉬워요. 그냥 분포의 위치와 크기를 변경해주면 되는거에요!








<2. Batch Normalization>


아래사진에서 training dataset과 test dataset에 대한 가중치 분포를 동일하게 만드는 방법이 단순히 가중치분포의 크기와 위치를 변환시키는것이라 말씀드렸죠?


지금부터 크기와 위치를 바꾸는 방법을 자세하게 말씀드릴거에요. 그리고 이러한 방식을 batch normalization이라 합니다~



우리가 앞선 normalization 파트에서 데이터에 대해 평균 및 표준편차를 이용해 데이터로 인해 생기는 overfitting을 방지하고자 했죠? 이번에는 데이터가 아닌 가중치(Wx)에 대해 평균 및 표준편차를 이용해 가중치로 인해 발생하는 overfitting을 막고자 할거에요.


먼저 입력값에 대한 normalize를 진행할거에요. 여기서 입력값은 activation 직전의 Wx 값이라고 생각하시면 되요. 실제 입력데이터 x는 고정된 값이기 때문에 가중치 W값들에 대해서만 normalize를 한다고 보시면 되요. 이렇게하면 normalize된 가중치값들의 평균이 0 그리고 분산범위가 1이 되겠죠? normalization파트에서 언급한 normalization하는 이유와 일맥상통한거에요. normalization 파트에서는 입력데이터에 대한 범위를 규제한것이라면, batch normalization은 가중치 W에 대한 범위를 규제하여 overfitting을 방지하려고 한거에요. (아! 참고로 normalize식에서 분모부분에 입실론은 분모를 0으로 나누는걸 방지하기 위함이에요~)


<사진4>


Normalize된 가중치 값 조차도 불완전하다고 느껴서 normalize된 가중치값을 scale(확대; 감마), 이동(shift; 베타)하게 되요. Normalization만 했을 때 activation에 적용되는 normalized weights의 정규분포는 아래와 같이 형성될거에요. 이렇게 값의 범위를 제한해 버리면 사실 activation function을 linear(직선)형태의 함수를 쓰는것과 큰 차이가 없어 non-linearity를 없애줄거에요.


<사진5>


그렇기 때문에 감마, 베타 값 역시 학습을 하여 최적의 scale과 shift값을 찾게 됩니다.


<사진6>


그렇다면 결과적으로 어떤현상이 일어날까요? batch normalization 기법을 적용하지 않으면 '사진6'에서

처럼 기존 가중치 distribution(노란색)이 가중치 업데이트가 된 후 굉장히 다른 가중치 분포(녹색)를 갖을 수 있어요. 반면에, batch normalization 기법을 적용하면 가중치에 대한 업데이트가 진행된다 하더라도 가중치의 분포가 크게 달라지지 않을거에요. 이런방식으로 internal covariate shift 문제를 피할 수 있게 됩니다. 

      

<사진7>                                                <사진8>


아래 사진은 batch normalization에 대한 backpropagation chain rule과정이니 참고하세요~


<사진9>





<3. 결과>


결과적으로 우리는 아래와 같은 DNN(Deep Neural Network) 모델을 보편적으로 사용하게 됩니다. (Affine 부분은 Wx 연산을 의미해요!)


<사진10>




지금까지 가중치에 대한 normalization을 적용한 기법인 batch normalization에 대해서 소개해 드렸어요. 다음글에서는 DNN 모델의 학습방향성을 다룬 optimizer에 대해서 알아보도록 할게요!








이번글은 아래영상을 참고했으니 공부하실때 같이 보시면 좋을것 같아요~


 


[사진 래퍼런스]

<사진1>

http://sanghyukchun.github.io/88/

<사진2,3,6,7,8>

https://www.youtube.com/watch?v=TDx8iZHwFtM

<사진4,10>

밑바닥부터 시작하는 딥러닝

<사진5>

https://mc.ai/intuit-and-implement-batch-normalization/

+ Recent posts