실습 · 연습문제 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)를 반환한다.
제곱과 나눗셈은 성분별이다. 반환하는 m_new, v_new는 bias correction 전의 , 다(다음 step에서 다시 쓴다).
테스트는 다음을 확인한다.
- 첫 step(, )의 이동량은 gradient 크기와 무관하게 좌표마다 약 다.
- gradient 전체에 양의 상수를 곱해도 갱신이 거의 바뀌지 않는다(스케일 불변성, 의 영향은 무시할 만큼 작다).
- 이차함수에서 여러 step을 반복하면 최솟점 근처로 간다.
AdamW의 decoupled weight decay 구현하기 adamw-decay
Adam에 감쇠를 넣는 두 방식을 구현하고 차이를 확인한다. 두 함수 모두 (x_new, m_new, v_new)를 반환하고, m_new, v_new는 bias correction 전의 모멘트다(, , ).
-
adam_l2_step(x, g, m, v, t, lr, wd): L2 정규화. gradient에 를 더한 로 보통의 Adam step을 한다. -
adamw_step(x, g, m, v, t, lr, wd): decoupled weight decay. 모멘트는 만으로 갱신하고, 파라미터는로 갱신한다.
테스트는 다음을 확인한다.
wd = 0이면 두 함수가 같다.- 데이터 gradient가 0이면 AdamW는 매 step 정확히 배로 줄어들지만, Adam + L2는 크기와 무관하게 매 step 약 씩 줄어든다(감쇠 항까지 정규화되기 때문이다).
- 곡률이 인 이차함수 에서 Adam + L2는 L2 정규화 문제의 해 로 가고, AdamW는 세 좌표를 같은 값으로 보낸다.