Weight initialization & lr Schedule

seung·2024년 8월 13일

AI 기초

목록 보기
13/14

Weight Initialization

우리가 neural network를 훈련할 때 훈련 단계를 배웠는데 훈련하기 위한 가장 첫번째 스텝이 오늘 배울 가중치 초기화이다.

W를 무조건 0으로 초기화 하거나 랜덤으로 할 순 없다. 상황에 맞게 해야되니깐! 그럼 어떻게 초기화해야 학습이 잘되고, 업데이트할때 수렴이 잘 될까?

초기화 방법

1. Small Gaussian Random
가장 심플하고 간단하게 랜덤하게 초기화 시키는 방법이다.
weight 파라미터를 random하게 다 채우는것이다.
일단은 np.random.randn(d_in,d_out)을 통해 random한 값을 뽑아내고 가장 작은 상수(0.01)을 곱해준다.(maximum 값이 0.01이 되게 한거임)
이 초기화 기법을 통해 활성화 함수를 tanh를 쓰고 층을 계속 쌓아나가면 초기에는 엄청 잘 이상적으로 output이 나오지만 점점 층이 쌓일 수록 output이 점점 없어 지는 것을 볼 수 있다.
즉 작은 상수를 곱해주면 얇은 신경망에서는 잘 작동하지만 깊어지면 output이 사라지고 x=0에서 기울기가 0에 가까워진다.

2. Large Gaussian Random
그럼 큰 상수를 곱하면?
weight이 작아 모든 활성화 값이 0이된다.
output은 극단 값으로 밀려난다. 그래서 또 기울기가 0에 가까워져 학습이 되지 않는다.

3. Xavier Initialization
과학자 xavier가 제안한 것으로 np.random.randn으로 random하게 뽑은 후 np.sqrt(d_in(input_size))로 나누어주는 방식이다.

이렇게 진행하면 output이 없어지거나 exploit되지 않고, vanishing gradient도 보이지 않는다. 좋아 보인다!

실제로는 현업에서는 pytorch에 initialization function이 있어 그걸 사용하면 초기값 설정 문제가 생기지 않도록 잘 실행해준다.

Learning Rate Scheduling

사실 앞에서 배운 activate function이나 초깃값 설정은 현업에서는 pytorch library로 해결하지만
learning rate scheduling은 우리가 경험에 따라서 trior & error로 직접해봐야한다.(현업에서도 매우 중요한 일!!)

어떤 learning rate를 선택할까?

우리가 경사하강법으로 내려올 때 한 걸음의 보폭이 learning rate이다. 모든 optimizer들은 특정 학습률을 필요로 한다.

만약 학습률이 높으면? loss가 급증되거나 수렴이 되지않을 수 있다.
만약 학습률이 낮으면? 너무 느리게 학습하게 되어서 시간이 오래 걸린다.

그래서 trial & error를 해서 찾아야한다.

꿀팁은 없나?

Learning rate Decay

  • 대부분 큰 초기 학습률에서 시간이 지날수록 감소시키면서 학습할 수 있다.(Learning rate Decay)

Learning rate Decay(initial warm up)
교수님의 꿀팁! 처음에 훈련할 때 작은 학습률에서 시작해서 점점 늘려나가다가 loss가 잘 줄어든다고 생각될 때 고정시켜놓고 쭉 줄여나간다.
그러다 보면 loss가 줄어들지 않는 시점이 온다. 그때 그 학습률의 반또는 크게 줄인다. loss가 줄어들다가 또 안 줄어들면 또 반으로 줄인다.

또 다른 방법
Learning rate Decay을 굳이 선형적으로 하지 않고 다양한 함수를 사용해 학습률을 조정할 수 있다.

0개의 댓글