오늘의 인기 글
최근 글
최근 댓글
Today
Total
05-03 06:06
관리 메뉴

우노

[DL] 가중치 초기화 본문

AI/Deep Learning

[DL] 가중치 초기화

운호(Noah) 2021. 1. 19. 14:20

가중치 초기화의 중요성

  • Gradient Vanishing 문제란, MLP를 학습시키는 방법인 Backpropagation 중, Gradient 항이 사라지는 문제이다.
  • Backpropagation 학습식을 보면 Cost Function의 Gradient 항이 존재한다.
  • 이 항이 0이나 0에 가까워져 학습이 불가능해지는 현상을 말하는 것이다.
  • 왜 gradient 항이 사라지는 현상이 발생할까?
  • 이는 우리가 Activation Function으로 Sigmoid Function을 사용했기 때문이다.
  • Sigmoid Function에 대해 자세히 살펴보자.

  • Sigmoid Function의 도함수를 살펴보면 최대값이 0.25 인 것을 알 수 있다.
  • 다시 말해, Sigmoid Function를 사용한다면, 망이 깊어질수록 Gradient가 1/4씩 줄어든다는 의미이다.

  • 위 그림은 Backpropagation(역전파) 과정을 수식으로 나타낸것이다.
  • W_1의 Gradient를 확인해보면 Backpropagation(역전파)로 인해, Sigmoid의 도함수가 중첩된 것을 볼 수 있다.
  • Sigmoid의 도함수는 최대값이 0.25이기 때문에, 결국 Gradient 값이 급격히 줄어들게 되어 Gradient Vanishing 현상이 일어나게 된다.
  • 하지만, 이러한 Gradient Vanishing 현상은 Activation Function의 변경을 통해 어느정도 보완할 수 있다.
  • 또한, 가중치 초기화 시, 가중치의 값들을 최적의 값으로 설정한다면 gradient가 작아지더라도, 학습횟수가 적더라도 좋은 모델을 생성할 수 있다.

가중치를 0으로 초기화

  • 가중치 값들을 0 으로 초기화한다면 학습이 불가능하다.
  • 모든 parameter가 동일한 값으로 update 된다.
  • neuron을 만드는 이유는 서로 다른 특징을 포착하기 위함인데,
  • 이렇게 동일한 가중치 업데이트가 일어나면
  • 여러개의 neuron을 만드는 이유, 층을 쌓는 이유가 사라진다.
  • 모든 layer에 유닛이 1개인 신경망을 훈련시키는 것과 동일하다.

가중치를 random 하게 초기화

  • np.random.randn를 사용하면, 가중치는 평균 0, 표준편차 1인 정규분포를 따르도록 초기화된다.

  • 이후, 작은 상수를 추가로 곱해준다.

      w = np.random.randn(n_input, n_output) * 0.01
  • 곱해주는 이유는?

    • 활성화함수로 sigmoid나 tanh를 사용하는 경우
      • w가 크면 z가 커지고 a의 기울기 값은 작아진다.
      • 따라서, gradient vanishing 문제가 발생한다.
    • 활섬화함수로 ReLU를 사용하는 경우
      • w가 절대값이 큰 음수 값이면 dead ReLU가 되고
      • w가 절대값이 큰 양수 값이면 gradient exploding이 발생한다.

가중치의 표준편차를 줄여서 초기화

  • MLP 학습시 Sigmoid 공식을 사용하며, 가중치 값들을 평균이 0이며 표준편차가 1인 정규분포를 이용해 초기화 했을 경우엔, 다음과 같이 Sigmoid 함수의 출력값이 0 과 1에 치우치게 된다.

  • Sigmoid 함수의 출력값이 0 과 1에 치우친다는 것은, 역전파시 기울기가 0이 된다는 뜻이다.

  • 이를 해결하기 위한 방법 중 하나로, 가중치 값들을 표준편차가 작은 정규분포 형태로 초기화 하는 방법이 있다.

  • 위 그림은 가중치의 표준편차를 0.01로 하는 정규분포 형태로 초기화 했을 때의 출력값들을 나타낸 그래프이다.

  • 표준편차가 1일 때와 달리 0.5 중심으로 값이 모여 있는 것을 확인할 수 있다.

  • 이렇게 된다면 Gradient 값이 최대 0.25 정도로 구성되어, Gradient Vanishing 현상을 완화할 수 있게 된다.

Xavier Initialization

  • Gradient Vanishing 현상을 완화 하기 위해서 weight 를 초기화 할 때,

  • Sigmoid와 같은 S자 함수의 경우, 가장 중요한 것은 출력값들이 표준 정규 분포 형태를 갖게 하는 것이다.

  • 출력값들이 표준 정규분포 형태를 갖게 되어야 안정적으로 학습이 가능하기 때문이다.

  • Xavier(사비에르) Initialization 방법은, 단순히 가중치를 작은 값의 표준편차를 갖는 형태로 초기화 하는 것이 아닌, 보다 발전된 방법이다.

  • Xavier Initialization 방법은 표준 정규분포로 초기화 된 가중치를 1/입력개수 제곱근으로 나누어주면 된다.

      w = np.random.randn(n_input, n_output) / sqrt(1/n_input)
  • 아래 그래프는 활성화함수로 Sigmoid, 가중치 초기화로 Xavier Initialization 방법을 사용했을 경우의 그래프이다.

    • 10층 레이어에서도 출력값들이 표준 정규분포 형태로 잘 출력되고 있는 것을 알 수 있다.
  • 아래 그래프는 활성화함수로 ReLU, 가중치 초기화로 Xavier Initialization 방법을 사용했을 경우의 그래프이다.

    • 출력값이 0으로 수렴하고 평균과 표준편차 모두 0으로 수렴하는 모습을 확인할 수 있다.
    • 즉, ReLU 함수를 사용할 경우에는 가중치 초기화로 Xavier Initialization 방법을 사용할 수 없다는 의미이다.

He Initialization

  • ReLU에 맞는 가중치 초기화 방법이다.

  • He Initialization은 Xavier Initialization와 크게 다르지 않다.

  • 표준 정규분포로 초기화 된 가중치를, 2/입력개수 제곱근으로 나누어주면 된다.

    • He가 Xavier의 2배가 되는 제곱근을 사용하는 이유는

    • ReLU는 입력이 음수일 때, 출력이 전부 0이기 때문에 더 넓게 분포시키기 위해서이다.

      w = np.random.randn(n_input, n_output) / sqrt(2/n_input)
  • 아래 그래프는 활성화함수로 ReLU, 가중치 초기화로 He Initialization 방법을 사용했을 경우의 그래프이다.

  • 10층 레이어에서도 평균과 표준편차가 0으로 수렴하지 않는 것을 알 수 있다.

결론

  • 가중치를 0으로 초기화하는 것은 금지
  • 활성화함수로 Sigmoid나 Tanh를 사용할 경우에는 Xavier 초기화 사용
  • 활성화함수로 ReLU를 사용할 경우에는 He 초기화를 사용

'AI > Deep Learning' 카테고리의 다른 글

[DL] 지수 가중 평균 (Exponentially Weighted Averages)  (1) 2021.01.20
[DL] Regularization (Dropout)  (0) 2021.01.19
[DL] Gradient Checking  (1) 2021.01.18
[DL] Regularization (L1, L2)  (0) 2021.01.18
[DL] Bias(편향) vs Variance(분산)  (0) 2021.01.17
Comments