TL;DR
게시물은 ε를 약 1에서 약 0으로 낮추고 β₂ 전이를 적용하면 optimizer의 갱신 구조가 SGD에서 Adam으로 이동한다는 관점을 제시한다. 함께 제공된 Python 코드는 m과 v에 gradient의 1차·2차 모멘트 이동평균을 저장하고, e를 분모 안정화 항으로 갱신한 뒤 p에 weight decay와 정규화된 gradient를 순서대로 적용한다. Bias correction은 약 1,000~2,000 training steps 이후 영향이 작아 생략할 수 있다고 적었지만, 별도의 benchmark 결과는 제시되지 않았다.
실용적 조언
- 제시된 구현을 검증할 때는 ε, β₂, bias correction 생략 여부를 각각 분리해 동일한 gradient sequence에서 파라미터 갱신을 비교해야 한다. 특히 bias correction을 생략하는 주장은 약 1,000~2,000 steps 이후에 해당하므로 초기 구간과 이후 구간의 결과를 나눠 확인해야 한다. weight decay도 p.mul_(self.decay_factor)로 gradient 갱신보다 먼저 적용되므로 표준 Adam 구현과 적용 순서가 같은지 함께 대조해야 한다.
섹션별 상세
이미지 분석

이미지는 게시물의 중심 주장인 ε 조절과 β₂ 기반 전이를 수식으로 시각화한다. 본문 코드는 m과 v의 이동평균, e의 갱신, weight decay를 순서대로 계산해 이 갱신식을 구현하며, 이미지와 코드는 optimizer 간 연결 구조를 함께 전달한다.
ε와 β₂ 변화에 따라 optimizer 갱신식이 SGD에서 Adam으로 이어지는 관계를 나타낸 수식 이미지이다.
용어 해설
- 편향 보정(Bias Correction)
- — 초기 학습 단계에서 0으로 초기화된 모멘트 추정치가 실제 gradient 통계보다 작게 잡히는 문제를 보정하는 항이다. 게시물은 약 1,000~2,000 step 이후 영향이 작아져 분자와 분모에서 생략할 수 있다고 설명한다.
- 가중치 감쇠(Weight Decay)
- — 매 업데이트 전에 파라미터를 일정 비율로 줄여 과도한 가중치 증가를 억제하는 정규화 방식이다. 코드에서는 λ* = 1 - αₗᵣ · λ를 감쇠 계수로 두고 p를 먼저 곱한 뒤 gradient 기반 갱신을 적용한다.
- 모멘트 추정치(Moment Estimates)
- — optimizer가 gradient의 이동평균 통계를 저장해 업데이트 방향과 크기를 조정하는 값이다. 코드의 m은 gradient의 1차 모멘트, v는 gradient 제곱의 2차 원시 모멘트이며 β₁과 β₂가 각각 두 추정치의 갱신 비율을 결정한다.
코드 예제
class Adam(optim.Optimizer):
def __init__(self, params, lr=3e-4, weight_decay=0.01, betas=(0.9, 0.999)):
defaults = dict(lr=lr, betas=betas)
super().__init__(params, defaults)
self.wd = weight_decay
self.lr = lr
self.beta1, self.beta2 = betas
self.beta1_, self.beta2_ = 1-self.beta1, 1-self.beta2
self.decay_factor = 1.0 - self.lr * self.wd
self.eps = 1e-8
@torch.no_grad()
def step(self):
for group in self.param_groups:
for p in group['params']:
if p.grad is None:
continue
grad = p.grad
state = self.state[p]
if len(state) == 0:
state['m'] = torch.zeros_like(p, memory_format=torch.preserve_format)
state['v'] = torch.zeros_like(p, memory_format=torch.preserve_format)
state['e'] = torch.tensor(1-self.eps, device=p.device, dtype=p.dtype)
m = state['m']
v = state['v']
e = state['e']
# Update biased first moment estimate
m.mul_(self.beta1).add_(grad, alpha=self.beta1_)
# Update biased second raw moment estimate
v.mul_(self.beta2).addcmul_(grad, grad, value=self.beta2_)
e.mul_(self.beta2).add_(self.eps, alpha=self.beta2_)
# Update parameters
p.mul_(self.decay_factor).addcdiv_(m, v.sqrt().add_(e), value=-self.lr)Adam의 1차·2차 gradient 통계를 갱신하고 weight decay를 적용한 뒤 파라미터를 업데이트하는 핵심 구현이다.
언급된 리소스
AI 요약 · 북마크 · 개인 피드 설정 — 무료
출처 · 인용 안내
인용 시 "요약 출처: AI Trends (aitrends.kr)"를 표기하고, 사실 확인은 원문 보기 기준으로 진행해 주세요. 자세한 기준은 운영 정책을 참고해 주세요.