weight initialization이 중요한 이유
- ⭐ exploding / vanishing gradient 문제를 막기 위해서 weight initialization도 신중하게 해주어야 한다.
- $$ dW^{[l]} = dZ^{[l]}A^{[l-1]^T} $$
- 이므로 weight matrix의 각 요소가 크다면 exploding gradient 문제를,
- weight matrix의 각 요소가 작다면 vanishing gradient 문제를 유발한다.
- ⭐ 입력 노드의 수가 많은 경우에는 weight를 더 작게 해주는 방식으로 초기화를 진행해준다.
- 입력 노드가 많은 경우 가중치가 조금만 커도 전체 계산된 z값이 크기 때문이다.
- z값이 크면 a값도 커지고, 따라서 gradient가 exploding된다.
영행렬로 가중치 초기화하는 방법의 문제점
- all zeros -> 모든 parameter가 동일한 값으로 update된다.
- neuron을 만드는 이유는 서로 다른 특징을 포착하기 위함인데, 이렇게 가중치 업데이트가 일어나면 여러개의 neuron을 만드는 이유, 층을 쌓는 이유가 사라지기 쉽다.
정규분포를 따르는 가중치 초기화 방법의 문제점
- 평균이 0, 표준편차가 1인 정규분포를 따르는 값으로 weight matrix를 초기화한 경우
- activation function으로 sigmoid 함수를 사용했을 때 그 결과가 0 또는 1로 치우치는 현상이 발생한다.
- sigmoid 함수는 0과 1근처에서 미분값이 0이기 때문에 vanishing gradient 문제로 이어진다 😢
- 평균이 0, 표준편차가 0.01인 정규분포를 따르는 값으로 weight matrix를 초기화한 경우
- activation function으로 sigmoid 함수를 사용했을 때, 그 결과는 0.5로 치우치는 현싱이 발생한다.
- sigmoid 함수는 0 부근에서 선형의 형태를 띄는데, 모든 출력이 0.5에 치우친다면 layer를 쌓는 의미가 사라진다.
- 즉 비선형패턴을 학습하지 못하는 문제가 발생한다.
Xavier Initialization
- 입력 노드의 개수에 기반하여 weight를 초기화한다.
- 입력 노드의 개수가 많아지면 분산이 작아지도록, 입력 노드의 개수가 적어지면 분산이 커지도록 해준다.
- W = np.random.randn(n_input, n_output)*sqrt(1/n_input)
He Initialization
- 활성화함수로 ReLU를 사용하는 경우, Xavier initialization 방법은 적절하지 않다. He initialization 방법이 적합!
- W = np.random.randn(n_input, n_output) * sqrt(2/n_input)
- Xavier initialization 방법보다 분산을 조금 더 크게 설정
- 가중치 행렬을 0으로 초기화하는 것은 절대 금지
- sigmoid, tanh 활성화함수를 사용하는 경우에는 Xavier initialization 방법을,
- ReLU 활성화함수를 사용하는 경우에는 He initialization 방법을 사용하라.
'🙂 > Coursera_DL' 카테고리의 다른 글
WEEK4 : problem of optimization (0) | 2020.12.19 |
---|---|
WEEK4 : Optimizer (최적화 알고리즘) (0) | 2020.12.19 |
WEEK3 : normalizing input (입력 정규화) (0) | 2020.12.19 |
WEEK3 : regularization (정규화) (0) | 2020.12.19 |
WEEK3 : train test split (with bias) (1) | 2020.12.19 |