검색
← 모듈 로드맵

역전파를 계산 그래프로 손계산하기

강의 · 입문자 · KAITABASE 정리

계산 그래프 · 마디별 기울기 규칙 · 2층 신경망 손계산 · 수치 기울기 점검으로 익히는 역전파

먼저 알아야 할 것

연쇄 법칙 · 편미분다층 퍼셉트론 순전파행렬 곱

다루는 내용

계산을 덧셈 · 곱셈 · ReLU 같은 작은 마디로 쪼개고 연쇄 법칙을 뒤에서부터 적용하는 역전파를 손으로 익힙니다. (x+y)z, 시그모이드 뉴런, 2층 신경망 세 예를 끝까지 계산해 PyTorch 자동 미분과 맞춰 보고, 경사 하강 한 걸음 뒤 손실이 줄어드는 것을 확인합니다. 갈라지는 변수의 기울기 합, 수치 기울기 점검, 자동 미분 사용 시 주의점도 정리합니다.

해설

역전파를 계산 그래프로 손계산하기

신경망 학습은 "손실을 줄이려면 각 가중치를 어느 쪽으로 얼마나 움직여야 하나"를 계산하는 일입니다. 역전파(backpropagation)는 계산을 작은 마디로 쪼갠 계산 그래프 위에서 연쇄 법칙을 뒤에서부터 적용해, 모든 가중치의 기울기를 순전파 한 번 정도의 비용으로 구합니다. 이 수업은 작은 그래프 세 개를 직접 손으로 풀고, PyTorch 자동 미분으로 답을 맞춰 봅니다.

항목내용
참고 자료D2L '순전파 · 역전파 · 계산 그래프' 절 · d2l.ai/chapter_multilayer-perceptrons/backprop.html
트랙 · 수준딥러닝 기초 · 기초
이 수업의 범위계산 그래프, 국소 기울기와 연쇄 법칙, 덧셈 · 곱셈 · 최댓값 마디의 규칙, 갈라지는 변수의 기울기 합, 시그모이드 뉴런 예, 2층 신경망 손계산, 수치 기울기 점검, 자동 미분
먼저 알면 좋은 것편미분과 연쇄 법칙, 다층 퍼셉트론의 순전파

들어가기 전에

한눈에 보기

  • 복잡한 함수를 덧셈 · 곱셈 같은 작은 마디의 그래프로 쪼개는 법을 익힙니다.
  • 각 마디는 "위에서 받은 기울기 × 내 국소 기울기"만 계산하면 된다는 역전파의 핵심을 손으로 확인합니다.
  • 덧셈은 기울기를 그대로 나눠 주고, 곱셈은 서로 바꿔 곱해 주고, ReLU는 문을 여닫는다는 마디별 규칙을 외웁니다.
  • 2층 신경망 하나를 끝까지 손계산하고, 경사 하강 한 걸음 뒤 손실이 줄어드는 것을 봅니다.
  • 수치 기울기로 역전파 구현을 점검하는 방법을 압니다.

1. 계산 그래프와 연쇄 법칙

직관(해설용 비유): 공장 조립 라인을 떠올려 봅시다. 완성품 품질(손실)이 나쁘면, 마지막 공정부터 거꾸로 "이 공정이 결과에 얼마나 영향을 줬나"를 따져 앞 공정에 알려 줍니다. 각 공정은 자기 바로 뒤에서 받은 신호와 자기 공정의 민감도만 알면 됩니다.

계산 그래프(computational graph)는 계산을 마디(연산)와 화살표(값의 흐름)로 그린 것입니다. 예를 들어 f(x,y,z)=(x+y) zf(x, y, z) = (x + y)\,z는 두 마디로 쪼갭니다.

  1. q=x+yq = x + y (덧셈 마디)
  2. f=q⋅zf = q \cdot z (곱셈 마디)

연쇄 법칙(chain rule): ff가 qq를 통해 xx에 의존하면

∂f∂x=∂f∂q⋅∂q∂x\frac{\partial f}{\partial x} = \frac{\partial f}{\partial q}\cdot\frac{\partial q}{\partial x}
기호뜻
∂f∂q\frac{\partial f}{\partial q}위(출력 쪽)에서 내려온 기울기 — "상류 기울기(upstream gradient)"
∂q∂x\frac{\partial q}{\partial x}이 마디의 국소 기울기(local gradient) — 마디 혼자서 계산 가능
둘의 곱아래(입력 쪽)로 내려보낼 기울기

숫자로 해 보기(해설용, PyTorch로 확인): x=−2x = -2, y=5y = 5, z=−4z = -4.

  • 순전파: q=3q = 3, f=3×(−4)=−12f = 3 \times (-4) = -12
  • 역전파 시작: ∂f∂f=1\frac{\partial f}{\partial f} = 1
  • 곱셈 마디: ∂f∂q=z=−4\frac{\partial f}{\partial q} = z = -4, ∂f∂z=q=3\frac{\partial f}{\partial z} = q = 3
  • 덧셈 마디: ∂q∂x=∂q∂y=1\frac{\partial q}{\partial x} = \frac{\partial q}{\partial y} = 1이므로 ∂f∂x=∂f∂y=−4×1=−4\frac{\partial f}{\partial x} = \frac{\partial f}{\partial y} = -4 \times 1 = -4

결과 (∂xf,∂yf,∂zf)=(−4,−4,3)(\partial_x f, \partial_y f, \partial_z f) = (-4, -4, 3)은 자동 미분 결과와 같습니다. 뜻을 읽으면 "zz를 조금 올리면 ff는 3배만큼 오르고, xx를 조금 올리면 4배만큼 내린다"입니다.

mermaid
flowchart LR
  X[x = -2] --> Q((+))
  Y[y = 5] --> Q
  Q -- q = 3 --> M((×))
  Z[z = -4] --> M
  M --> F[f = -12]
  F -. 기울기 1 .-> M
  M -. ∂f/∂q = -4 .-> Q
  M -. ∂f/∂z = 3 .-> Z
  Q -. -4 .-> X
  Q -. -4 .-> Y

2. 마디별 규칙: 외워 두면 편한 네 가지

마디순전파아래로 보내는 기울기 (상류 기울기 gg)기억법
덧셈a+ba + bgg, gg나눠 주기 — 같은 기울기를 양쪽에 그대로
곱셈a⋅ba \cdot bg⋅bg \cdot b, g⋅ag \cdot a바꿔 곱하기 — 상대 값을 곱해 줌
최댓값 · ReLUmax⁡(a,b)\max(a, b)큰 쪽에 gg, 작은 쪽에 0문 여닫기 — 이긴 쪽만 통과
시그모이드s=σ(a)s = \sigma(a)g⋅s(1−s)g \cdot s(1-s)출력값만으로 국소 기울기 계산

갈라지는 변수는 기울기를 더합니다. 한 값이 여러 곳에 쓰이면, 각 경로에서 돌아온 기울기를 모두 더합니다(다변수 연쇄 법칙). 예: g=ab+ag = a b + a에서 a=3a = 3, b=4b = 4이면 ∂g∂a=b+1=5\frac{\partial g}{\partial a} = b + 1 = 5입니다(PyTorch 결과도 5). 신경망에서 한 은닉값이 다음 층의 모든 뉴런에 쓰이므로, 이 "더하기"가 늘 일어납니다.

왜 뒤에서부터 계산하나: 앞에서부터(순방향 모드) 미분하면 입력 변수 하나마다 그래프를 한 번씩 훑어야 합니다. 신경망은 입력 쪽 파라미터가 수백만 개이고 출력(손실)은 숫자 하나뿐이므로, 출력에서 한 번 거꾸로 훑어 모든 파라미터의 기울기를 한꺼번에 얻는 역방향 모드가 압도적으로 쌉니다. 비용은 순전파의 작은 상수배 정도입니다.

3. 시그모이드 뉴런 하나

설정(해설용): f=σ(w0x0+w1x1+w2)f = \sigma(w_0 x_0 + w_1 x_1 + w_2), w=(2,−3,−3)w = (2, -3, -3), x=(−1,−2)x = (-1, -2).

순전파

  • z=2×(−1)+(−3)×(−2)+(−3)=−2+6−3=1z = 2 \times (-1) + (-3) \times (-2) + (-3) = -2 + 6 - 3 = 1
  • f=σ(1)≈0.7311f = \sigma(1) \approx 0.7311

역전파

  1. 시그모이드 마디: ∂f∂z=f(1−f)=0.7311×0.2689≈0.1966\frac{\partial f}{\partial z} = f(1 - f) = 0.7311 \times 0.2689 \approx 0.1966
  2. 덧셈 마디: w0x0w_0x_0, w1x1w_1x_1, w2w_2 모두 0.1966을 받습니다. 따라서 ∂f∂w2=0.1966\frac{\partial f}{\partial w_2} = 0.1966.
  3. 곱셈 마디 w0x0w_0 x_0: ∂f∂w0=0.1966×x0=−0.1966\frac{\partial f}{\partial w_0} = 0.1966 \times x_0 = -0.1966, ∂f∂x0=0.1966×w0=0.3932\frac{\partial f}{\partial x_0} = 0.1966 \times w_0 = 0.3932
  4. 곱셈 마디 w1x1w_1 x_1: ∂f∂w1=0.1966×(−2)=−0.3932\frac{\partial f}{\partial w_1} = 0.1966 \times (-2) = -0.3932, ∂f∂x1=0.1966×(−3)=−0.5898\frac{\partial f}{\partial x_1} = 0.1966 \times (-3) = -0.5898

PyTorch로 계산한 값과 소수 넷째 자리까지 같습니다. 마디를 얼마나 크게 묶을지는 자유입니다. 시그모이드 안의 지수 · 덧셈 · 나눗셈을 낱낱이 풀어도 되지만, 국소 기울기 s(1−s)s(1-s)를 아는 덩어리로 묶으면 계산이 짧아집니다.

4. 2층 신경망 끝까지 손계산하기

설정(해설용 숫자):

  • 입력 x=(1,2)\mathbf{x} = (1, 2), 정답 t=2t = 2
  • 1층: W(1)=(10.5−10.25)W^{(1)} = \begin{pmatrix} 1 & 0.5 \\ -1 & 0.25 \end{pmatrix}, b(1)=(0,0)\mathbf{b}^{(1)} = (0, 0), ReLU
  • 2층: w(2)=(0.5,−1)\mathbf{w}^{(2)} = (0.5, -1), b(2)=0b^{(2)} = 0
  • 손실: L=12(y−t)2L = \frac{1}{2}(y - t)^2

순전파

단계계산값
z=W(1)x+b(1)\mathbf{z} = W^{(1)}\mathbf{x} + \mathbf{b}^{(1)}(1+1,  −1+0.5)(1 + 1, \; -1 + 0.5)(2,−0.5)(2, -0.5)
h=ReLU(z)\mathbf{h} = \mathrm{ReLU}(\mathbf{z})(2,0)(2, 0)
y=w(2)⋅h+b(2)y = \mathbf{w}^{(2)}\cdot\mathbf{h} + b^{(2)}0.5×2+(−1)×00.5 \times 2 + (-1) \times 011
LL12(1−2)2\frac{1}{2}(1 - 2)^20.50.5

역전파

단계규칙값
∂L∂y\frac{\partial L}{\partial y}y−ty - t−1-1
∂L∂w(2)\frac{\partial L}{\partial \mathbf{w}^{(2)}}곱셈: ∂L∂y h\frac{\partial L}{\partial y}\,\mathbf{h}(−2,0)(-2, 0)
∂L∂b(2)\frac{\partial L}{\partial b^{(2)}}덧셈: 그대로−1-1
∂L∂h\frac{\partial L}{\partial \mathbf{h}}곱셈: ∂L∂y w(2)\frac{\partial L}{\partial y}\,\mathbf{w}^{(2)}(−0.5,1)(-0.5, 1)
∂L∂z\frac{\partial L}{\partial \mathbf{z}}ReLU 문: z>0z > 0인 칸만 통과(−0.5,0)(-0.5, 0)
∂L∂W(1)\frac{\partial L}{\partial W^{(1)}}바깥곱 ∂L∂z x⊤\frac{\partial L}{\partial \mathbf{z}}\,\mathbf{x}^\top(−0.5−100)\begin{pmatrix} -0.5 & -1 \\ 0 & 0 \end{pmatrix}
∂L∂b(1)\frac{\partial L}{\partial \mathbf{b}^{(1)}}덧셈: 그대로(−0.5,0)(-0.5, 0)
∂L∂x\frac{\partial L}{\partial \mathbf{x}}W(1)⊤∂L∂z{W^{(1)}}^\top \frac{\partial L}{\partial \mathbf{z}}(−0.5,−0.25)(-0.5, -0.25)

이 표의 모든 값은 PyTorch loss.backward() 결과와 같습니다.

읽을 것

  • 두 번째 은닉 뉴런은 z2=−0.5<0z_2 = -0.5 < 0이라 ReLU 문이 닫혀, 그 뉴런으로 들어가는 가중치(둘째 행)의 기울기가 모두 0입니다. 이 예제에서는 그 뉴런이 배우지 않습니다.
  • 행렬 꼴로 쓰면 층 하나의 역전파는 세 줄입니다. δ=∂L∂z\delta = \frac{\partial L}{\partial \mathbf{z}}일 때 ∂L∂W=δ x⊤\frac{\partial L}{\partial W} = \delta\,\mathbf{x}^\top, ∂L∂b=δ\frac{\partial L}{\partial \mathbf{b}} = \delta, ∂L∂x=W⊤δ\frac{\partial L}{\partial \mathbf{x}} = W^\top \delta. 배치라면 예제별 값을 더하거나 평균 냅니다.

한 걸음 내려가 보기

학습률 η=0.1\eta = 0.1로 모든 파라미터를 θ←θ−η ∂L∂θ\theta \leftarrow \theta - \eta\,\frac{\partial L}{\partial \theta}만큼 고칩니다.

  • W(1)W^{(1)} 첫 행 (1,0.5)→(1.05,0.6)(1, 0.5) \to (1.05, 0.6), b1(1):0→0.05b^{(1)}_1: 0 \to 0.05
  • w(2):(0.5,−1)→(0.7,−1)\mathbf{w}^{(2)}: (0.5, -1) \to (0.7, -1), b(2):0→0.1b^{(2)}: 0 \to 0.1
  • 새 순전파: z1=1.05+1.2+0.05=2.3z_1 = 1.05 + 1.2 + 0.05 = 2.3, y=0.7×2.3+0.1=1.71y = 0.7 \times 2.3 + 0.1 = 1.71
  • 새 손실: 12(1.71−2)2≈0.042\frac{1}{2}(1.71 - 2)^2 \approx 0.042 — 0.5에서 크게 줄었습니다.

5. 수치 기울기로 점검하기

직관: 기울기의 정의 그대로, 가중치를 아주 조금 올려 보고 내려 보며 손실 변화를 재면 역전파 없이도 기울기를 근사할 수 있습니다. 느리지만 틀리기 어렵기 때문에 역전파 구현을 검사하는 데 씁니다.

∂L∂θ≈L(θ+ϵ)−L(θ−ϵ)2ϵ\frac{\partial L}{\partial \theta} \approx \frac{L(\theta + \epsilon) - L(\theta - \epsilon)}{2\epsilon}
기호뜻
ϵ\epsilon아주 작은 값(예: 10−410^{-4} ~ 10−610^{-6})
양쪽 차분(central difference)한쪽 차분 L(θ+ϵ)−L(θ)ϵ\frac{L(\theta+\epsilon) - L(\theta)}{\epsilon}보다 오차가 작음

숫자로 해 보기: 4절의 W11(1)W^{(1)}_{11}에 대해 ϵ=10−4\epsilon = 10^{-4}로 재면(배정밀도) −0.5000-0.5000이 나와 역전파 값 −0.5-0.5와 같습니다.

쓰는 법

  1. 역전파 기울기 gag_a와 수치 기울기 gng_n을 몇 개 파라미터에서 비교합니다.
  2. 상대 오차 ∣ga−gn∣max⁡(∣ga∣,∣gn∣)\frac{|g_a - g_n|}{\max(|g_a|, |g_n|)}를 봅니다. 배정밀도에서 아주 작아야(대략 10−710^{-7} 이하) 정상이라고 보는 경우가 많습니다(경험칙).
  3. ReLU의 꺾인 점(0) 근처에서는 차분이 꺾임을 넘어가 값이 어긋날 수 있으니 주의합니다.
  4. 실험은 float64로, 드롭아웃처럼 무작위가 섞인 층은 끄고 합니다.

6. 자동 미분: 실제로는 누가 계산하나

PyTorch · JAX 같은 프레임워크는 순전파하는 동안 계산 그래프를 기록했다가, loss.backward()를 부르면 이 수업의 규칙대로 역방향 모드 자동 미분을 실행합니다. 우리가 할 일은 순전파 코드만 쓰는 것입니다.

python
import torch
x  = torch.tensor([1., 2.])
W1 = torch.tensor([[1., 0.5], [-1., 0.25]], requires_grad=True)
w2 = torch.tensor([0.5, -1.], requires_grad=True)
y  = w2 @ torch.relu(W1 @ x)
loss = 0.5 * (y - 2) ** 2
loss.backward()
print(W1.grad)   # tensor([[-0.5, -1.0], [0., 0.]])

주의할 점

  • PyTorch는 .grad에 기울기를 누적합니다. 학습 반복마다 optimizer.zero_grad()로 비워야 합니다.
  • 역전파는 순전파의 중간값(z\mathbf{z}, h\mathbf{h} 등)을 다시 씁니다. 그래서 학습할 때 메모리가 추론보다 훨씬 많이 듭니다.
  • 기울기가 층을 지나며 곱해지므로 깊어질수록 작아지거나 커질 수 있습니다. 이 문제는 초기화 · 정규화 · 규제에서 다룹니다.

연습 문제

1. f=(a⋅b)+cf = (a \cdot b) + c, a=2a = 2, b=−3b = -3, c=4c = 4에서 세 기울기는?

풀이: f=−2f = -2. 덧셈 마디가 1을 그대로 나눠 주므로 ∂cf=1\partial_c f = 1, 곱셈 마디가 바꿔 곱해 ∂af=b=−3\partial_a f = b = -3, ∂bf=a=2\partial_b f = a = 2입니다.

2. f=max⁡(x,y)f = \max(x, y), x=3x = 3, y=7y = 7이고 상류 기울기가 2일 때 xx, yy의 기울기는?

풀이: 큰 쪽 yy에 2, xx에 0입니다.

3. 4절 예에서 정답이 t=1t = 1이었다면 ∂L∂w(2)\frac{\partial L}{\partial \mathbf{w}^{(2)}}는?

풀이: y=1y = 1이므로 ∂L∂y=0\frac{\partial L}{\partial y} = 0, 모든 기울기가 0입니다. 이미 정답을 맞혀 고칠 것이 없습니다.

4. g=x2g = x^2을 계산 그래프 g=x⋅xg = x \cdot x로 보고, x=3x = 3에서 갈라지는 변수 규칙으로 기울기를 구하세요.

풀이: 곱셈 마디의 두 입력이 모두 xx이므로 두 경로의 기울기 xx와 xx를 더해 2x=62x = 6입니다. 미분 공식 2x2x와 같습니다.

스스로 점검

  1. 역전파에서 각 마디가 알아야 하는 것은 무엇인가요?
    • 답: 위에서 받은 상류 기울기와 자기 연산의 국소 기울기뿐입니다. 둘을 곱해 입력 쪽으로 보냅니다.
  2. ReLU의 입력이 음수였던 뉴런의 가중치 기울기는 왜 0인가요?
    • 답: ReLU의 국소 기울기가 음수 구간에서 0이라 상류 기울기가 그 뉴런을 통과하지 못하기 때문입니다.
  3. 역전파 구현이 맞는지 어떻게 확인하나요?
    • 답: 양쪽 차분으로 구한 수치 기울기와 몇 개 파라미터에서 비교해 상대 오차가 충분히 작은지 봅니다.

용어 정리

용어쉬운 뜻
역전파(backpropagation)출력 쪽에서 입력 쪽으로 연쇄 법칙을 적용해 기울기를 구하는 방법
계산 그래프(computational graph)계산을 연산 마디와 값의 흐름으로 그린 그림
국소 기울기(local gradient)마디 하나의 출력이 그 입력에 대해 갖는 미분
상류 기울기(upstream gradient)출력 쪽에서 이 마디로 내려온 손실의 기울기
연쇄 법칙(chain rule)합성 함수의 미분은 단계별 미분의 곱
수치 기울기(numerical gradient)값을 조금 바꿔 손실 변화로 근사한 기울기
자동 미분(automatic differentiation)프로그램이 계산 그래프를 기록해 기울기를 자동으로 구하는 기술
역방향 모드(reverse mode)출력 하나에서 모든 입력의 기울기를 한 번에 구하는 자동 미분 방식

더 깊이 보려면

D2L의 '순전파 · 역전파 · 계산 그래프' 절은 정규화 항이 있는 1은닉층 MLP의 그래프를 그려 같은 과정을 행렬 꼴로 유도하고, 학습 중 중간값을 저장해야 하는 메모리 비용까지 설명합니다. 원조 논문의 생각은 오차 역전파로 표현 학습하기에서 봅니다.

다음에 볼 것

라이선스

이 글은 원문 번역이 아니라 KAITABASE가 직접 쓴 해설입니다. 1절 (x+y)z(x+y)z와 3절 시그모이드 뉴런의 숫자는 CS231n 역전파 노트(MIT 라이선스)의 예와 같은 값을 빌려 썼고, 4절 2층 신경망 숫자는 설명용으로 새로 만든 것입니다(모든 값은 PyTorch 2.14 자동 미분으로 다시 계산해 확인). 참고 자료 D2L은 CC BY-SA 4.0입니다.

출처

AI 원리부터 이해하기 · 딥러닝 기초 모듈

딥러닝 기초 모듈 학습

이 글은 딥러닝 기초 모듈의 학습 자료입니다. 전체 29개 자료 중 3번째입니다.

AI 기초 과정은 현재 진도 저장을 지원하지 않습니다.

출처·원문

원문 보기

요약만

본문 자체 작성 · 참고 자료 D2L(CC BY-SA 4.0)