티스토리 뷰
가중치 초기화의 중요성
- 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이 발생한다.
- 활성화함수로 sigmoid나 tanh를 사용하는 경우
가중치의 표준편차를 줄여서 초기화
- 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 초기화를 사용
'Artificial Intelligence > Deep Learning' 카테고리의 다른 글
[DL] Layer Normalization(레이어 정규화) (0) | 2022.10.14 |
---|---|
[DL] Batch Normalization (0) | 2022.09.20 |
[DL] 딥러닝 프레임워크 비교(텐서플로우 VS 파이토치 VS 케라스) (0) | 2022.09.12 |
[DL] 전이학습이란? (0) | 2022.09.09 |
[DL] 1x1 convolution이란? (0) | 2022.09.04 |