안녕하세요~


1~7장까지는 딥러닝 모델이 어떻게 구성되는지 배웠다면, 8~13장까지는 딥러닝 모델이 학습을 잘 하기 위해서는 어떤 설정들을 해주어야 하는건지 배웠어요.


1~7장 요약본은 여기 링크를 참고해주시고, 이번글에서는 8~13장까지의 내용을 다루고 Deep Neural Network 챕터는 이것으로 마무리하려고해요.


그럼 지금부터 마지막 글을 잘 장식해보도록 하겠습니다~









<1. Data Preprocessing and Normalization>


※해당파트의 자세한 설명은 여기를 참고해주세요.


먼저 DNN(Deep Neural Network)을 학습시키기 위해서는 학습(training) 데이터가 필요합니다. 그런데, DNN이 training 데이터를 지나치게 학습하다보면 training 데이터에 overfitting이 일어날 확률이 높겠죠?

또한 가중치값들의 범위들이 training data에 최적화되면 각각의 가중치값들의 범위가 천차 만별이 될수있기 때문에 학습시 zigzag 현상이 일어날 확률이 매우 높답니다 (zigzag로 학습하면 학습시 매우 오래걸리거나 제대로 학습이 안될 수 있어요(overshooting) ㅜㅜ).




위와 같은 문제를 해결하고자 데이터자체를 전처리(Data preprocessing)하는 과정이 필요하게 되는데요. 이때 사용되는 개념이 Normalization입니다. 데이터들의 표준편차를 이용해 normalization을 수행하면 training dataset의 성격이 조금 완화되게 됩니다. 


 

<사진1>


이러한 과정을 거치면 가중치들의 범위를 일정범위내로 제한해 줄수있어 zigzag현상을 피할 수 있게 됩니다. Training dataset에 치우쳐져 있는 가중치 범위들의 큰 편차를 normalization을 통해 줄여주었고, 이러한 가중치들이 training dataset을 여전히 잘 classification해준다면, training dataset과 validation dataset 모두 classification을 잘해주는 뛰어난 일반화성능의 DNN 모델을 만들어 줄 거에요.


<사진2>













<2. Mini-Batch>


※해당파트의 자세한 설명은 여기를 참고해주세요.


우리가 만약 방대한 데이터를 가지고 학습해야한다고 했을 때, 이 데이터들을 하나씩 DNN에 넣어보면서 학습시킨다면 어떻게 될까요? 우선 시간도 굉장히 오래걸리겠지만 이렇게 학습을 시키게 되면 문제공간이 복잡하게 바뀌고 학습도 제대로 이루지지 않을 가능성이 높아요.


<사진3. SGD problem space>


1)SGD

위에서 언급했던 데이터들을 하나씩 DNN에 넣어서 학습하는 방식이에요.


      


만약 아래 DNN 모델 전체관점에서의 cost function이 아래와 같이 그려진다고 했을 때, 이미지 A가 학습했을때 cost 값이 적어서 업데이트가 문제 없이 진행될 수 있지만 만약 다음 데이터인 이미지 B가 학습을 할때 굉장히 높은 값의 cost 값을 갖게 된다면 가중치 업데이트가 굉장히 많이 되기 때문에 overshooting이 일어날 수 있을거에요.



입력되는 학습이미지마다 가중치를 업데이트 하기 때문에 개별 학습이미지에 치우친 DNN 모델이 나올 수 있기 때문에 overfitting될 확률도 있겠죠? 그렇다면 학습이미지 전체를 하나의 큰 데이터라고 보고 학습을 하면 학습이미지 전체관점에서 분류하기 때문에 개별 이미지에 대한 overfitting 문제는 피할 수 있겠죠?



2) Batch 


위에서 언급한 SGD의 단점을 극복하기 위해서 전체 이미지를 하나의 dataset으로 간주해 학습시키는 batch 학습 방법을 적용해 볼거에요. 즉 개별이미지에 대해 가중치를 업데이트하는게 아니고 각각의 이미지에 대한 cost값들의 평균을 내서 가중치를 업데이트 하는 방법인거죠. 바꿔말해, 개별이미지에 잘 구별해내는 것에 초첨을 둔게 아니고 모든 이미지를 평균적으로 잘 구분해내는 DNN 모델을 만들겠다는 취지에요.


   


하지만 이러한 방식의 가장 큰 문제점은 학습이 굉장히 느리다는 점이에요. SGD같은 경우는 개별 이미지 하나에 대한 cost값을 통해서 가중치를 업데이트해가죠? 그런데 batch같은 방식은 모든 이미지들에 대한 cost 값을 도출하고 평균을 내야 한 번 가중치 업데이트가 진행되요. 그러니까, SGD는 방식은 하나의 이미지마다 한 번 학습이 진행되는데, batch 방식은 모든 이미지를 훑어봐야 한 번 학습이 되는거에요. 그러니까 학습속도가 굉장히 느려보일 수 있어요. (한 번 학습할때에 드는 계산량도 어마어마 할거에요)



3)Mini-Batch


SGD와 Batch의 단점을 극복하고자 mini-batch라는 개념이 도입됩니다. SGD와 Batch의 절충안으로 전체 데이터를 나누어 학습시키는 방식입니다.


<사진4>



   


아래 영상은 Batch, Mini-batch, SGD를 사용했을때 학습 결과에 대한 영상자료입니다.













<3. Batch Normalization>


※해당파트의 자세한 설명은 여기를 참고해주세요.


가중치를 학습시킬 때 아무 제약없이 학습시키면 training dataset에 overfitting되는 상황이 발생해요. 이러한 overfitting이 생겨나는 이유 중 하나는 internal covariate shift 현상 때문이에요


DNN 모델은 첫 번째 가중치 값에 따라서 다음 가중치 값의 범위에 영향을 미칠 수 있어요. 예를 들어, 첫 번째 hidden layer h1 값은 relu(W1x)로 결정되요 (여기서 W는 가중치, x는 입력데이터를 의미해요). 그렇기 때문에 h2의 값은 relu(W2h1)이기 때문에 이전 h1에 영향 받게 됩니다. 이러한 이유 때문에 종종 직전 hidden layer (ex; h1)에 따라 다음 hidden layer (ex; h2)가 영향을 받아요.


아래 그림을 보면 왼쪽 그림은 최초의 DNN 모델이 가운데에 형성 되어 있다고 가정할 때 한번 가중치 업데이트에 hidden layer의 분포가 변하는걸 보여주고 있어요. 그리고 오른쪽 그림은 두 번째 가중치 업데이트가 일어날때 첫 번째 그림의 왼쪽에 형성된 hidden layer들이 오른쪽에 형성되어있음을 볼 수 있어요. 즉, 첫 번째 hidden layer의 가중치값 업데이트에 따라서 뒷단에 있는 hidden layer들이 지나치게 많은 움직임을 가져가고 있네요. 이러한 현상을 internal covariate shift라고 하고, 이러한 현상 때문에 training dataset에 overfitting이 일어나는 경우가 생겨요. 


    

<사진5>


다시 생각을 해보면, 위와 같이 지나친 편향성을 갖고 hidden layer가 형성이 되면 DNN 모델은 training dataset만 잘 classification하는 가중치 분포를 갖게 될거에요. 그래서 아래와 같이 validation set을 위한 가중치 분포와 매우 달라지게 되는것이죠. 


<사진6>


요약하자면 internal covariate shift 때문에 overfitting이 일어나는데, internal covariate shift가 일어나는 이유는 이전 hidden layer의 가중치가 다음 hidden layer에 큰 영향을 미치기 때문이에요. 그래서, 이러한 문제를 없애주기 위해 이전 hidden lay에서 다음 hidden layer에 값을 건내주기 전에 가중치에 대한 값들의 범위를 제한하도록 할거에요.



아래 그림에서는 x라고 표현되어 있지만 실제로는 가중치(w)라고 생각하시면 됩니다. 앞서 Normalization 파트에서 학습 데이터에 대해 제한을 두었던것을 그대로 가중치에 적용시켜주었어요. 그리고 감마와 베타를 통해 가중치 분포의 scale과 shift를 최적으로 맞추어 주었습니다.

<사진7>


이러한 방식을 통해 오늘날 보편적으로 사용되는 DNN 모델이 완성되었어요.


<사진8>











<4. 가중치 초기값 설정>



※해당파트의 자세한 설명은 여기를 참고해주세요.



앞에서 글을 지속적으로 읽었으면 가중치 분포가 굉장히 중요하다는걸 아셨을거에요. 그런데 이러한 가중치 분포에 영향을 미치는 가장 근본적인 요인은 가중치 초기값을 설정해주는 방식에서 기인해요. 

 


1)가중치를 표준편차가 1인 정규분포로 무작위 초기화 할때 각 층의 sigmoid 활성화값 분포


아래 그림에서 볼 수 있듯이, 활성화 값의 분포가 양측으로 취우쳐 졌었어요. Sigmoid에서 이런 분포를 갖는다면 vanishing gradient문제를 피할 수 없어 보입니다.


<사진9>



2) 가중치를 0.01 표준편차로 초기화 할때 각 층의 sigmoid 활성화값 분포


활성화값들이 하나의 값으로만 집중되어 있는 경향이 보이네요.  



<사진10>


활성화 결과값이 모두 같다면 왼쪽 아래와 같이 DNN 모델이 형성될거에요. 중간중간 hidden layer와 연결된 가중치값이 어떻게 됐든 hidden layer 결과값이 모두 같다면 결국에는 오른쪽 아래 그림처럼 DNN 모델이 단순해질거에요 (중간에 아무리 다양한 가중치값들이 많아도 우리가 봐야할 것은 DNN 맨끝다단에 위치한 relu(Wx) 결과값이자나요.  


     

      

<사진11>



이러한 현상들을 해결하기 위해 초기 가중치 값들을 어떻게 설정해줄지에 대한 연구도 진행되고 있는데, 아직까지는 Xavier 초기값 설정 방법, He 초기값 설정 방법 등이 있어요












<5. Optimizer>


※해당파트의 자세한 설명은 여기를 참고해주세요.


결국 DNN 모델학습은 cost function의 최저값을 찾는 것을 목표로해요. 그런데 cost function이 아래 그림과 같이 복잡한 형태로 이루어 질 수 있기 때문에 local optimum or plateau에 빠지는 경우가 생기게 됩니다. 이러한 문제를 해결하기 위해 나온 개념이 optimizer라는 개념이에요.


<사진12>


Optimizer에는 momentum 방식과 adaptive 방식이 있어요.



[Momentum 방식]


1) Momentum optimizer


기존 SGD 방식에 기울기의 누적값을 적용한 개념이 momentum이에요. 기울기의 누적값은 다르게 보면 관성의 개념이라고 볼 수 있겠는데 만일 아래 그림에서 local minimum에 빠진다고 하더라도 관성이 있기 때문에 벗어날 수 있게되요. 같은 원리로 Plateau도 벗어날 수 있답니다.

                                      

           <SGD 방식>                                              <Momentum 방식>       


    

<사진13>


위의 방식의 문제는 global optimum을 찾았음에도 불구하고 지속적으로 학습을 하게 된다는 점이네요. 이러한 단점을 극복하고자 Nestreov Momentum이라는 optimizer가 등장하게 됩니다.



[Adaptive 방식]


1) AdaGrad


크게 업데이트 될 것 같은 가중치에 대해서 페널티를 주고있어요. 가중치가 급격하게 업데이트가 되면 앞서 normalization, batch normalization에서 언급했듯이 많은 부작용이 일어나 overfitting을 일으키는 원인이 되요. 그래서 AdaGrad는 가중치 업데이트가 크게 되는 가중치에 대해서는 페널티를 주는 방식식의 optimizer를 만들게 되었어요.


<AdaGrad 수식>

하지만 AdaGrad의 문제점은 제곱성질이에요. 제곱을 하다보면 당연히 값은 커지게 되고, 계속 진행되다보면 나중엔 학습이 거의 되지 않는 문제점이 생길거에요. 그래서 이러한 단점을 고치고자 RMSProp라는 optimizer가 등장하게 됩니다.



2) RMSProp


앞선 AdaGrad의 문제는 지속적으로 커지는 G값이었어요. 그래서 RMSProp에서는 지수평균을 적용하여 G에 대한 비중을 조절해주게 됩니다. 


위와 같은 수식으로 설정하게 되면, 감마를 통해서 지난 누적된 G값보다 최근 기울기의 제곱값을 더 비중을 두게 할 수 있겠죠?




[Adaptive + Momentum]


1) Adam


Adam은 RMSProp에 Momentum을 적용한 방식이에요.


                       

<RMSProp 수식>                                       <Adam 수식>


두 수식을 살펴보면 어떤것들이 대체가 되었는지 아시겠죠? 

또한 아래 수식의 첫 번째 부분을 보면 momentum 개념에 지수평균을 적용한 것이고, 두 번째 부분은 G의 개념에서 지수평균을 적용한거라고 볼 수 있겠네요. 그리고 마지막으로 m, v를 오른쪽 수식과 같이 바꿔주는데 그 이유는 optimizer 파트에서 설명드렸으니 넘어가도록 할게요~



결국 DNN은 cost function 자체가 매우 복잡하게 나올 확률이 높기 때문에 local minimum과 plateau를 피하는 optimizer에 대한 연구는 필수적이랍니다~










<6. Hyperparameter> 


※해당파트의 자세한 설명은 여기를 참고해주세요.


DNN 모델을 학습시킬 때 사전에 정의해 주어야하는 상수값들이 있어요. 가중치 값들은 학습을 통해 배우지만 learning rate, 각 층의 neuron 수, 전체데이터의 mini-batch 수 등등 이 있어요. 그리고 이러한 상수값들을 Hyperparameter라고 부릅니다.


우리가 Hyperparameter를 학습시킬 순 없지만 그래도 경험을 통해서 최적의 Hyperparamter를 추론할 수 있어요. 그래서 최근에는 Bayesian optimization을 통해서 최적의 Hyperparameter를 찾으려는 노력이 계속되고 있답니다.










<7. Dataset 구성>


※해당파트의 자세한 설명은 여기를 참고해주세요.


이제 모든것이 정리되었다면 실제로 학습을 시켜봐야겠죠? 


<사진14>


이전에도 계속 말씀드렸지만 DNN 모델은 overfitting을 피하는게 정말 중요해요. 그래서 DNN은 학습시에 중간중간 validation dataset을 이용해 현재 DNN이 overfitting이 일어나는 지점을 파악하게 해줍니다. 그래서 우리가 학습할 dataset을 갖고 있다고 하면, 50%는 traning dataset으로 30%는 validation set으로, 20%는 Test dataset으로 설정해요 (Test dataset은 우리가 DNN 모델을 다 학습하고 나서 한 번더 검증해보기 위한 데이터라고 보시면되요)


         


<사진15>


그런데 문제는 일반적으로 현업에서 갖고는 데이터의 양이 그렇게 많지 않다는 거에요. 그래서, 우리는 한정된 데이터로 training dataset과 validation dataset을 구성해야 하는데 이때 cross validation이라는 방법을 통해 조금 효율적으로 DNN 모델을 학습시킬 수 있게되요. (Cross validation에 대한 개념은 여기 링크를 참고해주세요)








지금까지 배운것들을 총정리해봤어요. 지금까지 다루었던 개념들은 DNN이라는 모델을 학습시키는데 뼈대가 되는 개념들이에요. 이로써 DNN 파트는 마무리를 하도록 하겠습니다 ㅎㅎ ! 





[사진 래퍼런스]

사진1

http://aikorea.org/cs231n/neural-networks-2-kr/

사진2

https://medium.com/@pnkshir/concept-of-normalization-427108d1ccfa

사진3

https://arxiv.org/pdf/1712.09913.pdf

사진4

https://wikidocs.net/55580

사진5

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

사진6,7

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

사진8,9,10

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

사진11

http://research.sualab.com/introduction/2017/10/10/what-is-deep-learning-1.html

사진12, 13

https://sacko.tistory.com/38

사진14

http://hpkim0512.blogspot.com/2017/12/sdf.html

사진15

https://rfriend.tistory.com/188




안녕하세요~


이번시간에는 가중치 초기값을 설정하는 것과 하이퍼파라미터에 대한 용어설명과 개념에 대해서만 설명하고 넘어가려고해요.



<1. 가중치 초기값 연구>


앞서 보았듯이 가중치값들이 어떻게 설정되어있는지에 따라서 DNN 모델의 성능이 달라져요. 그렇다면 최초의 가중치값들은 어떻게 설정하면 좋을까요? 


가중치 초기값 연구를 진행할때 기준점이 되는 부분은 hidden layer의 activation function 값들이 어떻게 변하는지 보는거에요. 예를들어서 activation function을 sigmoid function으로 썻다고 가정해볼게요. 활성화 함수로 시그모이드 함수를 사용하는 5층 신경망에 무작위로 생성한 입력 데이터를 흘리며 각 층의 활성화값 분포를 히스토 그램으로 그려볼거에요.



1) 가중치를 표준편차가 1인 정규분포로 무작위 초기화할 때의 각 층의 활성화값 분포


실험결과 활성화 값들이 0과 1에 치우쳐 있다는 것을 알 수 있어요 (시그모이드 함수값 범위는 0~1인거 알고계시죠?!). 시그모이드 특성상 값이 이와같이 분포되어 있다면 미분값이 매우 적기때문에 vanishing gradient 문제가 생기게 될거에요. 

<사진1>



2) 가중치를 0.01 표준편차로 초기화할 때의 활성화값 분포


sigmoid function을 거친 값들이 아래와 같이 분포되어 있어요. 조금 극단적으로 말하자면 가중치를 "0.01*정규분포"로 설정한다면 100개의 뉴런을 사용시 모두 같은 값(Wx)을 도출한다는 이야기가돼요. 어떤 입력이 들어오더라도 Wx결과가 모두 같은 값을 도출하게 된다면 그 DNN 모델이 복잡한 비선형 함수를 잘 표현할 수 있을까요? 결국은 100개의 뉴런을 사용하나 1개의 뉴런을 사용하나 큰 차이가 없어질거에요 (<- 이부분에 대한 보충설명은 여기 링크에서 '가중치 초기값' 부분을 살펴보시면 더 잘 이해하실거에요~)

 

<사진2>


이러한 문제들 때문에 He 초기값 설정방법, Xavier 초기값 설정방법이 제안됐어요. 이 두 개념에 대한 자세한 설명은 '밑바닥부터 시작하는 딥러닝'을 참고해주세요~





<2. 하이퍼파리미터>


DNN(Deep Neural Network)에서 사용하고 있는 하이퍼파라미터라는 용어는 상수값을 의미해요. 예를 들어, 가중치같은 경우는 학습을 하면서 지속적으로 바뀌기 때문에 '매개변수(parameter)'라는 용어를 사용하지만, mini-batch를 학습할 때 적용되는 batch의 크기 같은 경우는 학습 중에 변하는 것이 아니고 고정값으로 미리 정해주는 것이기 때문에 상수값이되요.


이렇게 상수값으로 설정할 수 있는건 각 층의 뉴런수, 학습률(learning rate) 등이 있어요. 


그런데 이러한 하이퍼파라미터마저도 최적의 값들을 찾도록 노력하고 있어요. 이러한 노력중 하나가 Bayesian optimization 기법들을 통해 최적의 값들을 찾는거에요.


사실 Bayesian optimization 기법에 대한 설명은 따로 챕터를 만들어야 할 정도로 설명할 부분이 많은 개념이기 때문에 나중에 공부를 하게 된다면 따로 다루도록 할게요.


여기에서는 하이퍼파라미터라는 개념과 하이퍼파리미터를 최적화시키는 방법에는 무엇이 있는정도만 알면좋을듯해요!  




자! 그럼 다음글에서 지금까지 배운 내용을 간단히 review해보면서 Deep Neural Network 챕터의 피날레를 장식해 보도록 하겠습니다!




[사진 래퍼런스]

<사진1,2>

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

안녕하세요~


지금까지는 DNN의 일반화성능에 초점을 맞추고 설명했어요. Batch normalization하는 것도 overfitting을 막기 위해서이고, Cross validation, L1,L2 regularization 하는 이유도 모두 overfitting의 문제를 피하기 위해서에요.


그런데 이번에는 조금 다른 관점에서 DNN모델이 학습하는 목적을 살펴볼거에요. 


먼저우리가 DNN 모델이 학습하는 목적이 cost function에서 제일 적은 cost(error)값을 찾는게 중요하다고 말씀드렸어요. 그리고 아래의 사진에서와 같은 함수가 있을 경우 미분값이 0인 곳을 찾으면 최저 cost 값을 찾을 수 있게 됩니다.


<사진1>

그런데 문제는 9장 mini-batch에서 언급했듯이 DNN은 다양한 문제공간을 갖고 있다는 점이에요. 예를 들어, 어떤 문제는 좌측사진과 같이 굉장히 간단한 문제공간을 갖을 수 있고, 어떤 문제는 오른쪽과 같이 복잡한 문제공간으로 이루어져있어요.


                     

<사진2>                                                       <사진3>



간단한 문제공간에서 최적의 cost값을 찾는건 문제가 되지 않겠지만, 복잡한 문제공간에서는 local minimum에 빠지는 경우가 굉장히 많을거에요.


<사진4>


또 다른 문제로는 plateau에 빠지는 경우에요. plateau에 빠지게 되면 학습이 굉장히 더디게 되거나 더 이상 학습이 진행이 안될 가능성도 높겠죠?


<사진5>



그래서 우리는 이러한 local mimum와 plateau에 빠지는 경우에 대한 해결책을 갖고 있어야 하는데, 이러한 문제에 직면할 때마다 상황에 맞게 극복하고자 나온 개념들이 optimizer에요.


Optimizer의 발전역사를 보면아래와 같아요. Optimizer에는 크게 momentum 방식과 adaptive(adagrad) 방식으로 나뉘어져서 발전해왔어요. 그리고 현재 Momentum, RMSProp, Adam이라는 optimizer를 주로 사용하고 있기 때문에 위의 3가지 optimizer를 이해하기 위한 개념들을 설명하도록 할게요.



<사진6>


[Momentum 방식]


<1. Momentum>


모멘텀은 물리개념이에요. 물리개념에서 질량과 속도의 곱으로 나타내는데, DNN 모델에서는 질량이란 개념을 도입하지 않으니 속도와 관련된 개념이라고 생각하시면 될거에요.


일반적으로 SGD (Stochastic Gradient Descent) 방식으로 학습하게되면 아래와 같은 문제가 생긴다고 했죠? 이러한 문제를 해결하고자 나온 방식이 momentum이라는 개념을 도입한거에요. Momentum 방식은 가속도라는 개념을 이용해 아래와 같은 문제를 해결하려고 했어요.




기존 SGD 방식에 momentum이라는 개념을 도입한 것을 momentum optimizer라고 하는데, 아래 수식을 보면 x는 가중치값, v는 가속도를 의미해요. 즉, 이전의 기울기값에 이전 가속도를 추가하여 현재 가중치 값을 업데이트하면서 local minimum, plateau를 피하려고 하는 방법이에요. 쉽게 말하자면 관성의 법칙을 이용한건데 자세한건 아래 '사진8'에서 더 자세히 설명할게요.



<SGD 수식>


<Momentum 수식>


관성이라는 개념이 통용되는 이유는 기울기값이 지속적으로 누적되기 때문이에요. cost function에서 기울기가 지속적으로 음수가 나온다면 가속도는 계속 붙어있는상태겠죠?



<사진7>



Momentum 방식을 이용하면 SGD의 3가지 문제를 해결할 수 있어요.

- SGD 가중치 업데이트보다 더 빠른 속도로 업데이트

- SGD 만으로는 plateau 부분에서 학습속도가 느려졌지만, 가속도를 추가해주면서 plateau 구간에서도 느려지지 않고 일정한 속도로 학습하는것이 가능

- 이전 가속도로 인해 local minimum 구간을 빠져나가는것도 가능 


아래 그림을 자세히보면 롤러스케이트를 타는 사람이 산을 탄다고 생각해볼 수 있어요. 이전 구간이 가파를수록 가속도는 높아지고 local optimum에 해당하는 부분에서는 이전 가속도에 의한 관성의 법칙때문에 멈출 수 없게 되는거에요.

<사진8>

하지만 위에 사진을 보시면 아시겠지만, global optimum에 해당하는 위치에 도달하고서도 지속적으로 이가속도 때문에 위치를 벗어나는 경우가생겨요. 그래서 이전 가중치에 대한 비율을 조금 줄이고자 나온 개념이 Nestreov Momentum입니다.

(Nestreov Momentum에 대한 설명은 여기 링크를 참고해주세요!)






[Adaptive 방식]


<1. AdaGrad>


앞서 normalization 파트에서 언급했듯이 w1, w2의 범위가 다르면 왜 지그재그 현상이 일어난다고 설명드렸습니다. 



Ada(ptive) Grad(ient) 방식인 Adagrad는 각각의 가중치 (ex: w1, w2)가 업데이트되는 정도에 따라서  위와 같은 지그재그 현상을 피하게 됩니다. 아래 수식을 두 파트로 나누어 살펴보면서 좀 더 자세히 이해해보도록 할게요.


- 첫 번째 수식, G라고 되어있는 수식을 보면 당연히 가중치의 기울기가 클 수록 G값도 커질거에요. 즉, 업데이트가 많이 되어야 될거 같다고 생각이 들면 값이 커지는거죠. G(t-1)라는 수식은 't-1번째 G'라는 뜻인데, 이부분을 통해서 이전까지 가중치 업데이트의 정도를 보는거에요. G(t-1)이 높다는건 이전의 cost function의 기울기가 크다는 뜻이고 이것은 가중치의 업데이트가 크게 일어났다는 뜻이되요.

- 두 번째 수식, 가중치가 업데이트 될때 G가 분모에 위치하고 있기 때문에 G값이 커질수록 가중치 업데이트가작아져요 (왜냐하면 그만큼 step size(learning rate/루트(G(t)+입실론))이 줄어들것이기 때문이죠). 분모의 입실론은 batch normalization에 설명드린것 처럼 분모를 0으로 나누는 것을 방지하기 위함이에요. 

  

<사진9>


위에서 한 말을 바꿔말하면 업데이트가 크게 될 것 같은 가중치에 대해서는 페널티를 주어 업데이트를 적게 하려고 하고 있어요 (앞서 배운 regularization을 적용하려던 철학과 비슷해보이기는 하네요). 다시 아래그림을 보면 cost function의 기울기가 클때나 작을때나 똑같이 학습을 시키는 것이 아니고, cost function이 크다고 생각하면 업데이트를 조금 줄이고, cost function의 기울기가 작다고 생각한다면 좀더 빠르게 업데이트를 할 수 있도록 도와주는 모양새가됩니다.



짧게 정리해서 말씀드리면, '지금까지 업데이트의 폭이 큰 가중치들의 step size를 작게한다'라고 할 수 있겠어요. 


하지만 AdaGrad에도 문제점이 있어요. 바로 수식에서 보여지는 제곱에 대한 식인데, 제곱이라는 성질이 값을 굉장히 크게 만들거나 작게 만들 수 있어요. 만약 학습이 계속 진행되다가 제곱값이 엄청 커져버리면 나중에는 step size가 굉장히 줄어들게 될거에요. 그래서 이를 보완하고자 RMSProp optimizer가 나타나게 됩니다.


<2.RMSProp>


AdaGrad의 수식과 가장큰 차이는 감마(r)의 여부라고 볼 수 있겠죠? 첫 번째 수식에서 왼쪽 부분인 G(t-1)라는것이 이전 cost function의 기울기(=가중치 업데이트 정도)를 의미하고, 오른쪽 부분은 최근(현재) cost function의 기울기(=가중치 업데이트 정도)를 의미합니다. 


AdaGrad에서 이전까지 가중치 업데이트 정도가 매우커서 G의 값이 커질때, step size(or learning rate)가 매우 작아져 학습이 불가능해지는(=가중치 업데이트가 안되는) 상황이 발생된다고 했죠? 그래서 RMSProp에서는 감마를 통해 G에 대한 비중을 조절해주고 있어요. 기울기제곱에 대한 지수평균을 구하는 것이라고 할 수 있어요 (지수평균이라는 개념은 보통 최근에 일어난 사례에 더 가중치를 준다는 개념이에요) (물론 최근 기울기가 엄청 크게 안온다고는 하지만 보통 누적된 기울기 값인 G(t-1)보다 크게 나오진 않겠죠? 왜냐하면 기울기 제곱의 값은 항상 양수니까요!) 


   

<사진10>





[Momentum 방식 + RMSProp(Adaptive) 방식]


<1. Adam(Adaptive Momentum)>


Moment와 RMSProp 수식을 다시한번 복기해볼게요. Momentum 수식은 기울기의 누적값을 이용하는 것이고, RMSProp는 이전 기울기값의 제곱의 지수평균을 구하는 것이라고 했어요.


                                  


<Momentum 수식>                                        <RMSProp 수식>      



아래 수식을 보시면 감이 오시나요? m이라고 되어있는 부분은 moment의 v가 지수평균화 된것이라고 보고, v라고 되어있는 부분은 RMSProp의 G라고 볼 수 있어요.  


             

           <Adam 수식 part1>


그렇다면 오른쪽의 수식은 무엇을 의미할까요? m0이라는건 관성이 없는거에요. 그렇게 때문에 m1은 최근 기울기 값인 g1과 동일해야해요. 그런데 우리는 베타값을 보통 상수로 정하기 때문에 m1과 g1이 같지가 않아요. 하지만 m의 수식을 위의 수식의 오른쪽 부분처럼 수정하면 문제없이 m1=g1으로 만들어 줄 수 있어요.



또한 베타를 0.9라고 설정하면 최근 기울기를 10% 반영하겠다는 의미에요. m1에 대한 수식이 수정이되도 여전히 g2가 전체 비율의 10%만 차지하는것처럼 보이네요. 



아래우측 수식의 맨마지막이 최종적인 Adam 수식이에요. 먼저 vt를 분모로 mt를 분자로 이용한 이유는 vt는 무조건 양수가 나오고, mt는 음수가 나올 수 있기 때문인거 같아요 (분모에 해당하는 루트값에 음수가 들어가면 안되니까요~). 어떻게 보면 RMSProp 수식의 기울기 부분에 momentum을 적용했다고 볼 수 있겠네요!

                       

<Adam 수식>                                            <RMSProp 수식>





[정리]


지금까지 optimizer를 알아보았어요. DNN의 목적이 어쨌든 cost function의 최저값을 찾는 것이에요. 하지만 cost function이 simple하게 생긴것이 아니고 굉장 complex하게 생긴경우가 많기 때문에 앞서 언급한 plateau, local minimum 등과같이 예상치 못한 난관에 부딪힐 수 있어요.


그래서 이러한 문제들을 해결하기 위해 상황에 맞게 대처하는 최적화(optimization)과정이 반드시 필요하게 된답니다~!




     



다음글에서는 가중치 초기값과 하이퍼파라미터에 대한 설명을 간단히 하도록할게요~


 


[글 래퍼런스]

https://nittaku.tistory.com/271

http://shuuki4.github.io/deep%20learning/2016/05/20/Gradient-Descent-Algorithm-Overview.html

https://light-tree.tistory.com/141?category=755497


[사진 래퍼런스]

사진1

http://physics2.mju.ac.kr/juhapruwp/?p=1610

사진2,3

https://arxiv.org/pdf/1712.09913.pdf

사진4

https://hwiyong.tistory.com/9

사진5,7,8

https://sacko.tistory.com/38

사진6

https://gomguard.tistory.com/187

사진9

http://shuuki4.github.io/deep%20learning/2016/05/20/Gradient-Descent-Algorithm-Overview.html

Q. 실제로 데이터들을 학습시킬 때, 일반화성능을 어떤 방식으로 평가하나요?

Q. 그런데, 갖고있는 데이터가 적다면, 일반화 성능을 어떤 방식으로 평가해야하나요?



안녕하세요~


이번글에서는 실제 DNN(Deep Neural Network)이 방대한양의 데이터를 어떻게 학습시키고 일반화를 평가하게 되는지 알아보도록 할거에요. 이번장은 복잡한 수식이 없기 때문에 쉽게 읽어내려가시면 될 것 같아요~


우리가 이미지를 학습시켜 이미내의 객체가 무엇인지 분류하는 DNN모델을 만든다고 했을 때, 방대한 양의 이미지 데이터들을 학습시키게 됩니다. 그런데 앞서 언급했듯이 아래 이미지들만 학습시키게 되면 결국 아래 이미지들에 대해서만 학습이 잘 될 가능성이 있기 때문에 일반화 성능을 놓칠 가능성이 커지게 되는 것이죠.


<사진1>


그렇다면 DNN모델이 위와 같은 이미지 데이터를 학습하는 중간중간에 일반화성능을 테스트 하려고 한다면 어떻게 하는게 좋을까요?


정답은 '모든 데이터를 학습데이터(training data)를 쓰지 않는다'가 되겠습니다. 좀 더 쉽게 설명하자면, 위에 있는 이미지 데이터들을 일부분은 학습데이터로 일부분은 validation(모델의 유효성 검사) 데이터 (DNN학습 중 일반화 성능을 중간중간 점검하기 위한)로 구성하는 것입니다. 또한 test data set이 있는데, validation dataset 경우는 모델의 overfitting을 막기 위해 모델 중간중간 점검을 하기 위해 사용되고, DNN이 validation 결과가 좋다고 판단했을 때, 실제로 test를 하여 performance를 알아보는 목적으로 사용되는 것이 test dataset입니다.



      


<사진2>                                                               <사진3>



요약하자면 아래와 같습니다.


Training dataset+validation dataset -> DNN 모델 학습 -> validation 결과가 좋게 나왔다면 -> DNN 모델 학습 종료 -> 상품 출시 전, 다른 test dataset으로 최종 성능평가



그런데 실제로 현업에서 DNN 모델을 적용하려고 할 때, 모아둔 데이터 양이 굉장히 적은 경우가 많습니다. 예를들어, 1000개의 데이터를 갖고 있다면 600(60%)개는 training dataset, 200(20%)개는 validation set, 마지막 200(20%)개는 test set으로 사용해도 괜찮을거에요. 그런데, 갖고 있는 데이터가 100개 밖에 없다고 한다면 어떻게 될까요? 100개를 모두 training dataset으로 써도 모자랄판에 그중에 40개를 validation set과 test set으로 할당해주게되면 학습이 제대로 될까요?


또한, 데이터가 적은 경우에는 아래와 같이 데이터셋을 구성해야하는데, 이런 경우에는 train, validation dataset이 너무 적다보니, validation하는 dataset에 overfitting이 일어날 가능성이 있게됩니다.


<사진4>


이러한 문제를 해결하고자 적은 양의 데이터를 갖고 있을 때 학습시키는 방법에 대해 논의가 되어왔답니다.




<1. (K-fold) Cross validation>



우리가 갖고 있는 데이터가 충분하지 않다면 아래와 같이 Dataset을 k개의 subset으로 나누고, 첫 번째 학습할 때는 첫 번째 subset으로 validation을 평가하고, k 번째 학습할 때는 k 번째 subset으로 validation을 평가하는 방법입니다.


<사진5>


이렇게 각기 다른 K번의 validation이 끝나면, 각 validation 과정에서 얻은 accuracy들의 평균을 내어 최종적으로 모델의 accuracy(performance)를 평가하게 됩니다.



이외에도 많은 통계적 방식을 활용하여 데이터셋을 구성하고 validation하는 방법들이 나오고 있는데요. 더 많은 방법들을 보고싶으시다면 아래사이트를 참고해주세요~ 잘 설명해 놓으셨더라구요!


https://m.blog.naver.com/PostView.nhn?blogId=ckdgus1433&logNo=221599517834&categoryNo=11&proxyReferer=https%3A%2F%2Fwww.google.com%2F






이번장에서는 실제로 데이터셋을 어떻게 구성하여 일반화성능을 평가하는지 알아보았어요. 다음장에서는 optimizer라는 개념을 배워보도록 할게요! 





[사진 래퍼런스]

사진1

http://hpkim0512.blogspot.com/2017/12/sdf.html

사진2,3

https://rfriend.tistory.com/188

사진4

https://m.blog.naver.com/PostView.nhn?blogId=ckdgus1433&logNo=221599517834&categoryNo=11&proxyReferer=https%3A%2F%2Fwww.google.com%2F

사진5

https://nonmeyet.tistory.com/entry/KFold-Cross-Validation%EA%B5%90%EC%B0%A8%EA%B2%80%EC%A6%9D-%EC%A0%95%EC%9D%98-%EB%B0%8F-%EC%84%A4%EB%AA%85

안녕하세요~


이번글에서도 역시 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/

Q. 굉장히 많은 데이터를 학습시키려고 한다면 어떻게 학습시켜야 하나요? 데이터 하나하나 단계적으로 학습시켜야 하나요? 



안녕하세요~


이번시간에도 DNN(Deep Neural Network) 모델을 좀 더 효율적으로 학습하는 방법에 대해서 알아보도록 할거에요. DNN을 학습시키려면 방대한 양의 데이터를 학습시켜야 할텐데요. 이때 어떤방식으로 학습시키면 좋은지에 대해서 언급해보려고해요!





<1.Stochastic Gradient Descent (SGD) VS Batch>


1) Stochastic 

이전에 가중치를 업데이트 시켰던 방식을 상기해볼게요. 하나의 입력 데이터가 들어오게 되면 가중치를 업데이트 시켰죠? 이렇게 입력데이터를 하나씩만 처리하면서 가중치를 업데이트 하는 방식을 Stochastic Gradient Descent라고 해요.

               

                   <사진1>




2) Batch (Gradient Descent; BGD)


위와는 다르게 데이터를 많이 갖고 있으면 전체 데이터에 대한 학습을 한번에 하는 방식을 Batch 방식이라고 해요. 아래의 수식을 보면 알 수 있겠지만 오차함수를 미분하여 가중치를 업데이트 할때, 개별 데이터로 하는 것이 아니라 N개의 모든 데이터에 대한 오차함수의 평균을 기준으로 업데이트가 수행되는 것을 알 수 있습니다. 


              


                     <사진2>





<2. Comparison SGD VS Batch>


그렇다면 우리가 이미지를 학습한다고 했을 때, SGD와 Batch의 학습방식에는 어떤 차이가 있을까요? 먼저 SGD에 대해서 살펴보겠습니다. (개별 이미지 데이터, 전체 이미지 데이터라는 용어를 자주 사용할텐데, 여기서 전체 이미지 데이터 image={A, B, C, ..., Z} 는 개별 이미지 데이터 A~Z를 모두 포함한 집합개념으로 보시면 됩니다)



1) Batch (Gradient Descent; BGD)


Batch는 전체 이미지 데이터를 기준으로 가중치를 업데이트하게 됩니다. 우리가 관심있어하는 부분은 개별적인 데이터들에 대한 분류가 아니라 전체 이미지를 모두 분류할 수 있는지가 중요합니다. 다시말해, 전체 이미지를 잘 분류해줄 수 있는 DNN 모델이 필요한 것이죠. 그래서 가중치 업데이트 또한 전체 이미지에 대한 cost값을 기준으로 업데이트하게 됩니다. 이렇게 되면 우리가 원하는 전체 이미지를 분류하는 문제공간이 만들어 지겠죠? 하지만, 이러한 방식에도 문제점이 있습니다.


<사진3. Batch problem space>


첫 번째 문제는 학습시간이 매우 느려진다는 점입니다. 예를들어, SGD 같은 경우는 하나의 데이터를 학습할 때마다 가중치가 업데이트되죠? 이렇게 가중치를 빠르게 업데이트하다보면 학습이 빠르게 끝나는 경우도 있을거에요 (아닌경우도 많아요ㅜ 왜냐하면 개별이미지에 대한 업데이트만 하기 때문에 global opimal value를 찾을 가능성이 낮아지기 때문이에요. 자세한 설명은 SGD를 참고해주세요!). 그런데, Batch 방식 같은 경우에는 모든 데이터에 대한 cost 값을 계산하고 평균을 낸 후에야 한 번 가중치가 업데이트 됩니다. 그렇다보니 모든 이미지데이터들을 순회해야 가중치가 한 번 업데이트 되는 꼴인거죠. (그런데 생각해봐야 할 부분은 이미지같은 경우에는 GPU로 병렬처리해 줄 수 있는 경우가 있기 때문에 이러한 장점이 어떻게 DNN을 학습 할 때 어떤 효과를 일으키는지 더 지켜봐야할 것 같아요~)


               


두 번째는 local minima에 빠지게 되면 빠져나오기 어려워집니다. 그 이유는 SGD에서 설명드릴게요.


<사진4>





2) SGD


SGD는 개별 이미지 데이터를 기준으로 가중치를 업데이트하게 됩니다. 그렇기 때문에 문제공간이 이미지A, 이미지B 이렇게 매번 바뀌게 되는데요. 즉, 파라미터들이 하나의 이미지데이터들을 잘 구분해내려고 파라미터들을 업데이트하게 되는 꼴이됩니다. 그래서 전체이미지에 대한 분류문제가 굉장히 많은 개별이미지에 대한 problem space 집합으로 볼 수 있게 됩니다.


이렇게 복잡한 problem space에서 역시 전체이미지를 잘 분류하기 위한 가중치값(global optimal value)을 찾는다는 것은 굉장히 복잡한 문제로 귀결될 수 있습니다. 또한, 하나씩 데이터를 학습 시키기 때문에 이미지같은 경우에는 GPU를 충분히 활용못 할 수도 있게되죠.


<사진4. SGD problem space>


앞서Batch 방식을 사용하면 local minima에 빠져나오기 어렵다고 말씀드렸죠? 그 이유에 대해서 설명드릴게요. 먼저 왼쪽사진이 Batch가 학습하는 방식입니다. Batch는 모든데이터에 대한 가중치 평균을 계산합니다. 즉, 한 번 cost값을 도출하여 이를 가중치 업데이트에 반영하게되면 두 번째 모든데이터에 대한 cost값은 더 낮을 가능성이 큽니다.


그런데, SGD같은 경우에는 A라는 이미지를 학습했을 때에는 cost가5가 나와서 가중치업데이트를 조금만 할 수 있는 반면에, B라는 이미를 학습했을 때에는 cost가 25가 나올 수 있습니다. 왜냐하면 A라는 이미지를 통해 가중치가 업데이트 되었다고 해도, 이미지B에서는 그 가중치가 적절치 못해 더 큰 cost로 나올 가능성이 충분히 있기 때문이에요 (or 이미지B가 이미지A랑 많이 다른 형태일 수 도 있지요). 그래서 오른쪽 사진과 같이 over shooting이 일어나 local minimum에 빠질 위험이 줄어들게 됩니다. (그런데 오히려 Global optimum value를 찾을 가능성도 현저히 낮아보이네요;;; 


            





<3. Mini-Batch>


위의 두 학습방법에서 제기된 단점을 극복하고자 나온 개념이 Batch와 SGD를 절충한 Mini-Batch라는 학습방식입니다. 모든 데이터에 대해서 가중치 평균을 구하는 것이 아니라 전체 데이터에서 일부데이터를 묶음방식으로하여 데이터 학습을 진행시키게 됩니다.


                 



      

<사진6>


      

마지막은 영상을 보시고 실제 loss가 어떻게 진행되는지 보시면 될 것 같아요. 개인적으로 batch size가 작을때마다 loss가 크게 나오는 이유는 아마 앞서 언급한 "전체이미지에 대한 문제정의(problem space)가 아닌 개별이미지 problem space의 집합인 복잡한 problem space일 가능성이 높기 때문"인거 같아요.


그래서 Batch size를 어떻게 설정해주어야 좋은건지에 대한 연구도 진행되고 있답니다~







지금까지 '많은 학습데이터가 있을때 어떻게 학습시키는것이 좋을지'에 대해서 알아보았어요. 다음장에서는 이전글에서 배웠던 Normalization과 이번글에서 언급했던 Batch라는 개념을 이용하여 Batch Normalization 개념을 이해해보도록 할게요~   


[사진레퍼런스]

사진1,2,

딥러닝 첫걸음

사진3,5

https://arxiv.org/pdf/1712.09913.pdf

사진4

https://hwiyong.tistory.com/9

사진6

https://www.kakaobrain.com/blog/113





Q. DNN을 학습시키기 전에 왜 데이터를 전처리해주어야 하나요?

 

 

안녕하세요~ 이번시간에는 DNN 모델이 학습을 효율적으로 하기위해 필요한 정규(Noramlization; 정규화) 대해서 알아보도록 할거에요~ 흔히 Data Preprocessing(데이터 전처리)를 위해 하는 방법론으로 쓰이고 있는데, 이번글에서 data preprocessing과 normalization 관계에 대해서 알아보도록 할게요. 

 

 

 

 

<1.Normalization(정규화)란?>

 

먼저 정규화의 사전적인 의미는 아래와 같아요. 

 

'어떤 대상을 일정한 규칙이나 기준에 따르는 '정규적인(정식으로 된 규정이나 규범)' 상태로 바꾸는 행위

 

이미지를 예로 들어볼께요. 이미지에서 하나의 pixel은 보통 0~255의 range(범위)를 갖고 있어요. 가끔 이러한 범위가 수치계산에 비효율적인 경우가 있어서 비율에 맞게 0.0~1.0 단위로 축소시키기도 합니다.

 

 

 

 

<2. Normalization이 필요한 이유>

 

앞서 Normalization이 필요한이유가 DNN의 효율적인 학습 때문이라고 말씀드렸는데요. 그렇다면 구체적으로 어떻게 효율적인지 예시를 통해 알아보도록 해보겠습니다.

 

먼저 우리가 x1, x2라는 데이터를 통해 학습을 시킨다고 해볼께요. x1변수의 데이터 범위는 (1~9)인 반면에 x2의 범위는 (-5000~9000)이네요. 이렇게 입력데이터들끼리의 범위차이가 심하면 어떤 현상이 발생할까요?

 

          

                    <사진1>                               <사진2>        

 

문제정의를 회귀(regression)문제라고 하고, MSE를 통해 문제를 풀어봅시다. (우리가 원하는 target 값이 45000이라고 가정)

 

 

x1과 x2에 대한 cost function을 그려보면 아래와 같습니다. 실제 값의 범위를 그려보면 아래 사진들의 빨간색 그래프처럼 한쪽은 굉장히 가파른 모양을 갖고, 다른 한쪽은 완만한 모양을 지니고 있어요. 

   

     

<사진3>                                                          <사진4>

 

위의 두 개의 독립변수에 대한 가중치 cost function을 결합하면 아래와같은 모양이 나오게 됩니다.

(Note: 아래에는 w1, w2 값이 0,0 일 때 최소값을 갖는것 처럼 나오는데, 정확하게는 w1=4500, w2= 5 일 때 최소값을 갖습니다. 3D 그림으로 설명하려다가 이 부분을 고려 못했네요 ㅜㅜ;; )

 

 

      

<사진5>

 

위의 그래프를 2D로 표현해보려고 합니다. 위의 그래프를 위에서 아래로 바라본다면 아래와 같은 그래프 모양을 형성하겠죠.

 

<사진6>

 

그런데 이때 문제는 cost value를 알아볼수가 없네요. 그래서 아래와 같이 색으로 cost value를 표현해주고 등고선형태의 모양으로 3D cost function을 2D cost function으로 표현해 줄 수 있게 됩니다. (Note: 아래에는 w1, w2 값이 0,0 일 때 최소값을 갖는것 처럼 나오는데, 정확하게는 w1=4500, w2= 5 일 때 최소값을 갖습니다. 3D 그림으로 설명하려다가 이 부분을 고려 못했네요 ㅜㅜ;; )

 

       -->       

(Note: 아래에는 w1, w2 값이 0,0 일 때 최소값을 갖는것 처럼 나오는데, 정확하게는 w1=4500, w2= 5 일 때 최소값을 갖습니다. 3D 그림으로 설명하려다가 이 부분을 고려 못했네요 ㅜㅜ;; )

 

<사진7>                                                     <사진8>

 

 

자 그럼 이제부터 문제가되는 부분을 살펴볼게요.

 

앞서 Weight update 방식을 보면 W1, W2에 적용되는 learning rate은 같아요 (항상 같은 상수값이죠).

 

 

그런데, 아래와 같은 cost function을 형성했을 때에는 learning rate이 W1 cost function 기준에서는 적절할지 몰라도 W2 기준에서는 굉장히 큰 값이 될 수 있기 때문에 overshooting이 일어날 확률이 커지게 됩니다. 그래서 아래와 같이 비효율적으로 지그재그로 학습하게 됩니다. 

 

<사진8>

 

 

 

<사진9>

 

 

 

"모든 가중치에 동일한 Learning rate(상수 값)이 적용"된다는 조건 때문에 입력데이터들의 범위를 모두 동일화해줄 필요성이 있다는 주장이 제기되었죠. 그래서 입력되는 독립변수들을 가능하면 같은 범위로 Normalization하는 아이디어가 적용되었고, 이것이 Data Preprocessing (데이터 전처리) 개념으로 쓰이게 된 것이랍니다!

 

이렇게 Normalization을 적용하게 되면, 아래와 같이 더 효율적으로 DNN이 학습을 할 수 있게 되는것이죠! (위의 예시와 아래그림이 일치하는건 아니에요. 그냥 Normalization하면 cost function이 어떻게 바뀌고, 어떻게 효율적으로 학습할 수 있을지에 대한 개념만 이해하시면 됩니다~)

 

<사진10>

 

 

 

 

<3. Normalization 실습>

 

마지막으로 Normalization이 적용되는 방식에 대해서 알아보도록 할게요.

 

이전에 제가 PPT로 정리해 두어서 캡쳐만 하고 사진으로 올리드록 하겠습니다 ;; ㅎㅎ

 

 

 

 

 

 

 

 

 

이번장에서는 데이터 전처리를 해야하는 이유에 대해서 알아보았어요!

 

다음장에서는 Batch Normalization을 배우기 위한 사전지식인 Mini-Batch 학습 방법에 대해서 알아보도록 할께요!!

 

 

 

 

 

 

 

[사진래퍼런스]

사진1

https://stackoverflow.com/questions/37734655/neural-network-solving-xor?noredirect=1&lq=1

사진2, 8

https://www.youtube.com/watch?v=1jPjVoDV_uo&list=PLlMkM4tgfjnLSOjrEJN31gZATbcj_MpUm&index=18

<사진10>

https://medium.com/@pnkshir/concept-of-normalization-427108d1ccfa

<실습사진>

http://aikorea.org/cs231n/neural-networks-2-kr/

 

안녕하세요! 이번글에서는 지금까지 배워온 내용을 총 요약해보려고합니다. 


근래 딥러닝 모델이라고 하면 Deep Neural Network (DNN or Multi-Layer Perceptron(MLP)라고 하는 인공신경망(Artificial Neural Network; ANN)을 일컫는데요. 다음장부터는 수식이 조금 더 디테일하고 복잡하게 다루어질 수 있기 때문에 이번장에서 중간점검차 요약을 한 번 할까해요.


그럼 이제부터 시작하겠습니다~ (이번장에서는 말투를 좀 편하게 할께요 ㅎㅎ;;)



[1. Supervised Learning]


- 딥러닝(Deep Neural Network) 모델 학습방식  --> Supervised Learning VS Unsupervised Learning

- Supervised Learning: DNN 모델이 예측하는 값과 실제 정답지 (학습데이터)를 통해 DNN 모델을 학습시킴

- Unsupervised Learning: 정답지 없이 데이터의 패턴을 분석해서 데이터의 특징이나 구조를 발견

- 이번글에서는 Supervised Learning을 목적으로하는 DNN 모델들에 대해 설명할 예정




<사진1>


[2. Deep Neural Network]


<1.기본구조>


- DNN은 기본적을로 아래와 같은 구조를 갖음.

- x=Training data --> 'Training data' X '신경망 가중치(weight; w)' = Wx--> activation function (아래그림에서 z=f(U)에서 f가 activation function)) -> 신경망예측값(=z) --> Error = 신경망예측값(=z) - 정답지 --> Backpropagation을 통해 가중치 업데이트

- 결국 DNN은 최상의 분류성능을 내기위한 최적의 '가중치값'을 갖으려는 것이 목적


          


<사진2>                                                  <사진3>










<2. Cost(Error) function>


- Supervised Learning에서 "(Calculate) Error = Training data(정답지) - DNN모델 예측값"이라고 규정함

- 이때 Error를 도출하는 함수식(function)을 cost function이라고 함

- 그런데 Supervised Learning에서도 여러 문제들이 있음, 문제유형에 따라 Error값을 도출하는 방식이 달라짐 --> 즉, cost function 식이 조금씩 다름


<사진4>





- 위의 수식을 가정하고 설명하면


1) Regression(회귀) 문제의 Cost function

- Mean Square Error (MSE) 개념 이용

- 분모 1/2은 backpropagation때 미분계산하려고 할때 편하기 계산하려고 붙임




2) Binary Classification (이진분류) 문제의 Cost function

- Maximum Likelihood Estimation(MSE; 최대우도법) 개념 이용


3) Multi-Class Classification (다분류) 문제의 Cost function

-Cross Entropy 개념 이용









<4. Backpropagation (가중치 학습방법)>


- 제가 블로그에서 식의 유도과정을 전부 기술해놓은 글이 있는데, 대부분 내용이 '딥러닝 제대로 시작하기'에 있는 내용이라 비공개로 설정했어요. 그래서 여기에서는 제가 직접 계산한 과정을 수기로 쓴 파일을 올려놓을테니 한번 보시면 좋을거에요. 이곳에서는 간단한 설명만 하도록 하겠습니다.


- Backpropagation은 DNN에서 가중치를 학습(업데이트)시키는 알고리즘 with Chain 

- 보통은 아래와 같이 업데이트 방식이 진행


<사진5>


- 아래파일은 실제로 업데이트가 어떻게 이루어지는지 계산한것을 수기로 작성한 파일


6. Backpropagation (2).pdf


아래영상은 Backpropagation이 학습이 어떻게 되는지 보여주는 영상이에요. 참고하세요!












<5.Activation function>


- 활성함수를 쓰는 목적은 DNN 모델이 비선형성을 표현할 수 있게 도와줌

- Layer를 더 쌓을 수록 비선형성을 더욱 잘 표현해줄 수 있는데, activation function까지 같이 활용해주면 더욱 비선형 모델을 잘 표현해줄 수 있음


<사진6. 왼쪽: Target function, 오른쪽 Activation function>



    

<사진7. activation function을 통해 non-linearity를 표현한 경우>



- Activation function 종류에는 아래와 같은 것들이 있음


<사진8>


- 변천과정은 아래와 같음


뉴런은 다음 뉴런에게 신호를 보내던지 안보내던지 둘 중에 하나야 --> Step(Binary step) function을 쓰자 --> Backpropagation으로 학습시키려고 하는데 미분이 안돼 --> sigmoid(Logistic) function으로 바꿔 그럼 --> Backpropagation은 기본적으로 미분으로 학습하는데 sigmoid function에는 기울기가 굉장히 낮은 곳들이 있어서 Chain rule을 관점에서 입력층에 가까운 가중치들은 학습이 거의 안됨 (Vanishing Gradient) --> 그럼 기울기 잘되게 ReLU로 바꿔 --> 근데 음수부분은 어떻게 함??? 그쪽은 미분값이 0인데? --> 그럼 Leaky ReLU로 학습시켜봐 --> 아 그런데 뭔가 새로운 방법은 없을까? --> activation function은 계속해서 연구중이야, 아래표 보면 cifar10 성능에서 maxout이라는 activation function이 제일 좋다고 나오지? 앞으로 다른 activation function들이 계속해서 나올거야 아마 --> 그런데 보통 ReLU까지를 기본적으로 배우더라고 그외 것들은 알아서 공부하면 돼!

(참고로 maxout관련 설명은 아래사이트를 참고해!)

http://blog.naver.com/laonple/220836305907


<사진9>









<6. Regularization>


- DNN을 학습시키는 목적이 분류라고 가정 (학습시키는 목적은 Cost function을 어떻게 해주느냐에 따라 회귀문제, 다클래스문제 등 다양함)

- 보통 학습데이터로 학습을 시키고, 다른데이터로 테스트했을 때 역시 성능이 좋아야함

- 그런데, 지나치게 학습데이터를 학습하면 Overfitting이 일어나서 일반화성능이 떨어짐. (그 이유는 학습데이터에도 종종 noise가 있는 안좋은 데이터가 있을 수 도 있고, 학습데이터에 불필요한 특징들이 포함되어 있을 가능성이 있기 때문)



<사진10>


- DNN은 Overfitting과의 싸움이라고 할 정도로, Overfitting을 방지하기 위한 여러가지 방법이 있음 그 중에 하나가 Regularization


1) Regularization의 철학

- 낮은 가중치 값들은 어차피 있거나 없거나 DNN 성능에 중요한 요소는 아님. 

- 높은 가중치 값들이 DNN 성능에 큰 영향을 미침

- 학습데이터에 지나치게 학습시켰을 때, DNN 가중치는 학습데이터에 최적화. 이렇게 되면 일반화성능 떨어짐

- 그래서 학습시 높은 가중치들에게 Penality를 부여 <-- 이것에 Regularization의 핵심 포인트

<사진11>


2) Regularizaton 종류


- L1 norm을 사용했는지, L2 norm을 사용했는지에 따라 종류가 달라짐

- L1-regularization은 L2-regularization 보다 낮은 가중치 값을 0으로 만들어줘 입력차원을 줄여주는 경향이 있고, 이것은 입력차원을 낮춰주는 효과가 있음

보통은 weight decay regularization에서는 L2-regularization이 사용되고 있음


L1 Regularization ->   

L2 Regularization -> 



아래 영상은 DNN이 이미지를 학습하는 과정을 visualization한 영상이에요.

지금까지 잘따라오셧다면 아래영상에서 소개되는 DNN 학습(진행)과정이 한눈에 들어오실거에요!


 






지금까지 배웠던 내용들을 간략하게 정리해봤어요. 

아마 1~6장 내용이 딥러닝을 배우는 가장 기초적인 뼈대가 될거에요.


다음장부터서는 Overfitting을 피하는 방법들을 좀 더 소개하고 Neural Network 챕터는 마무리하려고 할까해요.


그럼 다음 글에서 찾아뵐게요!!




[사진 래퍼런스]

사진1

https://www.elfarchive.org/2017/12/backpropagation.html

사진4

https://www.deeplearning-academy.com/p/ai-wiki-machine-learning-vs-deep-learning

사진5

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

사진6,7

https://towardsdatascience.com/can-neural-networks-really-learn-any-function-65e106617fc6

사진8

https://en.wikipedia.org/wiki/Activation_function

사진9

https://coolingoff.tistory.com/category/%5B%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D%5D?page=2

<사진10>

https://ko.wikipedia.org/wiki/%EA%B3%BC%EC%A0%81%ED%95%A9

<사진11>

https://slidesplayer.org/slide/12402488/



Q. 차원의저주(Curse of Dimension이 무엇인가요?)

Q. 왜 딥러닝은 자꾸 parameter(가중치)를 줄여주는 노력을 할까요?


안녕하세요~ 지난 시간에는 DNN의 일반화성능을 높이기 위해 Regularization 기법에 대해서 알아보았어요. 또한 L1 regularization 기법이 낮은 가중치를 0으로 만드는 경향이 있어 입력차원을 줄여주는 효과를 얻을 수 있다고 했었던거 기억하세요?


이번장에서는 입력차원을 줄여주는것이 왜 효과적인지, 이것이 딥러닝 성능을 어떻게 높여준다는것인지 알아볼거에요. 


위키백과에서 내린 차원의저주 정의는 아래와 같아요. 쉽게 말하자면 데이터의 차원이 증가하면 이것을 표현하기 위한 데이터양이 기하급수적으로 올라간다는 뜻이에요.


"The common theme of these problems is that when the dimensionality increases, the volume of the space increases so fast that the available data become sparse. This sparsity is problematic for any method that requires statistical significance" 


먼저, 아주 간략하게 설명을 해보도록 해볼게요.

우리에게 4개의 데이터가 있다고 가정해볼게요. 그리고 모든 축의 길이가 2인 2차원공간과 3차원공간에 4개의 데이터를 집어넣을거에요. 왼쪽그림에서는 면적당 데이터가 차지하는 밀도는 1이겠네요. 우측그림에서는 면적당 데이터가 차지하는 밀도가 1/2일거에요. 그렇다면 공간의 차원이 높아질 수록 같은 데이터량이라고 할지라도 (데이터가 공간을) 차지하는 비율이 낮아진다고 할 수 있겠죠?



우리가 30개의 데이터를 갖고 있는다고 했을때보다 1000개의 데이터를 갖고 있을때 overfitting이 일어날 확률이 더 적을거에요 (이에 대한이유는 앞선글의 가위 예시를 통해 이해해주시면 좋을것 같아요). 결국엔 같은 공간차원이라고 해도 데이터가 더 적을수록 overfitting이 일어나게되고, 이것을 일반화해서 설명하면 "데이터가 공간상에서 차지하는 비율이 적을 수록 상대적으로 overfitting이 일어날 확률이 높다"라고 할 수 있어요. 


.

.

.

.

.

.



이제부터는 위에서 언급한 내용들을 조금 더 자세히 풀어 설명해보도록 할께요.


먼저 어떤 사람에 정보에 관한 데이터를 갖고 있다고 가정해볼께요. 그리고 사람정보(X)에는 나이(=x1), 키(=x2), 몸무게(=x3)가 들어가 있다고 합시다. 그렇다면 사람정보 데이터 X는 아래와 같이 3차원 공간상에서 표현이 가능하겠네요? 그리고 다음과 같이 표현 할 수 있을 겁니다 --> X=(x1,x2,x3)


우리는 앞으로 데이터 X를 이루는 3가지 조건인 x1,x2,x3의 총 갯수를 데이터 건수라고 명명할거에요. 그러니까 여기 3차원 데이터에서 데이터 건수=3이 되겠네요.


<사진1>




이때, 1명의 사람에 대한 데이터를 수집했다고 해볼께요. X데이터는 3개로 나누어지니 각각의 공간은 33%의 비율을 갖고있을 겁니다. 만일 데이터건수가 2라고 한다면 각각의 공간은 50%의 비율을 차지하고 있겠네요.

      

<사진2>                                              <사진3>



만약 어떤 데이터가 27차원으로 이루어져있다고 해봅시다. 만약으로가 어떤 서로다른 특성을 갖는 데이터 I=(I1,I2,I3), J=(J1,J2,J3), K=(K1,K2,K3)를 조합하여 입력데이터를 사용한다고하면 아래와 같이 구성이 가능해 질 겁니다.

<사진4>

이때는 하나의 데이터건수가 갖고 있는 공간비율이 1/27 = 0.037 이 되겠어요.


예를들어, 우리가 6명의 사람에 대한 데이터를 수집한다고 해볼께요. 먼저 데이터가 3차원으로 구성된다고 하면 3가지 데이터조건에 6명을 채우는게 됨으로 실제 3차원 공간에서 6/3=200% 공간을 채울 수 있게되요. 이 말을 바꿔말하자면 6명의 데이터는 3차원 공간을 200% 채울 수 있다는 뜻으로 풀이할 수 있습니다.


그런데, 27차원인 경우에는 어떻게 될까요? 6/27=0.22=22%의 공간밖에 채우질 못하네요. 


이처럼 수집된 데이터 건수는 동일하더라도 입력데이터 차원이 증가하면, 데이터 공간을 채우는 비율이 줄어들기 때문에 분석에 요구되는 데이터 수도 증가하게되요.


만약 1가지 데이터 건수에 최소 30건의 데이터가 있어야 분석이 용이하다고 했을 때, 3차원의 입력데이터는 3*30=90 개의 데이터 (건수)가 필요하고, 27차원 입력은 27*30=810건의 데이터 (건수)가 필요하게 됩니다.


언뜻보면 데이터건수가 많아지면 데이터를 표현하는 정보가 많아져 분석에 더 유리할 것 같이 보이시나요? 

그런데 자세히 보시면 입력 데이터의 차원이 커지게 되면 데이터 건수가 많아지므로 하나의 데이터건수가 갖는 공간비율도 점점 줄어들게 되고, 분석에 필요한 데이터 건수도 기하급수적으로 늘어나게 됩니다. 


딥러닝 관점에서 해석을 다시 해볼께요.  우리가 어떤 Deep Neural Network모델을 학습시키고 분류하는 성능을 테스트 해본다고 가정해봅시다. 먼저 1차원 입력데이터 30개를 Deep Neural Network로 학습을 시킨 후, 학습데이터가 아닌 데이터로 검증을 했다고 해봤을 때 문제없이 동작을 합니다. 그런데, 27차원으로 표현되는 입력데이터 30개를 학습시킨 후 테스트를 해보면, 학습된 30개의 데이터에 대해서는 무리없이 잘 분류하는데 다른 학습데이터로 검증을 한다고 하면 잘 분류를 하지 못하는 현상이 벌어지곤 합니다. 다시말하자면, 입력 데이터의 차원이 증가했는데 데이터 수가 부족하니 학습데이터만 잘 구분하도록 모델이 학습데이터에 편중 되었네요. 이 역시 Overfitting입니다.

아래 사진을 보면 입력데이터가 일정한 차원 수를 넘어가게되면 분류성능이 급격하게 떨어지는 것을 볼 수 있어요.

<사진5>


이전장에서 L1 regularization이 낮은 가중치를 0으로 만드는 경향이 있다고 했죠? 사실 낮은 가중치는 딥러닝 모델에서 큰 부분을 차지하지 않아요. 예를들어, 가중치가 0.00000000000001이라고 한다면 아무리큰 입력값이 곱해져도 그 결과가 0에 수렴할거니까요. 만일 가중치가 0이 된다면 결국 입력차원이 줄어들게 되고, 분석에 필요한 데이터량이 줄어들 수도 있겠네요.


또는 복잡한 딥러닝 모델을 좀 더 simple하게 만드는 효과도 불러일으킬 수 있겠네요.



<사진6>


이렇게 딥러닝에서 데이터의 차원이나 딥러닝 모델의 파라미터를  줄여주려는 노력은 계속되고 있어요. 일반화성능을 위해서도 줄여주려고 하는 것도 있지만, 딥러닝 모델의 속도를 향상시키거나, 제한적인 데이터량을 극복하려고 하는 등의 여러 이점이 있기 때문에 이와같은 노력이 지속되고 있어요.




이제 이번장에 기술했던 글을 요약해볼께요~

1. 주어진 데이터 샘플에 대한 세밀하고 밀도 있는 데이터 (=고차원 데이터)는 많은 정보를 담고 있지만, 딥러닝 모델 관점에서 고차원 입력데이터는 부작용을 일으킬 가능성이 더 높아요. 
2. 즉, 고차원 입력데이터일수록 훨씬 더 많은 데이터량이 필요하게 되는데, 이것을 차원의 저주라고해요.
3. 하지만 현실적으로 방대한량의 데이터를 모으는데 힘든 부분이 많아요.
4. 또한 입력차원의 데이터가 고차원이어도 실제분석에서는 저차원으로 구성된 데이터가 더 분류성능을 높일 수 있어요. 왜냐하면 가끔씩 우리가 품질좋은 세밀하고 밀도 있는 데이터를 구성했다고 하지만, 그건 언제나 우리관점에서에요. 그러니까, 없어도 되는 변수들을 데이터에 추가했을 가능성도 있어요 (오히려 분류에 방해되는 변수를 넣을 가능성도...).
5. 이러한 이유들 때문에 어떻게든 입력데이터의 차원을 줄여주는 노력들을 하고 있어요.
-Feature extraction: PCA
-Feature selection: Correlation Analysis, VIF(Variance Inflation Factor), Random Forest
(위에 있는 개념들은 사실 선형대수나 Machine Learning에서 주로 다루는 개념이에요. 그래서 이 부분은 나정에 관련 챕터를 개설하게 되면 그때 설명하도록하고 지금은 이러한 기법들이 사용되고 있구나 정도만 알고있으면 될 것 같아요)


이번장에서는 Curse of Dimension에 대해서 알아보았어요. 다음장에서는 지금까지 배운내용을 전체적으로 요약정리하면서 디테일한 수식들을 사용해보도록 할게요!


[사진 레퍼런스]

사진5

https://www.visiondummy.com/2014/04/curse-dimensionality-affect-classification/

사진6

https://www.youtube.com/watch?v=6g0t3Phly2M


[글 래퍼런스]

https://kkokkilkon.tistory.com/127

http://thesciencelife.com/archives/1001


Q. 학습을 잘 시키기 위해서 왜 Regularization이 필요한가요?

Q. 학습을 잘 시킨다는 것은 무엇을 의미하나요?



안녕하세요~ 이번에는 Deep Neural Network (DNN)을 학습 시키기 위해서 사용되는 regularization(규제화) 기법에 대해서 알아볼께요.


위키백과에서는 Regularization에 대한 개념정의를 아래와 같이 해놓았어요.


"Regularization is the process of adding information in order to solve an ill-posed problem or to prevent overfitting."


위의 정의를 알아보기 위해서 overfitting이라는 개념부터 알아보도록 할께요. 


아래 두 그림 처럼 O,X를 구분하는 DNN을 학습시킨다고 해볼께요. 두 그림 중 어느 DNN 모델이 더 학습을 잘 한것 같나요? 물론 대다수 분들이 오른쪽이라고 할 거에요. 왜냐하면 완벽히 O,X를 구분했으니까요. 그런데 딥러닝에서는 일반적으로 왼쪽 그림과 같은 경우가 학습이 잘 됐다고 하는 경우가 많아요. 왜일까요?


<사진1>



위와같이 왼쪽 그림이 더 학습이 잘됐다고 판단을 하는 이유는 크게 두 가지에요. 


첫 번째는 "우리가 학습하는 데이터에는 잘 못된 학습데이터들도 있을 것이다"라는 점이에요. 만약에 outlier 또는 noise(or 불순물)가 섞인 데이터가 포함되어 있다고 생각해봅시다. 위 그림을 예를들어보면 O에 깊숙히 침투해 있는 두 개의 X는 사실 불순물이 섞였을 가능성도 있는거에요. 이런 좋지 않은 데이터로 학습하면 학습결과가 좋지는 않겠죠?


두 번째는 "DNN 모델이 학습데이터에만 지나치게 편중하여 학습시키는 것이 좋지 않을 것이다"라는 점이에요. 예를 들어, 가위를 구별하려는 DNN 모델을 만든다고 가정해볼께요. 아래 가위를 학습데이터로 이용한다고 합시다. 아래 가위의 특징은 톱니모양, 검은색 및 동그란 손잡이 등등이 있겠네요. 


   

<사진2>



자 이제 학습된 DNN 모델로 아래 사진들의 가위들이 가위인지 아닌지 구별해보려고 합니다. 자! 그럼 실행시켜볼께요~ 엥? 위에 학습된 DNN 모델이 아래 그림들에 있는 사물들이 가위가 아니라고 결론을 지었네요.. 왜일까요? 

 


<사진3>


사람들은 대부분 위의 사물들이 가위라고 결론을 내리지만 학습된 DNN은 그렇지 않았어요. 그 이유는 학습된 DNN 모델이 지나치게 "사진2"에 있는 가위의 특징을 학습했기 때문이에요. 그러니까 "사진3"에 있는 사진들은 톱니모양도 없고, 손잡이도 검은색이 아닌경우도 있기 때문에 "가위"가 아니라고 결론을 내린거에요. 즉, '사진2'라는 데이터에 DNN 모델이 너무 편중되게 학습을 한 것인데 이러한 현상을 우리는 DNN모델이 학습 데이터에 overfitting 되었다라고 표현해요. 


DNN 입장에서 엄밀히 말하자면 "내가 학습했던 이미지에서의 가위랑은 달라!"가 되겠네요. 그래서 우리는 DNN이 학습시 주어지는 학습데이터에만 너무 치중(specific)하지 않도록 하여 일반적(general)으로 판단할 수 있게 해주는 "일반화(Generalization)"성능을 향상 시키는것이 학습시 더 중요하다고 판단을 내린거에요. 즉, overfitting을 피한다는 것은 DNN의 일반화성능을 높인다는 말과 일맥상통해요.



그렇다면 이러한 일반화 성능을 향상시키는 방법에는 무엇이 있을까요? 


다시 아래그림을 살펴볼께요. 오른쪽 그림은 학습데이터에 지나치게 편중된 모델이에요. 지나치게 편중되었다는 것은 DNN 입장에서 가중치값들이 지나치게 학습데이터에 편중되어 있다는 뜻과 같은 말이에요. 왜냐하면 DNN에서는 입력(학습데이터)는 항상 고정값이고 (이미지를 학습한다고 생각해보세요. 입력이미지값은 변하지 않아요!), 가중치를 업데이트해서 무엇가를 분류하기 때문이에요.

<사진4>


그렇다면 가중치가 업데이트 될 때, 학습데이터에 편중되지 않도록 해주면 되지 않을까요? 

이러한 물음에서나온 방법이 Regularization이에요! 좀더 풀이하자면 업데이트되는 가중치에 규제를 가해야 한다는 뜻이에요. 그럼 지금부터 Regularization의 종류들에 대해서 알아보도록 할께요


Regularization의 대표적인 종류는 L1, L2 regularization입니다. 우선 L1, L2를 나누는 이유는 regularization을 적용할 때 쓰이는 norm 때문이에요. 우선 L1 norm과 L2 norm에 대해서 짧게 설명드릴께요. 




<1.Norm>


Norm이란 벡터의 크기를 의미해요. 벡터의 정의와 크기를 구하는 공식은 아래의 영상을 보시면 될거에요. (첫번째 영상은 벡터의 정의를 다루었고, 두 번째 강의에서 크기가 언급될거에요)









요약하자면 하나의 벡터가 2차원이면 x=(x1, x2)라고 표현되고, 3차원이면 x=(x1,x2,x3)라고 표현될거에요. 그리고 영상에서 소개한 크기 공식을 일반화하면아래와 같이 표현할 수 있을거에요.



또한 norm과 관련된 식은 아래와 같이 나타나요. (L1 norm은 p=1만 대입해주면 L1 norm 식이되요)


그렇다면 본격적으로 L1, L2 regularization에 대해서 알아볼까요? 우선 L2 norm에 대해서 알아보고 L1 norm과 L2 norm을 비교하는 방향으로 알아볼거에요.



<2. L2 regularization (Ridge regression)>



아래수식은 2장에서 설명드린 가중치를 업데이트 하는 수식이에요. 



우리는 가중치가 크게 업데이트가 될 경우 이를 규제(억제)시키려고 해요. 그렇다면 위의 수식을 어떻게 변경시켜주면 될까요? 먼저 아래식들을 볼께요.


1번 수식은 MSE cost function이에요. 1/2이 MSE 수식앞에 붙은건 미분을 거친 후 계산을 편하기 하기 위해서에요 (미분을하면 제곱이 1/2과 곱해져서 1이 되겠죠?). 그리고 2번 수식을 잘 살펴볼 필요가 있어요. Regularization을 위해서 새로운 cost function을 만들어줬는데 식을 자세히 보내 (λ/2)||w||^2 를 더해주었네요? 더해진 식이 의미하는 바가 무었일까요? 


더해진식을 자세히 보면  λ X L2 norm이라는 것을 볼 수 있어요.  (1/2)이 곱해진 이유는 gradient descent로 학습시 적용되는 미분계산 이후의 과정을 편하게 하기 위함이고, 람다(λ)가 곱해진 이유는 regularization의 정도를 결정하기 위함이에요(보통0~1사이로 조절한다고해요). 중요한건 왜 L2 norm이 적용됐냐는 부분이에요.


큰 가중치값이 overfitting에 영향을 미치기 때문에, 그 벌(페널티)로써 큰 가중치 값이 업데이트 될 때에는 업데이트를 더 급격하게해주려는 의도에요. 예를 들어, 가중치값이 0.1 인 경우(w=0.1)와 3인 경우 (w=3)에는 w=3일 때 더 큰 값이 이전 가중치 값인 w(t)에 더 큰 변화를 줄 거에요 (즉, w(t+1)값과 w(t)값의 변화가 클거라는 말이에요). 다시말하자면, L2 norm이 적용돼었다는건 큰 가중치값을 가질수록 학습시 더 큰 페널티를 주겠다는거에요. 


그런데 왜 큰 가중치값이 overfitting에 영향을 미친다고 판단한걸까요? 우선 L2 norm에서는 항상 결과값이 음이아닌 정수이기 때문에 0에 가까운 값이 작은 값이 되고, 0에서 멀어질 수록 큰 값이됩니다. 이러한 개념이 weight에 적용되기 때문에 가중치값이 작다는 말은 바꿔말해 0에 수렴하는 것이라고 말할 수 있겠네요. 


앞서 신경망이 계산되는 원리를 설명드렸죠? Wx->activation->Wx-> .... ->Wx

결국 DNN 모델은 거대한 Wx 함수의 연속이라고 추상화시킬 수 있는데요. 만약에 Wx^2+Wx+1 이런식으로 표현된다고 했을 때, coefficient 값에 해당하는 W값이 커지게되면 그래프모양이 굉장히 sharp하게 그려질거에요 (sharp하다는 표현이 조금 애매하긴한데, noise가 섞인 데이터조차 표현하다보면 그래프가 완만해지기 보다는 sharp해지는 경우가 흔하기 때문에 이렇게 표현했어요).


<사진5>


또 다른 측면에서 보면 입력값에 해당하는 X의 차원이 높으면 높을 수록 overfitting이 일어나는 경우가 있어요. 그래서 X입력값과 결합되는 가중치 W의 값이 0에 가까울 수록 X입력값의 차원이 줄어드는 것 처럼 보일 수도 있겠네요. (이부분은 이해가 안되시면 넘어가도 좋아요. 추후에 Curse of Dimension (차원의 저주) 라는 개념에 대해서 다시 설명하도록할께요)


아무튼 결론적으로 요약하자면 가중치 값이 크면 overfitting을 일으킬 확률이 크다고 보기 때문에, 큰 가중치에 대해서는 L2 norm이라는 식을 적용하여 가중치 업데이트시 페널티를 주고 있어요. 그리고 이러한 행위를 Weight decay (regularization) 라고 부르기도 해요.


하지만 필자는 이런의문이 들어요. "정말 큰 가중치가 overfitting을 일으킬까? 학습데이터에 따라서 큰 가중치값이 더 좋을 수 있지 않을까? 오히려 overfitting을 일어나다는 것은 오차값(E=d-y(x;w))이 적다는 뜻이므로 오차값을 크게 만드는데 관여하는 w에 대해서 페널티를 주는식을 만드는것이 더 효율적이진 않을까?"


물론 딥러닝이라는것이 기계학습의 일부로 확률적 모델을 기반으로 하기 때문에 어떤 개념을 명확하게 설명하는게 힘들긴 하겠지만, 위와 같은 질문을 통해 regularization을 적용할 시 L2 norm이 아닌 다른 방식을 써보는건 어떨까라는 생각을 해봤어요.  




<3. L1, L2 regularization 비교>


L1 regularization (Lasso regression)은 따로 설명을 하진 않았지만 L2 regularization을 보셨다면 쉽게 이해 되실거에요. 앞선 "<1.Norm> 파트에 언급된 수식에 p=1만 집어 넣고, L2 regularization 수식에 적용된 L2 norm 부분은 L1 norm으로 바꿔주기만 하면되요.



L1 reguralization은 L1 norm을 적용하기 때문에 가중치 크기에 상관없이 일정한 상수값으로 매번 페널티를 부여받아요. 가중치의 부호에 따라 +λ or -λ 의 상수값이 되겠네요.


그렇다면 이렇게 가중치와 상관없이 '일정한 상수값'이 페널티로 부여되면 어떤일이 발생할까요?


  VS 



결과론적으로 말씀드리자면 상수값 때문에 L2보다는 L1에서 낮은 가중치값에 해당하는 coefficient가 0이 될 확률이 높다고 설명해놨습니다. 사실 이부분이 이해가 잘 안되서 외국분들에게 질문했는데요. 답변해주신 내용을 통해 아래와 같은 해석을 할 수 있었습니다.


가중치 값이 낮은 경우 L1 norm이 더 0으로 빠르게 수렴하게 영향을 미치는지 살펴볼께요. 먼저, 낮은 가중치(0~0.01)가 있다고 가정해봅시다. L1 norm, L2 norm 둘다 가중치를 업데이트하는데 영향을 미칠거에요. 그러다보면 값이 0.01 값보다 점점 더 작아질거에요 (물론 람다(0~1)의 부호에 따라서 설명이 달라지겠지만 여기서는 가중치가 양의 값을 갖는 0~1사이에 값이라고 가정할께요. 이에 따라 업데이트 되는 가중치의 변화는 0.1->... ->0.001 이런흐름으로 작아질거에요. 하지만 지속적으로 업데이트 하다보면 가중치 w는 0에 가까운 값을 갖게되고 그렇게 되면 L2 regularization에서 사용되는 미분된 L2 norm은 아래수식과 같이 0에 수렴하게될거에요. 



요약하자면, L2 regularization에서는 학습을 하다 결국 w가 0에 가까운 값을 갖게되는 시점부터는 가중치 업데이트할때 E(x)만 관여하게 되는거에요 (위의 수식참고). 결국 어느 순간부터는 수식이 아래와 같이 바뀌겠네요. 이렇게 보면 L1이 regularization에 좀더 공격적이라고 표현할 수 있겠어요. (그런데 이 설명이 완벽하진 않아요. 왜냐하면 작은 가중치에 대한 εΔE(w) 값이 가지는 범위에 따라서 해석이 달라질 수 있거든요. 그래서 가끔 느끼는거지만 딥러닝을 설명하는데 있어서 명확하게 설명되는 부분이 종종 있다고 느껴져요. 그냥 확률적으로 그렇다고 설명하고 넘어가는 부분들이 종종있어서..) 


  VS 


아무튼 중요한 점은 가중치값이 작아질 수록 0에 수렴하게 하는 regularization 기법에는 L1이 더 적극적일 확률이 높다는거에요!

(아래링크는 제가 질문하고 답변을 받은 내용들이에요)

https://datascience.stackexchange.com/questions/65828/how-does-l1-regularization-make-low-value-features-more-zero-than-l2



그렇다면 이제 위의 개념을 기반으로 다른설명들을 해볼께요. 


먼저, 아래식을 먼저 볼께요. 위에서 설명한대로라면 x2, x4, x5 앞에 붙은 가중치 값들이 0이 될 확률이 높아요! 그렇게 된다면, x1, x3, x6 만으로도 충분히 Deep Neural Network를 나타내는 식을 만들어 낼 수 있어요. 즉, 입력차원을 줄일 수 있어서 모델의 complexity를 줄여준다는 건데, 이렇게 입력차원을 낮아주게 만들어 나타나는 효과는 다음장 curse of dimension에서 다룰거에요.



다시설명하자면, 가중치값이 굉장히 낮은 부분은 0에 수렴한다고 보기 때문에 오히려 없애주어 얻는 효과가 DNN 성능향상에 미치는 영향이 크다고 보는 거에요.


아래 그림은 실제 regularization식을 적용해보고 학습을 시켜본 결과입니다. 329번 학습을 시켰을 때, 학습이전 낮은 값을 갖고 있던 가중치값들이 중 몇몇이 L2보다 L1 regularization에서 더 많은 zero값을 갖게 된 것을 볼 수 있죠?


     

<사진6>


또하나 주의할 점은 L1 regularization에 적용되는 L1 norm은 절대값이 포함되어있기 때문에 미분이 안되는지점이 발생할 수 있다는 점입니다.  


<사진7>



(간혹 딥러닝 공부하시다보면 smooth L1 norm이라는 개념이 튀어나오는데, 이 개념은 보통 loss function에서 많이 다루어요. 추후에 Convolutional Neural Network (CNN)이라는 개념을 다룰 건데 여기서 smooth L1 loss를 사용해요~ 물론 다른곳에서도 많이 사용하겠지만요;;ㅎㅎ 한가지 힌트를 드리자면 당연히 n1 norm의 단점이라고 할 수 있는 학습 시 미분불가능한 부분을 개선했겠죠?? )



지금까지 내용을 요약하자면 아래와 같아요.

1. 가중치가 큰 값은 overfitting을 일으킬 요인이 크기 때문에 학습시 페널티를 주어야한다는 관점에서 나온것이 weight decay regularization이에요. 

2. Weight decay regularization 종류에는 L1-regularization, L2-regularization이 있어요. 

3. 가중치가 큰 정도를 판단하기 위해 가중치를 하나의 벡터라고 가정했고, 그 벡터의 크기를 가중치의 크기로 보고자 L1-norm, L2-norm이라는 개념을 도입해 L1-regularization, L2-regularization을 고안해냈습니다.

4. L1-regularization은 L2-regularization 보다 낮은 가중치 값을 0으로 만들어줘 입력차원을 줄여주는 경향이 있고, 이것은 입력차원을 낮춰주는 효과가 있어요.

5. 보통은 weight decay regularization에서는 L2-regularization이 사용되고 있어요.  




이번장에서는 overfitting을 이유로 들어 왜 regularization이 DNN을 학습시킬 때 필요한지 알아보았어요. 하지만 조금 깔끔하지 못했던 것이 중간에 'curse of dimension', '입력차원'이라는 용어를 설명없이 기술해놓았기 때문이에요. 그래서 다음장에는 curse of dimension이라는 개념을 설명해보려고합니다!




[사진 래퍼런스]

사진1, 사진4

https://www.youtube.com/watch?v=dBLZg-RqoLg

사진2

https://ko.wikipedia.org/wiki/%EA%B0%80%EC%9C%84

사진3

https://m.blog.naver.com/PostView.nhn?blogId=kkss0234&logNo=220141976191&proxyReferer=https%3A%2F%2Fwww.google.com%2F

사진6

https://developers.google.com/machine-learning/crash-course/regularization-for-sparsity/l1-regularization?hl=ko

사진7

https://donaldaq.github.io/articles/2018-09/Art-of-ML

+ Recent posts