안녕하세요~
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
사진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
사진14
http://hpkim0512.blogspot.com/2017/12/sdf.html
사진15
https://rfriend.tistory.com/188
'딥러닝 이론 > Deep Neural Network (DNN)' 카테고리의 다른 글
13. 가중치 초기값 설정 및 하이퍼파라미터 (0) | 2020.01.09 |
---|---|
12. Optimizer (결국 딥러닝은 최적화문제를 푸는거에요) (0) | 2020.01.09 |
11. 일반화 성능을 평가하는 방법(Cross validation) (0) | 2020.01.09 |
10. Batch Normalization (배치 정규화) (2) | 2020.01.09 |
9. Mini-Batch (데이터가 많은 경우에는 학습을 어떻게 시키나요?) (0) | 2020.01.09 |