콘텐츠로 이동

3. Optimization과 안정화

이 챕터의 질문

왜 깊은 신경망은 학습하기 어렵고, 서로 다른 학습 문제가 어떤 종류의 방법으로 해결되는가?

2장에서 backpropagation으로 gradient를 계산했다. 그러나 gradient가 존재한다고 학습이 자동으로 잘 되는 것은 아니다. update가 너무 크거나 작을 수 있고, 깊은 layer를 지나며 신호가 사라지거나 커질 수 있으며, train data에는 잘 맞지만 새로운 data에는 실패할 수 있다. 이 장에서는 해결책을 세 묶음으로 나눈다.

  1. Update rule: 계산한 gradient를 parameter 변화로 바꾸는 방법
  2. Signal stability: activation과 gradient가 깊이를 지나며 전달되게 하는 방법
  3. Generalization: 학습하지 않은 데이터에서도 유용한 규칙을 찾게 하는 방법

서로 다른 문제에 대한 처방을 섞지 않는 것이 이 장의 핵심이다.

이 장에서 알아볼 수준

핵심 개념

  • gradient descent, mini-batch SGD, momentum
  • learning rate와 scheduler
  • Adam과 AdamW
  • vanishing/exploding gradient, initialization, normalization
  • residual connection과 gradient clipping
  • underfitting, overfitting, weight decay, dropout, early stopping
  • train/validation curve를 이용한 진단

이름과 위치를 알아둘 개념

  • RMSProp과 adaptive optimizer
  • hyperparameter sensitivity
  • loss landscape

모든 optimizer 식을 암기하는 것이 목표는 아니다. 어떤 방법이 update의 방향과 scale을 바꾸는지, 어떤 방법이 architecture의 신호 경로를 바꾸는지, 어떤 방법이 generalization을 겨냥하는지 분류할 수 있으면 된다.

이해에 필요한 항목

  • gradient의 부호와 크기, learning rate의 역할
  • 평균과 이동평균의 직관
  • train loss와 validation loss의 차이
  • 2장의 forward pass, backpropagation, mini-batch

1. Gradient update

Gradient descent와 mini-batch SGD

전체 train set loss를 \(L(\theta)\)라고 하면 가장 기본적인 update는 다음과 같다.

\[ \theta_{t+1}=\theta_t-\eta\nabla_\theta L(\theta_t) \]

learning rate \(\eta\)가 너무 크면 낮은 loss 영역을 지나치거나 학습이 발산할 수 있고, 너무 작으면 진행이 느리거나 평평한 영역을 벗어나지 못할 수 있다. 실제 딥러닝에서는 전체 데이터를 매 step마다 계산하기보다 mini-batch \(B_t\)로 gradient를 추정하는 stochastic gradient descent(SGD)를 사용한다.

\[ g_t=\frac{1}{|B_t|}\sum_{i\in B_t}\nabla_\theta \ell_i(\theta_t) \]

mini-batch마다 \(g_t\)가 조금씩 달라지므로 update에는 변동성이 생긴다. 이는 단순한 계산 오차가 아니라 batch size, 데이터 순서, 학습률과 함께 optimization 경로를 결정하는 요소다.

Momentum

SGD는 좁고 굽은 loss surface에서 좌우로 흔들리거나, 여러 step에서 일관된 방향으로도 천천히 움직일 수 있다. momentum은 이전 gradient의 이동평균과 비슷한 상태를 유지해 지속적인 방향은 강화하고 반복적인 진동은 줄이려 한다.

\[ v_t=\beta v_{t-1}+g_t, \qquad \theta_{t+1}=\theta_t-\eta v_t \]

\(\beta\)는 과거 방향을 얼마나 유지할지 조절한다. momentum은 물리적 운동량과 완전히 같은 것은 아니지만, 관성이라는 직관이 update 누적을 이해하는 데 유용하다.

Adaptive optimizer와 Adam

feature와 parameter마다 gradient scale이 크게 다를 수 있다. RMSProp 계열은 squared gradient의 이동평균을 이용해 parameter별 update scale을 조정한다. Adam은 gradient의 이동평균과 squared gradient의 이동평균을 함께 사용한다. 초기에 비교적 안정적으로 학습되는 경우가 많아 널리 쓰이지만, 모든 문제에서 항상 최상의 generalization이나 속도를 보장하지는 않는다.

AdamW는 weight decay를 Adam의 gradient 기반 update와 분리해 적용한다. 이름이 비슷해도 "Adam에 L2 항을 단순히 더한 것"과 같은 동작이 아닐 수 있다는 점이 핵심이다.

Learning rate schedule

학습 초반에는 넓게 이동하고 후반에는 세밀하게 조정하도록 learning rate를 시간에 따라 바꿀 수 있다. step decay, cosine schedule, warmup 같은 이름을 접하게 된다. warmup은 특히 큰 batch나 Transformer 학습에서 초반 update를 점진적으로 키우는 방식으로 사용된다.

scheduler를 쓰면 무조건 좋아지는 것이 아니다. 총 step 수, optimizer, batch size와 함께 하나의 학습 설정으로 검증해야 한다. 서로 다른 schedule을 비교하면서 한쪽에 더 많은 학습 step을 주면 공정한 비교가 아닐 수 있다.

2. 깊이에 따른 신호 안정성

Vanishing gradient와 exploding gradient

깊은 network의 gradient는 여러 layer의 local derivative가 곱해진 결과다. 이 곱이 반복해서 1보다 훨씬 작아지면 앞쪽 layer의 gradient가 거의 사라지는 vanishing gradient가 생긴다. 반대로 반복해서 커지면 exploding gradient가 생긴다.

gradient만의 문제가 아니다. forward pass의 activation도 layer를 지날 때 scale이 지나치게 줄거나 커질 수 있다. signal propagation을 생각할 때 forward activation과 backward gradient를 함께 봐야 한다.

Initialization

모든 weight를 같은 값으로 초기화하면 같은 layer의 neuron들이 대칭적으로 같은 gradient를 받아 서로 다른 feature를 배우기 어렵다. 무작위 초기화가 필요하지만 scale도 중요하다.

  • Xavier 또는 Glorot initialization은 입력과 출력 차원을 고려해 activation과 gradient의 분산을 유지하려 한다. sigmoid나 tanh 계열과 연결해 소개되는 경우가 많다.
  • He initialization은 ReLU처럼 일부 activation을 0으로 만드는 함수의 특성을 고려한 scale을 사용한다.

이 방법들은 학습 성공을 보장하는 공식이 아니라 초기 signal scale을 합리적으로 정하는 출발점이다. activation, normalization, residual structure가 바뀌면 적절한 initialization도 달라질 수 있다.

Normalization

normalization layer는 중간 activation의 scale과 분포를 조절해 optimization을 안정화하는 데 도움을 준다.

  • Batch normalization은 mini-batch 통계를 사용해 activation을 정규화하고 학습 가능한 scale과 shift를 적용한다. MLP에서는 보통 feature별로 정규화하고, 일반적인 CNN에서는 batch와 spatial 위치에 걸쳐 통계를 모아 channel별로 정규화한다. train과 inference에서 사용하는 통계가 다를 수 있다.
  • Layer normalization은 한 sample 내부의 feature 축 통계를 사용한다. batch 크기에 직접 의존하지 않아 Transformer에서 널리 사용된다.

둘을 단순히 교체 가능한 기법으로 보면 안 된다. 어느 축에 대해 통계를 계산하는지, sequence 또는 spatial dimension을 어떻게 취급하는지, train과 inference의 동작이 같은지 확인해야 한다.

Residual learning과 skip connection

residual block은 입력 \(x\)를 변환 \(F(x)\)에 직접 더한다.

\[ y=F(x)+x \]

이 skip path는 정보와 gradient가 여러 nonlinear layer를 모두 통과하지 않고도 이동할 수 있는 경로를 제공한다. residual connection은 optimizer가 아니다. architecture를 바꾸어 깊은 network의 optimization을 돕는 요소다. 5장에서 ResNet의 실제 구성으로 다시 본다.

Gradient clipping

gradient norm이 지나치게 커질 때 정해진 범위로 줄이는 gradient clipping을 사용할 수 있다. recurrent network나 불안정한 학습에서 급격한 update를 막는 안전장치가 될 수 있다. 그러나 지속적인 exploding gradient의 원인이 잘못된 learning rate, 데이터 scale, loss 구현에 있다면 clipping만으로 원인이 해결되지는 않는다.

3. Generalization

Underfitting과 overfitting

  • Underfitting은 train data의 중요한 패턴조차 충분히 학습하지 못한 상태다. 모델 용량 부족, 부적절한 feature, 너무 강한 regularization, 부족한 optimization 등이 원인일 수 있다.
  • Overfitting은 train data에는 매우 잘 맞지만 validation 또는 실제 사용 데이터에는 성능이 떨어지는 상태다. 단순히 모델이 크다는 사실보다 데이터 양과 다양성, label noise, split, 학습 시간과의 관계가 중요하다.

train error와 validation error의 차이를 generalization gap이라고 부르기도 한다. gap이 크다고 곧바로 특정 regularizer 하나를 적용하기보다 data leakage, train과 validation 분포 차이, metric 구현을 먼저 확인해야 한다.

Weight decay

weight decay는 update 과정에서 weight의 크기가 계속 커지는 것을 억제한다. 단순 SGD에서는 loss에 L2 penalty를 더하는 관점과 밀접하게 연결되지만 adaptive optimizer에서는 구현에 따라 동작이 달라진다. AdamW의 "W"가 이 분리를 강조한다.

weight가 작으면 항상 좋은 모델이라는 뜻은 아니다. parameter scale이 함수의 복잡성과 직접 대응하지 않는 architecture도 있으며 normalization과 함께 사용할 때 해석이 달라질 수 있다.

Dropout

dropout은 training 중 일부 activation을 무작위로 0으로 만들어 특정 unit 조합에 지나치게 의존하지 않도록 한다. inference에서는 모든 unit을 사용하되 training과 출력 scale이 일치하도록 처리한다. dropout rate가 크면 regularization이 강해지지만 정보까지 과도하게 제거해 underfitting을 일으킬 수 있다.

Early stopping

validation metric이 더 이상 개선되지 않을 때 학습을 멈추고 가장 좋은 checkpoint를 선택하는 방법이다. validation set을 반복해서 모델 선택에 사용하므로, 최종 test set은 이 선택 과정과 분리해야 한다. validation curve의 작은 변동마다 즉시 멈추지 않도록 patience를 둘 수 있다.

Data augmentation

입력의 의미를 유지하는 변환으로 새로운 train sample을 만드는 방법이다. 이미지를 조금 이동하거나 뒤집는 변환이 대표적이지만, 어떤 변환이 의미를 보존하는지는 domain에 따라 다르다. 글자를 뒤집거나 chiral molecule을 반사하는 변환처럼 target을 바꿀 수 있는 augmentation은 무조건 적용하면 안 된다.

Training curve로 문제를 분류하기

curve는 원인을 확정하는 도구가 아니라 가설을 좁히는 증거다.

  • train과 validation loss가 모두 높고 거의 줄지 않는다: model capacity, feature, learning rate, gradient 흐름, 구현 오류를 점검한다.
  • train loss는 줄지만 validation loss가 다시 증가한다: overfitting, split 차이, label noise 가능성을 본다.
  • loss가 큰 폭으로 진동하거나 NaN이 된다: learning rate, exploding gradient, 수치 안정성, 입력 scale을 확인한다.
  • loss는 내려가지만 metric이 개선되지 않는다: loss와 metric의 불일치, class imbalance, threshold 선택을 확인한다.
  • train 재현성이 지나치게 낮다: random seed만 고정하기 전에 data order, nondeterministic operation, batch 통계와 hyperparameter sensitivity를 본다.

하나의 증상에 하나의 처방만 대응하지 않는다. 예를 들어 validation 성능이 나쁠 때 dropout부터 추가하기보다 train 성능, split, 데이터 품질을 먼저 확인하는 순서가 중요하다.

Loss landscape라는 관점

parameter 공간의 각 위치에 loss 값을 놓은 모습을 loss landscape라고 부른다. 실제 network는 차원이 매우 높아 전체를 그릴 수 없지만, 왜 optimization 경로와 초기화가 중요하며 서로 다른 parameterization이 같은 기능을 나타낼 수 있는지 생각하는 데 도움을 준다.

"local minimum에 갇힌다"만으로 모든 학습 실패를 설명하기는 어렵다. saddle point, 평평한 방향, gradient scale 차이, stochastic noise, generalization이 함께 작용한다. loss surface 그림은 선택한 2차원 단면일 뿐 전체 geometry를 그대로 보여주지 않는다.

반드시 구분할 것

  • Adam, SGD는 parameter update 규칙이다.
  • Residual connection은 정보와 gradient의 경로를 바꾸는 architecture 요소다.
  • Batch normalization, layer normalization은 activation을 정규화하는 layer다.
  • Weight decay, dropout, early stopping은 generalization을 개선하려는 regularization 전략이지만 작동 지점이 다르다.
  • 좋은 optimization은 train objective를 잘 낮추는 것이고, 좋은 generalization은 새로운 데이터에서도 목적을 달성하는 것이다. 둘은 관련되지만 같은 개념은 아니다.

앞뒤 장과의 연결

2장에서 계산한 gradient가 이 장의 optimizer에 입력된다. 5장의 ResNet에서는 residual connection이 깊은 CNN을 학습하는 구조로 나타난다. 7장의 Transformer에서는 layer normalization과 residual connection이 반복되고, 12장의 deep reinforcement learning도 불안정한 training signal 위에서 같은 optimizer를 사용한다. 이후 모든 모델을 볼 때 "구조의 아이디어"와 "학습을 가능하게 한 안정화 방법"을 분리해 읽는다.

스스로 확인하기

  1. Adam, residual connection, dropout은 각각 update, signal path, generalization 중 어디에 주로 작용할까?
  2. train loss와 validation loss가 함께 높을 때와 둘의 차이가 계속 커질 때 점검할 가설은 어떻게 다를까?
  3. gradient clipping이 exploding gradient의 근본 원인을 항상 해결하지는 않는 이유는 무엇일까?

더 읽을 자료