모두의 AI
머신러닝AI논문
로딩 중…

배우기

🏅내 업적

Ch.02

최적화 알고리즘: 속도와 방향을 똑똑하게 조절하기

AI 모델을 학습시키는 과정은 '안대가 씌워진 채로 거대한 산맥에서 가장 깊은 골짜기(오차가 가장 적은 최솟값)를 찾아 내려가는 등산'과 완벽하게 같습니다. 여기서 최적화(Optimization)란, 우리가 현재 서 있는 위치에서 어느 방향으로, 얼만큼의 보폭으로 걸어 내려갈지 결정하는 내비게이션 역할을 합니다.
Ch.01에서 출발선을 정했다면, 이번 장에서는 경사(Gradient)를 느끼며 안전하고 빠르게 산을 내려가는 다양한 스킬들을 배웁니다. 뚜벅뚜벅 걸어가는 SGD부터, 관성을 이용해 썰매를 타는 모멘텀(Momentum), 그리고 지형에 맞춰 보폭을 스스로 조절하는 똑똑한 자율주행차 Adam까지! 실무에서 매일 마주하게 될 핵심 최적화 알고리즘들의 원리를 아주 쉽고 직관적으로 파헤쳐 봅니다.
안대를 쓴 채 같은 산맥(손실 곡면)을 내려가도, SGD·모멘텀·Adam은 서로 다른 길을 택합니다. 아래는 단순화한 골짜기에서의 궤적 비교입니다.
loss
SGDMomentumAdam
빨강(SGD)은 초기부터 좌우로 더 크게 흔들리며 내려오고, 하강 중 지그재그가 가장 뚜렷하게 남습니다. 초록(모멘텀)은 진동을 줄이면서도 끝에서 중심에서 살짝 비켜 있고, 파랑(Adam)은 가장 빨리 골짜기 한가운데로 붙습니다.

학습 흐름: 순전파 → 손실 → 역전파 → 옵티마이저 step

모델 작동: θ←θ−η⋅(Adam 등으로 만든 스텝)\theta \leftarrow \theta - \eta \cdot(\text{Adam 등으로 만든 스텝})θ←θ−η⋅(Adam 등으로 만든 스텝)

  • ① SGD: 기울기 반대 방향으로 매 스텝 이동(노이즈 있으면 지그재그)
  • ② Momentum: 속도 vvv를 누적해 관성으로 꺾임이 완만해짐
  • ③ Adam: 좌표별 적응적 보폭으로 골짜기 형태에 맞게 스텝
  • ④ 실무: 로그·스케줄·초기화(Ch.01)와 함께 튜닝

최적화 알고리즘: 속도와 방향을 똑똑하게 조절하기

1. 경사 하강법(Gradient Descent)과 SGD: 오르막의 반대로 걷기
개념: 산을 내려갈 때 가장 확실한 방법은 발끝으로 땅을 짚어보고 '가장 가파른 내리막길'로 한 걸음씩 내디디는 것입니다. 이것이 경사 하강법의 핵심입니다.
직관적 비유: 짙은 안개가 낀 한라산에서 하산한다고 상상해 보세요. 한 번에 너무 크게 뛰면(보폭이 넓으면) 낭떠러지로 떨어지거나 반대편 봉우리로 튕겨 올라갈 수 있습니다. 반대로 너무 좁은 보폭으로 걸으면 해가 져도 하산하지 못하겠죠. 여기서 '보폭'이 바로 학습률(Learning Rate)입니다.
핵심 수식:
θ←θ−η∇L(θ)\theta \leftarrow \theta - \eta \nabla L(\theta)θ←θ−η∇L(θ)
- θ\thetaθ(세타): 현재 위치(모델의 가중치 파라미터)
- η\etaη(에타): 보폭, 즉 학습률 (보통 0.01, 0.001 등)
- ∇L\nabla L∇L: 현재 위치에서의 기울기(경사)
실전 팁: 전체 지도를 다 보려면 시간이 너무 오래 걸리기 때문에, 실무에서는 지도의 일부(미니배치)만 보고 빠르게 방향을 정하는 확률적 경사 하강법(SGD, Stochastic Gradient Descent)을 기본으로 사용합니다.
2. 모멘텀(Momentum): 빙판 위를 미끄러지는 볼링공
개념: SGD는 눈앞의 경사만 보고 걷기 때문에, 울퉁불퉁한 좁은 골짜기를 만나면 좌우로 심하게 지그재그로 움직이며 시간을 낭비합니다. 이를 해결하기 위해 '과거에 이동했던 방향의 관성'을 추가한 것이 모멘텀입니다.
직관적 비유: 가벼운 종이컵은 작은 돌멩이(노이즈)에도 쉽게 방향을 바꾸지만, 무거운 볼링공은 웬만한 장애물은 뚫고 원래 굴러가던 방향으로 묵묵히 밀고 나갑니다. 모멘텀은 모델에 이 볼링공 같은 '무게감'을 부여합니다.
핵심 수식:
v←βv+(1−β)gv \leftarrow \beta v + (1-\beta)gv←βv+(1−β)g
θ←θ−ηv\theta \leftarrow \theta - \eta vθ←θ−ηv
- vvv: 현재 굴러가고 있는 속도(관성 벡터)
- β\betaβ(베타): 과거의 관성을 얼마나 유지할지 정하는 계수 (보통 0.9로 이전 속도의 90%를 유지)
- ggg: 현재 위치에서 측정한 기울기
보충: Nesterov 변형은 관성으로 한 번 이동한 앞 지점에서 기울기를 보아 예측 성격을 줍니다.
3. 적응형 옵티마이저 (AdaGrad, RMSProp, Adam): 바퀴마다 브레이크 따로 잡기
개념: 데이터의 특징에 따라 어떤 파라미터는 이미 목표치에 도달했고, 어떤 파라미터는 아직 한참 더 가야 할 수 있습니다. 모든 파라미터에 똑같은 보폭(η\etaη)을 적용하는 대신, 각 파라미터의 상황에 맞춰 보폭을 스스로 조절(Adaptive)하는 똑똑한 방법들입니다.
발전 과정:
- AdaGrad: "많이 걸어온 길은 보폭을 줄이자!" 과거에 경사가 컸던(많이 움직인) 파라미터의 보폭을 확 줄여줍니다.
- RMSProp: AdaGrad의 단점(나중에는 보폭이 0이 되어 멈춰버림)을 완화하기 위해, 아주 옛날의 궤적은 서서히 잊어버리도록 고안되었습니다.
- Adam (실무 제왕): 모멘텀(방향 유지)과 RMSProp(보폭 조절)의 장점을 합친 방식입니다. 현재 딥러닝에서 가장 기본적으로 선택하는 옵티마이저 중 하나입니다.
실전 팁: 최신 논문들에서는 가중치 감소(Weight Decay)를 분리하여 성능을 끌어올린 AdamW를 매우 즐겨 사용합니다.
4. 최적화의 3대 목표: 안정성, 속도, 일반화
개념: 옵티마이저를 고르는 것은 단순히 '빨리 내려가는 것'만이 목적이 아닙니다. 목적지(최솟값)에 도달하는 궤적에 따라 모델이 처음 보는 데이터에 얼마나 잘 대응하는지(일반화 성능)가 달라집니다.
직관적 비유: KTX(Adam)를 타면 부산에 빨리 도착하지만, 완행열차(SGD+Momentum)를 타면 시간이 걸려도 구석구석 숨겨진 명소(더 좋은 일반화 지점)를 발견할 확률이 높습니다.
실전 팁: 시야가 좁은 초반에는 보폭을 천천히 늘리는 워밍업(Warm-up)을 하고, 목적지에 다다를수록 보폭을 줄이는 학습률 스케줄링(Scheduler)을 옵티마이저와 반드시 짝꿍으로 함께 사용해야 합니다.

수식 쉽게 이해하기

SGD 한 스텝 θ←θ−ηg^\theta \leftarrow \theta - \eta \hat{g}θ←θ−ηg^​ — g^\hat{g}g^​는 미니배치로 추정한 기울기, η\etaη는 스텝 크기(학습률)입니다.
모멘텀 v←βv+(1−β)gv \leftarrow \beta v + (1-\beta)gv←βv+(1−β)g, θ←θ−ηv\theta \leftarrow \theta - \eta vθ←θ−ηv — 과거 방향이 vvv에 쌓여 좁은 골짜기에서 좌우로만 튕기는 현상을 줄이는 데 도움이 됩니다.
Adam(개념) — 1차 모멘트(기울기의 EMA)와 2차 모멘트(기울기 제곱의 EMA)로 각 좌표의 보폭을 조절하고, 초기 몇 스텝의 편향을 bias correction으로 나눕니다.
적응형의 공통 직관 — 자주 크게 갱신되는 좌표는 보폭을 줄이고, 드문 좌표는 상대적으로 덜 줄이는 식으로 좌표별 학습률 효과를 냅니다.

왜 중요한지

AI 프로젝트의 시간과 비용을 결정짓는 핵심
학습률이 너무 크면 모델이 엉뚱한 곳으로 튕겨 나가 영원히 학습되지 않고(발산), 너무 작으면 1시간이면 끝날 학습이 1주일이 걸릴 수도 있습니다. 올바른 옵티마이저와 학습률 설정은 곧 값비싼 GPU 대여 비용과 여러분의 야근 시간을 줄여주는 마법입니다.
'시험 점수(일반화 성능)'를 바꾼다
재미있게도, 같은 데이터로 학습해도 옵티마이저에 따라 최종 결과물의 질이 달라집니다. 어떤 골짜기(최솟값)에 정착하느냐에 따라 새로운 데이터(테스트 세트)에 대한 예측력이 크게 달라지기 때문입니다. 실력 있는 AI 엔지니어는 데이터의 성격에 맞춰 이 도구들을 자유자재로 바꿔 낍니다.
모델이 아플 때 가장 먼저 확인하는 '체온계'
학습 로스(Loss)가 뚝 떨어지지 않고 제자리걸음을 하거나, 갑자기 NaN(계산 불가) 에러가 뜬다면? 가장 먼저 의심해야 할 용의자 1순위가 바로 '학습률'과 '옵티마이저'입니다. 이 원리를 알면 막막한 에러 앞에서도 침착하게 디버깅을 시작할 수 있습니다.

어떻게 쓰이는지

① 실험을 기록하고, 한 번에 하나씩만 바꾸기
라이브러리마다 함수 이름은 다르지만 실무 습관은 비슷합니다. 학습률·배치 크기·옵티마이저·난수 시드를 메모해 두고, 이상이 생기면 한 번에 변수 하나만 바꿔 원인을 좁힙니다. 손실이 들쭉날쭉하면 배치·학습률·모멘텀을 먼저 보고, 오래 돌릴수록 갱신이 거의 멎는 느낌이면 AdaGrad 계열 대신 RMSProp·Adam 같은 선택을 검토합니다. 증상과 조절할 손잡이를 짝지어 생각하는 연습이 중요합니다.
② 실무자를 위한 옵티마이저 선택 치트시트
  • 상황일단 빠르게 결과(Baseline)를 보고 싶을 때
  • 추천 옵티마이저`Adam` 또는 `AdamW`
  • 이유알아서 보폭을 조절해 주어 초기 학습률 설정에 덜 민감함
  • 상황자연어 처리(NLP), 트랜스포머 모델 학습
  • 추천 옵티마이저`AdamW`
  • 이유희소한 데이터와 복잡한 구조에서 압도적인 안정성을 기대할 때가 많음
  • 상황이미지 분류(CNN) 성능을 극한(SOTA)으로 쥐어짤 때
  • 추천 옵티마이저`SGD + Momentum`
  • 이유세팅은 까다롭지만, 최적의 하이퍼파라미터를 찾으면 일반화 성능이 더 뛰어날 수 있음
상황추천 옵티마이저이유
일단 빠르게 결과(Baseline)를 보고 싶을 때`Adam` 또는 `AdamW`알아서 보폭을 조절해 주어 초기 학습률 설정에 덜 민감함
자연어 처리(NLP), 트랜스포머 모델 학습`AdamW`희소한 데이터와 복잡한 구조에서 압도적인 안정성을 기대할 때가 많음
이미지 분류(CNN) 성능을 극한(SOTA)으로 쥐어짤 때`SGD + Momentum`세팅은 까다롭지만, 최적의 하이퍼파라미터를 찾으면 일반화 성능이 더 뛰어날 수 있음
③ 모니터링: 눈을 떼지 마세요!
비행기를 이륙시켰다고 끝이 아닙니다. TensorBoard나 Weights & Biases(W&B) 같은 대시보드를 띄워놓고 손실 곡선(Loss Curve)이 아름답게 미끄럼틀을 타며 내려가고 있는지 반드시 실시간으로 지켜보아야 합니다. 그래프가 심하게 톱니바퀴처럼 요동친다면 학습률을 낮춰 줄 타이밍입니다.

요약

최적화는 손실 L(θ)L(\theta)L(θ)을 줄이기 위해, 역전파로 얻은 기울기 ggg를 학습률 η\etaη과 함께 스텝(step)으로 가공한 뒤 θ←θ−η⋅(스텝)\theta \leftarrow \theta - \eta\cdot(\text{스텝})θ←θ−η⋅(스텝) 형태로 파라미터를 갱신하는 과정입니다.
SGD는 미니배치 기울기 g^\hat{g}g^​로 갱신하고, 모멘텀은 속도 vvv를 누적해 진동을 줄이며, Adam/AdamW는 1차·2차 모멘트로 좌표별 보폭을 적응적으로 조절합니다.
실무 디버깅 요약(증상 → 우선 점검)
- 손실 진동: `lr`, 모멘텀, 배치 크기
- 초반 발산/NaN: 초기화, `lr`, `grad_norm`, clipping
- 학습 정체: 스케줄러(warmup 포함), 옵티마이저 재선택(SGD↔AdamW)
- 검증 정체: weight decay, 증강, early stopping
실전 튜닝 순서 요약
1) 로그 정상성 확인 → 2) `lr` 먼저 조정 → 3) 옵티마이저 선택 → 4) 스케줄 결합 → 5) 안정화 장치 적용 → 6) 평균 성능·분산·재현성으로 최종 선택
운영 원칙: 한 번에 한 변수만 변경하고, `optimizer/lr/batch_size/weight_decay/seed/scheduler`를 기록해 비교합니다.

문제 풀이를 위한 설명

최적화는 손실 L(θ)L(\theta)L(θ)을 줄이기 위해 역전파로 얻은 기울기로 파라미터 θ\thetaθ를 어떻게 갱신할지 정하는 과정입니다. 기본 SGD는 미니배치에서 본 기울기 g^\hat{g}g^​로 θ←θ−ηg^\theta \leftarrow \theta - \eta \hat{g}θ←θ−ηg^​ 한 스텝을 밟으며, 학습률 η\etaη가 한 걸음의 크기(보폭)를 직접 결정합니다. 모멘텀은 속도 vvv를 누적해 좁은 골짜기에서 생기는 지그재그를 줄이고, Adam/AdamW는 1차·2차 모멘트로 좌표마다 보폭을 다르게 두는 적응형 옵티마이저입니다. 손실이 들쭉날쭉하거나 발산할 때는 옵티마이저 이름만 바꾸기보다 학습률·배치 크기·학습률 스케줄러를 함께 점검하는 것이 실무에서 가장 먼저 필요합니다.
예시 (정의)
"모멘텀(Momentum)의 핵심 역할은?
① 학습률을 0으로 만듦
② 과거 방향을 누적해 진동을 줄임
③ 역전파를 생략"
모멘텀은 속도 vvv를 누적해 업데이트 방향의 관성을 유지한다. → 정답 2

예시 (응용)
"학습 손실이 크게 진동할 때 가장 먼저 점검할 조합은?
① 학습률·모멘텀·배치 크기
② 데이터 0개
③ 레이어 전부 삭제"
진동은 스텝 크기와 기울기 노이즈 문제와 연결되므로
①을 먼저 본다. → 정답 1

예시 (계산)
η=0.001\eta=0.001η=0.001, g=20g=20g=20일 때 SGD에서 업데이트 크기 ηg\eta gηg는?
0.001×20=0.020.001 \times 20 = 0.020.001×20=0.02. → 정답 0.02
정의 예시 — "Adam이 함께 사용하는 정보로 맞는 것은?
① 1차·2차 모멘트
② 배치 인덱스만
③ 드롭아웃 마스크만" → Adam은 1차·2차 모멘트를 사용. 정답 1

참/거짓 예시 — "RMSProp은 제곱 기울기의 지수이동평균(EMA)을 사용한다." → 맞음. 정답 1

응용 예시 — "초반 학습이 불안정할 때 먼저 고려할 것은?
① warmup·학습률 스케줄
② 역전파 끄기
③ 데이터 삭제" → warmup·스케줄 우선 점검. 정답 1

선택 예시 — "Nesterov의 특징은?
① lookahead 지점의 기울기
② 현재점만
③ 기울기 미사용" → lookahead 사용. 정답 1

개념 예시 — "AdaGrad에서 자주 갱신된 좌표의 유효 보폭은?
① 작아지는 경향
② 항상 동일
③ 커지는 경향" → 누적으로 인해 보폭 감소 경향. 정답 1

계산 예시 — "샘플 수 64, 배치 크기 16일 때 한 에폭 스텝 수는?" → 64/16=464/16=464/16=4. 정답 4