CS231n - lecture 6: Training neural networks,Part 1

Nunucoder·2021년 9월 25일
0



Mini-batch Stochastic Gradient Descent (gradient의 반대 방향으로 이동하는 것)

Mini-batch SGD는 우선 데이터의 일부만 가지고 Forword pass를 수행한 뒤에 Loss를 계산합니다.
그리고 gradient를 계산하기 위해서 backprop를 수행합니다. 그 gradient를 이용해서 파라미터를 업데이트합니다.

NN 학습을 처음 시작할때 필요한 기본 설정에 대해 알아볼 것입니다.
활성함수 선택, 데이터 전처리, 가중치 초기화 Regularization, gradient checking 등이 이에 속하죠
Training dynamics에 대해서도 다룰 것입니다.
학습이 잘 되고 있는지 확인하는 법에 대해 배울 것입니다.

어떤 방식으로 파라미터를 업데이트할 것인지에 대해서도 배울 것이고
가장 적절한 하이퍼파라미터를 찾기 위해 하이퍼파라미터를 Optimization 하는 방법도 배울 것입니다.
평가에 대해서도 이야기 할 것입니다. 그리고 Model ensemble에 대해서도 배웁니다.


Part 1 으로 활성함수, 데이터 전처리,가중치 초기화, Batch Normalization

학습 과정 다루기, 하이퍼 파라미터 Optimization을 배워 보도록 하겠습니다.

▶ ACTIVATION FUNCTION

Activation Function
먼저 지난시간에 봤던 Layer를 살펴보면 데이터 입력이 들어오면 가중치와 곱합니다. FC 나 CNN이 될 수 있겠죠
그 다음 활성함수, 즉 비선형 연산을 거치게 됩니다.


좀 더 다양한 종류의 활성함수와
그들간의 Trade-off에 대해 다뤄보도록 하겠습니다.

1. sigmoid 함수


특징:

얘가 하는 일은 각 입력을 받아서 그 입력을 [0, 1] 사이의 값이 되도록 해줍니다.

입력의 값이 크면 Sigmoid의 출력은 1에 가까울 것이고 값이 작으면 0에 가까울 것입니다.
0 근처 구간을 보면 선형스럽습니다 (/ 모양) 그 쪽은 선형함수 같아 보입니다.

sigmoid 문제점
첫번째는 Saturation되는게 gradient를 없앱니다.(Vanishing gredient)

이 Sigmoid gate를 Computraional graph에서 한번 살펴보겠습니다.
여기 데이터 X가 있고 출력이 있습니다.

Backprop에서 Gradient는 어떻게될까요?
우선 dL/dSigma 가 있습니다. dL/dSigma가 밑으로 내려가죠
그리고 dX/dSigma를 곱하게 될 것입니다.

이 값이 local sigmoid function의 gradient가 될 것입니다.

그리고 이런 값들이 계속 연쇄적으로 Backporp될 것입니다.
X가 –10이면 ?gradient는 어떻게 생기게 될까요?

gradient = 0

Sigmoid에서 음의 큰 값이면 sigmoid가 flat하게 되고 gradient가 0이 되겠죠
이 값이 backprop에 의해 밑으로 내려갈 것입니다.거의 0에 가까운 값이 backprob 될 것입니다.
이 부분에서 gradient가 죽어버리게 되고 밑으로 0이 계속 전달되게 됩니다.

X가 0이면?

선형 그래프 모양을 가져 잘작동함.
괜찮은 gradient를 얻게 될 것이고 backprop 이 잘 될 것입니다.

X가 10이면 ?

X가 값이 큰 양수 일 경우에도 sigmoid가 flat하기 때문에 gradient들 다 1이됨. gradient가 잘 흐르지 않음

두 번째 문제는 바로 sigmoid 의 출력이 zero centered(원점대칭) 하지 않다는 것입니다.
-> 업데이트 비효율적

입력이 양수 일 때 gradient가 "전부 양수" 또는 "전부 음수"입니다.
W가 모두 같은 방향으로만 움직일 것임을 의미하게 됩니다.
파라미터를 업데이트 할 때 다 같이 증가하거나 다 같이 감소하거나 할 수 밖에 없습니다.
여기서의 문제는 이런 gradient 업데이트는 아주 비효율적이라는 것입니다.

세 번째 문제는 exp()로 인해 계산비용이 크다는 것입니다. 이 세 번째 문제는 그렇게 큰 문제는 아닙니다.
큰 그림으로 봤을 때 다른 연산들, 가령 내적의 더 계산이 비쌉니다.

2. tanh 함수


특징

  • 범위가 [-1 , 1] 입니다
  • zero-centered 입니다
  • saturation때문에 Gradient가 없어집니다.

3. ReLU의 함수

f(x) = max(0,x)

특징

  • 이 함수는 element-wise 연산을 수행하며 입력이 음수면 값이 0, 양수면 입력 값 그대로를 출력합니다.

  • ReLU는 양의 값에서는 saturation되지 않습니다.

  • 계산 효율이 아주 뛰어납니다. 단순히 max 연산이므로 계산이 매우 빠릅니다.

렐루의 문제점

ReLU는 더 이상 zero-centered가 아니라는 것입니다.

ReLU에서 양의 수에서는 saturation 되지 않지만 음의 경우에서는 그렇지 않습니다.
gradient의 절반을 죽여버리는 셈입니다.

dead ReLU

data cloud = traing data, ReLU에서는 평면의 절반만 activate 된다는 것을 알 수 있습니다.

ReLU가 data cloud에서 떨어져 있는 경우에 "dead ReLU" 가 발생할 수 있습니다.
dead ReLU에서는 activate 가 일어나지 않고 update되지 않습니다. 반면 active ReLU는
일부는 active되고 일부는 active하지 않을 것입니다.

dead relu 발생이유

  • 초기화를 잘 못한 경우
  • Leraning rate가 지나치게 높은 경우

4. leaky ReLU


특징

  • negarive region에서 0이 아닙니다.
    -> negative space 에서도 saturation 되지 않습니다.

  • 계산이 효율적입니다.

  • dead ReLU 현상도 더 이상 없습니다.

5. PReLU


특징

  • negative space에 기울기가 있다는 점에서 Leaky ReLU와 유사합니다.
  • 기울기가 alpha 라는 파라미터로 결정됩니다.

alpha: backpro으로 학습시키는 파라미터

6. ELU

특징

  • zero-mean 에 가까운 출력값을 보입니다.
  • ELU는 negative에서 "기울기" 를 가지는 것 대신 "saturation" 됩니다.
  • ELU saturation이 잡음(noise)에 강하다고 주장합니다.

7. Maxout Neuron


특징

  • 입력을 받아드리는 특정한 기본형식을 미리 정의하지 않습니다.
  • w1에 x를 내적한 값 + b1과 w2에 x를 내적한 값 + b2 의 최댓값을 사용합니다.
  • 문제 : 뉴런당 파라미터의 수가 두배가 된다는 것입니다.

▶ Data processing

이미지의 경우 전처리로 zero-centering 정도만 해줍니다.
normalization 하지는 않습니다. 왜냐하면 이미지는 이미 각 차원 간에 스케일이 어느정도 맞춰져 있기 때문입니다.

기본적으로 zero-mean 으로 전처리를 해준다는 것입니다. 평균 값은 전체 Training data에서 계산합니다.

보통 입력이미지의 사이즈를 서로 맞춰주는데 가령 32x32x3 이고 네트워크에 들어가기 전에 평균값을 빼주게 됩니다.
그리고 Test time의 이미지에도 Training time에 계산한 평균 값으로 빼주게 됩니다.
실제로 일부 네트워크는 채널 전체의 평균을 구하지 않고 채널마다 평균을 독립적으로 계산하는 경우도 있습니다.

채널별로 평균이 비슷할 것인지 아니면 독립적으로 계산해야 할 것인지는 상황에 따라 -> AlexNet 이후 VGGNet 같은 네트워크

▶ Weight initialization

Example: "Two Layer Neural Network“

"모든 가중치 = 0" 이면 어떻게 될까요?

  • 모든 뉴런이 <같은일> 을 한다
  • 가중치가 0 이라서 모든 뉴런은 모두 다 같은 연산을 수행합니다. 출력도 모두 같을 것이고. 결국 gradient도 서로 같습니다.

초기화 문제를 해결하는 첫번째 방법은 임의의 작은 값으로 초기화하는 것입니다

조금 더 깊은 네트워크를 가지고 실험해봅시다.

설정 : 10개의 레이어, 레이어당 500개의 뉴런이 있습니다. nonlinearities로는 tanh를 사용해 봅시다
가중치는 "임의의 작은 값" 으로 초기화시킵니다.데이터를 랜덤으로 만들어주고 이 데이터를 forward pass시켜보겠습니다.


각 레이어별 activations 수치를 통계화 시켜보겠습니다.
이 결과는 각 레이어 출력의 평균과 표준편차를 계산한 것입니다.
첫번째 레이어를 한번 봅시다. 평균은 항상 0 근처에 있습니다


X와 W를 내적한 값에 tanh를 취합니다.

tanh가 zero-centered 이니까 평균이 0에 가깝습니다.

표준편차를 보게되면 줄어듭니다. 아주 가파르게 줄어들어서 0에 수렴합니다.


첫 번째 레이어에서는 가우시안스럽게 생긴 좋은 분포를 형성하고 있는것을 볼 수 있습니다.
하지만 문제는 우리가 W를 곱하면 곱할수록 W가 너무 작은 값들이라서 출력 값이 급격히 줄어드는 것입니다.
결국 0이 되겠죠 그래서 모든 활성함수 결과가 0이됩니다.

각 가중치들에 해당하는 gradient가 어떨까?
각 레이어의 "입력" 이 엄청 작은 것입니다.입력 값이 점점 0에 수렴합니다

Updated weight = upstream gradient * local gradient

X가 엄청 작은 값이기 때문에 gradient도 작을 것이고 결국 업데이트가 잘 일어나지 않습니다.

가중치의 편차를 0.01 이 아니라 1(큰 값)로 하면 어떻게 될까요?

가중치가 큰 값을 가지므로 tanh의 출력은 항상 saturation될 것입니다.
출력이 항상 -1 이거나 +1 일 것입니다.

적절한 가중치를 얻기는 너무 어렵습니다.

가중치 초기화 좋은 방법 - Xavier initialization

  • tanh 적용

Xavier initialization가 하는 일은 입/출력의 분산을 맞춰주는 것입니다.
입력의 수가 작으면 더 작은 값으로 나누고 좀 더 큰 값을 얻습니다.
우리는 더 큰 가중치가 필요합니다. 왜냐하면 작은 입력의 수가 가중치와 곱해지기 때문에, 가중치가 더
커야만 출력의 분산 만큼 큰 값을 얻을 수 있기 때문입니다.반대로 입력의 수가 많은 경우에는 더 작은 가중치가 필요합니다. 가우시안 모양과 비슷한 분포도를 얻을수 있습니다.

가중치 초기화 좋은 방법 - Xavier initialization

  • ReLU 사용

ReLU는 출력의 절반을 죽입니다. 그 절반은 매번 0이 됩니다.
그래서 출력의 분산을 반토막 내버립니다. 그러므로 이전과 같은 가정을 해버리면 ReLU에서는 잘 작동하지 않습니다.
값이 너무 작아지는 것입니다.점점 더 많은 값들이 0이 되고 결국은 비활성(deactivated) 되버립니다.

가중치 초기화 좋은 방법 - Xavier initialization / 2

  • ReLU 사용

기존 Xavier initialization에서 추가적으로 2를 더 나눠줍니다.
뉴런 들 중 절반이 없어진다는 사실을 고려하기 위해서 입니다.
입력은 반밖에 안들어가므로 반으로 나눠주는 텀을 추가적으로 더해 주는 것이고 실제로 잘 동작합니다.
결과를 보시면 전체적으로 좋은 분포를 형성하고 있는것을 볼 수 있습니다.

▶ Batch normalization

Batch normalization : 레이어의 출력이 unit gaussian 형태로 만들기

동작:
어떤 레이어로부터 나온 Batch 단위 만큼의 activations 이 있다고 했을때, 우린 이 값들이 Unit gaussian 이기를 원합니다.

Batch에서 계산한 mean과 variance를 이용해서 Normalization 해 볼 수 있을 것입니다.
가중치를 잘 초기화 시키는 것 대신에 학습 할 때 마다 각 레이어에 이런 일을 해줘서 모든 레이어가 Unit gaussian이 되도록 해줍니다.
각 뉴런을 평균과 분산으로 Normalization 해주므로서 함수로 구현하는 것입니다.
Batch단위로 한 레이어에 입력으로 들어오는 모든 값들을 이용해서 평균과 분산을 구해서 Normalization 해주는 것입니다.

Batch당 N개의 학습 데이터가 있고 각 데이터가 D차원
1. 각 차원별로(feature element별로) 평균을 각각 구해줍니다.
2. 한 Batch 내에 이걸 전부 계산해서 Normalize 합니다.

위 연산은 FC나 Cov Layer 직후에 넣어줍니다.
각 레이어의 W가 지속적으로 곱해져서 Bad scaling effect가 발생했습니다만
Normalization은 그 bad effect를 상쇄시켜 버립니다.
Batch Normalization은 입력의 스케일만 살짝 조정해 주는 역할이기 때문에 FC와 Conv 어디에든 적용할 수 있습니다.

FC와 Conv Layer에서 차이점

  • Normalization을 차원마다 독립적으로 수행하는 것이 아니라 같은 Activation Map의 같은 채널, Depth에 있는 요소들은 같이 Normalize

tanh의 입력이 unit gaussian 이기를 바라는 것일까요?

normalization이 하는 일은 입력이 tanh의 linear한 영역에만 존재하도록 강제하는 것입니다.그렇게 되면 saturation이 전혀 일어나지 않게 됩니다.
-> Saturation이 안 일어나는것보다 우리가 제어를 하는 것이 더 좋다!!

Unit gaussian으로 normalize 된 값들을 감마로는 스케일링의 효과를, 베타는 이동의 효과

normalized 된네트워크가 값 들을 원상복구 하고 싶다면 "감마 = 분산", "베타 = 평균“

Batch normalization 효과

입력이 있고 mini-batch에서의 평균을 계산합니다. 모든 mini-batch 마다 각각 계산해 줍니다. 분산도 계산합니다.그리고 평균과 분산으로 Normalize 한 이후에 다시 추가적인 scaling, shifting factor를 사용합니다.
Batch normalization은 gradient의 흐름을 보다 원활하게 해주며 학습이 더 잘되게 해줍니다.

Batch normalization : regularization의 역할

각 레이어의 출력은 해당 데이터 하나 뿐만 아니라 batch 안에 존재하는 모든 데이터들에 영향을 받습니다.(평균, 분산)
왜냐하면 각 레이어의 입력은 해당 배치의 (표본)평균으로 Normalize 되기 때문입니다.
Batch 내의 모든 데이터가 입력으로 한대 묶인다고 볼 수 있습니다. 이는 regularization effect를 줍니다

▶ Babysitting the learning process

학습과정을 어떻게 모니터링하고 하이퍼파라미터를 조절할 것인지를 배워보겠습니다.

1. data processing


zero-mean을 사용합니다.

2. Choose the architecture


하나의 Hidden Layer 와 50개의 뉴런을 가진 모델로 해봅시다.

3. initialize network


Forward pass를 하고난 후에 Loss확인합니다.
10개의 클래스라면 Loss는 –log(1/10)
약 2.3 정도 되는 것을 보실 수 있습니다. 이를 통해 Loss가 원하는 대로 동작한다는 것을 알 수 있습니다.


regularization 증가 --> Loss가 증가

4.train

전체 데이터 셋을 사용할 것이고 regularization을 약간만 주면서 적절한 learning rate를 찾아야 합니다.
Learning rate는 가장 중요한 하이퍼파라미터 중 하나입니다. 가장 먼저 정해야만 하는 하이퍼파라미터 입니다.

learning rate = 1e-6 -> loss 의 변화 미세

Loss가 잘 줄어들지 않는 가장 큰 요인은 Learning rate가 지나치게 작은 경우입니다.


왜 loss가 잘 변하지 않음에도 training/validation accuracy가 20% 인가?

현재 상황은 확률 값들이 아직까지 멀리 퍼져있고 때문에 loss는 여전히 비슷비슷한 것입니다. 하지만 이 확률은 조금씩 "옮은" 방향으로 바뀌고 있습니다. 우리가 지금 "학습" 을 하고 있기 때문이죠

learning rate = 1e6 ->cost= NaNs(exploded)

learning rate가 지나치게 높기 때문에 발산값이 출력됩니다.learning rate를 낮춰야만 합니다.

learning rate는 1e-3 에서 1e-5 사이의 값을 사용합니다.

▶ Hyperparameter optimization

하이퍼 파라미터를 최적화시키고 그중 가장 좋은 것을 선택하려면 어떻게 해야 할까요?

cross-validation :Training set으로 학습시키고 Validation set으로 평가하는 방법

5 epochs을 coarse search를 하는 과정

  • validation accuracy를 통해 높은 정확도를 가진값을 확인한다

● 하이퍼 파라미터 최적화 시 tip
Log scale 적용(learning rate는 gradient와 곱해지기 때문에 learning rate의 선택 범위를 log scale을
사용하는 편이 좋습니다.)

regulation , learning rate를 조절하여 더 좋은 validation accuracy를 얻음.
-> 하이퍼 파라미터 탐색

grid search: 하이퍼 파라미터를 고정된 값과 간격으로 샘플링

효과: grid search < random search
Random이 더 좋은 이유는 바로 내 모델이 어떤 특정 파라미터의 변화에 더 민감하게 반응(녹색선)

여러분은 neural networks practitioner 손실함수의 출력이 음악이라고 생각해 보면 적절한 출력(loss)을 내보이기 위해서 모든 것들을 조절하는 것이라고 보시면 될 것입니다. 때문에 이는 일종의 art라고 할 수 있습니다.

▶ Summary

활성 함수와 데이터 전처리 그리고 가중치 초기화, Batch Norm, 학습 과정 준비하기
하이퍼 파라미터 최적화를 배웠습니다.

profile
집에가고싶다

0개의 댓글