본문 바로가기
딥러닝(Deep Learning)/D&A Deep Session

[D&A Deep Session] 3차시 - 5. 최적화와 가중치 초기화

by rahites 2022. 3. 29.

 

# 최적화란? : 가중치 매개변수의 최적값을 탐색하는 방법 ( 경사 하강법의 단점을 보완 )

 

- 경사 하강법의 단점

1. 학습할 때마다 모든 데이터 셋을 활용하기 때문에 학습이 오래걸리며 메모리 문제가 발생할 가능성이 높다.

2. 적절한 학습률을 찾기 어렵다 ( 너무 작으면 시간이 오래걸리고, 너무 클 경우에는 최솟값 계산이 어렵고 loss 값이 커지는 방향으로 진행된다 )

3. 최종 목적인 Global minimum을 찾지 못하고, Local minimum에 갇힐 수 있다.

 

이러한 경사 하강법의 단점을 보완하여 '확률적 경사 하강법 (Stochastic Gradient Descent)'이 등장하였다.

: 모든 데이터 셋 활용 -> 랜덤하게 추출한 일부 데이터만을 사용 ( 잦은 업데이트를 통한 빠른 최적해 서치 )

 

하지만 단순하고 구현이 쉬운 SGD이지만, 기존 Gradient Descent의 속도 문제만을 개선한 SGD또한 단점이 존재한다. 그것은 SGD가 방향에 따라 기울기가 달라지는 '비등방성 함수'라는 것으로 이 때문에 SGD의 탐색 경로가 문제에 따라 비효율적이게 된다. 이러한 SGD의 문제점을 극복하기 위해 모멘텀, AdaGrad, Adam 등의 최적화 방법이 사용된다.

 

Optimizer 발달 계보 : https://www.slideshare.net/yongho/ss-79607172

* 모멘텀(Momentum)

: SGD의 경로 변동을 줄이기 위해 제안된 최적화 방법으로 관성 방향을 고려하며 이동해 진동과 폭을 줄이는 방법이다.

모멘텀의 갱신 경로는 공이 그릇 바닥을 구르듯이 움직이며 SGD에 비해 지그재그 정도가 덜하다. x축의 힘이 작지만 방향은 변하지 않아서 한 방향으로 일정하게 가속하게 되고, y축의 힘은 크지만 위아래로 번갈아 이동하기 때문에 y축 방향의 속도는 안정적이지 않게 된다. 결국 x축 방향으로 빠르게 다가가 지그재그 움직임이 줄어드는 것이다. 

[단점] : 관성으로 인해 최적값에 수렴되지 않는 경우가 존재한다. -> NAG ( Nesterove Accelerated Gradient )

 

- 네스테로프 모멘텀(Nesterov Accelerated Gradient, NAG)

네스테로프 모멘텀은 모멘텀 값과 기울기 값이 더해져 실제 값을 만드는 기존 모멘텀과 달리 모멘텀 값이 적용된 지점에서 기울기 값을 계산합니다. 모멘텀 방법은 멈추어야 할 시점에서도 관성에 의해 훨씬 멀리 갈 수 있는 단점이 있지만, 네스테로프 방법은 모멘텀으로 절반 정도 이동한 후 어떤 방식으로 이동해야 하는지 다시 계산하여 결정하기 때문에 모멘텀 방법의 단점을 극복할 수 있습니다. 따라서 모멘텀 방법의 이점인 빠른 이동 속도는 그대로 가져가면서 멈추어야 할 적절한 시점에서 제동을 거는 데 훨씬 용이합니다.

 

- 예시 SGD 옵티마이저 설정

lr : learning rate 학습률

momentum : 모멘텀, 보통 0.9로 설정하며 교차 검증을 한다면 0.5에서 시작하여 0.9, 0.95, 0.99 순서로 검증 )

decay : 업데이트마다 적용되는 학습률의 감소율 설정

nesterov : 네스테로프 모멘텀의 적용 여부를 설정

optimizer = torch.optim.SGD(model.parameters(), lr = 0.1, momentum=0.95, nesterov=True)

 

* AdaGrad

: 이전 Gradient를 기반으로 학습률에 변화를 주는 방법으로 이전에 크게 변동이 있었던 경우 학습률을 감소시키고 반대의 경우에는 학습률을 증가시킨다.

y축 방향의 기울기가 커서 처음에는 크게 움직이지만 큰 움직임에 비례해 학습률도 큰 폭으로 작아지기 때문에 y축 방향으로 갱신되는 정도가 빠르게 줄어들고, 지그재그 움직임이 줄어들게 된다.

[단점] : 학습률이 0에 수렴할 수 있다. -> RMSProp

          : Gradient 양이 적을 때 움직임이 멈출 수 있다. -> AdaDelta

 

* RMSProp

: AdaGrad의 단점인 학습률이 0에 수렴하는 문제를 해결하기 위해 제안된 방법이다.

최근 n개의 gradient만 반영해 지수이동평균을 계산한다. 

 

* Adam

: RMSProp + Momentum으로 학습률, 모멘텀용 계수, 2차 모멘텀용 계수 3개의 파라미터를 가진다.

 

공이 바닥을 구르는 움직임을 보인 '모멘텀'과 매개변수의 원소마다 적응적으로 갱신 정도를 조정한 'AdaGrad' 두 기법을 융합한 방법으로 최근 많이 사용되는 방법이다. 하이퍼파라미터의 편향 보정이 진행된다는 특징을 지닌다. 학습의 갱신이 적응적으로 이루어지기 때문에 기존의 모멘텀 방식보다 지그재그 흔들림이 적게 일어난다. 

 

 

# 가중치 초기화

 

: 신경망 학습은 가중치를 랜덤하게 초기화 하며 loss의 최소화 값을 찾기 때문에 학습을 빠르게 진행하기 위해선 가중치의 초깃값을 어떻게 설정할 것인지가 중요하다. 이를 단순히 0으로 설정할 경우, 오차 역전파법을 실행할 때 모든 가중치 값이 똑같이 업데이트 되기 때문에 가중치가 고르지 않도록 랜덤하게 설정하여야 한다. 

( ex. 2층 신경망에서 첫 번째와 두 번째 층의 가중치가 0일 경우, 순전파의 경우에는 입력층의 가중치가 0이기 때문에 두 번째 층의 뉴런에 모든 같은 값이 전달된다 -> 역전파가 실행될 때 두번째 층의 가중치가 모두 똑같이 갱신된다 )

 

활성화함수로 Sigmoid 함수를 사용할 때, input의 절대값이 조금이라도 커질 경우 미분값이 소실되는 문제가 발생한다. 이 때 평균이 0이고 표준편차가 1인 정규분포를 따르도록 가중치를 초기화할 경우, 각 층의 활성화 값들이 0과 1에 치우치게 되어 역전파의 기울기 값이 점점 작아지다가 사라지는 기울기 소실 문제가 발생한다. 또한 위의 경우에서 표준편차를 0.01로 줄여 활성화값 분포를 확인해 보면 값들이 0.5에 집중되어 표현력이 제한되는 문제가 발생한다.

 

--> 가중치를 적절하게 초기화하는 것이 학습에 있어 중요한 역할을 한다!!

 

 

1. LeCun 초기화

: 분포에서 추출한 랜덤한 값으로 초기화 ( 정규분포를 따르는 방법, 균일분포를 따르는 방법 )

 

2. Xavier 초기화

: 이전과 다음 노드의 수를 고려하여 확률분포를 조정하는 방법으로 Sigmoid, tanh와 같은 비선형함수에서 효과적이다. ( 정규분포를 따르는 방법, 균일분포를 따르는 방법 )

But, ReLU함수에서는 출력 값이 0으로 수렴하게 된다!!

 

앞 계층의 노드가 n개일 때, 표준편차가 sqrt(1/n)인 정규분포를 사용한다.

Xavier 초깃값을 사용하면 앞 층에 노드가 많을수록 대상 노드의 초깃값으로 설정하는 가중치가 좁게 퍼진다.

 

3. He 초기화

: ReLU에 특화된 초기화 방법으로 특화된 초깃값을 찾아낸 카이밍 히의 이름을 땄다. 앞 계층의 노드가 n개일 때, 표준편차가 sqrt(2/n)인 정규분포를 사용한다. ReLU는 음의 영역이 0이기 때문에 더 넓게 분포시키기 위해 2배의 계수가 필요하다는 해석이 가능하다. ( 정규분포를 따르는 방법, 균일분포를 따르는 방법 )

 

--> 활성화 함수가 sigmoid나 tanh 등의 S자 모양의 곡선일 경우에는 Xavier 초기화, ReLU일 때는 He 초기화

 

 

 

댓글