6.2 가중치의 초기값
1. 초기값을 0 으로 설정하면?
가중치 감소(weight decay) : 오버피팅을 억제해 범용성을 높이는 테크닉.
가중치 감소는 말그래도 가중치 매개변수의 값이 작아지도록 학습하는 방법이다. 가중치 값을 작게 하여 오버피팅이 일어나지 않게 하는 것이다. 하지만 가중치를 작게하라? 가중치를 작게 만들고 싶다면 가중치의 초기값을 작게 만들면 된다. 단순하다.
초깃값을 모두 0으로 하면 안되는 이유는 무엇일까요? (정확하게는 가중치를 균일한 값으로 설정해서 안되는 이유)
그 이유는 바로 오차역전파법에서 모든 가중치의 값이 똑같이 갱신되기 때문이다. 결과적으로 말하면 가중치들은 같은 초기값에서 시작하고 갱신을 거쳐도 여전히 같은 값을 유지하게 되는 것이다. 노드를 늘려서 가중치를 여러 개 갖게 하는 것이 의미가 없어진다.
2. 은닉층의 활성화값 분포
이번 섹션에서는 가중치의 초깃값에 따라 은닉층 활성화값들이 어떻게 변화하는지 간단한 실험을 하려고 한다.
이 실험은 Stanford University 의 CS231n 수업에서 참고하였다.
각 층의 활성화값들이 0과 1에 치우쳐 분포되어있다. 여기에 사용된 활성화 함수는 시그모이드 함수인데, 이 함수의 특성은 출력이 0이나 1에 가까워지면 그 미분 즉 gradient 가 0에 가까워지고 결론적으로 역전파의 기울기 값이 점점 작아지다가 사라지는 것이다.
이것이 잘 알려진 기울기 소실 문제(Vanishing Gradient Problem)이다.
이번에는 0.5 부근에서 집중되는 것을 볼 수 있다. 앞의 예와 달리 0과 1에 치우치지 않아 더 이상 기울기 소실 문제는 일어나지 않는다. 하지만 활성화 값을이 치우쳤다는 것은 신경망 자체가 표현력을 잃었다는 말과 동일하다. 직관적으로 다수의 뉴런이 거의 같은 값을 출력하고 있으니 뉴런을 여러 개 둔 의미가 없다는 것이다.
가중치 초기화 방법
(1) Xavier 초깃값 (Xavier Glorot, Yoshua Bengio 논문에서 권장하는 가중치 초기값이다.)
이 논문에서는 각 층의 활성화값들을 광범위하게 분포시킬 목적으로 가중치의 적절한 분포를 찾고자 하였다. 그리고 결론적으로 앞 계층의 노드의 숫자가 n개라면 표준편차가 1 / root(n) 인 분포를 사용하면 된다는 결론을 이끌었다.
오른쪽으로 갈수록 약간씩 일그러지고 있다. 이 일그러짐은 sigmoid 함수 대신 tanh 함수(쌍곡선 함수)를 이용하면 개선된다. tanh 함수가 원점에서 대칭인 S곡선인 반면, sigmoid 함수는 (x, y)=(0, 0.5)에서 대칭인 S 곡선이다. 활성화 함수용으로는 원점에서 대칭인 함수가 바람직 하다고 알려져 있다.
(2) ReLU 를 사용할 때의 가중치 초깃값
Xavier 초깃값은 활성화 함수가 선형인 것을 전제로 이끈 결과이다. sigmoid 와 tanh 함수는 좌우 대칭이라 중앙 부근이 선형적이라고 볼 수 있다. 그래서 Xavier 초깃값의 사용이 적절하다. 하지만 ReLU 함수를 사용할 때는 이런 선형성이 불가피하지만 성립되지 않는다.
ReLU 함수에 특화된 초깃값을 찾아낸 카이밍 히(Kaiming He)의 이름을 따 He 초깃값이라고 한다. 1/root(n) 의 Xavier 와는 약간 다르게 이전 층의 노드가 n개 라면 표준편차가 root(2/n) 인 정규분포를 사용한다.
ReLU는 음의 영역이 0이라서 더 넗게 분포시키기 위해 2배의 계수가 필요하다고 (직관적으로) 해석할 수 있다.
# MNIST 데이터셋으로 가중치 초깃값 비교
이 실험은 층별 뉴런 수가 100개이고 5층 신경망에서 활성화 함수 ReLU 를 사용한 결과이다.
std 가 0.01인 경우 학습이 전혀 되지 않고 있는 이유는 자명하다. 너무 작은 값으로 가중치를 갱신하여 gradient 자체가 역전파에서 0에 가까운 값으로 넘어가게 되면 거의 매개변수의 갱신이 이루어지지 않는다는 것이다. (vanishing gradient)