오늘의 학습내용이다.
< Neural Network Training >
우리가 network parameter를 최적화하는 방법 중 Gradient Descent Algorithm에 대해서 배웠다.
그리고 모든 data를 가지고 gradient descent Algorithm에 적용을 하면
계산량이 많기 때문에 SGD(Stochastic Gradient Descent) Algorithm을 이용한다.
Sample을 뽑아내 Gradient Desscent Algorithm을 사용하는 방법이다.
처음에 모델을 어떻게 선정해야 하고, Training 할 때 유의해야할 사항은
무엇인지 평가는 어떻게 해야하는지 한 번 알아보자.
< Activation Function >
Activation Function의 종류에 대해서 알아보자.
첫번째로 나온 함수는 Sigmoid Function이다.
이 함수는 출력이 (0,1) 사이의 값이 나오도록 하는 선형 함수이다.
하지만 단점이 존재하는데,
1. Saturated neurons가 Gradient값을 0으로 만든다.
2. 원점 중심이 아니다.
3. 지수함수가 계산량이 많다.
Saturate를 찾아보면 ‘포화’라고 해석을 하는데,
입력이 너무 작거나 클 경우 값이 변하지 않고
일정하게 1로 수렴하거나 0으로 수렴하는 것을 포화라고 생각하고
Gradient의 값이 0인 부분을 의미하는 것 같다.
그렇다면 Gradient의 값이 0이 되는 것은 왜 문제가 될까?
Chain Rule 과정을 생각했을 때, Global gradient값이 0이 되면
즉, 결과 값이 0이 되면 local gradient 값도 0이 된다.
따라서 Input에 있는 gradient 값을 구할 수 없다.
그럼 원점 중심이 아닌 것은 왜 문제가 될까?
output의 값이 항상 양수면 다음 input으로 들어갔을 때도 항상 양수이게 된다.
그렇다면 다음 layer에서 w의 값을 update할 때 항상 같은 방향으로 update가 된다.
다음 그림의 예로 설명하면 우리가 원하는 vector가 파란색일 때,
w의 같은 경우 제 1사분면과 제 3사분면으로 update가 되기 때문에
우리가 원하는 방향으로 update를 하기 힘들다.
Sigmoid의 2번 단점을 보완하기 위해 나온 function이 바로 tanh(x)이다.
하지만 여전히 saturated한 뉴런일 때, gradient값이 0으로 된다.
따라서 새로운 activation function이 제안되었는데, 바로 ReLU이다.
ReLU의 특징은 (+) 영역에서 saturate하지 않고,
계산 속도도 element-wise 연산이기 때문에
sigmoid/tanh보다 훨씬 빠르다는 특징이 있다.
하지만 ReLU에도 단점은 존재하는데,
바로 (-)의 값은 0으로 만들어 버리기 때문에 Data의 절반만 activate하게 만든다는 것이다.
그래서 이러한 단점을 보완하기 위해 여러 activation function이 또 제시 되었다.
Leaky ReLU
Exponential Linear Unit
Maxout이라는 activation function도 있는데,
이 함수를 사용하려면 parameter가 기존 function보다 2배 있어야 한다.
< Data processing >
데이터 전처리 과정에서는 주로 Zero-centered, Normalized, PCA, Whitening같은 처리들을 한다.
Zero-centered 나 Normalized를 하는 이유는
모든 차원이 동일한 범위에 있어 전부 동등한 기여를 할 수 있도록 하는 것이다.
PCA나 Whitening은 더 낮은 차원으로 projection하는 느낌인데
이미지 처리에서는 이런 전처리 과정은 거치지 않는다.
기본적으로 이미지는 Zero-centered 과정만 거친다.
실제 모델에서는 train data에서 계산한 평균을 test data에도 동일하게 적용한다.
< Weight Initialization >
초기값을 몇으로 잡아야 최적의 모델을 구할 수 있을까?
만약 초기값을 0으로 한다면, 모든 뉴런은 동일한 일을 하게 될 것이다.
즉, 모든 gradient의 값이 같게 될 것이다. 이렇게 하는 것은 의미가 없다.
그래서 생각한 첫번째 Idea는 ‘작은 random한 수로 초기화’를 하는 것이다.
초기 Weight는 표준정규분포에서 Sampling을 한다.
하지만 이런 경우 얕은 network에서는 잘 작동을 하지만 network가 깊어질 경우 문제가 생긴다.
왜냐하면 network가 깊으면 깊을수록, weight의 값이 너무 작아 0으로 수렴하기 때문이다.
만약 표준 편차를 키우게 되면 어떨까?
activaton value의 값이 극단적인 값을 가지게 되고, gradient의 값이 모두 0으로 수렴할 것이다.
이런 초기값 문제에 대해서 ‘Xavier initialization’이라는 논문이 제시 되었는데
일단 activation function이 linear하다는 가정하에
다음과 같은 식을 사용하여 weight의 값을 초기화 한다.
이 식을 이용하면 입/출력의 분산을 맞춰줄 수 있게 된다.
하지만 activation function을 ReLU로 정한 경우, 출력의 분산이 반토막 나기 때문에 이 식이 성립하지 않는다.
보통 activation function이 ReLU인 경우에는 He Initialization을 사용한다.
Weight 초기화 문제를 해결하기 위해 여러 논문이 제시 되었는데 정말 많다.
< Batch Normalization >
만약 unit gaussian activation을 원하면 그렇게 직접 만들어보자.
현재 Batch에서 계산한 mean과 variance를 이용하여 정규화를 해주는 과정을 Model에 추가해주는 것이다.
각 layer에서 Weight가 지속적으로 곱해져서 생기는 Bad Scaling의 효과를 상쇄시킬 수 있다.
하지만 unit gaussian으로 바꿔주는 것이 무조건 좋은 것 인가?
이에 유연성을 붙여주기 위해 분산과 평균을 이용해 Normalized를 좀 더 유연하게 할 수 있게 했다.
논문에 나와있는 Batch Normalization의 알고리즘은 다음과 같다.
Batch Normalization의 특징을 살펴보면
-
Regularization의 역할도 할 수 있다. (Overfitting을 방지할 수 있다.)
-
weight의 초기화 의존성에 대한 문제도 줄였다.
-
Test할 땐 미니배치의 평균과 표준편차를 구할 수 없으니 Training하면서 구한 평균의 이동평균을 이용해 고정된 Mean과 Std를 사용한다.
-
학습 속도를 개선할 수 있다.
< 학습 과정을 설계하는 법 >
첫번째로 고려야 할 사항은 데이터 전처리 과정이다.
두번째로는 어떤 architecture를 선택해야 하는 것인지 골라야 한다.
그렇다면 이제 가중치가 작은 값일 때 loss값이 어떻게 분포하는지 살펴봐야 한다.
우선 training data를 적게 잡고 loss의 값이 제대로 떨어지는지 한번 살펴보자.
여러 Hyperparameter들이 있는데 그 중 가장 먼저 고려야 해야하는 것은 Learning rate이다.
training 과정에서 cost가 줄어들지 않으면 Learning rate가 너무 작은지 의심을 한번 해보자.
단, activation function이 softmax인 경우
가중치는 서서히 변하지만 accurancy값은 갑자기 증가할 수 있는데
이것은 옳은 방향으로 학습을 하고 있다는 것을 의미한다.
cost값이 너무 커서 발산한다면, Learning rate가 너무 큰지 의심을 한번 해보고 계속해서 값을 조정해야 한다.
< Hyperparameter Optimization >
딥러닝 모델을 만들 때, 고려해야 할 Hyperparameter들이 정말 많다.
보통 training set으로 학습을 시키고 validation set으로 평가를 한다.
만약 Hyperparameter를 바꿨는데 update된 cost의 값이
원래 cost의 값보다 3배 이상 빠르게 증가할 경우 다른 parameter를 한 번 써보자.
Hyperparameter의 값을 여러 시행착오를 거쳐서 정하는 것도 하나의 방법이지만,
시간이 없다면 이러한 방법으로 hyperparameter를 찾는 것이 한계가 있다.
따라서 Grid Search vs Random Serach 두가지 방법이 제시되었다.
Grid Search는
탐색의 대상이 되는 특정 구간 내의 후보 hyperparameter 값들을 일정한 간격을 두고 선정하여,
이들 각각에 대하여 측정한 성능 결과를 기록한 뒤,
가장 높은 성능을 발휘했던 hyperparameter 값을 선정하는 방법이다.
반면, Random Search는
Grid Search와 큰 맥락은 유사하나,
탐색 대상 구간 내의 후보 hyperparameter 값들을
랜덤 샘플링(sampling)을 통해 선정한다는 점이 다르다.
Random Search는
Grid Search에 비해 불필요한 반복 수행 횟수를 대폭 줄이면서,
동시에 정해진 간격(grid) 사이에 위치한 값들에 대해서도 확률적으로 탐색이 가능하므로,
최적 hyperparameter 값을 더 빨리 찾을 수 있는 것으로 알려져 있다.
따라서 실제로는 random search가 더 좋은 방법이라고 알려져 있다.
실제로 Hyperparameter Optimization는 다음과 같은 과정으로 일어난다.
-
Hyperparameter 값을 설정한다.
-
1에서 정한 범위 내에서 파라미터 값을 무작위로 추출한다.
-
검증 데이터(Validation Set)을 이용하여 평가한다.
-
특정 횟수를 반복하여 그 정확도를 보고 Hyperparameter 범위를 좁힌다.
Hyperparameter를 정할 때 loss curve를 보고 이 hyperparameter가 적합한지 아닌지 평가를 하는 경우가 많다.
만약 loss curve가 초기에 평평하다면 초기화가 잘못될 가능성이 클 것이다.
그리고 training accuracy와 validation accuracy가 gap이 클 경우 overfitting이 된 가능성이 매우 높은 것이다.
그 gap이 없을 경우 model capacity를 늘리는 것을 고려해봐야 한다.
즉, training한 dataset이 너무 작은 경우일 수도 있다.
이렇게 Training Neural Networks 중
Activation Function, 데이터 전처리, Weight 초기화,
Batch Normalization, Hyperparameter Optimization하는 경우에 대해서 살펴보았다.
오늘은 여기까지 :)
(참고자료)
leechamin.tistory.com/search/cs231n
taeyoung96.github.io/categories/CS231n/
'ML & DL > CS231n (Stanford Univ.)' 카테고리의 다른 글
[CS231n] Lecture 8 | Deep Learning Software (0) | 2020.11.28 |
---|---|
[CS231n] Lecture 7 | Training Neural Networks II (0) | 2020.11.28 |
[CS231n] Lecture 5 | Convolutional Neural Networks (0) | 2020.11.14 |
[CS231n] Lecture 4 | Introduction to Neural Networks (0) | 2020.11.14 |
[CS231n] Lecture 3 | Loss Functions and Optimization (0) | 2020.10.24 |
댓글