[Deep Learning] 딥러닝 옵티마이저: 기초부터 최신 AdamW까지

nomadicsoul·2026년 3월 23일

deeplearning

목록 보기
9/20

옵티마이저는 손실 함수(LL)를 최소화하기 위해 가중치(ww)를 어떻게 업데이트할지 결정하는 '길잡이' 역할을 합니다.


1. 방향과 속도의 개선 (Momentum 계열)

가장 단순한 방법에서 시작해, 물리적인 '관성'을 도입한 단계입니다.

① SGD (Stochastic Gradient Descent)

가장 기본적인 경사 하강법입니다. 현재 위치에서의 기울기 방향으로만 이동합니다.

  • wt+1=wt−η∇L(wt)w_{t+1} = w_t - \eta \nabla L(w_t)
    • η\eta: 학습률
    • ∇L(wt)\nabla L(w_t): 기울기
  • 특징: 계산이 매우 빠르나, 기울기가 가파른 쪽으로만 움직이려다 보니 지그재그(Oscillation) 현상이 심하고 수렴 속도가 느립니다.

② Momentum (SGDM)

SGD에 '관성' 성분인 vtv_t(Velocity)를 추가했습니다.

  1. vt+1=γvt+η∇L(wt)v_{t+1} = \gamma v_t + \eta \nabla L(w_t)
  2. wt+1=wt−vt+1w_{t+1} = w_t - v_{t+1}
  • vv: 속도
  • γ\gamma: 관성 계수 (보통 0.9)
  • 특징: 과거에 이동했던 방향(vtv_t)을 기억하여 현재 업데이트에 반영합니다. 덕분에 지역 최솟값(Local Minimum)이나 안장점(Saddle Point)을 관성의 힘으로 탈출할 수 있습니다.

    vtv_t (Velocity / Momentum)의미: "속도" 또는 "관성"

    • 수학적 역할: 현재 계산된 기울기(∇L\nabla L)에 지난 단계까지 이동했던 방향과 속도의 일정 비율(γ\gamma)을 더합니다.
    • 효과: 언덕에서 공을 굴릴 때처럼, 계속 내려가던 방향으로 가속도를 붙여줍니다. 이는 '지그재그' 현상을 줄이고, 얕은 지역 최솟값(Local Minimum)을 관성으로 넘어가게 해줍니다.

2. 학습률의 적응적 조절 (Adaptive 계열)

모든 변수에 동일한 학습률(i.e. 사용자가 설정한 '기본 학습률 η\eta')을 적용하는 대신, 각 변수의 특성에 맞춰 보폭을 조절합니다.

③ Adagrad (Adaptive Gradient)

보폭을 조절해 많이 변한 변수는 적게, 적게 변한 변수는 크게 학습하도록 조정합니다. 자주 업데이트된 변수는 보폭을 줄이고, 적게 된 변수는 보폭을 크게 가져갑니다.

  1. Gt+1=Gt+(∇L(wt))2G_{t+1} = G_t + (\nabla L(w_t))^2
  2. wt+1=wt−ηGt+1+ϵ∇L(wt)w_{t+1} = w_t - \frac{\eta}{\sqrt{G_{t+1} + \epsilon}} \nabla L(w_t)
    • GG: 기울기 제곱의 합
    • ϵ\epsilon: 0으로 나누기 방지용 작은 값
  • 특징
    • Sparse Data(희소 데이터, 예: NLP의 단어 빈도) 처리에 매우 효율적입니다.
    • 하지만 학습이 진행될수록 GG 값이 무한히 커져서 학습률이 0에 수렴해버리는 단점이 있습니다.

GtG_t (Gradient Squared Sum / vtv_t in Adam): "기울기 에너지의 누적 합"

  • Adam 수식에서는 이를 vtv_t라고 표기하기도 하지만, 의미는 Adagrad의 GG와 같습니다.
  • 수학적 역할: 기울기 값의 제곱을 계속 더해나갑니다.Gt=Gt−1+(∇L)2G_{t} = G_{t-1} + (\nabla L)^2
    • GtG_t의 의미: 기울기 제곱의 합(∑(∇L)2\sum (\nabla L)^2). 즉, "지금까지 얼마나 많이 움직였는가"를 나타내는 척도입니다.
  • 효과: 이 값이 분모로 들어갑니다(1G\frac{1}{\sqrt{G}}). 즉, 많이 움직인 축은 분모가 커져서 보폭(Learning Rate)이 줄어들고, 적게 움직인 축은 보폭이 커집니다. 변수별로 맞춤형 속도를 제공하는 '어댑티브(Adaptive)' 기능의 핵심입니다.

④ RMSprop

Adagrad의 단점을 보완하기 위해 지수 이동 평균(Exponential Moving Average)을 사용합니다. 너무 오래된 과거의 기울기는 잊고 최근 기울기에 비중을 둡니다.

  1. Gt+1=ρGt+(1−ρ)(∇L(wt))2G_{t+1} = \rho G_t + (1 - \rho)(\nabla L(w_t))^2
  2. wt+1=wt−ηGt+1+ϵ∇L(wt)w_{t+1} = w_t - \frac{\eta}{\sqrt{G_{t+1} + \epsilon}} \nabla L(w_t)
    • ρ\rho: 감쇠 계수 (보통 0.9)
  • Adagrad: Gt=Gt−1+(∇Lt)2G_{t} = G_{t-1} + (\nabla L_t)^2 (계속 더하기만 함)
  • RMSprop: Gt=ρGt−1+(1−ρ)(∇Lt)2G_{t} = \rho G_{t-1} + (1-\rho)(\nabla L_t)^2 (비중을 조절함)
  • 특징:
    • 너무 먼 과거의 기울기는 잊고, 최근의 기울기 위주로 GtG_t를 업데이트합니다. 학습률이 급격히 줄어들지 않아 학습을 멈추지 않고 끝까지 학습을 이어갈 수 있습니다
    • RNN 계열에서 특히 성능이 좋습니다.

3. 가장 많이 쓰이는 알고리즘 (Adam & AdamW)

현재 가장 널리 쓰이는 알고리즘들로, 앞선 장점들을 결합했습니다.

⑤ Adam (Momentum + RMSprop)

관성(vtv_t)과 적응적 학습률(GtG_t)을 모두 사용합니다. 현재 딥러닝의 표준 옵티마이저입니다.

  1. mtm_t (Momentum 역할): β1mt−1+(1−β1)∇L(wt)\beta_1 m_{t-1} + (1 - \beta_1) \nabla L(w_t)
  2. vtv_t (RMSprop 역할): β2vt−1+(1−β2)(∇L(wt))2\beta_2 v_{t-1} + (1 - \beta_2) (\nabla L(w_t))^2
  3. Bias Correction 후 업데이트: wt+1=wt−ηv^t+ϵm^tw_{t+1} = w_t - \frac{\eta}{\sqrt{\hat{v}_t + \epsilon}} \hat{m}_t
  • 특징:
    • 방향(Momentum)도 잘 잡고, 보폭(RMSprop)도 적절히 조절합니다. 대부분의 문제에서 준수한 성능을 보입니다.
    • 하이퍼파라미터 튜닝 없이도 대부분의 문제에서 가장 안정적이고 뛰어난 성능을 보입니다. 현재 딥러닝의 표준입니다.

L2L2 규제의 문제점

L2L2 규제

  • 손실 함수(LL)에 가중치의 제곱(12λw2\frac{1}{2}\lambda w^2)을 더하는 것. 이를 미분하면 기울기에 λw\lambda w가 추가됨.
  • 목적: 가중치 ww가 너무 커지지 않게 계속 뒤에서 잡아당기는 것.
  • 기울기: Total Gradient=∇L(데이터 오차)+λw(가중치 크기)\text{Total Gradient} = \nabla L(\text{데이터 오차}) + \lambda w(\text{가중치 크기})
  • L2L2 규제: 가중치 크기를 줄이려는 '추가적인 기울기'입니다.
    • Total Loss=Data Loss+12λw2\text{Total Loss} = \text{Data Loss} + \frac{1}{2}\lambda w^2
  • 이 손실 함수를 미분해서 옵티마이저에게 줄 기울기(gtg_t)를 구하면 이렇게 됩니다.
    • gt=∇Data Loss⏟순수 기울기+λwt⏟L2 규제 성분g_t = \underbrace{\nabla \text{Data Loss}}_{\text{순수 기울기}} + \underbrace{\lambda w_t}_{L2 \text{ 규제 성분}}

위 식에 대입해보면,

  • mtm_t = β1mt−1+(1−β1)gt=β1mt−1+(1−β1)(∇Loss+λwt)\beta_1 m_{t-1} + (1-\beta_1) \mathbf{g_t}= \beta_1 m_{t-1} + (1-\beta_1) (\nabla \text{Loss} + \mathbf{\lambda w_t})
  • vtv_t = β2vt−1+(1−β2)gt2=β2vt−1+(1−β2)(∇Loss+λwt)2\beta_2 v_{t-1} + (1-\beta_2) \mathbf{g_t^2}= \beta_2 v_{t-1} + (1-\beta_2) (\nabla \text{Loss} + \mathbf{\lambda w_t})^2

① 모멘텀(mtm_t)에 들어갈 때

  • 규제 성분(λw\lambda w)이 모멘텀에 섞입니다.
  • 즉, "가중치를 줄여야 한다는 신호"가 과거의 방향 성분과 섞여서 부드럽게 반영됩니다. (여기까지는 큰 문제가 없습니다.)

② 속도/학습률 조절(vtv_t 혹은 GtG_t)에 들어갈 때 (문제 !)

  • Adam은 가중치를 업데이트할 때 1vt\frac{1}{\sqrt{v_t}}를 곱해서 보폭을 조절합니다.

    • 규제 성분(λwt\lambda w_t)이 제곱(2^2)이 되어 분모(vt\sqrt{v_t})로 갑니다.
    • 가중치를 줄이려고 넣은 규제 항이 오히려 학습률을 건드리는 '오염'이 발생합니다.
  • 만약 가중치(ww)가 크면 규제 성분(λw\lambda w)도 커지는데, Adam은 기울기가 크다고 판단해서 학습률(보폭)을 확 줄여버립니다.

  • 모순 발생: "가중치가 크니까 빨리 줄여야지!" 하고 규제를 넣었는데, Adam이 "기울기가 크네? 보폭을 줄여야지~" 하면서 가중치를 줄이는 속도를 늦춰버리는 것입니다.

L2L2 규제의 모순
1. 우리가 λwt\lambda w_t를 넣은 원래 목적: "가중치(ww)가 너무 크니까 업데이트할 때 더 많이 빼줘!" 입니다.
2. 하지만 vtv_t 식을 보면: λwt\lambda w_t가 제곱(2^2)이 되어 vtv_t 값을 키워버립니다.
3. 결과적으로: 분모인 vt\sqrt{v_t}가 커지니까, 전체 업데이트 보폭(ηvt\frac{\eta}{\sqrt{v_t}})이 작아져 버립니다.
즉, 가중치를 많이 줄이려고 규제(λwt\lambda w_t)를 세게 걸었더니, 오히려 Adam이 "어? 기울기(규제 포함)가 너무 크네? 천천히 가야겠다"라며 보폭을 줄여버리는 모순이 생기는 거죠.

⑥ AdamW (Adam with Weight Decay)

Adam의 가중치 감쇠(L2 Regularization)를 적용할 때 발생하는 수학적 모순을 해결하여 일반화 성능(Generalization)을 극대화한 버전입니다.

  • Adam: L2L2 규제를 손실 함수에 포함시켜 기울기 계산 단계에서 처리.
  • AdamW: L2L2 규제/ 가중치 감쇠(Weight Decay)를 기울기 계산과 완전히 분리(Decouple)하여, 가중치 업데이트 마지막 단계에서 직접 감쇠시킴.(다시 말해, L2L2 규제 성분을 모멘텀이나 속도 계산할 때 넣지 않는 것.)
    • wt+1=(wt−Adam step)−λwtw_{t+1} = (w_t - \text{Adam step}) - \lambda w_t

알고리즘

  1. Adam 계산: 순수하게 데이터 오차(∇L\nabla L)로만 모멘텀과 속도를 계산해서 가중치를 업데이트합니다.

    • Step 1: gt=∇Data Lossg_t = \nabla \text{Data Loss}
      • AdamW는 gtg_t에 λwt\lambda w_t를 섞지 않습니다. (순수 기울기만 사용)
    • Step 2: 이 "순수한" gtg_t로 mt,vtm_t, v_t, 그리고 Δwt\Delta w_t를 계산합니다. (학습률 오염 방지)
      • Δwt=ηv^t+ϵm^t\Delta w_t = \frac{\eta}{\sqrt{\hat{v}_t + \epsilon}} \hat{m}_t
  2. 규제 적용: 업데이트가 다 끝난 직후에, 가중치 ww에서 일정 비율(λ\lambda)을 그냥 빼버립니다.

    • Step 3: wt+1=wt−Δwt−ηλwtw_{t+1} = w_t - \Delta w_t - \mathbf{\eta \lambda w_t}
  • 이렇게 하면 L2L2 규제가 Adam의 학습률 조절 메커니즘에 방해받지 않고, 독립적으로 가중치 크기를 조절할 수 있게 됩니다. 이것이 AdamW가 일반화 성능이 훨씬 좋은 이유입니다.

특징

  • Transformer(GPT, BERT) 같은 대규모 모델에서 Adam보다 훨씬 더 정교한 규제가 가능해졌고, 최신 딥러닝 연구의 주류가 되었습니다.
  • Adam: 규제 성분을 속도(GtG_t) 계산에 포함시켜서 오히려 규제 효과를 떨어뜨렸습니다.
    • L2L2 규제가 기울기에 통합되어 들어옴 →\rightarrow 학습률 조절(vtv_t) 계산 시 규제 항까지 제곱됨 →\rightarrow 가중치가 클 때 오히려 규제가 약해지는 모순 발생.
  • AdamW: 규제를 모멘텀이나 속도 계산에서 분리(Decouple)하여 마지막에 직접 적용했습니다.
    • L2L2 규제를 기울기 계산에서 분리 →\rightarrow 순수하게 방향과 보폭만 정한 뒤, 마지막에 가중치를 직접 삭감. →\rightarrow 일반화 성능 대폭 향상.

정리 테이블

이름핵심 키워드추천 상황
SGD단순함, 느림매우 단순한 모델
Momentum관성, 탈출SGD의 한계 극복 시
Adagrad변수별 학습률데이터가 희소할 때 (NLP 등)
RMSprop최근 기울기 중시RNN 계열 모델
AdamMomentum + RMSprop대부분의 일반적인 상황
AdamW가중치 감쇠 분리최신 Transformer 기반 모델
  • Adagrad: 모든 과거를 기억하다가 결국 멈춤. (희소 데이터에 강함)

  • RMSprop: 과거를 적당히 잊으며 끝까지 완주함. (RNN/시계열에 강함)

  • Adam: '관성'과 '최근 보폭 조절'의 장점만 쏙쏙 뽑아 만든 딥러닝계의 '올라운더'.

  • AdamW: Adam의 똑똑함은 유지하되, 가중치 규제(Weight Decay) 방식만 올바르게 고쳐서 성능을 한 단계 더 끌어올림.

용어 정리

  1. 모멘텀 (mtm_t): 공이 굴러갈 때 가던 방향으로 계속 가려는 "방향과 관성"
  2. 속도/G (vtv_t): 지형이 얼마나 험난한지에 따라 보폭을 줄이거나 늘리는 "적응형 학습률"
  3. L2L2 규제 (λw\lambda w): 가중치(ww)가 너무 커지면 모델이 억지 예측을 하니까, 가중치 값 자체를 0에 가깝게 계속 깎아내는 "값의 크기 다이어트"
profile
꾸준히

0개의 댓글