모델의 구조 이외에 중요한 또 다른 것에는 무엇이 있을까?
activation function, layer들과 같이 모델 자체를 무엇으로 만들지도 중요하지만 처리하고자 하는 data를 어떻게 바꾸고 모델의 초기 조건을 어떻게 만들지 또한 중요하다. 이번 강의에서는 크게 3가지를 중심으로 알아보고자 한다
- 맨처음에 input으로 들어오게 될 Data를 전처리(중요한 데이터 중심으로 model이 쉽게 training하게 만
- training을 진행하기 전 network내에 있는 parameter initalization하기
- Hyperparmeter 최적화하기
Data Preprocessing
1. Mean Subtraction
처음에 한번데이터의 모든 feature(input data)에 대해 평균을 구해 그 평균을 빼준다.(batch마다 진행하는 것이 아니라 한번에 진행) 이를 통해 data들이zero_centered 되는 효과를 얻을 수 있는데 이는 CS231n 6-1. Setting Up Architecture (Activation Functions)에서 sigmoid의 문제점과 같이 최적의 w vector을 찾는데에 학습이 가능한 gradient의 값이 정해져 최적의 값을 찾는데 오래 찾는 문제점을 해결한다.
또한 input data에 있는 어떠한 형태의 noise들도 결국에 최적의 의 값을 찾는데 영향을 미칠 수 있기 떄문에 mean subtraction이 필요로 한다. 이미지처리에서는 주로 이 부분까지만 주로 진행하는데 이미지의 pixel 정보가 이미 상대적으로 비교와 학습이 가능한 규모와 분포를 가졌기 떄문에 굳이 normalization을 진행하지 않아도 된다.
예를 들어Alexnet 에 경우 이미지([32,32,3]) 배열의 평균을 빼면서 전처리를 진행하고,VGG 에서는 이미지를 구성하는 3가지 channel(RGB) 각각의 평균을 구해 빼면서 전처리를 진행한다. 각각의 channel에 대한 평균을 구해서 뺴는 것이 전체 이미지의 배열의 평균을 빼는 것보다 mean subtraction을 통해 달라지는 점이 많고 다루기 쉽다고 한다.
Mean Subtraction이 zero-centered가 문제인 activation function에 도움을 줄까?
정답부터 말하면 아니다!
sigmoid,relu등 zero-cenetered가 아닌 activation function들의 input으로mean subtraciton이 된 input이 들어오게 될 경우 문제를 해결할 수 있다. 다만 이 activation function들의 결과들이 다시 zero-centered가 되지 않기 때문에 오직 첫번째 layer에 대해서만 효과가 있어 본질적인 해결책이 되지 못한다.
2. Normalization
데이터의 차원(dimension)을 정규화(normalize)하여 비슷한 scale로 만드는 과정으로 데이터들이 공간상에 분포되어 있는 거리를 같게 만든다. 밑에 2개의 방법을 때에 따라서는 혼합하여 사용하기도 하며 각각의 특성을 아는게 중며하다
- 각각의 차원을 표준편차로 나누는 방법
- 앞선 mean subtraction으로 인한 zero-cenetered한 특성 덕분에 더 효과가 생김
- 분산을 1로 만들어 정규분포로 변환하고 이상치(outlier )를 줄이고 특성간 상대적 중요도 조정
- zero-centered하지 않으면 원점부분이 아닌 곳에 값이 모이게 될거임
- 각 차원에 대해서 min과 max value가 각각 -1과 1이 되도록 normalize를 시킨다
- input feature들이 서로 다른 scale(범위) 을 가지고 있을 때 주로 사용함(단, 이때 다른 scale을 갖고 있는 것이 당연한 경우에는 진행하지 않는다)
- 어떤 feature은 0
1범위, 어떤 feature은 -100100 범위이면 각 feature을 동일한 scale로 조정하여, 동등한 중요도로 취급하도록 만든다! - image data에서는 픽셀이 동일한 범위(0~255)이기 떄문에 feature간 scale차이가 크지 않고 이는 곧 추가적인 scaling 필요없음(표준편차로만 나누면 됨)

linear classification에서 normalization을 할 경우 아래와 같은 이점을 가지게 된다! 분류를 담당하는 선이 조금 움직이더라도 분류하는데에 큰 영향을 주지 않아 최적화하는데 도움을 줄 수 있다.
neural network에서도 input 데이터로 들어온 image의 픽셀 자체를 normalize하지 않지만 activation function에 들어가기 전에 convolutional layer에서 나온 값을 normalize하여 성능을 향상 시키줄 수 있다(batch normalization). 이렇게 함으로써 weight가 조금 변화하더라도 일반적인 학습이 가능하게 된다

3. CS231n 6-3. PCA & Whitening 1번은 거의 진행, 2번도 주로 진행
이미지처리 부분에서는 PCA와 Whitening을 진행하지는 않는다. 결국 여기에서 하고자하는 바는 input이 되는 pixel을 공간적인 형태를 유지하면서 convolutional layer을 통과시켜 학습을 하는 것인데 PCA를 진행하게 된다면 새로운 차원으로 데이터들이 바뀌게 되면서 공간적인 정보를 잃어 할 이유가 없다. CS229에서 관련된 내용을 자세하게 다룬다. 21. Principal Component Analysis(PCA)
- 간단하게 설명하자면SVD factorization을 통해 weight를 나누고 PCA 방법으로 dimensionality reduction(차원축소)을 진행하여 data를 decorrelated하게 만든다(필요한 정보는 유지하되 필요없는 noisy들은 제거)
- 이후 Whitening을 통해 scale을 normalize하여 각각의 feature들이 독립적이며 같은 분산을 만들게 하여 모델이 더 쉽게 학습하게 만든다.
- [!] Mean Substraction을 진행하지 않고 PCA를 진행하면주성분(분산이 가장 큰방향을 나타내는 새로운 축: 중요한 정보를 많이 가지고 있음) 의미있는 패턴을 나타내지 못할 수 있다.
- PCA 자체가 주성분을 찾는것이 중요한데 원점에서 멀어질 경우, 주성분이 데이터의 중심이 아니라 원점을 중심으로 한 축을 가져 부정확한 결과를 가져옴
- PCA 계산과정에서 원점을 중심으로 주성분을 찾는 식이 있는듯함
- [!] Normalize을 진행하지 않고 PCA를 진행하면 주성분이 데이터의 분산이 큰 특성을 중심으로 찾음
- 즉 scaling을 갖게 하지 않으면 특정 feature가 영향을 많이 주어 주성분을 구하는데 오류가 생기게 됨
Weight Initalization
앞에서는 input 되는 data를 어떻게 전처리할지 배웠고 이제 network를 학습시키기 이전에 parameter들을 초기화하는 방법에 대해 배워야함!
1. All zero Initalization
위의 data initalization을 올바르게 수행했다면 weigth의 반은 양수, 반은 음수가 되기 떄문에 그냥 모두 0으로 만들면 되지 않을까(어차피 확률적으로 나오는 값이 0!) 라는 생각에서 나온 방법이다.
이렇게 될 경우 weight가 다 똑같은 값이므로 output value,gradient가 연결되어 있는 neuron들이 모두 같은 update를 거쳐 뉴런 사이의 비대칭성(asymmetry)을 없애 network의 성능이 매우 안좋게 된다. 사실상 여러가지 neuron을 사용한 효과를 얻지 못한다. 그렇기 떄문에 weight의 값들이 서로 다른 값을로 초기화를 해야한다.
2. Small random number
서로 다른 값들을 가지면서 data들이 전처리를 통해 zero-centered되어 있고 normalize 되어 있으므로 여전히 weight가 0에 가까운 매우 작은 값으로 하는 것이 효율적인 방법이지 않을까라는 생각에서 나왔다.
대칭성(symmetry)를 깨기 위해 무작위한 작은 숫자를 사용하며 여기서는 gaussian distribution에서 무작위로 뽑아 값들을 구했다. 이렇게 할 경우 각 neuron들이 서로 다른 update를 진행하기 때문에 기존의 문제를 해결할 수 있다. 또한 아래 그래프를 볼 경우 activation된 값들의 평균이 0으로 잘 학습이 된 것으로 보인다(tanh를 통과했기 떄문에 zero-centered 특성을 가지고있음)
🤬 문제점:
- 매우 작은 weight ➡️ dead neuron ➡️ 학습 불가
forward pass에서 weight가 작을 경우 layer을 지나면서 값들이 점점 작아져 표준편차가 0이 되어 곧 모든 값들이 0으로 가게 되는 문제를 겪게 되고, backward pass에서는 결국 local gradient= x에 대한 식이 되어 ( ) 곧 gradient도 0이 되고 이로 인해 update가 진행되지 않는다. 또한 input data x 입장에서 local gradient= 에 대한 식이 되는데, 이때도 가 곧 0으로 가게 되면 local gradient의 값도 0으로 가게 된다.

- 매우 큰 weight ➡️ local gradient의 값이 0 ➡️ 포화
위의 문제가 weight 의 값을 작게 만들어서 생기게 되었다면 weight의 값을 크게 만들면 되지 않을까? 만약 W값의 초기화를 0.01을 곱하는 것이 아닌 1을 곱한다면 어떻게 될까? 이렇게 될 경우 weigth 값이 크게 되어, activation 값이 -1 혹은 1이 되고 역전파 과정에서 local gradient의 값이 0에 가까워져 포화가 됨에 따라 제대로 된 학습이 불가능하게 된다.

3. Xavier initialization
- 논문
Xavier intialization [Glorot et al., 2010]
결국 위에서 문제는 weight가 너무 크면 saturate, weight가 너무 작으면 dead neuron이 된다는 점이기 때문에 중요한 것은 weight가 크지도 작지도 않은 weight로 초기화해야하는 것이다. 위의 문제점을 해결하기 위해 각각의 neuron output에 대해 variance를 1로 normalize한다. 이 방법이 강의가 진행된 시점에서 가장 많이 사용되는 방법이다!Xavier 즉,
- weight vector을 input의 수의 루트로 나눠 scaling하면서 진행한다
- 이를 통해 모든 network의 neuron들이 똑같은 output distribution을 가져
saturate와dead neuron문제를 해결하고 최적의 값으로의 수렴 속도를 향상시킨다(경험상 결과)
⭐️ 즉, 상대적인 값을 이용해 initialization 진행을 한다
- input이 많다면
saturate할 가능성이 높아지기 때문에(하나의 neuron이 여러가지 input가 연결되어 전달하는 값이 커질 수 있어 weight가 큰 것과 같은 효과를 가져옴) 전체적으로 spread한 output을 갖기 위해 큰값으로 나눠 작은 weight를 갖게 한다 - input이 적다면
gradient가 0이 될 가능성이 높기 떄문에(적은 input가 연결되어 작은 weight를 갖는 것과 같이 값의 영향을 덜 받는다) 작은값으로 나눠 큰 weigth를 갖게 만들어 분산이 고르게 되도록 만든다.
수학적 식 유도 과정

🤬 문제점
tanh가 아닌ReLU함수에서는 input 분포가 균일할때 지나갈때마다 반씩(양수반, 음수반) neuron이 기때문에 문제가 생긴다.- 편차가 강제로 반씩 되는데 이는 데이터를 보존하는데에 있어 문제가 되며 곧 표준편차가 0에 가까워져 제대로된 분포가 되지 못해 학습에 지장이 생기게 된다
3-2 He initialization
결국 반씩 데이터가 사라져 편차가 줄어드는게 문제가 되므로 분모의 값을 2로 나눔으로써 다시 전체적인 분포를되살리게 만든다. (He) . 이는 곧 학습 중에 전체적인 데이터의 편차를 일정하게 유지시킬 수 있도록 만들어 성능을 높임

Batch Normalization
- 논문 :
[loffe and Szegedy, 2015]⭐️batch_normalization 5. Dropout and Batch Normalization
여기서 하고자고 하는 바는 activation function의 input이 고르게 분포되는 것을 원한다면 즉,unit gaussian activation을 원한다면 그냥 그렇게 만들어라! 이다. 방법은 1) 각각의 차원에 대해서 평균(mean)과 분산(variance)를 구한 후 2) Unit Gaussian으로 normalize(정규화)시키는 것이다.
🤩 장점
- activation function전의 input 분포를 layer마다
gaussian distribution에 가깝게 만듦으로써 위에서 언급한dead neuron이나saturate가 되는 문제점을 해결한다. CNN에서convolutional layer의 결과로 나온 activation map 전체에서의 평균과 표준편차를 구해 단순히 normalize를 함으로써 공간정보를 유지하되 데이터의 분포를 activation function이 제대로 동작이 가능하게 만든다.- normalize를 통해 정규분포를 따르도록하여 입력값 범위를 제한시키고 이를 통해 saturate control, flexibility(입력값 자체를 제한하여 여러가지 시도 및 function 사용가능),regularization의 효과를 얻는다. CS231n 7-2. Evaluation & Regularization
Batch normalization이 regularization 효과를 얻는 이유
- Minibatch 별로 정규화값이 달라짐: 각 batch마다 평균과 분산을 계산하기 때문에 값들이 조금씩 달라지게 되고 이는
noise가 추가된 효과를 얻어 과적합 되는 것을 막는다- Noise 주입 효과: batch 마다 변하는 정규화 과정은 모델에 작은 변동을 일으켜
dropout처럼 모델의 weight를 안정화시키고 일반화 성능을 높인다
즉, layer을 지나게 되면 값이 튀게 되는데 이 값을 정규화시켜 activation function에 input으로 사용함으로써 weight 초기화와 별개로 학습을 효과적으로 할 수 있음과 동시에 regularization효과 또한 얻을 수 있다

Batch normalization에서 주의해야할 점
batch normalization은 layer내에서 weight의 값을 바꾸는 것이 아닌 하나의 독립적인 layer로 존재하여 output 값들을 gaussian 분포에 맞게 normalize 하는 것이다- 총 의 개수 n이 작을 경우 batch normalization의 효과가 조금은 적게 나타날 것이지만 그래도 여전히 일정수정의 효과를 보장한ㄷ
- 꼭
batch normalization결과가gaussian 분포와 정확하게 일치할 필요는 없다. rescaling과 shift 되는 정도를 하나의 parameter로 놓아 각 neuron에서 activation function의 입력값으로 들어가기에 최적의 값을 찾아 적절히 변형이 된다. 단, 이때batch normalization하기 전으로의 상태로 돌아갈 가능성은 매우 희박하기 때문에batch normalization을 하는 것이 학습을 위해 필요한 과정임을 알 수 있다.

신경망 훈련 단계
- 신경망 초기화: weight와 bias 초기화
- 순방향 전파: w,x,b를 이용해 가중치의 선형조합을 계산 후 activaition function에 적용
- 손실함수 계산: 실제 label과 예측 label을 통해 계산(손실함수 최소화가 우리의 목표!!)
- 역전파(Backpropagation): gradient를 사용하여 매개변수값을 update
- 반복(n epoch): 과적합하지 않고 손실함수가 최소화될때까지 n epoch동안 2,4단계를 반복 ⇒ 최상의 구성을 찾는 4가지 전략!! (Babysitting, Random, Grid, Bayesian)
1. Babysitting the learning process
-
데이터 전처리하기! (
preprocessing data) -
모델 구조 정하기(
Full Connected,CNN,activation function) -
loss가 합리적인 수준인지 확인하기
-
우리가 weigth가 작고 적당히 분산되어 있다는 것을 알고 있을 때 나오게 되는 loss를 예상하여 실제 loss가 합리적인 수준인지 확인을 해봐야한다
-
ex) 10개의 class가 있다면
softmax에서 이기 때문에 실제로 이와 유사한 값이 맨 첫번째 loss에 나와야한다
-
-
train data의 일부분만 가져와 학습 후,overfitting 되면 다음 단계로 넘어감
- 이때
regularization 항은잠깐 없애서 학습이 제대로 되는지를 loss가 0에 가까워지는 것을 통해 확인한다. - overfit된다는 뜻은 여러번 반복시켜 loss 값이 0에 가깝게 만드는 것인데 물론 전체 데이터가 overfit되면 안되지만, 일부의 데이터가 overfit된다는 뜻은 학습이 잘되고 있다는 뜻으로 해석할 수 있음
- 이때
-
Full data learning: 여기서 하나 주의해야할 것은learning_rate 를 먼저 정해야한다.
regularization 항을 낮게 설정하고 학습을 시키는데 만약 loss가 거의 바뀌지 않는다면learning rate가 너무 낮아서 그렇기 때문에 이 수치를 높여야한다. 하지만 이런 경우에도 정확도가 눈에 띄게 커지고는 하는데, 결국에는 학습이 진행중이고 이 weight들이 조금 맞는 방향으로 바뀌게 되기 때문이다(0%→10%→20%)learning rate를 크게 설정하면 loss가 Nan값이 찍히는데 이는 값이explode되기 때문이므로learning rate의 값을 줄여야한다. cost가 explode됨→ learing을 너무 많이 시킨 결과→ learning rate 줄임!
- [!] 실제 구현을 할 때 사용되는
learning rate는 주로 사이의 값을 사용한다.
Hyperparameter Optimization:
network architecture, regularization, learning rate등의 결정에 사용이 되며 hyperparameter의 값을 조정하여 특정 모델에 가장 적합한 값은 무엇인지 알아보는 과정이다.
1. Cross-Validation
14-1. Cross Validation 여러개의 fold로 trainig set과 validation set을 나누고 parameter값을 변경하며 최적의 결과를 찾는방법
- 몇 번의 epoch(모든 데이터를 학습한 횟수)를 통해 parameter들의 값이 어떻게 되어야하는지 rough하게 알 수 있다. ⇒ 내가 kaggle 같은 곳에서 모델을 만들 때 이 과정을 하지 않아서 hyperparameter 최적화에 오랜 시간을 보낸 것 같다..!
- 이를 통해 높은 accuracy를 갖는 weight의 범위를 뽑아내어 그 사이에서 적절한 값을 찾음
- 강의에서는 여기서
48%의 정확도를 얻음
- running time을 늘려 더 세밀한 탐색을 진행
- 단, 이때 weight 범위의 edge 값이 점수가 높을 경우 범위를 늘릴 필요가 있음!! ⇒ 학습 중에 learning rate의 값도 확인하여 범위의 끝값에서 점수가 좋은지 확인을 할 필요가 있음!
- 처음에 rough하게 알아본거기 때문에 우리가 생각한 범위안에 답이 꼭 있으리라는 보장은 없음
- 강의에서는 이 과정을 통해
53%의 정확도를 얻음
- [!]
explosion을 찾는 팁! 각 반복마다 기존에 구한 정확도 혹은 값보다 특정 값 이상이 될 경우(current cost > 3original cost) 더 이상 탐색을 그만하게 함으로써explosion을 방지한다 - [!] 어찌되었든
learning rate를 구하는 것이 제일 중요하고 한번에 4개 이상의 hyperparameter들을 최적화하는 것은 시간상 비효율적일 수 있다. 먼저 learning rate를 구하고 다른 hyperparameter들을 최적화한 뒤 다시 최적의 learning rate인지 재확인하는 과정이 필요하다.
2. Grid Search (Bad)
모든 hyperparameter 조합을 사전에 지정된 grid 형태로 탐색을 하는 방법이다. 하지만 차원이 커질 수록 계산 비용이 증가하고 시간 복잡도가 폭발하기 때문에 차원이 4보다 적을 때처럼 차원이 작을때 주로 사용되며 권장되지 않는다.GridSearchCV
2-2. Random Search (Good)
모든 hyperparameter 조합을 지정된 범위내에서 random하게 선택하여 탐색하는 방법으로 주로 사용되는 hyperparameter 탐색 방법이다
🤩 장점
- 매개변수의 중요도에 따라 training이 가능하며 대부분의 경우 함수에 영향을 많이 미치는 parameter와 그렇지 않은 parameter가 나뉘기 때문에 중요한 parameter의 값을 더 많이 시도해볼 수 있음으로써 최적의 값을 얻어내려고 해야한다.
- 한 매개변수가 다른 것보다 중요하다고 가정할때
grid에서는 9개의 모델을 학습시켜도 변수당 3개의 값만을 이용 Random에서는 9개의 다른 값을 이용하여 9개의 모델을 훈련⇒ 더 중요한 변수를 광범위하게 탐색
- 한 매개변수가 다른 것보다 중요하다고 가정할때
- 즉, 더 적은 수의 반복으로 최상의 구성 가능하다!(똑같은 변수를 반복해서 확인하는건 비효율적)
- 중요한 정보를 갖는 sample을 갖는게 중요한데 더 많이 확인 가능함!!

Monitoring: 이런 방식을 통해 구한 결과를 볼 때 주의해야할 점이 있음!
- test에 대한 결과에서 gap이 너무 클경우 과적합(overfitting)으로 인한 결과이고 gap이 없다면 더 accuracy가 증가할 가능성이 높기 때문에 model의 capacity를 늘려야한다.
- 너무 model이 간단해서 완벽히 예측하는거임, 실제로는 더 복잡해서 세밀하게 분류해야하며 더 복잡한 패턴을 포착할 수 있도록 CNN에서 hidden layer의 neuron 수를 늘리거나 학습가능한 parameter을 늘려야한다
