모델이 틀렸다. 어떤 손잡이를 어느 방향으로 얼마나 움직여야 할까?
매개변수 하나, 모델이 얼마나 틀렸는지를 재는
아래 위젯에서 출발점 과 슬라이더를 끌고 한 스텝을 눌러보자. 프리셋 셋 — 작음은 천천히 기어 내려가고, 적당은 두어 스텝 만에 최솟값에 닿고, 너무 큼은 진동하며 발산한다. “적당”과 “발산” 사이의 경계가 이 방법의 안정성 이론 전체 — 화면 하나에 다 담긴다. 경사하강법은 최적화의 정전적 예시 — 같은 다섯 단계가 금융과 보정에서도 반복된다.
틀림을 숫자로
가능한 가장 단순한 모델: 매개변수 하나 , 입력 하나 , 예측 . 참값 에 대해 가 되길 바란다. “가까움”을 재려면 숫자가 필요하다. 표준은 제곱 오차 — 예측이 정확하면 0, 빗나갈수록 크고, 무엇보다 어디서나 매끄러워 미분할 수 있다.
위젯은 으로 고정 — 손실은 , 최솟값이 인 포물선이 된다. 문제는 결국 한 줄 — 어떤 출발점 에서든 까지 어떻게 가느냐.
어느 방향? — 미분
미분 모듈이 한 줄로 답한다: — 현재 에서 본 손실 곡선의 기울기. L'(w) > 0이면 가 커질수록 손실이 오른다 — 를 줄여야 한다. L'(w) < 0이면 반대. 하강 방향은 언제나 .
위젯에서 현재 점의 초록 화살표가 그 방향이다. 가 최솟값에 다가갈수록 화살표가 짧아지고, 정확히 에서 길이가 0이 된다 — 최솟값에서는 기울기가 0이라 더 이상 따를 신호가 없다.
# Toy: one parameter w, one example (x, y) = (2, 6).
# Loss(w) = (w·x − y)² = quadratic in w, minimum at w* = y/x = 3.
def loss(w, x, y):
return (w * x - y) ** 2
def grad(w, x, y):
# d/dw [(wx − y)²] = 2x(wx − y).
return 2 * x * (w * x - y)
x, y = 2, 6
loss(0.0, x, y) # → 36 (way off)
loss(3.0, x, y) # → 0 (perfect)
grad(0.0, x, y) # → −24 (loss decreases as w grows)
grad(3.0, x, y) # → 0 (no signal at the minimum)얼마나? — 학습률
방향은 정해졌다. 크기는 아직 정해지지 않았다. 기울기에 양수 (
w ← w − η · L'(w)
가 달라지면 궤적도 달라진다. 위젯에서 로 돌리면 매
스텝마다 w_까지의 거리가 일정 비율 (여기선 약 0.68) 만큼 줄어든다 — 기하
반복 — 하강 루프
방법 전체가 스텝 → 스텝 → 스텝 — 기울기가 충분히 작아지거나 (최솟값 근처에 왔거나) 정해둔 횟수가 끝날 때까지 반복한다:
for _ in range(steps): w = w − η · L'(w)
코드 다섯 줄. 그게 경사하강법이다. 위젯의 자동 버튼이 정확히 이 루프를 돌린다. 로 누르면 가 으로 수렴하고, 로 누르면 값이 화면 밖으로 튀어 나간다.
# The descent loop, in five lines. The shape that scales to neural nets.
def descent(w0, lr, x, y, steps=20):
w = w0
for _ in range(steps):
w = w - lr * grad(w, x, y)
return w
descent(0.0, lr=0.04, x=x, y=y, steps=20) # → 2.95 slow but stable
descent(0.0, lr=0.12, x=x, y=y, steps=20) # → 3.00 fast, near-Newton
descent(0.0, lr=0.27, x=x, y=y, steps=20) # → ~10⁵ diverged
# The single requirement for stability on a quadratic with second
# derivative c is η < 2/c. Here c = L''(w) = 2x² = 8, so η < 0.25.
# Beyond that, every "step" overshoots more than it corrects, and
# the iterates explode geometrically.발산 — η가 너무 크면
이차 손실에서 u = w − w_로 두면 갱신은 — 최솟값까지의 거리가 매 스텝마다 만큼 곱해진다. 안정적으로 수렴하려면 |r| < 1, 즉 0 < η < 2/L''(w_)여야 한다. 여기서는 이니 η < 0.25면 수렴, η > 0.25면 발산.
를 넘어가면 매 스텝이 보정해야 할 거리보다 더 멀리 최솟값을 지나친다. 의 부호가 번갈아 바뀌고 (최솟값 양쪽에 번갈아 떨어진다) 크기는 점점 커진다. 위젯이 그 모습을 보여준다 — 에서 값이 핑퐁하며 부풀어 오른다. 실제 ML이 이 문제를 푸는 방법은 단순한 시행착오가 아니다. 국소 곡률을 측정하고 (2차 방법, Adam 같은 적응형 학습률), 최적해에 가까워질수록 를 줄이는 스케줄을 함께 쓴다.
왜 ML 곳곳에 이 식이 있는가
실제 ML은 매개변수가 하나가 아니라 수백만에서 수십억 개다. 예제도 하나가 아니라 수백만 개. 손실은 깔끔한 포물선이 아니라 안장점과 평탄지가 가득한 고차원 비볼록 풍경이다. 그래도 레시피 자체는 바뀌지 않는다 — 각 기호가 가리키는 대상만 바뀐다.
매개변수 하나 → 벡터. 가 매개변수
로, 기울기는 편미분의 벡터로 바뀐다. 스칼라 갱신 자리에 벡터 뺄셈이 들어선다 — 벡터 모듈이 다져둔 두 연산 (덧셈, 스칼라배) 그대로다.벡터 예제 하나 → 미니배치. 매 스텝마다 작은 무작위 샘플 위에서 손실을 합하거나 평균낸다. 이제 기울기에는 잡음이 섞인다 — 이것이 다. 잡음은 버그가 아니라 기능 — 나쁜 국소 기하에서 빠져나오는 데 오히려 도움이 된다.
깔끔한 포물선 → 실제 손실 표면. 깊은 신경망의 교차 엔트로피는 비볼록이다. 유일한 최적해는 없고, 같은 하강 루프로 찾아낸 “충분히 좋은”
으로 타협한다.국소 최솟값 손으로 유도한 기울기 → autograd. 연쇄 법칙은 기계적이다. 현대 ML 프레임워크는 forward 과정에서 계산 그래프를 만들고, 그것을 거꾸로 따라가며 을 자동으로 뽑아낸다. 우리가 장난감 예제에서 손으로 계산한 미분과 같은 연산, 규모만 다를 뿐이다.
자신 있게 틀리기로 이어지는 다리: 여기서 다룬 제곱 손실은 워밍업이다. 그쪽의 교차 엔트로피 손실도 “기울기 계산 → 한 스텝”이라는 같은 기하를 따른다 — 단지 자리에 가 들어갈 뿐이다. 같은 하강 알고리즘, 다른 풍경.
# Same loop, real ML.
# Replace the toy parameter w with a parameter VECTOR θ.
# Replace the toy gradient with the partial derivatives ∂L/∂θᵢ.
# Replace the single example with a SUM (or mini-batch average) over data.
#
# Pseudocode for a one-layer linear classifier with cross-entropy loss
# (the loss from /ml/confident-wrong) — same descent, more axes:
#
# for batch in data_loader:
# ŷ = softmax(W @ batch.x) # forward
# L = cross_entropy(ŷ, batch.y) # loss
# g = autograd.grad(L, W) # ∇_W L via reverse-mode autodiff
# W = W - lr * g # one step
#
# autograd ≠ a new idea; it's *bookkeeping for the chain rule* applied
# to the same gradient operation arc 3 derives by hand. Walk downhill,
# but with millions of axes and a clock.방향은 미분에서, 거리는 η에서, 그리고 반복. 현대 ML의 모든 기계는 이 한 줄에서 변수만 바꿔 끼우면 나온다 — .
, , 일 때 예측 와 손실 를 계산하라.
미분 모듈의 할선-접선 레시피로 를 처음부터 유도하라. 그 다음 , 에서 값을 계산.
에서 출발, , 기울기 일 때 한 스텝 뒤 는? 두 스텝 뒤는? 최적해 근처에 빨리 닿을 것이다.
이차 손실에서 변위 의 갱신은 로 쓸 수 있다. 에서 이 에 대해 지수적으로 발산함을 보여라. 갱신이 경계에 머무는 (진폭 일정, 자라지도 줄지도 않는) 는 무엇인가? 그 가 특별한 이유는?