경사소실을 해결하는 방법 - 가중치 초기화, 배치 정규화
[1] Weight initialization
weight는 각각의 입력신호에 부여되어 입력신호와의 계산을 하고 각 입력신호에는 고유한 weight가 부여되며 weight가 클수록 해당 신호가 중요하다고 볼 수 있다.
결국, 가중치는 입력신호가 결과 출력에 주는 영향도를 조정하는 매개변수이다.
weight 초기화는 14 ~ 15년도 사이에 발생한 최근 트렌드인데, 그 전까지는 처음 초기화만 하면 gradient로 업데이트 하면 되기 때문에 weight 초기화를 이용한 성능 개선의 인식이 약했다. weight를 잘 정하면 적당한 데이터를 이용하여 cost function을 최소화 시킬 수 있기 때문에, 최근에는 weight를 어떻게 초기화하냐에 따라 성능이 달라지는 것을 발견하고 관심을 가지게 되었다.
# weight initialization -> 딥러닝의 2번째 겨울인 경사소실 문제를 해결하면서 등장
2006년도 hinton교수 의 RBM논문에서 최초 제시
-> non convex cost function에서 초기값은 적절하게 잘 설정하는 것이 경사소실을 해결해 줄 수 있다.
-> 이후엔 위에서 언급한 것처럼 경사소실문제 보단 초기화 방식에 따른 성능차를 연구
weight는 레이어의 타입, 뉴런 개수, 활성화 함수의 종류등 여러 configuration에 대해 연관이 있고 만약 초기값 설정을 잘못한다면 다양한 문제를 야기할 수 있다.
1. weight가 0일때
가중치를 0으로 준다면 역전파를 통해 학습할 때, 편미분 값에 의해 입력 값에 대한 영향을 계산하는데 w가 0이므로 실제로 영향을 끼치는 데이터임에도 불구하고 영향을 끼치지 않는 데이터로 학습되어 딥러닝 알고리즘이 동작하지 않는다.
2. activation function으로 sigmoid 사용시 정규 분포 사용
만약 평균이 0이고 표준편차가 1인 정규분포를 따르도록 가중치를 랜덤하게 초기화 한다면 이 경우에는 표준편차가 크기 때문에 학습을 반복할 수록 가중치 값들이 0과 1로 치우치는 문제가 발생한다.
그래서 표준편차를 줄인다면 층이 깊어질 수록 가중치 값들이 0.5 부근에 몰리는 문제가 발생한다.
따라서 이러한 문제에 대한 예방을 위해 weight 초기화가 필요하다. 실제로 딥러닝에서는 분산 조정 기반 초기화를 가장 많이 이용한다. 분산 조정 기법이란 확률 분포를 기반으로 추출한 값으로 weight를 초기화 하되, 이 확률 분포의 분산을 웨이트 별로 동적으로 조절해주는 방법이다. 분산을 조정할 때 해당 weight에 input으로 들어오는 텐서의 차원인 fan in과 결과 값으로 출력하는 텐서의 차원인 fan out이 사용된다. (fan-in이란 해당 레이어에 들어오는 input tensor의 차원 크기 / fan-out 이란 한 로직에서 나온 출력이 다음 로직의 인풋으로 들어갈 때의 수의 제한이 있는 것)
-
RBM initialization
RBM은 현재 레이어와 다음 레이어에 대해서만 동작한다. 현재 레이어에 들어온 x값에 대해 가중치를 계산한 다음, 다음 레이어에 전달하고 이렇게 전달 받은 값을 거꾸로 이전 레이어에 가중치 값을 계산해서 전달한다.
이 과정을 반복하면 최초 전달된 x와 예측한 값의 차이가 최소가 되는 w를 발견할 수 있고 이 내용을 2개의 레이어에 대해 초기값을 결정할 때까지 반복하고 다음번 2개에 대해 반복하고 이 방식을 마지막 레이어까지 반복한다.
첫번째 레이어의 weight를 초기화하고, 두번째 레이어의 weight를 초기화하고 이런식으로 마지막 레이어까지의 모든 weight를 초기화할 수 있다.
복잡해서 현재는 잘 사용되지 않는다고 한다.
# RBM은 제한적 볼츠만 머신으로서 우리가 흔히 알고있는 fully connected layer.
가장 큰 차이는 에너지 함수의 도입 -> 볼츠만 분포는 (-E) 의 소프트맥스
-> 이 볼츠만 분포의 엔트로피를 최소화하는 방향으로 학습
-> 두 레이어 사이에서 반복하면, input x 를 forward시킨 결과를 그대로 backward 시키면 동일한 x를 얻을 수 있음
-> 이 상태를 엔트로피가 낮은 상태로 정의함.
-> 이 과정을 모든 레이어에 대해 수행한 것인 Deep belief network
-> 즉 DBM은 볼츠만 분포의 엔트로피가 가장 낮은 상태로 학습됨
-> 분포의 표준편차가 매우 낮은 상태라는 의미
-> 모든 레이어에 대해 소프트맥스 연산을 반복해야된다.
-> 소프트맥스연산은 성분개수만큼 지수연산을 하기에 계산 코스트가 매우높음
-> 계산 코스트, 이론적 어려움, 성능이 그렇게 높지 않아 현재는 사용하지 않지만
경사소실을 최초로 해결한 것에 의의가 있음.
-
Lecun initialization
Uniform distribution : w = sqrt(1 / fan in) in [-limit , limit]
Normal distribution : var(w) = sqrt(1 / fan in)
위 사진은 Lecun 초기화 방법의 수식인데 유니폼이나 normal 분산에서 추출한 랜덤
값으로 가중치를 초기화 시키되, 이 확률 분포를 fan in 값으로 조절하자는 아이디어
이다. 즉, input의 크기가 커질수록 초기화 값의 분산을 작게 만들자는 것이다.
ReLU가 나오기 전에 사용한 방법으로 가우시안 분포에서 분산을 X의 원래 분산 정도로 보정한다.
-
Xavier initialization -> sigmoid, tanh
Uniform distribution : w = sqrt(6 / (fan in + fan out ))
Normal distribution : var(w) = sqrt(2 / (fan in + fan out ))
위의 사진은 xavier glorot initialization의 수식이다.
핵심 아이디어는 fan in 과 fan out을 모두 고려하여 확률 분포를 조정해준다는 것인데, lecun initialization 기법에서 2를 곱해준 뒤, fan in과 fan out을 합한 크기로 나누어 준 값으로 확률 분포를 조정한다.
ReLU 등장 후에 vanishing gradient 문제를 해결하기 위해 만들어진 기법으로 특별한 분야가 아닐 경우 대부분 이 기법을 사용한다.
-
He initialization -> ReLU
Uniform distribution : w = sqrt(6 / fan in) in [-limit , limit]
Normal distribution : var(w) = sqrt(2 / fan in)
자비에 기법의 한계를 극복하기 위해 만든 He initialization이다. fan out을 제거하여 ReLU함수가 활성화 함수로 사용될 때 잘 작동될 수 있도록 fan in을 더 중요하게 고려한 형태이다. 0이하의 신호는 제거하기 때문에 분산을 두배로 주어 분산을 유지한다.
[2] Batch normalization
- 배치(batch) = ‘묶음’을 의미 (일반적으로 100개의 샘플에 대해 예측을 하면 예측 식을 통해 각 샘플에 대하여 예측을 하는데 이 때 약 총 100번의 계산을 한다.)
- 배치 정규화(batch normalization)는 2015년에 제안된 방법으로, 드롭아웃의 필요성을 줄여주고 가중치 선택의 중요성을 낮춰줌으로써 많이 활용되고 있는 학습기법이다.
- 배치 정규화는 각 layer에서의 활성화 값이 적당히 분포되도록 조정하는 것을 의미한다. 즉, 학습의 효율을 높이기 위함이다. 보통 딥러닝을 학습시킬 때 대부분 stochastic gradient descent(SGD) method를 사용한다.
하지만 이 방법은 gradient vanishing(그레디언트 소실) / gradient exploding(그레디언트 폭주) 문제를 야기할 수 있다. 여기서 gradient vanishing은 layer가 늘어나면서 기울기가 0이 되이버리는 현상을 말한다. 배치 정규화는 이 문제를 해결한다.
- 배치 정규화의 장점 : 1) 학습을 빠르게 진행할 수 있게 한다.
2) 초기값에 크게 의존하지 않는다.
3) 오버피팅을 억제한다.
- 배치 정규화의 모형
(출처:https://github.com/MagmaTart/DeepLearningStudy/blob/master/Soomin/summarys/25_BatchNormalization.md)
위 사진을 보면 데이터 분포를 정규화하는 ‘배치 정규화(Batch Norm layer) 계층’을 신경망의 중간에 삽입하여서 구현하였다.
- 배치 정규화의 알고리즘 진행 방식
첫 번째 식을 통해 입력 값들의 평균을 구해 µB에 대입한다. 두 번째 식은 입력 데이터의 분산을 구한 식이고 그 아래 세 번째 식을 통하여 데이터를 생성하면, 데이터의 평균은 0, 분산은 1이 되어 정규화가 된다. 하지만 이대로 데이터를 그대로 사용하게 되면 활성화 함수의 비선형성이 사라지게 되는 문제점이 발생한다. 이를 해결하기위해 gamma(scale)과 beta(shift)를 적용해서 yi값을 계산한다. gamma는 가중치, beta는 편향을 의미하며 각 1과 0으로 시작해서 역전파를 통해 적합한 값이 된다.
실제로 이 배치 정규화 알고리즘을 네트워크에 적용시킬 경우에는 특정 은닉층에 들어가기 전에 배치 정규화 layer를 더해주어 입력값을 수정해준 뒤 새로운 값을 활성화 함수에 넣어주는 방식으로 사용한다.