일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- DCGAN
- Inception Module
- Regression
- Generative
- GCN
- Skip Connection
- Manager
- classification
- Gated Skip Connection
- Linear
- python
- DL
- virtualenv
- RNN
- Optimizer
- Residual Connection
- vim-plug
- ResNet
- Bottleneck Layer
- version
- Inception V1
- AI
- jupyter
- Peephole Connection
- Vanilla RNN
- sigmoid
- GoogLeNet
- Skip Connectioin
- iTerm2
- cnn
- Today
- Total
IT Repository
(9) Other Techniques of Optimize 본문
Other Techniques to Optimize¶
지금까지 모델의 Capacity가 큰 경우에 생길 수 있는 문제로써
Overfitting과 Gradient Vanishing에 대해서 알아보았고, 이 문제들을 어느정도 해결하기 위한 방법에 대해서 알아보았습니다.
이번에는 그 외에 모델을 최적화하기 위한 방법에 대해서 소개합니다.
Parameter Initialization¶
우리가 학습을 하기 위해서는 학습하기 위한 파라미터인 Weight와 bias를 계속해서 연산하고 업데이트하는 과정을 반복합니다.
그런데 훈련을 맨 처음 시작할 때에는 이러한 파라미터의 값이 없어서 연산을 할 수가 없습니다.
따라서 이 때에는 파라미터를 임의의 값으로 초기화하고 훈련을 시작합니다.
(1)
그런데 훈련을 시작할 때 모든 파라미터가 0으로 초기화된다면 어떻게 될까요?
영벡터에 영행렬이라면 그 결과값은 어떤 인풋이 들어와도 0을 출력할 것이고 훈련을 진행할 수 없을 것입니다.
(2)
조금 더 심화해서 생각해 봅시다.
예를 들어, 스탠다드 가우시안 분포에서 값을 추출해서
여기에 $\epsilon$배한 값으로 파라미터를 초기화하고 Activation으로 tanh를 사용한다고 가정해 봅시다.
(tanh함수는 x값에 따라 -1 ~ 1의 값을 출력하는 함수입니다.)
$\epsilon$의 크기에 따라서 아래의 두 가지 경우가 발생할 수 있습니다.
1. $\epsilon$이 작다면, 훈련이 진행될 수록 tanh에 의해 점점 0으로 수렴
2. $\epsilon$이 크다면, 훈련이 진행될 수록 tanh에 의해 -1과 1로 수렴
즉, 파라미터를 어떻게 초기화 하는지에 따라 모델의 성능에 영향을 줄 수 있습니다.
그렇다면 파라미터를 어떻게 초기화해야 할까요?
Xavier Initialization, He Initialization 등은 초기화된 값이 특정 값으로 잘 수렴하지 않도록 수학적으로 연구한 결과입니다.
우리는 이미 구현되어 있는 이러한 초기화 방법들을 통해 파라미터를 초기화하면 됩니다.
(또한, 초기화 방법을 하나의 하이퍼 파라미터로써 설정하고, 튜닝하면서 성능 차이를 확인하는 것도 좋은 방법입니다.)
Batch Normalization¶
Batch Normalization은 이전 node에서 다음 node로 넘어가는 값들을 Re-scaling 및 Shifting 하는 기법입니다.
(1)
우리가 Activation function을 사용하는 이유는 무엇일까요?
뉴런을 모방하기 위함도 있겠지만, 정말로 중요한 것은 Non-linearity를 만들기 위함입니다.
Activation없이 3개의 층이 쌓인 MLP는 $WX \rightarrow W'WX \rightarrow W''W'WX$ 입니다.
자세히 보면 3개의 층이 쌓였지만 결국 W의 값만 새롭게 변화하고 $W''W'W$를 하나의 W로 하는 단층 레이어와 다를 바가 없습니다.
즉, 3개의 층이 쌓였지만 Linearity에 변화가 없습니다.
(2)
Activation이 Non-linearity를 위해 사용한다는 의미가 이해가 되신다면
이번에는 ReLU Activation을 사용할 때 모든 인풋이 양의 값으로 모여있다고 생각해봅시다. (아래 그래프의 Before)
이 역시도 Linearity에 변화가 없습니다.
(3)
그러면 ReLU Activation에 들어가기 전에 인풋을 평균을 0, 표준편차를 1로 하여 Normalization한다고 생각해봅시다.
이번에는 ReLU의 출력값이 Non-linear한 분포를 갖겠네요. (아래 그래프의 After)
이와 같이 Batch Normalization은 선형성을 비선형성으로 바꾸어주기 위하여 최적의 Mean과 Variance의 값을 학습해서 정규화(Normalization)된 분포로 변환합니다.
(아래의 그래프를 참고하시기 바랍니다.)
import numpy as np
import matplotlib.pyplot as plt
def normalize(x, rescale):
return (x - x.mean()) * rescale
relu_x = np.linspace(-5, 5, 1001)
relu_y = np.maximum(0, x)
raw_x = np.random.normal(3, 1, 100); bn_x = normalize(raw_x, 0.4)
raw_y = np.random.normal(3, 1, 100); bn_y = normalize(raw_y, 0.4)
plt.plot(relu_x, relu_y, label="ReLU")
plt.scatter(raw_x, raw_y, label="Before")
plt.scatter(bn_x, bn_y, label="After")
plt.title("Before & After Batch Normalization")
plt.legend()
plt.show()
Additional Studies of Batch Norm¶
(1)
추가로 최근의 엔비디아 딥러닝 컨퍼런스에서 이러한 Batch Normalization이 단순히 Activation이 잘 되도록 도와준다는 의미뿐만 아니라 다른 밝혀지지 않은 이유가 있다는 내용의 발표가 있었다고 합니다.
Batch Normalization이 무엇때문에 학습의 수렴을 돕는지는 아직 논의가 있지만 확실한 것은 안 썼을 때보다 썼을 때에 더 잘 돌아간다는 것입니다.
(2)
또한 Batch Normalization을 쓰면 각 파라미터들이 업데이트되면서 크게 발산해버리는 부분을 해결한다고 합니다.
좀더 해설을 한다면 훈련 중에 파라미터가 업데이트 되면서 파라미터들의 값은 어떻게든지 바뀔 수 있습니다.
만약에 파라미터의 값이 업데이트로 인해 크게 발산해버리면 학습이 제대로 수렴하기 어려울 것입니다.
그러나 Batch Normalization을 사용함으로써 파라미터들이 업데이트되는 범위를 어느정도로 제한해서 학습의 수렴을 좀더 빠르고 효율적으로 할 수 있다는 내용입니다.
'Basic fundamentals' 카테고리의 다른 글
(11) Optimizer - Vanilla SGD (0) | 2020.01.13 |
---|---|
(10) Optimizer (0) | 2020.01.13 |
(8) Gradient Vanishing (0) | 2020.01.13 |
(7) Regularization (0) | 2020.01.13 |
(6) Overfitting (0) | 2020.01.13 |