일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- random forest
- 한빛미디어
- 주피터노트북 커널 추가
- MySQL
- 경사하강법
- pandas
- 주피터노트북 커널 제거
- 주피터노트북
- 데이터분석
- deeplearning
- 나는리뷰어다2021
- 주피터테마
- GitHub
- lol api
- ubuntu
- 모두를 위한 딥러닝
- regression
- overfitting
- 딥러닝
- Machine Learning
- feature scaling
- Udacity
- 주피터노트북 커널 목록
- deep learning
- Python
- jupytertheme
- Linear Regression
- 주피터 노트북 테마
- Git
- 회귀분석
- Today
- Total
유승훈
lec10 - Relu, Weight Initialization, Drop out, Batch Normalization 본문
lec10 - Relu, Weight Initialization, Drop out, Batch Normalization
seunghuni96 2021. 2. 24. 04:18지난시간에는 Neural Network로 XOR을 푸는 것에 대해서 알아보았는데요, 이번에는 모델을 만들면서 사용되는 함수나 테크닉들에 대해서 소개하고 있습니다.
기존의 Neural Network 구조에 대해서 복습하면, 어떤 Input이 Network를 거쳐 Output을 만들어냅니다. 모델이 계산해 낸 Output과 실제 Output간의 차이를 Loss라고 하는데요. 이 Loss를 미분한 값을 Backpropagation 하면서 Network를 학습해나갑니다. Loss를 미분한 값을 Gradient라고 하고, 이 Gradient는 기울기입니다.
이 Sigmoid 함수를 보면, 파란색으로 표시된 영역은 기울기가 큽니다. 기울기가 크다는 것은 변화량이 크다는 것을 의미하죠. 반면 빨간색으로 표시된 영역, 극단 좌표계는 기울기가 매우 작은것을 볼 수 있습니다.
Neural Network가 Sigmoid의 기울기, Gradient를 전달받아서 학습하는데, 값이 매우 작으면 별로 좋지 않겠죠. 이 매우 작은 값이 몇개 없으면 큰 영향이 없을텐데, 복잡한 구조의 Deep Network에서 100개, 200개를 쓴다면 어떻게 될까요? Backpropagation으로 뒤에서부터 곱해지면서 앞으로 오는 과정에서 매우 작은 기울기값이 여러개 곱해지게 되고, 결국 거의 0에 가까워지게 됩니다. 이것이 앞선 강의에서 Layer를 거치면서 Error의 의미가 옅어진다는 이야기를 했던 이유입니다. 이러한 현상을 Vanising Gradient라고 하고, Sigmoid의 단점이 됩니다.
다른 활성화 함수로 Relu 함수가 있습니다. Relu는 $f(x) = max(0,x)$입니다. `x`가 0보다 클때는 x를, 0보다 작을때는 0을 반환합니다. 따라서 그림과 같은 형태로 나타낼 수 있습니다. 우리가 활용하는 Gradient, 기울기 값을 살펴보면, `x`가 0보다 클 때는 y=x이기 때문에 1의 기울기를, 0보다 작을때는 0의 기울기를 갖습니다.
`x`가 0보다 작을때는 Gradient가 0이 되는데, 왜 쓸까요? 구조가 간단하고, 좋은 성능향상을 보여주기 때문입니다. `x`가 0보다 작을때 무조건 0이 되는 문제를 해결한 Leaky Relu도 존재하는데, `x`가 0보다 작을때 0이 아니라 $\alpha x$값을 갖습니다. 여기서 $\alpha$는 0.01같이 매우 작은 값입니다.
우리의 Network는 Loss가 가장 작은 지점을 찾아 가는것이 목표입니다. 이를 Global Minimum이라고도 하죠.
Loss의 구조가 왼쪽의 그림과 같이 간단하다면, 어디서 시작하던지 Global Minimum을 찾아갈 것입니다. 하지만, 실제 Loss는 상당히 복잡한 구조를 갖습니다. 따라서 Initial Weight에 따라 Minimum을 찾는 것이 달라질 수 있습니다. 예를 들어, A지점에서 시작하면 Global Minimum이 아니라 Local minimum에 빠지거나, 운좋게 Local Minimum으로 수렴하지 않는다고 해도 Saddle Point에서 학습이 끝날 확률이 높습니다.
하지만 시작 Point가 x였다면 어땠을까요? 아마 Global Minimum에 잘 수렴했을것입니다.
이렇게 Weight 초기화, Weight Initialization은 Network가 어디서 출발할 것인가?를 정하는 과정입니다. 지금까지 우리는 Random Normalization을 사용했습니다. 이외에도 좋은 출발점을 찾는 방법은 여러가지가 있습니다.
Xavier는 평균은 0, 분산은 $\frac{2}{channel\_in + channel\_out}$인 분포입니다.
He는 Xavier와 똑같이 평균은 0이지만, 분산은 $\frac{4}{channel\_in + channel\_out}$입니다. He의 경우에는 Relu함수를 Activation Function으로 쓸때 활용합니다. 여기서 $channel\_in$은 이전 Layer의 노드 수(Input)이고, $channel\_out$은 다음 Layer의 노드 수(Output)입니다.
같은 데이터에 3개의 모델이 학습되어 있습니다. 첫번째 모델은 3개, 두번째 모델은 7개, 세번째 모델은 모든 데이터를 정확하게 맞추고 있습니다.
첫번째 모델은 Under-Fitting되었다고 합니다. Train, Test 데이터 둘 다에서 좋은 성능을 보여주지 못합니다. 단순히 성능이 떨어지는 모델이라고 할 수 있습니다.
두번째 모델은 Train 데이터에 대해서는 매우 좋지는 않지만, 어느정도 준수한 성능을 보여줍니다. Test 데이터에 대해서도 좋은 성능을 보여줍니다. 이상적으로 학습된 모델이라고 할 수 있습니다. Train 데이터에 대한 성능이 엄청나게 높지 않더라도, 적절하게 잘 학습된 상태이기 때문에 학습과정에서 보지 못한 Test 데이터에서도 좋은 성능을 보여줄 수 있습니다.
마지막으로 세번째 모델은 모든 Train 데이터를 다 맞추고 있습니다. 하지만 이런 모델은 Test 데이터에서는 좋은 성능을 보여주지 못합니다. 너무 Train 데이터에만 맞게 학습되어있다 보니, 새로운, 한번도 보지 못한 Test 데이터에 대해서는 좋지 못한 성능을 보여줍니다.
우리의 Network는 Overfitting 되는 것을 막고, 성능이 좋지 않은 Underfitting을 피하는 최적의 fitting을 해야합니다. 이런 문제가 발생하지 않도록 방지, 도움을 주는 것이 Regularization인데요, 그 중 하나가 Dropout입니다. 이외에도 데이터 증강, L2-Regularization, Batch-Normalization등의 방법을 활용할 수 있습니다.
Dropout은 우리의 Network의 뉴런을 일부 끈 상태에서 학습을 한 것입니다. 어떤 뉴런을 끌 지는 Random하게 정해집니다. Train할때 일부 뉴런을 끈 상태로 학습하고, Test할때는 모든 뉴런을 활성화하여 진행합니다.
예를 들어, 동물의 사진을 받아서 고양이인지 아닌지 판단하는 모델이 있다고 합시다. 이미지를 여러개의 노드로 나눠서 고양이인지 Input을 입력합니다. 이때 고양이의 사진이 나눠지죠. Dropout은 모든 부분이 아니라 고양이의 귀만, 고양이의 코만 가지고 판단하는 것입니다. 때문에 학습할때 보지 못한 검은 고양이나 얼룩 고양이의 사진도 고양이라고 잘 예측할 수 있는 것이죠.
Tensorflow에서는 Train을 할때 제외할 뉴런의 비율을 입력해줍니다. model()에서 Training=True면 Dropout을 쓰고, False면 Dropout을 쓰지 않게 됩니다.
데이터가 Network를 거치면서 분포가 이상해질 수 있습니다. 처음에는 균형있던 고양이 이미지의 분포가, Network의 뉴런들을 지나면서 이상한 형태의 분포를 갖는것을 볼 수 있습니다. 이러한 현상을 Internal Covariate Shift라고 하고, 이런 상황에서는 이미지가 고양이인지 아닌지 판단하기가 좀 어려운 상황이 됩니다.
위와 같은 Internal Covariate Shift를 막는 것이 Batch-Normalization입니다. Distribution이 계속 바뀌니까, Layer의 Input을 계속 Normalization하는 방법입니다. Batch의 평균과 분산으로 Input을 Normalization하고, 파라미터인 감마와 베타를 통해 Shift한 값이 Input이 됩니다. 이런 방법으로 일정한 형태의 분포를 유지합니다.
'강의정리 > 모두를 위한 딥러닝 시즌 2' 카테고리의 다른 글
lec12 - RNN (0) | 2021.03.04 |
---|---|
lec11 - Convolutional Neural Network(CNN) (0) | 2021.02.26 |
lec09 - XOR with Neural Nets (0) | 2021.02.21 |
lec08 - Basic Deep Learning (0) | 2021.02.20 |
lec07 - Application and Tips (0) | 2021.02.16 |