본문 바로가기
C.W.K.
Stream
Lesson 01 of 10 · published

Autograd가 실제로 하는 일

~12 min · autograd, graph, backward

Level 0텐서 탐구자
0 XP0/62 lessons0/13 achievements
0/120 XP to next level120 XP to go0% complete

즉시 실행되는 Python에서 쓰는 역방향 자동 미분

Autograd는 PyTorch의 자동 미분 엔진이야. 하는 일은 분명해. 손실 같은 스칼라를 계산하면, 그 값을 만든 연산을 거꾸로 따라가며 기울기 추적을 요청한 모든 리프 텐서에 기울기를 누적해.

여기서 핵심은 역방향 자동 미분이야. 순방향 자동 미분은 입력이 적고 출력이 많을 때 유리하지만, 역방향 자동 미분은 입력이 많고 출력이 하나일 때 유리해. 매개변수는 1억 개여도 손실은 스칼라 하나인 딥러닝 문제에 역방향 방식이 잘 맞는 이유지.

'동적 그래프'로 얻는 것

PyTorch는 그래프를 미리 고정하지 않고 순전파할 때마다 새로 만들어. 덕분에 다음이 가능해:

  • forward() 안에서 if/else, while, for 같은 Python 제어 흐름을 쓸 수 있어. 그래프에는 해당 입력이 실제로 거친 경로만 반영돼.
  • print, breakpoint, pdb로 디버깅할 수 있어. 순전파가 그대로 Python 코드니까.
  • 별도로 유지를 요청하지 않으면 역전파 뒤에 그래프를 버려. 그래서 메모리 사용량이 끝없이 늘지 않아.

물론 비용도 있어. 동적 그래프는 미리 최적화할 기회가 적어서 정적 그래프보다 구성 비용이 조금 더 들어. 뒤에서 배울 torch.compile()은 동적 실행의 사용성을 유지하면서 정적 그래프의 속도를 끌어내지만, autograd 자체는 여전히 동적으로 작동해.

Code

최소 autograd 반복문·python
import torch

# A tracked scalar
x = torch.tensor(3.0, requires_grad=True)

# Forward — y depends on x
y = x ** 2 + 2 * x + 1   # y = 16 at x=3

# Backward — compute dy/dx
y.backward()

# Result lands on x.grad
# dy/dx = 2x + 2 = 2*3 + 2 = 8
print(x.grad)            # tensor(8.)
동적 그래프: 순전파 안의 Python 제어 흐름·python
import torch

def f(x, branch):
    if branch == "polynomial":
        return x ** 3 - x
    else:
        return torch.sin(x) * x

# Same code path adapts based on Python data
x = torch.tensor(2.0, requires_grad=True)
y = f(x, "polynomial")
y.backward()
print(x.grad)            # 3*x^2 - 1 = 11

x.grad = None
y = f(x, "trig")
y.backward()
# d/dx (sin(x)*x) = cos(x)*x + sin(x)  ≈ -0.832 + 0.909 = 0.077
print(x.grad)
매개변수 많고 스칼라 하나: 딥러닝 모양·python
import torch

# A toy 'model': linear + bias
W = torch.randn(3, 2, requires_grad=True)
b = torch.randn(2, requires_grad=True)
x = torch.randn(4, 3)             # batch=4, features=3
y_true = torch.randn(4, 2)

# Forward
y_pred = x @ W + b                # (4, 2)
loss = ((y_pred - y_true) ** 2).mean()

# One backward call → gradients on every leaf
loss.backward()
print(W.grad.shape)    # torch.Size([3, 2])
print(b.grad.shape)    # torch.Size([2])

External links

Exercise

손으로 미분할 수 있는 함수 f(x)를 하나 골라 봐. x**3 + 2*sin(x)로 시작해도 좋아. x 값 세 개에서 autograd로 기울기를 계산하고 손으로 구한 도함수와 비교해. 부호를 빠뜨리기 쉬우니 결과가 다르면 그 부분부터 확인해 봐.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.