티스토리 뷰
이전 까지의 내용
이전 글에서는 Vanishing Gradient 현상이 왜 일어나는지, 어떻게 해결해 나가는지와 가중치 초기화 (weight initialization) 가 왜 중요한지에 대해 살펴보았습니다. 이번 글에서는 가중치 초기화의 방법들에 대해서 살펴보겠습니다.
전체 내용은 SlideShare 에서 한번에 보실 수 있으며 youtube 로도 볼 수 있습니다.
가중치 초기화의 중요성
처음 weight 값들을 평균이 0이며 표준편차가 1인 표준 정규분표를 이용해 초기화 했을 경우에 Sigmoid 함수의 출력값이 0 과 1에 치우치는 현상이 발생합니다. 이 현상이 왜 문제인지 살펴보기 위해 Sigmoid 의 개형을 다시 한 번 살펴보겠습니다.
출력값이 0 과 1 에 치우치면 Gradient 는 0 에 가까운 값을 갖게 되고 이는 Gradient Vanishing 현상의 원인이 됩니다. 따라서 Activation Function 을 변경시키는 것 뿐 아니라 가중치를 적절하게 초기화 하는 것을 통해서도 Gradient Vanishing 현상을 어느정도 해소할 수 있습니다.
표준편차를 줄이는 방법을 통한 개선
weight 의 값들이 0 에서 멀수록, 즉 표준편차가 클 수록 Sigmoid Function 을 사용할 때 0 과 1 에 치우치는 현상이 발생할 것입니다. 이를 해결하기 위한 방법 중 하나로 표준편차가 작은 정규분포 형태로 weight 들을 초기화 하는 방법이 있습니다.
표준편차를 0.01 로 하는 정규분포 형태로 초기화 했을 때 출력값들을 나타낸 그래프 입니다. 표준편차가 1일 때와 달리 0.5 중심으로 모여 있는 것을 확인할 수 있습니다. 이렇게 구성되어 있다면 표준편차가 1일 때 보다 의미있는 ( 0 이 아닌 ) Gradient 값들을 갖게 될 것이고 Gradient Vanishing 현상을 완화할 수 있습니다.
발전된 방법 : Xavier Initialization
Gradient Vanishing 현상을 완화 하기 위해서 가중치를 초기화 할 때 Sigmoid 와 같은 S 자 함수의 경우 가장 중요한 것은 출력값들이 표준 정규 분포 형태를 갖게 하는 것입니다. 출력값들이 표준 정규 분포 형태를 갖게 되어야 안정적으로 학습이 가능하기 때문입니다.
단순히 작은 값의 표준편차를 갖는 형태로 초기화 하는 것이 아닌 보다 발전된 방법인 Xavier Initialization 에 대해 살펴보겠습니다. Xavier 초기화 방법은 표준 정규 분포를 입력 개수의 표준 편차로 나누어주면 됩니다.
w = np.random.randn(n_input, n_output) / sqrt(n_input)
위의 그래프는 Sigmoid 함수와 Xavier 초기화 방법을 사용했을 경우의 그래프 입니다. 10층 레이어에서도 출력값들이 표준 정규분포 형태로 잘 출력되고 있는 것을 알 수 있습니다.
다음 그래프는 Xavier 초기화 방법과 ReLU 함수를 결합했을 때의 그래프 입니다. 출력값이 0 으로 수렴하고 평균과 표준편차 모두 0으로 수렴하는 모습을 확인할 수 있습니다. ReLU 함수를 사용할 경우에는 Xavier 초기화 방법을 사용할 수 없다는 의미입니다.
ReLU 에 사용하는 초기화 : He Initialization
ReLU 함수에 맞는 초기화 법은 He Initialization 입니다. He Initialization 은 Xavier Initialization 과 크게 다르지 않습니다. 단순히 인풋 개수의 절반의 제곱근으로 나누어주면 됩니다.
w = np.random.randn(n_input, n_output) / sqrt(n_input/2)
He 초기화와 ReLU 함수를 사용했을 때의 그래프 입니다. 10 층 레이어 에서도 평균과 표준편차가 0 으로 수렴하지 않는 것을 알 수 있습니다.
Sigmoid 나 Tanh 를 사용할 경우에는 Xavier 초기화를
ReLU 를 사용할 경우에는 He 초기화를 사용하시면 됩니다.
신경망이 깊어지면 가중치들의 작은 변화가 큰 변화로 이어지는 불안정한 현상들이 생깁니다. 물론 이것을 해결하기 위해 처음에 가중치를 잘 설정해주는 방법을 사용했습니다. 가중치를 잘 설정해서 출력값들의 분포를 안정화했는데, 혹시 출력값 자체를 정규화 해준다면 어떨까요?
다음 글에서는 출력값 자체를 정규화 하여 학습을 안정화 하는 방법인 Batch Normalization 에 대해 살펴보겠습니다.
다음 글 - Part. 7 : 배치 정규화
그래프 들은 다음의 사이트에서 참고하였습니다.
- http://umbum.tistory.com/221?category=751025
- cs231n 2017 lecture
부족한 블로그에 방문해 주셔서 감사합니다.
잘못된 부분이나 질문이 있으시면
댓글로 말씀해주세요.
금방 확인하고 피드백 드리겠습니다.
좋은 하루 되세요. ^^
'머신러닝' 카테고리의 다른 글
[딥러닝] 뉴럴 네트워크 Part. 8 - 옵티마이저 (Optimizer) (8) | 2018.03.29 |
---|---|
[딥러닝] 뉴럴 네트워크 Part. 7 - 배치 정규화 (0) | 2018.03.28 |
[딥러닝] 뉴럴 네트워크 Part. 5 - 새로운 활성화 함수 (4) | 2018.03.25 |
[딥러닝] 뉴럴 네트워크 Part. 4 - 역전파 (backpropagation) (26) | 2018.03.24 |
[딥러닝] 뉴럴 네트워크 Part. 3 - MLP 학습과정 (4) | 2018.03.20 |
- Total
- Today
- Yesterday
- 백준
- Koreancuisine
- sql
- 여름휴가추천
- 알고리즘
- 가평캠핑
- 여름캠핑
- 강원도여행
- 자연힐링
- 영월캠핑
- 파이썬
- python
- 여름휴가
- 커플여행
- 가평여행
- 계곡캠핑
- 캠핑초보
- 가족여행
- 글램핑
- SeoulTravel
- 가족캠핑
- 반려견캠핑
- 서울근교캠핑
- bukhansannationalpark
- Oracle
- 카카오
- 강원도캠핑
- 머신러닝
- 캠핑장추천
- 영월여행
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |