[CS231N] Lecture 6 Training Neural Networks I

YSL·2022년 8월 20일
post-thumbnail

앞으로 강의는 NN(Neural Networks)의 학습에 대해 진행된다.

  1. 신경망을 어떻게 설정하는지
    ex) 어떤 활성화 함수를 선택하는지, 어떻게 데이터를 전처리하는지, 정규화, 가중치 초기화 방법 등
  2. 훈련 역학 (Training Dynamic)
    ex) 매개변수 최적화, 하이퍼파라미터 업데이트 등
  3. 평가
    ex) 모델 앙상블

1. Activation Functions

layer에서 입력값이 들어오면 (FC 또는 CNN에) 가중치와 곱해 활성화 함수(= 비선형 연산)을 거친다.

Sigmoid

σ(x)=11+exσ(x) = \frac{1}{1 + e^{-x}}

입력 받은 값을 [0, 1] 범위의 값으로 변환해 출력해준다.
입력 : 매우 큰 값 → 출력 : 1에 가까운 값
입력 : 매우 작은 값 → 출력 : 0에 가까운 값

0 근처 구간(rigime)을 보면 선형 함수 같아 보이는 linear regime이 있다.

문제점

  1. 포화된(saturated : 입력 값이 너무 크거나 작을 때 출력값 그래프의 기울기가 0에 가까워지는 현상) 뉴런들이 기울기를 없앤다.
    ex) input = -10이어도 기울기는 0, input = +10이어도 기울기는 0으로, 너무 큰 값이 들어오면 기울기를 아예 0으로 없애버림

    → Vanishing Gradient를 야기한다. 기울기가 0이 되면 Backpropagation으로 0이 계속 전달되게 되면서 가중치가 업데이트 되지 못한다.

  2. 시그모이드의 출력이 0 중심이 아니다(Not zero-centered).
    입력이 모두 양수라면 시그모이드 출력값이 모두 양수(또는 모두 음수)로, 기울기의 부호가 같아져 가중치가 항상 모두 같은 방향으로만 움직이게 된다.

    → 파라미터(매개변수)를 업데이트할 때마다 다같이 증가(또는 다같이 감소)하기 때문에 매우 비효율적인 기울기 업데이트를 제공하게 된다.
    \because 4사분면 중 2개의 사분면(x,y 모두 양수 또는 모두 음수)만 사용할 수 있음

  3. 시그모이드 함수에 포함된 지수식(exp)이 계산적으로 비용이 많이 든다. 다만 다른 과정에서 더 많은 비용이 소모되기 때문에 큰 문제로 보진 않는다.

Tanh

Sigmoid와 유사해보이지만 출력값의 범위가 [-1, 1]이다.

Sigmoid와의 차이점

: 출력값이 0 중심이다(zero-centered).
하지만 여전히 Sigmoid의 1번 문제(saturated)는 해결하지 못한다.

ReLU(Rectified Linear Unit)

f(x)=max(0,x)f(x) = max(0, x)

입력 : 음수 → 출력 : 0
입력 : 양수 → 출력 : 입력값

Sigmoid, Tanh와의 차이점

  1. 입력값이 > 0일 때, saturation 되지 않는다.
    → 입력의 절반은 기울기가 절대 없어지지 않는다.
  2. 계산적으로 빠르고 효율적이다.
  3. 수렴속도가 Sigmoid, Tanh보다 약 6배 빠르다.

문제점

  1. 더이상 출력값이 0 중심이 아니다(Not zero-centered).
    ex) input = -10일 때 기울기는 0, input = 0일 때 기울기는 0, input = 10일 때 출력값이 선형 구간(linear regime)에 속한다. → 입력값의 범위 중 절반에 대해서는 기울기를 죽이기 때문에 전체 훈련 데이터(Data Cloud) 중 never activate(= never update)하는 Dead ReLU 발생
    \because 초기화를 잘못한 경우, 학습률(Learning rate)이 지나치게 높은 경우

Leaky ReLU & PReLU(Parametric Rectifier)

f(x)=max(0.01x,  x)f(x) = max(0.01x,\; x)

음수 영역의 기울기를 죽이지 않고 약간의 음수 기울기를 주는 방식

f(x)=max(α×x,  x)f(x) = max(α \times x, \;x)

기울기가 α라는 파라미터에 의해 결정되는데, α는 backpro으로 학슺시키는 파라미터로 만들어진다.

ReLU와의 차이점

음수 영역에서 출력값이 0이 아니다.
→ 입력값이 음수일 때도 saturation 되지 않고 기울기가 0으로 죽는 일이 발생하지 않는다.
= Dead ReLU 발생 X

ELU(Exponential Liner Units)

f(x)={x,  if    x>0α(exp(x)1),  if    x0f(x) = \begin{cases}x, \;if\;\; x > 0\\ α(exp(x) - 1) , \;if \;\; x \leq 0\end{cases}

ReLU와 Leaky ReLU의 중간 단계

장점

  1. ReLU의 모든 이점들을 가질 뿐만 아니라 zero-mean에 가까운 출력값을 보인다.
  2. 입력값이 음수일 때 saturation이 발생한다.(하지만 Leaky ReLU와 비교했을 때 조금 더 Noise에 견고함)

Maxout Neuron

max(x1Tx+b1,x2Tx+b2)max(x_1^Tx + b_1, x_2^Tx + b_2)

앞에서 본 활성화 함수들과 달리 특정한 기본 형식이 정해지지 않고 두 선형 함수 중 최댓값을 선택하는 방식이다.

장점

선형 함수 중 최댓값을 선택하기 때문에 Maxout도 선형이라 saturation 되지 않고 기울기가 0으로 없어지는 일이 발생하지 않는다.

문제점

뉴런당 파라미터의 수가 두 배가 되어 w1w_1w2w_2를 지니고 있어야 한다.

Activation Functions 결론

다양한 활성화 함수 중 ReLU가 실제로는 가장 많이 쓰이는데 이때 학습률(Learning rate)을 잘 결정해야 한다.
Sigmoid는 가장 오래되었고 LU 계열이 잘 작동하기 때문에 굳이 추천하지 않는다.


2. Data Preprocessing

가장 대표적인 데이터 전처리 과정은 아래와 같다.step 1. 입력된 데이터를 zero-mean으로 만든다.
step 2. 표준 편차를 사용해 normalization한다.

  • normalization을 해야 하는 이유
    모든 차원이 동일한 범위 안에 있도록 만들어 전부 동등한 기여(contribute)를 하게 만들기 위해서

이미지 데이터는 이미 각 차원 간에 스케일이 어느정도 맞춰져 있기 때문에 normalization은 하지 않고 zero-centering 정도만 해준다고 한다.

+) 이미지 전처리가 Sigmoid에서의 문제를 해결하기에는 충분하지 않다.
\because Sigmoid에서는 zero-mean이 필요한데, 데이터 전처리는 첫번째 레이어에서만 Sigmoid의 zero-mean 문제를 해결할 수 있음


3. Weight Initialization

NN을 수행할 때, 가중치가 업데이트 되면서 학습을 하게 된다. 초기 가중치가 있을 것이고, 기울기를 계산해서 가중치 값은 업데이트될 것이다.

Q. 만약 모든 가중치가 0으로 초기화된다면?

A. 입력되는 값에 상관없이 모두 같은 값을 출력하게 된다.
기울기도 같아지기 때문에 모든 가중치가 똑같은 값으로 업데이트 된다.
→ 뉴런이 죽는다 / 업데이트가 없다 (X)
뉴런이 같은 일을 하게 된다 / 모두 동일한 작업을 한다 (O)

뉴런들이 서로 다르게 생기길 원하기 때문에 가중치를 랜덤하게 초기화시켜 대칭이 되는 것을 피해야 한다.(Symmetry breaking)

해결방안 1. Small random numbers

: 가중치 W의 초기값을 표준정규분포에서 샘플링한 후, 좀 더 작은 값을 위해 스케일링하여 모든 가중치를 임의의 값으로 초기화하는 방식
간단한 네트워크에서는 괜찮디만 더 깊은 네트워크에서는 문제가 생길 수 있다.

가중치를 너무 작은 값으로 초기화하면?

All the activations become zero
가중치 W의 값이 너무 작기 때문에 출력 값도 급격히 줄어 결국 0이 된다. 활성화 함수의 결과도 0이 되고, 이를 이용해 역방향 계산을 하게 되면 기울기도 매우 작아져 업데이트가 잘 일어나지 않게 된다.

가중치를 너무 큰 값으로 초기화하면?

출력값이 매우 커지면서 포화(saturated)되어 tanh에서처럼 모든 기울기가 0이 되고 가중치가 업데이트 되지 않는 문제 발생한다.

해결방안 2. Xavier initialization

W = np.random.rand(fan_in, fan_out) / np.sqrt(fan_in)

표준정규분포에서 뽑은 값을 입력의 수로 스케일링해주는 방식
→ 입력과 출력의 분산을 맞춰준다.

입력 : 적다 → 더 큰 가중치가 필요함. 작은 입력의 수가 가중치와 곱해지기 때문에 가중치가 더 커야지만 출력의 분산만큼 큰 값을 얻을 수 있음
입력 : 많다 → 더 작은 가중치가 필요함.

이는 Linear Activation에 있다는 가정 하에 잘 작동하기 때문에 비선형인 ReLU를 쓰면 잘 작동하지 않는다.
ReLU에서 잘 작동하도록 하기 위해서는 추가적으로 2를 더 나눠주면 된다.

W = np.random.rand(fan_in, fan_out) / np.sqrt(fan_in / 2)

\because ReLU는 출력의 절반을 죽이고 매번 0으로 만들기 때문에 출력의 분산을 반으로 줄여버린다
→ 뉴런들 중 절반이 없어진다는 사실을 고려함


4. Batch Normalization

  • 활성화 값을 우리가 원하는 정규분포 범위에서 뽑고자 함
    → Want to unit gaussian activations

가중치 초기화 대신 현재 batch에서의 평균과 분산을 이용해서 훈련 시작 시 batch normalization을 설정한다.
→ 모든 Layer에서 정규 분포를 따르도록 만들어준다.

batch 단계에서의 normalization

들어오는 모든 미니 배치에 대해 이 작업을 수행한다.
step 1. 입력으로 주어진 mini-batch의 평균 계산
step 2. 분산 계산
step 3. 평균과 분산으로 정규화
step 4. 추가 스케일링 & 이동

이렇게 완성된 batch norm을 활성화 함수를 거치기 전에 ConV층과 FC층 뒤에 넣어준다.
→ 층마다 batch norm을 넣어 normalization 진행batch norm : tanh로 가는 입력값들을 tnah함수의 linear한 부분(기울기가 존재하는 범위)으로 범위를 변환한다.
\therefore 입력값들의 범위를 normalize해주어서 Saturation을 어느 정도 조절해준다.

Batch Normalization 결론

Batch Normalization을 통해 기울기의 흐름에 좋은 영향을 준다. 학습률(learning rate)의 범위를 더욱 확장시킬 수 있고, 많은 다양한 initialization을 유도할 수 있어 initialization의 의존성을 줄일 수 있게 된다.


5. Babysitting the Learning Process

step 1. Data Preprocessing
step 2. Choose Network Architecture (loss 함수 지정, regularization)
step 3. Train (train set에서 소량만 가져와 과적합이 되어 학습이 잘되는 것을 확인 → 전체 데이터 학습 & Loss 확인하면서 Learning Rate 조정)


6. Hyperparameter Optimization

Cross-validation (교차 검증)

: 훈련 세트(training set)에서 훈련한 다음, 검증 세트(validation set)에서 이 하이퍼파라미터가 얼마나 잘 작동하는지 평가하는 것

: 하이퍼 파라미터들의 값들을 조합을 고정시켜서 좋은 조합을 뽑는 방식

Random Search 방식이 더 좋다
\because Grid 방식은 일정한 간격으로 조합을 찾기 때문에 그림대로 찾아 나가지만, Random 방식은 무작위로 살펴 나감
\therefore 변수들 사이에서도 중요도가 있을텐데 Random 방식은 이를 무시한 채로 search한다.


Summary

0개의 댓글