10.4 적응적 방법과 학습 레시피

실습 · 연습문제 2개

Adam 한 step 구현하기 adam-step

Adam의 한 step을 구현한다. 함수 adam_step(x, g, m, v, t, lr, beta1=0.9, beta2=0.999, eps=1e-8)는 현재 파라미터 x, gradient g, 1차·2차 모멘트 m, v(모두 shape (n,)), step 번호 t(1부터)를 받아 (x_new, m_new, v_new)를 반환한다.

mt=β1mt−1+(1−β1) gt,vt=β2vt−1+(1−β2) gt2,m^t=mt1−β1t,v^t=vt1−β2t,xt=xt−1−η m^tv^t+ϵ.\begin{aligned} \mathbf{m}_t &= \beta_1\mathbf{m}_{t-1} + (1 - \beta_1)\,\mathbf{g}_t, & \mathbf{v}_t &= \beta_2\mathbf{v}_{t-1} + (1 - \beta_2)\,\mathbf{g}_t^2, \\ \hat{\mathbf{m}}_t &= \frac{\mathbf{m}_t}{1 - \beta_1^t}, & \hat{\mathbf{v}}_t &= \frac{\mathbf{v}_t}{1 - \beta_2^t}, \\ \mathbf{x}_t &= \mathbf{x}_{t-1} - \eta\,\frac{\hat{\mathbf{m}}_t}{\sqrt{\hat{\mathbf{v}}_t} + \epsilon}. \end{aligned}

제곱과 나눗셈은 성분별이다. 반환하는 m_new, v_new는 bias correction 전의 mt\mathbf{m}_t, vt\mathbf{v}_t다(다음 step에서 다시 쓴다).

테스트는 다음을 확인한다.

  • 첫 step(t=1t = 1, m0=v0=0\mathbf{m}_0 = \mathbf{v}_0 = \mathbf{0})의 이동량은 gradient 크기와 무관하게 좌표마다 약 η\eta다.
  • gradient 전체에 양의 상수를 곱해도 갱신이 거의 바뀌지 않는다(스케일 불변성, ϵ\epsilon의 영향은 무시할 만큼 작다).
  • 이차함수에서 여러 step을 반복하면 최솟점 근처로 간다.

AdamW의 decoupled weight decay 구현하기 adamw-decay

Adam에 감쇠를 넣는 두 방식을 구현하고 차이를 확인한다. 두 함수 모두 (x_new, m_new, v_new)를 반환하고, m_new, v_new는 bias correction 전의 모멘트다(β1=0.9\beta_1 = 0.9, β2=0.999\beta_2 = 0.999, ϵ=10−8\epsilon = 10^{-8}).

  1. adam_l2_step(x, g, m, v, t, lr, wd): L2 정규화. gradient에 λx\lambda\mathbf{x}를 더한 g+λx\mathbf{g} + \lambda\mathbf{x}로 보통의 Adam step을 한다.

  2. adamw_step(x, g, m, v, t, lr, wd): decoupled weight decay. 모멘트는 g\mathbf{g}만으로 갱신하고, 파라미터는

    xt=xt−1−η m^tv^t+ϵ−ηλ xt−1\mathbf{x}_t = \mathbf{x}_{t-1} - \eta\,\frac{\hat{\mathbf{m}}_t}{\sqrt{\hat{\mathbf{v}}_t} + \epsilon} - \eta\lambda\,\mathbf{x}_{t-1}

    로 갱신한다.

테스트는 다음을 확인한다.

  • wd = 0이면 두 함수가 같다.
  • 데이터 gradient가 0이면 AdamW는 매 step 정확히 (1−ηλ)(1 - \eta\lambda)배로 줄어들지만, Adam + L2는 크기와 무관하게 매 step 약 η\eta씩 줄어든다(감쇠 항까지 정규화되기 때문이다).
  • 곡률이 (0.01,1,100)(0.01, 1, 100)인 이차함수 ∑iai(xi−1)2/2\sum_i a_i(x_i - 1)^2/2에서 Adam + L2는 L2 정규화 문제의 해 ai/(ai+λ)a_i/(a_i + \lambda)로 가고, AdamW는 세 좌표를 같은 값으로 보낸다.