역전파(Backpropagation): AI가 에러의 '범인'을 색출하는 법 (feat. 연쇄 법칙)

1. 도입: 범인은 이 안에 있다



지난 글에서 우리는 미분이 "설정값(파라미터)을 어느 방향으로 돌려야 에러가 줄어드는지 알려주는 나침반"이라는 것을 알았습니다.

하지만 딥러닝에는 치명적인 문제가 하나 있습니다. 바로 모델이 너무 깊다(Deep)는 것입니다.

입력층에서 출력층까지 거쳐가는 레이어만 수십, 수백 개입니다.

상황: 출력층에서 "야! 결과가 정답이랑 10이나 차이 나잖아!"라고 에러(Loss)가 터졌습니다.

문제: 도대체 누구 잘못입니까?

입력층 근처에 있는 파라미터가 잘못해서 나비효과가 일어난 건지, 아니면 출력층 바로 앞의 파라미터가 막판에 트롤링을 한 건지 알 수가 없습니다.

이때 딥러닝은 아주 교묘한 방법으로 범인을 찾아냅니다. 바로 "내 바로 뒤에 있는 놈 탓하기(Chain Rule)" 기술입니다.

2. 연쇄 법칙(Chain Rule): "책임 전가"의 수학적 정의

수학 교과서에서는 연쇄 법칙을 이렇게 씁니다.

$$\frac{dz}{dx} = \frac{dz}{dy} \cdot \frac{dy}{dx}$$

개발자인 우리 눈에는 이게 그냥 수학 공식처럼 보이지만, 조직 관리 관점에서 보면 이건 "책임의 분배"입니다.

상상을 해봅시다. A팀장(입력) -> B부장(은닉) -> C이사(출력) 결재 라인이 있습니다.

  1. C이사(출력층)가 프로젝트를 망쳤습니다(Error 발생).
  2. C이사는 자기가 전적으로 책임지기 싫으니까 분석을 합니다. "B부장이 준 보고서가 엉망이라 내 결과도 엉망이 된 거야." ($\frac{dz}{dy}$: 내 결과가 B 때문에 얼마나 망가졌는가)
  3. B부장은 억울합니다. "아니, A팀장이 기초 데이터를 이상하게 줬으니까 내 보고서도 이상해진 거잖아요!" ($\frac{dy}{dx}$: 내 결과가 A 때문에 얼마나 망가졌는가)

결국 A팀장이 전체 프로젝트(z)에 끼친 악영향($\frac{dz}{dx}$)은, (C가 B 탓한 양) $\times$ (B가 A 탓한 양)으로 계산할 수 있습니다.

이것이 바로 미분의 연쇄 법칙(Chain Rule)입니다. 멀리 떨어져 있는 원인(A)과 결과(z)의 관계를, 중간 단계들의 곱셈으로 연결해버리는 것이죠.

3. 역전파(Backpropagation): 거꾸로 타오르는 디버깅



이 "책임 전가" 프로세스를 시스템 전체로 확장한 것이 역전파입니다.

  1. Forward (순전파): 데이터를 넣어서 결과를 뽑습니다. (일단 일을 저지름)
  2. Loss Calculation: 정답과 비교해서 얼마나 틀렸는지 계산합니다. (사고 터짐)
  3. Backward (역전파): 출력층에서부터 입력층 방향으로 거슬러 올라가며 "너 때문에 에러가 이만큼 났어"라고 갈굼(?)을 시전합니다.

개발자로 치면, 스택 트레이스(Stack Trace)를 맨 밑바닥부터 거꾸로 읽어 올라가며 버그의 원인(Root Cause)을 찾는 과정과 완벽하게 동일합니다.

맨 끝 단의 에러 메시지(Loss)를 보고, 그 함수를 호출한 놈, 또 그 놈을 호출한 놈... 이렇게 거슬러 올라가며 git blame을 찍어보는 것이죠.

4. 파이토치(PyTorch)의 Autograd: 자동화된 감사팀

우리가 numpy로 딥러닝을 짤 때 제일 고통스러운 게 이 미분 식을 손으로 유도해서 코드로 짜는 것입니다. (행렬 미분하다가 탈모 옵니다.)

파이토치가 위대한 이유는 이 복잡한 '책임 전가' 과정을 Computational Graph(연산 그래프)라는 지도로 그려놓고 자동으로 처리해주기 때문입니다.

  • 여러분이 loss.backward()를 호출하는 순간,
  • 파이토치의 Autograd 엔진(감사팀)이 출동합니다.
  • 그래프의 가장 끝에서부터 시작해서 모든 노드를 거꾸로 방문하며, 연쇄 법칙(곱셈)을 수행합니다.
  • 그리고 각 파라미터(Weight)들에게 "너의 책임 지분(Gradient)은 0.003이다"라고 딱지를 붙여줍니다.

우리는 그저 딱지 붙은 만큼만 값을 수정(optimizer.step())하면 되는 것이죠.

5. 마무리: 하지만 책임이 사라진다면? (Vanishing Gradient)

이 완벽해 보이는 시스템에도 치명적인 약점이 있습니다.

책임을 전가하고 전가하다가(곱하고 곱하다가), 층이 너무 깊어지면 책임이 0이 되어버리는 현상이 발생합니다.

"내 탓 아니야" $\times$ 0.1 $\times$ 0.1 $\times$ 0.1 ... 을 계속하다 보면 앞단에 있는 레이어에는 "고칠 게 없다(Gradient = 0)"는 잘못된 신호가 전달되기도 합니다.

이것이 그 유명한 기울기 소실(Vanishing Gradient) 문제입니다. 딥러닝의 겨울을 불러왔던 이 문제를 현대의 AI는 어떻게 해결했을까요? (힌트: ReLUResNet

image of backpropagation