본문 바로가기

Machine Learning

[Deep Learning from Scratch] 6장. 학습 관련 기술들

1. 가중치 값의 갱신

  신경망 학습의 목적은 손실 함수(loss function)의 값을 가능한 낮추는 것으로 이는 곧 신경망의 매개변수, 즉 가중치의 최적값을 찾는 문제로 귀결된다. 이러한 문제를 최적화(Optimization)라고 한다. 일반적으로 인공 신경망의 매개변수 공간은 매우 넓고 복잡해서 최적의 해결책을 찾는 것은 결코 쉬운 작업이 아니다.

A. 경사 하강법(Gradient Descent)

  가장 널리 사용되는 가중치 값의 최적화 솔루션 중 하나는 경사 하강법(Gradient Descent)이라는 기법이다. 경사 하강법은 각 입력값이 순전파된 이후 실제 값(Ground Truth)과 일치시키기 위해 계산된 매개변수(가중치)의 미분 값을 이용해 기울어진 방향으로 값을 갱신하는 일을 계속 반복해 점점 최적의 값(Global Minimum)에 도달할 수 있다는 아이디어를 사용한다. 이는 식으로 다음과 같이 정리할 수 있다.

경사 하강법(Gradient Descent)

W는 갱신할 가중치를 의미하며 α는 학습률(learning rate)이라는 새로운 변수로, 매 갱신의 정도를 결정하며 0.01과 같은 값을 미리 정하여 사용하는 것이 일반적이다. 경사하강법은 단순하고 이를 프로그램으로 구현하기도 어렵지 않지만 문제에 따라서 매우 비효율적인 알고리즘이 될 수 있다. 경사하강법은 일반적으로 손실함수가 볼록함수(Convex Function)이라는 가정하에 최적의 답을 찾을 수 있지만 만약 손실함수가 복잡한 형태를 지닌 경우 최적의 지점에 도달하지 못하고 학습이 정체되는 현상이 생길 수 있다. 더불어 방향에 따라 성질(기울기)가 달라지는 비등방성 함수에서 무작정 기울기가 최소인 방향으로 진행하는 방식을 사용하게 되면 심하게 굽이진 움직임을 가지게 되어 최적값을 찾는데 상당히 많은 자원이 소요된다(비효율적이다).

지그재그 움직이 심한 경사하강법

이러한 단점을 개선하기 위해 이후 모멘텀(Momentum), AdaGrad, Adam과 같은 새로운 최적화 기법(Optimizer)들이 고안되었으며 각 아이디어를 이 글에서 간단히 서술하고자 한다.

B. Momentum

모멘텀은 일반적으로 물리학에서 많이 들어볼 수 있는 용어로 운동량을 뜻하는 단어이다. 모멘텀 기법을 수식으로 풀이하면 다음과 같다.

모멘텀(Momentum)

v라는 변수가 새로이 추가되었으며 이는 물리에서 말하는 속도에 해당하는 변수이다. 사실 속도라는 개념으로 생각하기보다는 매 시점 특정 점에서의 미분 값만 고려하던 경사 하강법과는 달리 이전 단계의 움직임을 기억하고 이를 다음 움직임에 반영하는 '관성'의 개념으로 생각하는 것이 더 좋을 것이다. 이로 인해 그 힘은 미약하지만 방향이 잘 변하지 않는 방향으로 매번 가중치의 갱신은 일정하게 가속하게 되며 따라서 일반적인 경사 하강법을 사용하는 것보다 더 빠르게 최적 값을 향해 다가갈 수 있다는 것이 알려져 있다.

C. AdaGrad

학습률(learning rate)는 신경망 학습에서 중요한 역할을 하는 변수이다. 너무 작으면 학습이 너무 느려져 비효율적이고 너무 크게 설정하면 학습이 애초에 제대로 이루어지지 않는 경우가 많다. 초기에 학습률을 특정 값으로 설정하고 학습과 함께 값을 서서히 줄여나가는 학습률 감소(Learning Rate Decay)라는 기법이 있다. AdaGrad는 학습률을 서서히 낮추기 위해 매개변수 전체의 학습률 값을 일괄적으로 낮추는 방법을 채택하며 이로써 각각의 매개변수에 맞춤형 값을 만들어주는 효과를 낸다.

AdaGrad 기법

h라는 변수는 기존의 기울기 값을 제곱한 뒤 누적합을 통해 생성되는 변수이며 매개변수를 갱신할 때마다 곱해져 학습률을 조정하게 된다. 이전 단계에서 가장 많이 움직인 매개변수의 원소의 학습률을 줄이는 전략을 택함으로써 각 매개변수마다 학습률 감소가 다르게 적용될 수 있게 만든다. Adagrad 방식을 채택할 시 학습과정에서 갱신의 정도가 큰 폭으로 작아지며 따라서 지그재그 움직임이 줄어든다는 것이 알려져 있다.

+ Adam

Adam은 AdaGrad와 Momentum의 아이디어를 직관적으로 융합한 방법으로 매개변수 공간을 효율적으로 탐색하는 기법이며 초매개변수(Hyper-parameter)의 편향 보정이 가능한 기법이다. 자세한 것은 해당 서적에 나와있지 않고 원 논문을 참고할 것을 권하고 있다.


2. 가중치의 초깃값

신경망 학습에서 가중치의 초깃값을 어떻게 설정하느냐에 따라 신경망 학습의 성패가 갈릴 정도로 이 과정은 신경망 학습에 있어 중요한 단계라고 말할 수 있다.

예컨대 가중치의 초깃값을 모두 0으로 설정하게 되면 어떤 일이 생길까(또는 모두 균일한 값으로 설정한다면)? 입력층의 가중치가 모두 0이라는 뜻은 그다음 층의 뉴런에 모두 같은 값이 전달된다는 의미가 되며 이는 역전파 과정에서 모든 가중치가 모두 똑같이 갱신된다는 것을 의미한다. 따라서 가중치는 같은 초깃값에서 시작하고 갱신을 거쳐도 여전히 같은 값을 유지하게 되며 이는 가중치를 여러 개 갖는 의미를 사라지게 만든다. 이러한 상황을 피하기 위해 초깃값을 무작위로 잘 설정할 필요가 있다.

A. Xavier 초깃값

사비에르 글로로트(Xavier Glorot)와 요슈아 벤지오(Yoshua Bengio)의 논문에서 권장하는 Xavier 초깃값이라는 것이 있다. 이 논문에서는 각 층의 활성화 값들을 광범위하게 분포시키기 위해 가중치의 적절한 분포를 찾고자 했으며 이를 위해 앞 계정의 노드가 n개 일 때 표준편차가 1/(n^(-1/2))인 분포를 사용하면 된다는 결론을 이끌었다. 따라서 Xavier 초깃값을 사용했을 때 앞 층의 노드가 많을수록 대상 노드의 초깃값으로 설정하는 가중치가 좁게 펴지게 된다.

Xavier 초깃값을 이용하여 모든 층의 노드 수가 100개인 단순한 ANN(인공신경망) 구조를 훈련시킨다고 했을 때 각 층에서의 활성화 값 데이터는 다음과 같은 분포를 가진다는 실험이 명시되어 있다.

Xavier 초깃값을 이요할 때의 각 층의 활성화값 분포

층이 깊어지면서 형태가 다소 일그러지지만 활성화 값들이 넓게 분포되어 있어 시그모이드 함수의 표현력에 제한을 받지 않고 학습이 효율적으로 이뤄질 것으로 기대할 수 있다. 방금 설명했듯이 Xavier 초깃값은 활성화 함수가 선형인 것을 전제로 이끈 결과로 시그모이드(sigmoid)나 tanh 함수와 같이 중앙 부근이 선형인 함수를 사용하는 것을 가정하고 있다. 반면 현재 많이 사용되는 활성화 함수인 ReLU와 같은 함수를 사용할 때에는 이에 특화된 초깃값을 별도로 이용할 필요가 있다.

B. He 초깃값

ReLU(Rectified Linear Unit)을 이용할 대에는 카이밍 히(Kaiming He)가 고안한 He 초깃값이라는 것을 사용하는 것이 권장된다. Xavier 초깃값이 (1/n)^(-1/2)를 사용한 반면 He 초깃값은 표준편차가 (2/n)^(-1/2)인 정규분포를 사용한다. ReLU는 음의 영역이 0이기 때문에 활성화 값을 더 넓게 분포시키기 위해 2배의 계수가 필요하다고 직감적으로 해석할 수 있다고 본서에 명시되어 있다(사실 필자는 잘 와 닿지 않는다).

마찬가지로 이전 실험에서 사용했던 간단한 신경망 구조에서 활성화 함수만 ReLU로 바꾼 뒤 Xavier와 He 초깃값을 각각 사용하여 그 결과를 비교하여 본 결과가 위에 나타나 있다. Xavier 초깃값을 사용하면 층이 깊어지면서 치우침이 조금씩 커진다는 것을 볼 수 있는 반면 He 초깃값을 사용하였을 때에는 모든 층에서 활성화 갑들이 균일하게 분포되어 역전파 과정에서 적당히 학습이 일어날 것으로 기대할 수 있다.


3. 배치 정규화(Batch Normalization)

앞에서 각 층의 활성화 값 분포를 확인하며 가중치의 초깃값을 적절히 설정함으로써 각 층의 활성화 값 분포가 적당히 퍼지면서 학습이 원활하게 수행될 수 있다는 것을 확인했다. 배치 정규화는 각 층이 활성화를 적당히 퍼뜨리도록 '강제' 할 수 있다면 어떨까라는 아이디어에서 출발한 기법이다. 배치 정규화를 사용하면 학습의 속도가 개선되고 초깃값에 크게 의존하지 않으며 과적합(Overfitting)을 억제하여 여타 기법을 활용할 필요성이 감소한다는 점에서 나온 지 얼마 되지 않아 많은 연구자와 기술자의 흥미를 유도했다.

배치 정규화의 기본 아이디어는 앞에서 설명한 것과 같이 각 층에서의 활성화 값을 적당히 분포시키기 위한 조정을 하는 것이며 Affine 계층과 활성화(e.g ReLU) 계층 사이에 배치 정규화 계층을 삽입함으로써 구현된다. 배치 정규화는 학습 시 미니 배치를 단위로 정규화를 진행하며 구체적으로는 데이터의 분포가 평균이 0, 분산이 1이 되도록 정규화한다.

배치 정규화

기호 ε는 분산이 0일 때 0으로 나누기(Zero Division) 문제를 방지하기 위해 아주 작은 값으로 설정되는 상수이다. 이 처리를 활성화 함수의 앞에 삽입함으로써 데이터의 분포가 덜 치우치게 할 수 있다. 또한 배치 정규화 계층마다 이 정규화된 데이터에 고유한 확대(scale)와 이동(shift) 변환을 수행하며 수식으로는 다음과 같이 나타난다.

확대(scale)와 이동(shift)

이때 γ와 β는 모두 학습 가능한 값으로 매 훈련 단계를 거치며 적합한 값으로 조정된다.


4. 과적합 방지 기법

신경망이 훈련 데이터에만 지나치게 적응되어 그 외의 데이터에 제대로 대응하지 못하는 상태를 과적합(Overfitting) 상태라고 한다. 기계학습은 범용 성능을 지향해야 하며 훈련 데이터에 포함되지 않는(아직 보지 못한) 데이터가 주여져도 바르게 식별해낼 수 있어야 한다. 따라서 복잡하고 표현력이 높은 모델을 만들수록 과적합을 방지하는 기술이 그만큼 중요해진다.

A. 가중치 감소(Weight Decay)

예로부터 많이 사용한 방법 중 가중치 감소라는 기법이 있다. 학습 과정에서 큰 가중치에 대해서는 그에 상응하는 큰 페널티를 부과하여 과적합을 억제하는 방법이다. 예를 들어 기존의 손실 함수에 가중치의 제곱 Norm을 더해 새로운 손실함수를 정의한다면 가중치가 과도하게 커지는 것을 방지할 수 있을 것이다.

가중치의 제곱 Norm은 L2 Norm이라고도 불리며 따라서 L2 항을 손실 함수에 추가하여 가중치가 비이상적으로 커지는 것을 방지하는 기법을 L2 정규화(Regularization)라고도 한다. L2 Regularization은 Ridge Regularization으로도 불린다. 반대로 L1항 (모든 가중치값의 절대값의 합)을 손실함수에 추가하여 과적합을 막는 기법을 L1 정규화라고 하며 이 역시 Lasso Regularization이라는 별명을 가지고 있다.

B. 드롭아웃(Dropout)

신경망 모델이 복잡해지면 가중치 감소만으로는 대응이 어려워질 때가 있으며 이럴 때 드롭아웃(Dropout)이라는 새로운 기법을 적용할 수 있다. 드롭아웃은 뉴런을 임의로 삭제하며 학습을 진행하는 방법으로 훈련과정에서 은닉층의 뉴런을 무작위로 골라 삭제하여 신호를 전달하지 못하게 만든다. 시험과정에서는 모든 뉴런에 신호를 전달하되 각 뉴런의 출력에 훈련 때 삭제한 비율을 곱하여 출력한다.