1. Optimizer의 정의
딥러닝 모델은 처음에는 거의 아무것도 모르는 상태입니다. 예를 들어 FFNN/MLP가 어떤 summary를 context buffer에 남겨야 할지 점수를 예측한다고 하면, 처음 가중치는 랜덤에 가깝습니다.
모델은 입력을 받고 출력값을 만듭니다.
예:
입력: summary feature vector
출력: relevance score
정답: keep = 1 또는 evict = 0
모델 출력이 정답과 다르면 loss가 발생합니다. loss는 “얼마나 틀렸는지”를 숫자로 나타낸 값입니다.
optimizer는 loss를 줄이기 위해 모델 내부 파라미터, 즉 weight와 bias를 업데이트하는 알고리즘입니다.
즉 전체 흐름은 다음과 같습니다.
입력 데이터 → 모델 예측 → loss 계산 → gradient 계산 → optimizer가 weight/bias 수정 → 다시 예측 → loss 감소
2. 파라미터란 무엇인가
모델의 파라미터는 학습을 통해 바뀌는 숫자입니다.
예를 들어 프로젝트의 eviction MLP는 다음 구조입니다.
Linear(396, 128) → ReLU → Linear(128, 64) → ReLU → Linear(64, 1) → Sigmoid
policy.py에서는 EvictionMLP가 Linear(config.feature_dim, 128) → ReLU → Linear(128, 64) → ReLU → Linear(64, 1) 구조를 사용하고, 출력 logits에 sigmoid를 적용해 점수로 바꿉니다.
여기서 Linear(396, 128)은 입력 396개를 받아서 hidden neuron 128개로 변환합니다. 이때 각 입력과 각 neuron 사이에는 weight가 있습니다. 이 weight들이 학습 대상입니다.
3. Gradient의 의미
gradient는 “loss를 줄이려면 각 파라미터를 어느 방향으로 바꿔야 하는지”를 나타내는 값입니다.
예를 들어 어떤 weight를 조금 증가시켰더니 loss가 커진다면, optimizer는 그 weight를 줄이는 방향으로 업데이트합니다.
수식으로는 보통 다음과 같이 표현합니다.
현재 파라미터: θ
loss: L
gradient: ∂L/∂θ
가장 기본적인 업데이트는 다음과 같습니다.
θ ← θ − learning_rate × gradient
여기서 learning rate는 한 번에 얼마나 크게 움직일지 정하는 값입니다.
4. SGD란 무엇인가
가장 기본적인 optimizer는 SGD입니다.
SGD는 Stochastic Gradient Descent의 약자입니다.
의미는 “전체 데이터를 한 번에 보지 않고, 작은 batch 단위로 gradient를 계산해서 loss가 감소하는 방향으로 파라미터를 조금씩 이동시키는 방법”입니다.
공식은 단순합니다.
θ ← θ − αg
여기서 θ는 파라미터, α는 learning rate, g는 gradient입니다.
SGD의 장점은 단순하고 직관적이라는 점입니다. 단점은 모든 파라미터에 같은 learning rate를 적용하기 때문에, 어떤 파라미터는 너무 크게 움직이고 어떤 파라미터는 너무 느리게 움직일 수 있다는 점입니다.
5. Momentum이 필요한 이유
SGD는 gradient가 매번 흔들릴 수 있습니다.
예를 들어 산을 내려간다고 생각하면, SGD는 매 순간 바닥의 기울기만 보고 한 걸음 이동합니다. 지형이 울퉁불퉁하면 좌우로 흔들리면서 느리게 내려갑니다.
Momentum은 이전 이동 방향을 기억합니다.
즉, 계속 같은 방향으로 gradient가 나오면 더 빠르게 이동하고, 방향이 자주 바뀌는 잡음은 완화합니다.
직관적으로는 “관성”입니다.
공식은 대략 다음과 같습니다.
v ← βv + g
θ ← θ − αv
v는 이전 gradient들의 누적 방향입니다.
6. Adam의 정의
Adam은 Adaptive Moment Estimation의 약자입니다.
Adam은 크게 두 가지를 동시에 사용합니다.
첫째, gradient의 평균 방향을 기억합니다.
둘째, gradient 크기의 제곱 평균을 기억합니다.
즉 Adam은 “어느 방향으로 가야 하는지”와 “각 파라미터별로 얼마나 조심스럽게 움직여야 하는지”를 모두 계산합니다.
그래서 Adam은 파라미터마다 사실상 다른 learning rate를 적용합니다.
7. Adam의 핵심 아이디어
Adam은 각 파라미터에 대해 다음 두 값을 관리합니다.
m: gradient의 이동 평균, m은 방향 정보입니다.
v: gradient 제곱의 이동 평균 , v는 크기/불안정성 정보입니다.
gradient가 계속 같은 방향으로 나오면 m이 커집니다.
gradient가 너무 크게 튀면 v가 커집니다.
v가 크면 Adam은 해당 파라미터의 업데이트를 줄입니다.
즉 Adam은 다음처럼 작동합니다.
중요하고 안정적인 방향이면 빠르게 이동합니다.
gradient가 크고 불안정하면 조심스럽게 이동합니다.
gradient가 작은 파라미터도 너무 느리게 방치하지 않습니다.
9. Adam을 쉽게 비유하면
SGD는 “현재 경사만 보고 걷는 사람”입니다.
Momentum은 “이전까지 걷던 방향의 관성을 가지고 걷는 사람”입니다.
Adam은 “이전 방향도 기억하고, 길이 미끄러운지 울퉁불퉁한지도 고려해서 발걸음 크기를 자동 조절하는 사람”입니다.
그래서 Adam은 보통 초반 학습이 빠르고, learning rate에 덜 민감하며, sparse feature나 불균형한 gradient가 있는 문제에서 안정적입니다.
11. 코드에서 Adam이 하는 일
policy.py의 학습 코드에서는 다음처럼 Adam을 사용합니다.
optimizer = torch.optim.Adam(model.parameters(), lr=config.lr, weight_decay=config.weight_decay)
이 의미는 다음과 같습니다.
model.parameters()는 MLP 안의 모든 weight와 bias입니다.
lr=config.lr는 learning rate입니다. 설정 파일에서는 기본값이 1e-3입니다.
weight_decay=config.weight_decay는 가중치가 지나치게 커지는 것을 억제하는 정규화 항입니다. 기본값은 1e-4입니다.
학습 loop에서는 다음 순서가 반복됩니다.
예측값 계산
loss 계산
optimizer.zero_grad()로 이전 gradient 제거
loss.backward()로 현재 gradient 계산
optimizer.step()으로 Adam이 파라미터 업데이트
12. optimizer.zero_grad()가 필요한 이유
PyTorch에서는 gradient가 기본적으로 누적됩니다.
따라서 batch마다 새 gradient를 계산하기 전에 이전 batch의 gradient를 지워야 합니다.
optimizer.zero_grad()를 하지 않으면 이전 batch gradient와 현재 batch gradient가 섞입니다. 의도적으로 gradient accumulation을 하는 경우가 아니라면 잘못된 학습이 됩니다.
13. loss.backward()의 의미
loss.backward()는 역전파를 실행합니다.
역전파는 loss에서 시작해서 모델의 각 weight가 loss에 얼마나 영향을 주었는지 계산합니다.
즉 각 weight에 대해 gradient가 계산됩니다.
중요한 점은 backward() 자체가 weight를 바꾸는 것은 아닙니다.
weight를 실제로 바꾸는 함수는 optimizer.step()입니다.
14. optimizer.step()의 의미
optimizer.step()은 계산된 gradient를 사용해 파라미터를 업데이트합니다.
SGD라면 단순히 learning rate × gradient만큼 이동합니다.
Adam이라면 m, v, bias correction까지 고려해서 각 파라미터별 업데이트 크기를 조정합니다.
즉 step()은 실제 학습이 일어나는 순간입니다.
15. Adam과 learning rate의 관계
Adam도 learning rate가 필요합니다.
Adam이 adaptive optimizer라고 해서 learning rate가 필요 없는 것은 아닙니다.
다만 Adam은 파라미터별로 업데이트 크기를 자동 조절하므로, SGD보다 learning rate 선택에 덜 민감한 편입니다.
loss가 발산하면 learning rate가 너무 클 가능성이 있습니다.
학습이 너무 느리면 learning rate가 너무 작을 수 있습니다.
validation loss가 좋아지다가 나빠지면 overfitting일 수 있습니다.
초반부터 validation loss가 불안정하면 learning rate를 낮추는 것이 일반적입니다.
16. Adam의 장점
Adam은 초반 수렴이 빠릅니다.
gradient scale이 feature마다 다를 때 유리합니다.
sparse feature가 있을 때 안정적입니다.
learning rate 튜닝 부담이 SGD보다 작습니다.
작은 MLP, NLP 모델, embedding 기반 feature 학습에 적합합니다.
프로젝트의 eviction policy처럼 feature vector가 embedding, scalar feature, one-hot feature가 섞인 구조에서는 Adam이 합리적인 선택입니다.
17. 한 문장 요약
optimizer는 loss를 줄이기 위해 모델 파라미터를 업데이트하는 학습 알고리즘이고,
Adam은 gradient의 평균 방향과 크기 정보를 모두 기억해서 파라미터별로 업데이트 크기를 자동 조절하는 optimizer입니다.
'AL,ML 학부연구생 > 공부 기록' 카테고리의 다른 글
| PEFT 중 LoRA 파인튜닝은 무엇인가? LoRA 이해하기 (0) | 2026.05.18 |
|---|---|
| CNN의 순전파 역전파 과정 (0) | 2026.04.10 |
| 인터넷 쿠키(Cookie)란 무엇인가 (0) | 2026.03.31 |
| 인터넷 캐시(Cache)란 무엇인가 (0) | 2026.03.31 |
| Precision(정밀도), Recall(재현율), F1score, ROUGE-L, BELU, BERTscore, SEMscore 은 각각 무엇인가? (0) | 2026.03.30 |