매개변수 갱신
최적화(Optimization)
- 신경망 학습의 목적은 손실 함수의 값을 가능한 한 낮추는 매개변수를 찾는 것
- 곧 매개변수의 최적 값을 찾는 문제를 푸는 것
- 신경망 최적화는 굉장히 어려운 문제
- 매개변수 공간은 매우 넓고 복잡해서 최적의 설루션을 쉽게는 못 찾음
확률적 경사 하강법(SGD)
최적화 방법 중 가장 널리 사용되는 SGD(Stochastic Gradient Descent)입니다.
매개변수의 기울기(미분)를 이용해 최적화를 시도합니다.
SGD는 다음과 같은 단점이 존재합니다.
SGD는 단순하고 구현도 쉽지만, 문제에 따라서는 비효율적일 때가 있습니다.
- 비등방성(anisotropy) 함수(방향에 따라 성질, 즉 기울기가 달라지는 함수)에서는 탐색 경로가 비효율적입니다.
- 이럴 때는 SGD 같이 무작정 기울어진 방향으로 진행하는 단순한 방식보다 더 영리한 방법이 필요합니다.
SGD의 이러한 단점을 개선해주는 모멘텀, AdaGrad, Adam이라는 세 방법이 존재합니다.
이들은 모두 SGD를 대체하는 기법이라고 생각하시면 됩니다.
모멘텀(Momentum)
모멘텀은 '운동량'을 뜻하는 단어로, 물리와 관계가 있는 용어입니다.
공이 그릇의 곡면(기울기)을 따라 구르듯 움직인다고 생각하시면 됩니다.
- W : 갱신할 가중치 매개변수
- η : 학습률
- v : 물리에서 말하는 속도에 해당, 물체의 속도
- αv : 물체가 아무런 힘을 받지 않을 때 서서히 하강시키는 역할
- α : 0.9 등의 값, 물리에서의 지면 마찰이나 공기 저항에 해당
- SGD와 비교하면 지그재그 정도가 덜함
- 이는 x축의 힘은 아주 작지만 방향은 변하지 않아서 한 방향으로 일정하게 가속하기 때문
- 거꾸로 y축의 힘은 크지만 위아래로 번갈아 받아서 상충하여 y축 방향의 속도는 안정적이지 않음
- 전체적으로는 SGD보다 x축 방향으로 빠르게 다가가 지그재그 움직임이 줄어듦
AdaGrad
신경망 학습에서는 학습률 값이 중요합니다.
학습률 값이 너무 작으면 학습 시간이 너무 길어지고, 반대로 너무 크면 발산하여 학습이 제대로 이뤄지지 않습니다.
이 학습률을 정하는 효과적인 기술로 학습률 감소(learning rate decay)가 있습니다.
학습률 감소(Learning rate decay)
- 학습을 진행하면서 학습률을 점차 줄여가는 방법
- 처음에는 크게 학습하다가 조금씩 작게 학습한다는 얘기로, 실제 신경망 학습에 자주 쓰임
학습률을 서서히 낮추는 가장 간단한 방법은 매개변수 ‘전체’의 학습률 값을 일괄적으로 낮추는 것입니다.
이를 발전시켜, AdaGrad는 ‘각각의’ 매개변수에 ‘맞춤형’ 값을 만들어줍니다.
AdaGrad는 개별 매개변수에 적응적으로(adaptive) 학습률을 조정하면서 학습을 진행합니다.
- h : 기존 기울기 값을 제곱하여 계속 더해줌
- 매개변수를 갱신할 때 1/sqrt(h)를 곱해 학습률을 조정
- 매개변수 원소 중에서 많이 움직인 (크게 갱신된) 원소는 학습률이 낮아진다는 뜻인데, 다시 말해 학습률 감소가 매개변수의 원소마다 다르게 적용됨을 뜻함
- 최솟값을 향해 효율적으로 움직임
- y축 방향은 기울기가 커서 처음에는 크게 움직이지만, 그 큰 움직임에 비례해 갱신 정도도 큰 폭으로 작아지도록 조정
- 그래서 y축 방향으로 갱신 강도가 빠르게 약해지고, 지그재그 움직임이 줄어듦
AdaGrad는 과거의 기울기를 제곱하여 계속 더해갑니다. 그래서 학습을 진행할수록 갱신 강도가 약해집니다.
실제로 무한히 계속 학습한다면 어느 순간 갱신량이 0이 되어 전혀 갱신되지 않게 됩니다.
이 문제를 개선한 기법으로서 RMSProp라는 방법이 있습니다.
RMSProp은 과거의 모든 기울기를 균일하게 더해가는 것이 아니라, 먼 과거의 기울기는 서서히 잊고 새로운 기울기 정보를 크게 반영합니다.
이를 지수 이동평균(Exponential Moving Average)이라 하며, 과거 기울기의 반영 규모를 기하급수적으로 감소시킵니다.
Adam
모멘텀과 AdaGrad 기법을 융합한 듯한 방법입니다.
하이퍼 파라미터의 편향 보정이 진행된다는 점도 특징입니다.
- 모멘텀과 비슷한 패턴인데, 모멘텀 때보다 공의 좌우 흔들림이 적음
- 이는 학습의 갱신 강도를 적응적으로 조정해서 얻는 혜택
어느 갱신 방법을 이용할 것인가?
이 그림만 보면 AdaGrad가 가장 나은 것 같지만, 그 결과는 풀어야 할 문제가 무엇이냐에 따라 달라지므로 주의해야 합니다.
아직까진 모든 문제에서 항상 뛰어난 기법이라는 것은 없으므로, 각자의 상황을 고려해 여러 가지로 시도해야 합니다.
가중치의 초기값
신경망 학습에서 특히 중요한 것이 가중치의 초기값입니다.
가중치의 초깃값을 무엇으로 설정하느냐가 신경망 학습의 성패가 가르는 일이 실제로 자주 있습니다.
초기값을 0으로 하면?
가중치 감소(weight decay) 기법
- 오버 피팅을 억제해 범용 성능을 높이는 테크닉
- 가중치 매개변수의 값이 작아지도록 학습하는 방법
- 가중치 값을 작게 하여 오버 피팅이 일어나지 않게 하는 것
가중치를 작게 만들고 싶으면 초깃값도 최대한 작은 값에서 시작하는 것이 정공법이긴 합니다.
그렇다면 가중치의 초깃값을 모두 0으로 설정하면 어떨까요?
- 답부터 얘기하면, 이는 나쁜 아이디어
- 실제로 가중치 초깃값을 0으로 하면 학습이 올바로 이뤄지지 않음 (정확히는 가중치를 균일한 값으로 설정해서는 안됨)
- 초깃값을 모두 0으로 해서는 안 되는 이유는 오차 역전파법에서 모든 가중치의 값이 똑같이 경신되기 때문
- 가중치들은 같은 초깃값에서 시작하고 갱신을 거쳐도 여전히 같은 값을 유지하게 됨
- 이는 가중치를 여러 개 갖는 의미를 사라지게 함
- 이 가중치가 고르게 되어버리는 상황을 막으려면(정확히는 가중치의 대칭적인 구조를 무너뜨리려면) 초기값을 무작위로 설정해야 함
은닉층의 활성화 값 분포
은닉층의 활성화값(활성화 함수의 출력 데이터)의 분포를 관찰하면 중요한 정보를 얻을 수 있습니다.
가중치의 초기값에 따라 은닉층 활성화 값들이 어떻게 변화하는지 간단한 실험을 진행해봤습니다.
구체적으로는 활성화 함수로 시그모이드 함수를 사용하는 5층 신경망에 무작위로 생성한 입력 데이터를 흘리며 각 층의 활성화 값 분포를 확인했습니다.
각 층의 활성화 값들이 0과 1에 치우쳐 분포되어있을 경우
- 여기에서 사용한 시그모이드 함수는 그 출력이 0에 가까워지자(또는 1에 가까워지자) 그 미분은 0에 다가감
- 그래서 데이터가 0과 1에 치우쳐 분포하게 되면 역전파의 기울기 값이 점점 작아지다가 사라짐
- 이것이 기울기 소실 (gradient vanishing)이라 알려진 문제
- 층을 깊게 하는 딥러닝에서는 기울기 소실은 더 심각한 문제가 될 수 있음
0.5 부근에 집중되어 치우쳐 분포되어있을 경우
- 다수의 뉴런이 거의 같은 값을 출력하고 있으니 뉴런을 여러 개 둔 의미가 없어진다는 뜻
- 예를 들어 뉴런 100개가 거의 값을 출력한다면 뉴런 1개짜리와 별반 다를 게 없는 것
- 그래서 활성화 값들이 치우치면 표현력을 제한한다는 관점에서 문제
각 층의 활성화 값은 적당히 고루 분포되어야 합니다.
층과 층 사이에 적당하게 다양한 데이터가 흐르게 해야 신경망 학습이 효율적으로 이뤄지기 때문입니다.
Xavier 초기값 - sigmoid, tanh
Xavier는 일반적인 딥러닝 프레임워크들이 표준적으로 이용하는 초기값입니다.
각 층의 활성화 값들을 광범위하게 분포시킬 목적으로 가중치의 적절한 분포를 찾고자 했고,
앞 계층의 노드가 n 개라면 표준편차가 1/sqrt(n)인 분포를 사용하면 된다는 결론을 이끌었습니다.
Xavier 초깃값을 사용하면 앞 층에 노드가 많을수록 대상 노드의 초깃값으로 설정하는 가중치가 좁게 퍼집니다.
가중치의 분포가 일그러진다면, sigmoid 함수 대신 tanh 함수(쌍곡선 함수)를 이용하면 개선될 수 있습니다.
tanh 함수는 원점 (0,0)에서 대칭인 S 곡선인 반면, sigmoid 함수는 (x, y) = (0, 0.5)에서 대칭인 S 곡선입니다.
활성화 함수용으로는 원점에서 대칭인 함수가 바람직하다고 알려져 있습니다.
Xavier 초깃값은 활성화 함수가 선형인 것을 전제로 이끈 결과이고
sigmoid 함수와 tanh 함수는 좌우 대칭이라 중앙 부근이 선형인 함수로 볼 수 있습니다.
그렇기 때문에 활성화 함수로 sigmoid 함수와 tanh 함수를 사용할 때는 Xavier 초기값이 적당하다고 할 수 있습니다.
ReLU를 사용할 때의 가중치 초기값
ReLU는 선형인 함수로 볼 수 없으므로 Xavier보다는 ReLU에 특화된 초깃값을 이용하라고 권장합니다.
He 초기값
- 이 특화된 초기값을 찾아낸 카이밍 히(Kaiming He)의 이름을 땄음
- 앞 계층의 노드가 n개일 때, 표준편차가 sqrt(2/n)인 정규분포를 사용
- ReLU는 음의 영역이 0이라서 더 넓게 분포시키기 위해 2배의 계수가 필요하다고 직감적으로 해석
활성화 함수로 ReLU를 사용할 때는 He 초기값 사용하고,
활성화 함수로 sigmoid나 tanh 등의 S자 모양 곡선일 때는 Xavier 초기값 사용하는 것이 현재까지 모범 사례로 알려져 있습니다.
Reference
본 글은 '밑바닥부터 시작하는 딥러닝'을 참고하여 작성하였습니다.
'Data Science > Deep Learning' 카테고리의 다른 글
[DL] CNN (Convolutional Neural Network) (0) | 2022.03.29 |
---|---|
[DL] 배치 정규화(Batch Normalization), 가중치 감소(weight decay), 드롭아웃(Dropout) (0) | 2022.03.17 |
[DL] 오차역전파법(Backpropagation) (2) | 2022.03.08 |
[DL] 신경망 학습 (0) | 2022.03.04 |
[DL] 손실함수 (Loss Function) : 오차제곱합(SSE), 교차 엔트로피 오차(Cross-Entropy) (0) | 2022.03.04 |
댓글