Lemma
수학, 거꾸로
도입 · 어느 손잡이, 얼마나

모델이 틀렸다. 어떤 손잡이를 어느 방향으로 얼마나 움직여야 할까?

매개변수 ww 하나, 모델이 얼마나 틀렸는지를 재는 L(w)L(w) 하나가 있다. LL을 줄이려면 ww어느 방향으로 움직일까? 얼마나? 방향은 이 알려주고, 거리는 이라 부르는 한 숫자가 정한다. 이 둘을 합치면 수치 수학에서 가장 단순하고 가장 오래되었으며 가장 많이 쓰이는 레시피 — 현대 ML 시스템 전부의 엔진이 된다.

아래 위젯에서 출발점 w0w₀ηη 슬라이더를 끌고 한 스텝을 눌러보자. 프리셋 셋 — 작음은 천천히 기어 내려가고, 적당은 두어 스텝 만에 최솟값에 닿고, 너무 큼은 진동하며 발산한다. “적당”과 “발산” 사이의 경계가 이 방법의 안정성 이론 전체 — 화면 하나에 다 담긴다. 경사하강법은 최적화의 정전적 예시 — 같은 다섯 단계가 금융과 보정에서도 반복된다.

위젯 — 손실 풍경
w0.0000
L(w)36.000
L'(w) = ∇L-24.000
스텝0
w* = 3w
매개변수 하나 w, 예제 하나 (x, y) = (2, 6), 이차 손실 L(w) = (w·x − y)², 최솟값은 w* = 3. η = 0.04한 스텝을 반복하면 느린 하강. η = 0.12로 바꾸면 거의 뉴턴-속도 — 한 방에 가까움. η = 0.27로 두고 자동을 누르면 갱신이 진동하며 무한히 커진다. 경계 η < 2/L''(w*) (여기선 2/8 = 0.25)이 이 방법의 안정성 이론 *전부* — 위젯 한 화면에 압축돼 있다.
흐름
1

틀림을 숫자로

가능한 가장 단순한 모델: 매개변수 하나 ww, 입력 하나 xx, 예측 y^=wx\hat{y} = w · x. 참값 yy에 대해 y^y\hat{y} ≈ y가 되길 바란다. “가까움”을 재려면 숫자가 필요하다. 표준은 제곱 오차 L(w)=(wxy)2L(w) = (w·x − y)² — 예측이 정확하면 0, 빗나갈수록 크고, 무엇보다 어디서나 매끄러워 미분할 수 있다.

위젯은 (x,y)=(2,6)(x, y) = (2, 6)으로 고정 — 손실은 L(w)=(2w6)2=4(w3)2L(w) = (2w − 6)² = 4(w − 3)², 최솟값이 w_=3w\_ = 3인 포물선이 된다. 문제는 결국 한 줄 — 어떤 출발점 w0w₀에서든 33까지 어떻게 가느냐.

2

어느 방향? — 미분

미분 모듈이 한 줄로 답한다: L(w)=2x(wxy)L'(w) = 2x(wx − y) — 현재 ww에서 본 손실 곡선의 기울기. L'(w) &gt; 0이면 ww가 커질수록 손실이 오른다ww줄여야 한다. L'(w) &lt; 0이면 반대. 하강 방향은 언제나 L(w)−L'(w).

위젯에서 현재 점의 초록 화살표가 그 방향이다. ww가 최솟값에 다가갈수록 화살표가 짧아지고, 정확히 w_w\_에서 길이가 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)
3

얼마나? — 학습률

방향은 정해졌다. 크기는 아직 정해지지 않았다. 기울기에 양수 ηη ( · )를 곱해 빼준다:

w  ←  w  −  η · L'(w)

ηη가 달라지면 궤적도 달라진다. 위젯에서 η=0.04η = 0.04로 돌리면 매 스텝마다 w_까지의 거리가 일정 비율 (여기선 약 0.68) 만큼 줄어든다 — 기하 , 느리지만 안정적. η=0.12η = 0.12는 뉴턴-최적 η=1/L(w)=1/8=0.125η = 1/L''(w_) = 1/8 = 0.125에 가까워 두세 스텝이면 끝난다. η=0.27η = 0.27은 경계 너머 — 다음 절에서 무슨 일이 벌어지는지 본다.

4

반복 — 하강 루프

방법 전체가 스텝 → 스텝 → 스텝 — 기울기가 충분히 작아지거나 (최솟값 근처에 왔거나) 정해둔 횟수가 끝날 때까지 반복한다:

for _ in range(steps):
  w = w − η · L'(w)

코드 다섯 줄. 그게 경사하강법이다. 위젯의 자동 버튼이 정확히 이 루프를 돌린다. η=0.12η = 0.12로 누르면 ww33으로 수렴하고, η=0.27η = 0.27로 누르면 값이 화면 밖으로 튀어 나간다.

# 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.
5

발산 — η가 너무 크면

이차 손실에서 u = w − w_로 두면 갱신은 u(1ηL(w))uu ← (1 − η · L''(w_)) · u최솟값까지의 거리가 매 스텝마다 r=1ηL(w)r = 1 − η · L''(w_)만큼 곱해진다. 안정적으로 수렴하려면 |r| &lt; 1, 즉 0 &lt; η &lt; 2/L''(w_)여야 한다. 여기서는 L(w)=8L''(w) = 8이니 η &lt; 0.25면 수렴, η &gt; 0.25면 발산.

0.250.25를 넘어가면 매 스텝이 보정해야 할 거리보다 더 멀리 최솟값을 지나친다. uu의 부호가 번갈아 바뀌고 (최솟값 양쪽에 번갈아 떨어진다) 크기는 점점 커진다. 위젯이 그 모습을 보여준다 — η=0.27η = 0.27에서 값이 핑퐁하며 부풀어 오른다. 실제 ML이 이 문제를 푸는 방법은 단순한 시행착오가 아니다. 국소 곡률을 측정하고 (2차 방법, Adam 같은 적응형 학습률), 최적해에 가까워질수록 ηη줄이는 스케줄을 함께 쓴다.

6

왜 ML 곳곳에 이 식이 있는가

실제 ML은 매개변수가 하나가 아니라 수백만에서 수십억 개다. 예제도 하나가 아니라 수백만 개. 손실은 깔끔한 포물선이 아니라 안장점과 평탄지가 가득한 고차원 비볼록 풍경이다. 그래도 레시피 자체는 바뀌지 않는다 — 각 기호가 가리키는 대상만 바뀐다.

  • 매개변수 하나 → 벡터. ww가 매개변수 θθ로, 기울기는 편미분의 벡터로 바뀐다. 스칼라 갱신 자리에 벡터 뺄셈이 들어선다 — 벡터 모듈이 다져둔 두 연산 (덧셈, 스칼라배) 그대로다.

  • 예제 하나 → 미니배치. 매 스텝마다 작은 무작위 샘플 위에서 손실을 합하거나 평균낸다. 이제 기울기에는 잡음이 섞인다 — 이것이 SGDSGD다. 잡음은 버그가 아니라 기능 — 나쁜 국소 기하에서 빠져나오는 데 오히려 도움이 된다.

  • 깔끔한 포물선 → 실제 손실 표면. 깊은 신경망의 교차 엔트로피는 비볼록이다. 유일한 최적해는 없고, 같은 하강 루프로 찾아낸 “충분히 좋은” 으로 타협한다.

  • 손으로 유도한 기울기 → autograd. 연쇄 법칙은 기계적이다. 현대 ML 프레임워크는 forward 과정에서 계산 그래프를 만들고, 그것을 거꾸로 따라가며 L∇L을 자동으로 뽑아낸다. 우리가 장난감 예제에서 손으로 계산한 미분과 같은 연산, 규모만 다를 뿐이다.

자신 있게 틀리기로 이어지는 다리: 여기서 다룬 제곱 손실은 워밍업이다. 그쪽의 교차 엔트로피 손실도 “기울기 계산 → 한 스텝”이라는 같은 기하를 따른다 — 단지 (y^y)2(\hat{y} − y)² 자리에 logptrue−\log p_true가 들어갈 뿐이다. 같은 하강 알고리즘, 다른 풍경.

# 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의 모든 기계는 이 한 줄에서 변수만 바꿔 끼우면 나온다 — wwηL(w)w ← w − η · L'(w).

exercises · 손으로 풀기
1손실 계산계산기 없이

x=2x = 2, y=6y = 6, w=1w = 1일 때 예측 y^\hat{y}와 손실 L(w)=(y^y)2L(w) = (\hat{y} − y)²를 계산하라.

2기울기 손계산계산기 없이

미분 모듈의 할선-접선 레시피로 L(w)=2x(wxy)L'(w) = 2x(wx − y)를 처음부터 유도하라. 그 다음 (x,y)=(2,6)(x, y) = (2, 6), w=1w = 1에서 값을 계산.

3한 스텝 손계산계산기 없이

w=1w = 1에서 출발, η=0.12η = 0.12, 기울기 16−16일 때 한 스텝 뒤 ww는? 두 스텝 뒤는? 최적해 근처에 빨리 닿을 것이다.

4왜 큰 η가 폭발하는가

이차 손실에서 변위 u=ww_u = w − w\_의 갱신은 u(18η)uu ← (1 − 8η) · u로 쓸 수 있다. η=0.27η = 0.27에서 un|u_n|nn에 대해 지수적으로 발산함을 보여라. 갱신이 경계에 머무는 (진폭 일정, 자라지도 줄지도 않는) ηη는 무엇인가? 그 ηη가 특별한 이유는?

용어집 · 이 페이지에서 쓰임 · 6
loss function·손실 함수
"모델이 틀렸다"를 한 숫자로 바꾸는 함수. 모델의 예측 `ŷ`와 실제 라벨 `y`가 주어졌을 때 손실은 `L(ŷ, y)` — 예측이 가까우면 작고, 멀면 크다. 제곱 오차 `(ŷ − y)²`는 회귀의 표준 선택지: 매끄럽고 미분이 쉽기 때문. 교차 엔트로피는 분류의 표준. 모델 *훈련*은 데이터셋 전체에 대한 손실의 합을 가능한 한 작게 만들도록 매개변수를 바꾸는 일.
derivative·미분
한 점에서의 함수의 _순간_ 변화율 — 두 표본점 사이의 구간이 0으로 줄어들 때 할선 기울기의 극한으로 정의: `f'(a) = lim_{h→0} (f(a+h) − f(a)) / h`. 위치를 미분하면 속도, 속도를 미분하면 가속도, 시간에 대한 질량 미분은 질량 유량. 기하적으로는 접선의 기울기. 대수적으로는 `x²`를 `2x`로, `sin x`를 `cos x`로 바꾸는 연산. 물리·ML·공학에서 *변화율*이라 불리는 거의 모든 양이 무언가의 미분.
learning rate·학습률
경사하강법의 한 걸음 크기: 매 반복에서 매개변수 `w`가 `w ← w − η · ∇L(w)`로 갱신될 때 `η` (에타)가 학습률. 너무 작으면 수렴이 기어가고, 너무 크면 갱신이 최솟값을 지나쳐 발산할 수 있다. "딱 맞는" 범위는 손실의 *곡률*에 의존 — 이차식 손실의 2계 도함수가 `c`이면 안정 수렴의 상한은 `η < 2/c`. 실제 ML 훈련은 _스케줄_ (시간이 흐를수록 `η` 감소)과 _적응형_ (매개변수마다 다른 `η`)를 쓰는데, 둘 다 같은 관찰에서 나왔다 — 하나의 상수로 충분한 경우는 드물다.
convergence·수렴
반복을 더 해도 목적 함수가 의미 있게 변하지 않는 상태. 구체적으로 — 변화량 `|f(xₙ₊₁) − f(xₙ)|`이 어떤 허용오차 아래로 떨어지거나, 그래디언트 크기 `‖∇f‖`가 그 아래로 떨어지거나, 반복 점 `xₙ` 자체가 더는 움직이지 않거나. 수렴은 *정지 조건*이다 — 없으면 최적화기는 영원히 돈다. 그리고 위험이 사는 자리이기도 하다 — 국소 최솟값으로의 수렴과 전역 최솟값으로의 수렴은 똑같이 보인다. 둘 다 "근처에서 더 개선되지 않음"으로 비친다. 최종 답이 _옳은_ 답인지는 문제의 기하 (볼록한가 아닌가), 시작점, 스텝 크기 스케줄, 그리고 운에 달려 있다. *멈췄다*와 *풀렸다*는 다른 두 일이다.
vector·벡터
크기와 방향을 모두 가진 양. 구체적으로는 수의 튜플 — 2D에서 `(3, 4)`, 3D에서 `(1, 0, −2)` — 이지만, 그 수가 *무엇을 의미하는가*는 무엇을 하느냐에 따라 다르다. 그래픽에서는 제어점의 오프셋, 물리에서는 속도나 힘, ML에서는 매개변수 갱신이나 특징 표현. 튜플은 _같다_. *역할*이 다르다. 산술 — 성분별 덧셈, 수로의 스칼라배 — 은 모든 역할에서 _같기_ 때문에, 한 벌의 수학이 모두를 받친다.
local minimum·국소 최솟값
목적 함수가 _근처의 어떤 점보다도 작지 않은_ 지점 — 그러나 어디서든 가장 작다는 보장은 없다. 단일 그릇 모양 (_볼록_ 함수) 의 최솟값은 하나뿐이고, 그것을 찾으면 최적화가 완전히 풀린다. 골짜기가 여럿인 함수는 국소 최솟값도 여럿이고, 한 시작점에서 내려가는 일은 *어느 골짜기에서 시작했는지에 따라 그 골짜기*에 도달한다는 보장만 준다 — 가장 깊은 골짜기 (_전역 최솟값_) 가 거기인 것은 아니다. 실제 최적화 문제 대부분은 비볼록이다 — 신경망 훈련, 제약 있는 포트폴리오 선택, 이차식이 아닌 위치 에너지를 가진 물리 — 그리고 "이게 가장 좋은가?"의 수학은 보통 "근처에서 더 나은 곳이 있는가?"로 축소된다. 정직한 답은 _항상은 아니다_.