※ 본 내용은 stanford에서 제공하는 cs231n 강의, 강의자료를 바탕으로 작성하였습니다.
Lecture 6에서는 신경망의 학습에 대해서 다루고 있다.
학습시키기 위해 주의할 점이나 training process 를 다룬다.
- Activation Functions
● Sigmoid
먼저 가장 처음 사용되었고, 대표적인 activation 함수 중 하나인 simoid 함수이다.
Sigmoid 함수를 activation function으로 사용하는 것에는 3가지 문제가 존재한다.
(1) Satureated neurons "kill gradients" -> Gradient vanishing
먼저 gradient vanishing 문제가 존재한다.
Sigmoid 노드의 local 미분식은 다음과 같다.
$ y = sigmoid(x) $, $ \frac{\partial y}{\partial x} = y(1-y)$
Sigmoid의 값 y는 0과 1 사이이므로 y(1-y) 또한 0과 1사이의 값이다.
또한 수식을 보지 않더라도 그래프를 보면 대략 x가 10이상, -10 이하만 되더라도 미분값은 거의 0에 수렴하기 때문에 역전파값 또한 0에 수렴하게 된다.
결국 sigmoid를 activation function으로 사용하면, 역전파값이 0에 수렴하고 그 결과 weight의 업데이트가 이뤄지지 않는 문제가 발생하게 된다.
(2) Sigmoid outputs are not zero-centered
Sigmoid의 출력값 자체에도 문제가 있다. 바로 zero-centered되어 있지 않고, 모든 값이 0 이상라는 점이다.
이러한 점이 문제가 되는 이유는 fully connected layer의 역전파를 살펴보면 알 수 있다.
Sigmoid의 출력값이 다시 fully connected layer를 거쳐 다른 node로 전달되는 경우를 살펴보자.
그때 fully connected layer의 weight에 대한 미분은 input값이 된다.
(출력을 y라고 할 때, $ \frac{\partial y}{\partial w_i} = x_i $)
이때의 input은 sigmoid의 출력이므로 모두 양수이고, $ \frac{\partial L}{\partial w_i}$는 역전파를 통해 전달되는 값이 양수라면 모두 양수, 전달된 값이 음수라면 모두 음수가 된다.
이럴 경우 학습은 매우 비효율적으로 이뤄진다.
예를 들어 w1 = 0.5, w2 = 0.5 이고, 각각 0.4, 0.6일때 최적값이라고 가정해보자.
만약 미분값이 모두 양수이거나 음수가 아니라면 w1 -= 0.1, w2 += 0.1 과 같이 한번만에 최적값에 도달할 수 있을 것이다.
그러나 모두 양수이거나 음수라면 w1 += 0.1, w2 += 0.2 / w1 -= 0.2, w2 -= 0.1 과 같은 순서로 2번 수행되어야 최적값에 도달할 수 있을 것이다.
즉, sigmoids의 출력이 zero-centered가 아니라서 학습(weight의 최적화)이 비효율적으로 이뤄지게 된다.
(3) exp() is a bit compute expensive
말 그대로 exp()의 연산 자체가 조금은 부담스럽다는 문제도 존재한다.
(1), (2)번에 비해서는 사소한 문제이다.
zero-centered하지 않은 문제를 극복한 tanh(x)도 존재하지만 마찬가지로 수렴하는 부분에서 미분값이 0에 수렴한다.
● ReLU
ReLU 함수는 sigmoid의 문제를 극복하여 가장 많이 사용되는 activation 함수이다.
다음과 같은 장점이 있다.
(1) 미분값이 0으로 수렴하지 않는다. (+ 영역에서)
(2) max(0, x)로 구현할 수 있어 계산이 가볍다.
(3) simgoid나 tanh보다 학습이 더 빨리 이뤄진다.
(4) 실제 생물학적 activation과 가장 유사하다.
그러나 ReLU에도 단점은 존재한다.
(1) 여전히 zero-centered 되어있지 않다.
(2) Dead ReLU problem
Dead ReLU란 어떤 training data에 대해서도 0을 출력하는 ReLU를 의미한다.
(any input이라는 표현이 많아서 헷갈렸는데, any training data가 맞다.
input을 억지로라도 조정하면 당연히 active하게 만들 수 있을 것이다.)
Dead ReLU가 발생하면 미분값도 0이 되고, 업데이트도 이뤄지지 않는 문제가 발생하다.
말그대로 기능을 못하는 dead ReLU가 되는 것이다.
Dead ReLU는 크게 2가지 이유로 발생한다.
1. wrong initialization
weight의 초기화 자체가 잘못된 경우, 간단하게 예를 들어 weight가 모두 음수로 초기화 되면 ReLU의 output은 항상 0 일 것이다. (이전의 input은 모두 양수 가정)
-> 초기화 시에 slightly postivie biases를 주기도 한다고 한다.
2. Too big learning rate
Learning rate가 너무 큰 경우에도 학습이 잘못이뤄져 dead ReLU를 발생하기 쉽다고 한다.
이에 대한 명확한 해결은 강의 시점에서 존재하지 않는다고 하고, 보통 10~20% 정도의 dead ReLU가 발생하지만 학습에 지장을 갈 정도로 문제가 되진 않는다고 한다.
Leaky ReLU나 ELU를 사용해서 dead ReLU를 방지하는 방법도 있다.
실제로는 위의 룰을 따르는 것이 일반적이라고 하다.
- Data Preprocessing
일반적으로 이미지 데이터를 다루기 위해서는 zero-centered data로 만드는 것 외에 별도의 전처리는 크게 필요하지 않다. (zero-centered가 필요한 이유는 이전 activation function에서 다룬 내용과 동일하다. 학습이 비효율적으로 이뤄지기 때문)
Scaling이 필요한 이유도 각 feature가 비슷한 scale을 갖게 하기 위해서인데, image data의 경우 이미 각 pixel의 scale이 통일되어 있다.
- Weight Initialization
Weight의 initialization 또한 중요하며 고려할 점이 몇가지 있다.
● 전부 0으로 초기화
가장 먼저 모든 weight를 0으로 초기화하는 경우를 생각해보자.
모든 layer, 모든 노드가 같은 출력을 할 것이고 가중치 업데이트도 동일하게 이뤄질 것이다.
즉, 노드를 여러개 만드는 의미가 없어진다.
이런 문제에 대해 Symmetry breaking이 필요하다고 한다.
● Gaussian with mean = 0, std = 1e-2 or 1
Symmetry breaking을 하면서, 적당한 random 값으로 초기화하자는 발상이다.
결론적으로 말하자면 층이 깊어질수록 잘 동작하지 않는다.
각 layer마다 500개의 neurons가 존재하는 10-layer net에 대해 해당 초기화를 실험한 결과는 다음과 같다.
(activation function은 tanh를 이용했다고 한다.)
각 layer마다 각 neuron의 출력결과를 시각화한 결과이다.
0-mean Gaussian으로 초기화했으므로 mean이 0인 것은 문제되지 않지만, 점점 표준편차도 0에 수렴하는 것을 확인할 수 있다(모든 neuron이 거의 0을 출력).
tanh의 범위는 [-1, 1]이고, 계속해서 mean = 0, std = 1-e2로 초기화하였으므로 대부분 0과 가까운 작은 값이 곱해질 것이다.
그 결과 층이 깊어질수록 모든 뉴런이 거의 0을 출력하게 될 것이다.
-> 마지막 layer에서는 미분값이 거의 0일 것이고, 역전파를 통해 전달되는 값도 사라지기 때문에(local 미분 = input 값) 학습이 이뤄지지 않는다.
이번엔 std를 1로 초기화한 실험이다.
1보다 큰 값이 곱해져서 더해진 후 tanh를 통과하기 때문에 대부분의 경우에서 -1이나 1에 가까운 출력을 보이게된다.
따라서 모든 미분값이 거의 0에 수렴할 것이고, 학습이 이뤄지지 않는다.
● Xavier initialization
std를 $ \frac{1}{\sqrt{n}} $로 초기화하는 방법이다. (n : 각 layer별 input size)
가장 좋은 초기화 방법으로, 각 layer별 출력이 정규분포를 근사적으로 따르는 모습을 확인할 수 있다.
이러한 설정에 대한 이론적 배경은 논문에 자세히 나와있다고 한다.
그러나 ReLU에 대해서 Xavier 초기화를 사용하면 또 다시 위와 같은 문제가 발생한다. layer를 거칠수록 양수의 절반은 0이 되므로, 나중에는 대부분의 출력이 0이 된다.
따라서 ReLU에 대해서는 std를 $ \frac{1}{\sqrt{n/2}} $로 초기화한다.
Input 중 절반은 inactive되어 오므로 input을 절반으로 생각하는 Xavier 초기화와 유사하게 생각하면 된다.
이럴 경우 절반은 양수, 나머지는 inactive되는 결과가 모든 layer에서 유지된다.
(절반은 0이 되는 것이 자연스러운 출력이다.)
- Batch Normarlization
앞서 layer들의 출력을 안정화하기 위해 activiation 함수를 변경하고, 다양한 weight 초기화에 대해 살펴보았다.
2015년에 제시된 batch normarlization은 안정화를 위해 제시된 또 다른 방식이다.
아이디어는 다음과 같다.
“you want unit gaussian activations? just make them so.”
Gaussian 분포를 따르기 원한다면 그렇게 만들면 된다는 아이디어이다.
Batch noralization을 수행하는 하나의 layer가 추가된다고 생각하면 된다.
보통 Fully connected layer와 activation function 사이에 추가한다고 한다.
그러나 생각해보면, 반드시 평균이 0이고 표준편차가 1인 표준정규분포가 될 필요는 없다.
따라서 각 batch 별로 normalization을 수행한 후, $ \gamma$를 곱해주고(표준편차 변형), $\beta$를 더해주는(평균 변형) 과정을 통해 약간의 변형을 더한다.
여기서 $ \gamma, \beta$ 또한 학습되는 parameter로, 성능을 좋게 만드는 더 좋은 분포가 있다면 그렇게 바꾼다는 원리로 이해할 수 있다.
최종적으로 위와 같이 정리할 수 있다.
전체적으로 학습을 안정화시키며(imporves gradient flow, allow higher learning rate),
앞서 다룬 initialization 문제의 의존도를 낮춘다고 한다.
또한 일종의 regularization 역할도 하게 되는데, batch마다 empirical mean이 다르기 때문에 같은 input이라도 출력이 deterministic하지 않기 때문이다.
- Babysitting the learning process
모델을 학습시키는 과정은 보통 다음과 같은 process를 따른다.
Step1. Data Preprocessing
대부분의 이미지 데이터의 경우 zero-centered data로 만들어주면 된다.
Step2. Choose the architecture
모델의 구조를 선택하는 과정이다.
가장 좋은 구조를 찾기 위해서는 다양한 시도를 해봐야하지만, 기본적으로 다음 과정을 따르면 좋다.
먼저 설계상 문제는 없는지 다음 두 가지 사항을 검사한다.
- Random initialization했을 경우 loss는 예상대로 나오는지, ('log Class의 수'정도가 나와야된다.)
- 적은 sample data에 대해서는 100% overfit이 가능한지
다음으로 regularization 을 조금 추가하고, 학습에 적절한 learning rate를 찾는다.
learning rate가 너무 작으면 loss가 거의 낮아지지 않을 것이ㅗㄱ,
반대로 너무 크면 loss가 exploding할 것이다.
- Hyperparameter Optimization
Validation set을 이용하여 optimization을 수행한다.
Assignment1에서 grid layout 방식을 주로 사용했지만, random layout이 최적 parameter를 찾을 확률이 더 크다고 한다.
그림에 나와있듯이, 특정 parameter가 더 영향을 크게 미친다고 했을 때,grid 방식에서는 3가지 값을 시도해보지만 random 방식에서는 9가지 방식을 시도하게 된다.
학습 과정을 시각화하고 확인하여 문제를 찾을 수도 있다.
예를 들어 위와 같이 taining accuracy와 validation accuracy가 크게 차이나면 overfitting 문제가 발생하고 있음을 확인할 수 있고, regularization parameter를 수정하는 등의 보완을 할 수 있을 것이다.
'Computer Vision > cs231n' 카테고리의 다른 글
[Lec 8] Deep Learning Software (0) | 2022.01.16 |
---|---|
[Lec 7] Training Neural Networks, Part2 (0) | 2022.01.15 |
[Lec5] Convolutional Neural Network (0) | 2022.01.09 |
[cs231n] Assignment1-Q5 (0) | 2022.01.01 |
[Assignment1 - Q4] 2-layer NN (0) | 2022.01.01 |