경사하강법과 라그랑주 제약 최적화 운영 전략
GD·SGD·Adam의 수렴 특성과 라그랑주 승수법, KKT 조건, PGD를 바탕으로 학습과 제약 최적화 운영 방식을 정리한다.
2026-08-14 · 최초 발행 2024-04-29
목적함수와 제약을 함께 다루는 최적화 루프
머신러닝 학습은 목적함수 최소화 문제를 반복적으로 푸는 과정이다. 대규모 데이터, 비볼록 손실, 운영 제약이 함께 등장하면 손실을 낮추는 것뿐 아니라 안정적으로 수렴하고 제약을 만족하는 갱신 절차가 필요해진다.
무제약 문제는 미분 가능한 함수 (f)에 대해 (x \in R^n)에서 (min f(x))를 구하는 형태로 둘 수 있다. 1차 방법은 (\nabla f(x))를 이용해 반복적으로 해를 갱신하며, Lipschitz 연속 기울기와 적절한 스텝 크기가 수렴 조건에 포함된다.
GD(Full-batch)는 (x_{t+1} = x_t − η∇f(x_t))로 갱신한다. SGD(Mini-batch)는 (g_t ≈ ∇f(x_t))인 확률적 추정치를 사용해 저비용·고빈도 업데이트를 수행한다. Adam은 1·2차 모멘트 추정치 (m_t, v_t)를 기반으로 좌표마다 적응형 학습률을 적용한다.
제약이 포함되면 문제는 (min f(x)), (g_i(x) ≤ 0), (h_j(x) = 0)으로 표현된다. 이때 라그랑주안은 다음과 같다.
(L(x, λ, μ) = f(x) + Σ λ_i g_i(x) + Σ μ_j h_j(x))
해를 판단할 때는 정류성, 원초 타당성, 이중 타당성, 상보성으로 구성된 KKT 조건을 확인한다.
선택한 옵티마이저가 만드는 수렴 특성
GD는 선형·볼록 문제에서 안정적으로 수렴할 수 있지만, 데이터가 커질수록 스텝당 비용이 커진다. SGD는 잡음 주입 효과가 일반화에 이점이 될 수 있는 반면, 수렴 과정의 진동을 감수해야 한다. Adam은 좌표별 적응 스텝으로 초기 수렴이 빠르지만, 장기 일반화 품질은 SGD+모멘텀과 비교해 가변적이다.
| 항목 | GD | SGD(Mini-batch) | Adam |
|---|---|---|---|
| 성능(시간/스텝) | 스텝당 고비용, 스텝 수 적음 | 스텝당 저비용, 스텝 수 많음 | 초기 수렴 빠름 |
| 확장성 | 대규모 데이터 비효율 | 데이터 병렬 최적 | 파라미터/메모리 추가 비용 |
| 일관성(재현성) | 높음 | 배치 셔플 영향 | β 파라미터 민감성 |
| 안정성 | 학습률 의존 높음 | 잡음에 의한 진동 | 잡음 완화, 평탄해 탐색 제한 가능 |
| 운영 편의 | 단순 | 튜닝 부담 중간 | 하이퍼파라미터 다수, AdamW 권장 |
학습률은 고정 또는 감쇠 방식으로 운영할 수 있으며, Cosine·Step·Exponential 스케줄을 선택할 수 있다. Weight decay(AdamW)와 모멘텀/β2 조합은 과적합과 진동을 완화하는 데 사용된다.
제약 유무에 따라 갈라지는 갱신 경로
투영 경사하강법(PGD)은 (x ← Π_C(x − η∇f))로 제약 집합에 해를 다시 투영한다. 폐포·볼록 집합에서 단순하고 견고한 방식이며, 박스·심플렉스·ℓ2/ℓ1 볼처럼 집합이 단순할 때 효과적이다.
벌점법과 장벽법은 제약 위반 비용을 높이는 방식이다. 수치 안정성과 조건수 사이에는 트레이드오프가 있다. 라그랑주 승수와 듀얼 상승법을 쓸 때는 KKT 기반 라그랑주안 최적화 절차를 함께 둬야 한다.
학습 안정성과 대규모 실행에서 확인할 지점
기울기 폭주와 소실을 줄이려면 정규화, 기울기 클리핑, 적절한 초기화가 필요하다. 비볼록 지형에서는 새들 포인트를 피하기 위한 잡음 주입, 스텝 조정, 재시작 전략을 사용할 수 있다.
분산 환경에서는 데이터 병렬 SGD와 동기·비동기 집계 방식을 검토한다. 학습률 워머프, 배치크기와 스텝 크기의 공조, 통신과 계산의 균형도 설계 대상이다.
딥러닝 학습에서는 초기 탐색에 Adam을 쓰고 후반에 SGD+모멘텀으로 전환하는 전략을 적용할 수 있다. 대배치 학습에서는 LARS/LAMB 같은 적응 스케일링을 병행한다.
로지스틱 회귀와 선형 모델은 볼록 손실 기반의 GD·SGD를 적용하고, 백트래킹 라인서치로 안정적 수렴을 확보할 수 있다. 규제항(L2)이 있으면 닫힌형 해 근사와 조기 종료 전략을 함께 사용한다.
포트폴리오나 자원 배분처럼 예산·익스포져 제약이 있는 문제에는 Lagrange-KKT 또는 PGD를 적용한다. 종료 기준은 제약 위반률과 듀얼 갭을 모니터링해 설계한다.
반복 갱신에서 수렴과 제약 잔차를 분리해 본다
무제약 학습 루프
입력은 (x0), (η), 배치크기 B, 모멘텀 β 또는 Adam의 (β1, β2, ε)이다. 반복마다 (g_t = ∇f_B(x_t))를 계산하고, GD는 (B=N), SGD는 미니배치를 선택한다. 모멘텀 또는 Adam 보정 (m_t, v_t)를 갱신한 뒤 (x_{t+1})을 업데이트한다.
종료는 (||g_t||), 상대 목적 감소, 예산 또는 에폭 기준으로 판단한다. 학습률은 Warmup 뒤 Cosine 또는 Step 감쇠를 적용할 수 있고, 안정화를 위해 Gradient clipping과 mixed precision의 loss scaling을 사용한다.
평등식과 부등식을 포함한 프라이멀-듀얼 갱신
입력은 (x0), (λ0 ≥ 0), 자유로운 (μ0), 스텝 (ηx, ηλ, ημ), 패널티 (ρ)다. 반복 과정에서 다음 갱신을 수행한다.
- (x ← x − ηx ∇_x L(x, λ, μ))
- (λ ← max(0, λ + ηλ g(x))) [부등식], (μ ← μ + ημ h(x)) [평등식]
- 필요 시 (ρ) 증대 혹은 보조 패널티 추가
원초 타당성 (||g_+||), (||h||), 정류성 (||∇_x L||), 상보성 (λ⊙g ≈ 0)을 종료 기준으로 둔다.
단순 집합에 대한 PGD
반복은 (x̃ ← x − η∇f(x)), (x ← Π_C(x̃)) 순서로 진행한다. 제약 집합 (C)가 단순할 때 적용하기 쉽다.
PyTorch로 확인하는 무제약과 평등 제약
전제조건은 Python 3.9+, PyTorch 2.x, NumPy 1.24+이며 CPU/GPU와 무관하다. 재현성이 필요하면 시드를 고정한다.
SGD와 Adam 비교
# python 3.9+, torch 2.x
import torch
torch.manual_seed(42)
# 이차 모형 + 노이즈 데이터
n = 1000
X = torch.randn(n, 10)
true_w = torch.randn(10, 1)
y = X @ true_w + 0.1 * torch.randn(n, 1)
def train(optimizer_name):
w = torch.zeros(10, 1, requires_grad=True)
opt = torch.optim.Adam([w], lr=0.05) if optimizer_name == "adam" \
else torch.optim.SGD([w], lr=0.1, momentum=0.9)
for epoch in range(200):
idx = torch.randint(0, n, (128,))
loss = ((X[idx] @ w - y[idx])**2).mean()
opt.zero_grad()
loss.backward()
torch.nn.utils.clip_grad_norm_([w], max_norm=10.0)
opt.step()
with torch.no_grad():
mse = ((X @ w - y)**2).mean().item()
return mse
print("SGD MSE:", train("sgd"))
print("Adam MSE:", train("adam"))
라그랑주 승수를 이용한 평등 제약
문제는 (min x^2 + y^2), (x + y = 1)이다.
import torch
torch.manual_seed(0)
x = torch.tensor([0.0, 0.0], requires_grad=True) # [x, y]
mu = torch.tensor(0.0, requires_grad=True) # 평등 제약 승수 μ
opt = torch.optim.SGD([x, mu], lr=0.1)
for _ in range(200):
opt.zero_grad()
f = (x**2).sum()
h = x.sum() - 1.0
L = f + mu * h
L.backward()
opt.step()
print("x*", x.detach().numpy(), "h(x)", (x.sum() - 1).item())
# 해석해: x = y = 0.5, 제약 만족
승수가 발산하면 스텝을 줄이고 보조 패널티 (ρ h^2)를 추가한다. 부등식 제약에서는 (λ ≥ 0)를 유지해야 하므로 torch.clamp(λ, min=0) 또는 ReLU 파라미터화를 적용한다. 단순하고 안정적인 대안으로는 (x ← Π_C(x − η∇f)) 형태의 PGD를 사용할 수 있다.
수렴 성능을 해석할 때 남겨야 할 기준
학습 효율은 동일 정확도 기준 에폭 20~40% 절감 가능성이 있다. 기울기 클리핑과 스케줄을 적용하면 발산률을 유의미하게 줄일 수 있다. 듀얼 잔차와 상보성을 모니터링하면 제약 위반률을 < 10^-4 수준으로 달성할 가능성이 있다.
대규모 무제약 문제에서는 SGD와 Adam의 확률적·적응적 업데이트가 선택지가 된다. 비볼록 문제에서 일반화 품질을 확보하려면 Adam에서 SGD로 전환하는 전략을 검토할 수 있다. 제약이 있는 경우에는 Lagrange-KKT, PGD, 벌점법을 상황에 맞춰 조합하고, 수렴성 지표와 제약 잔차를 명시해 운영한다.