연쇄법칙으로 이해하는 역전파: 출력 기울기가 앞 층 가중치로 돌아오는 방식 | DAKER 커뮤니티

딥러닝 코드를 읽다 보면 loss.backward()는 너무 익숙해서 오히려 내부를 놓치기 쉽습니다. 하지만 학습이 왜 되는지, 어디서 막히는지, 왜 어떤 모델은 깊어질수록 불안정해지는지를 이해하려면 이 한 줄이 실제로 무엇을 하는지 다시 붙잡아 볼 필요가 있습니다.

핵심은 복잡하지 않습니다. 순전파가 값을 앞에서 뒤로 보낸다면, 역전파는 기울기를 뒤에서 앞으로 보냅니다. 그리고 그 흐름을 가능하게 하는 규칙이 연쇄법칙입니다.

연쇄법칙이 출력 기울기를 앞 층 가중치로 흘려보내고, backward는 그 흘림을 실행합니다.

역전파와 연쇄법칙 썸네일

연쇄법칙은 기울기를 곱으로 이어 붙입니다

간단한 경로를 보면 흐름이 선명해집니다. x → z = Wx → y = σ(z) → L(y, t)에서 손실 L이 y에 대해 얼마나 민감한지 알면, 여기에 y가 z에 대해 얼마나 민감한지를 곱해 ∂L/∂z를 얻습니다. 다시 z가 W에 대해 얼마나 민감한지를 곱하면 ∂L/∂W가 나옵니다.

일변수로 쓰면 dL/dW = (dL/dy)·(dy/dz)·(dz/dW)입니다. 다변수와 텐서에서는 야코비안이 등장하지만, 직관은 같습니다. 손실에 가까운 쪽에서 내려온 기울기에 현재 연산의 국소 기울기를 곱해 아래쪽으로 전달하는 구조입니다.

이 규칙은 계산 그래프 전체에 그대로 적용됩니다. 덧셈 노드는 기울기를 양쪽으로 그대로 복제해 보내고, 곱셈 노드는 상대쪽 값으로 스케일합니다. 대부분의 층은 이 국소 규칙의 조합으로 해석할 수 있습니다.

역전파는 전체 공식을 한 번에 푸는 과정이 아니라, 각 연산의 국소 미분을 그래프를 따라 이어 붙이는 과정입니다.

자동미분은 이 규칙을 계산 그래프에 적용합니다

프레임워크의 자동미분은 연쇄법칙을 기계적으로 적용합니다. 순전파 때 중간 값을 저장해 두고, 역전파 때 그 값을 다시 사용합니다. 그래서 학습에서는 메모리 사용량이 커집니다.

체크포인팅은 이 저장 비용을 줄이기 위한 타협입니다. 일부 중간 값을 버리고, 역전파 시점에 필요한 부분을 다시 계산합니다. 바뀌는 것은 수학이 아니라 저장과 재계산의 방식입니다.

한 층은 자기 국소 미분만 알면 됩니다

선형층 z = Wx에서는 입력 x 쪽으로 가는 기울기가 Wᵀ를 곱하는 형태로 나타납니다. 반대로 W 쪽으로 가는 기울기는 입력 x와 위쪽에서 내려온 기울기의 외적 또는 행렬곱 형태로 쌓입니다.

활성화 함수도 마찬가지입니다. ReLU는 순전파에서 양수였던 자리는 기울기를 통과시키고, 0이었던 자리는 막습니다. 시그모이드는 σ(z)·(1−σ(z))를 곱합니다. 끝이 포화되면 이 값이 작아져 앞 층으로 가는 신호가 약해집니다.

이처럼 각 층이 자기 국소 규칙만 정확히 제공하면 전체 학습에 연결됩니다. 새 층을 만들 때도 backward만 올바르게 정의하면 됩니다. 커스텀 CUDA 커널을 짤 때도 결국은 순전파 식과 그에 대응하는 국소 역전파 식을 짝으로 두게 됩니다.

순전파와 역전파에서 기울기가 흐르는 장면 다이어그램

기울기 소실과 폭주는 왜 생길까요

연쇄법칙은 곱셈입니다. 1보다 작은 수를 여러 번 곱하면 값은 빠르게 작아지고, 1보다 큰 스케일이 반복되면 값은 커집니다. 깊은 네트워크에서 시그모이드나 탄에이치가 겹치면 기울기 소실이 생기고, 반대로 큰 스케일이 누적되면 폭주가 나타납니다.

잔차 연결은 항등 경로를 남겨 기울기가 더 쉽게 흐르도록 돕습니다. 정규화는 스케일을 안정화하고, 초기화는 시작 시점의 분산을 맞춰 곱셈이 한쪽으로 치우치지 않게 합니다. 기울기 클리핑은 폭주가 보일 때 이동량을 제한하는 응급 장치로 쓸 수 있습니다.

소실과 폭주는 연쇄법칙이 틀려서가 아니라, 곱셈이 반복되며 스케일이 무너질 때 나타나는 현상입니다.

로그에 층별 기울기 노름을 남기면 어디서 신호가 죽는지 파악하기 좋습니다. 앞 층만 죽고 뒤 층만 살아 있으면 소실 패턴일 가능성이 크고, 모든 층이 동시에 폭발하면 학습률이나 손실 스케일을 먼저 의심해 볼 수 있습니다.

backward를 디버깅할 때 먼저 볼 것들

먼저 손실이 스칼라인지 확인하는 것이 좋습니다. 벡터 손실을 그대로 backward하면 의도하지 않은 합이나 평균이 섞일 수 있습니다. 다음으로 requires_grad 경로가 끊기지 않았는지 봐야 합니다. 잘못된 detach, 넘파이 변환, 정수 캐스팅은 그래프를 끊습니다.

동결된 파라미터는 의도적인 차단이지만, 실수로 헤더만 학습하거나 반대로 전부 학습하는 경우도 여기서 드러납니다. 작은 네트워크에서 수치미분과 자동미분을 비교하는 기울기 검사는 여전히 유효합니다. 특히 커스텀 연산, 복잡한 마스킹, 혼합 정밀도에서는 더 유용합니다.

혼합 정밀도는 낮은 비트를 써서 빠른 행렬곱을 수행하지만, 손실 스케일링으로 작은 기울기가 사라지지 않게 보호합니다. 여기서도 바뀌는 것은 연쇄법칙이 아니라 수치 표현입니다.

어텐션과 정규화도 같은 그림 안에 있습니다

어텐션은 소프트맥스와 가중합이 들어간 계산 그래프입니다. 역전파는 그 그래프를 따라 기울기를 Q, K, V와 입력으로 나눠 보냅니다. 레이어 정규화는 평균과 분산 통계를 사용하므로, 그 통계에 대한 미분까지 포함해 기울기가 흐릅니다.

복잡해 보이는 모듈도 원리는 같습니다. 순전파 식을 보고, 어디에 비선형이 있는지 확인하고, 기울기가 어떤 경로로 분기하는지 스케치하면 읽기가 빨라집니다.

정지 기울기(stop gradient) 연산은 특정 경로의 역전파를 의도적으로 막습니다. BYOL, 모멘텀 인코더, 일부 GAN 설계에서 선생님 쪽을 고정할 때 이런 선택이 등장합니다. 이는 연쇄법칙을 부정하는 것이 아니라, 어느 경로를 학습에 포함할지 정하는 설계입니다.

계산 그래프를 손으로 그려 보면 이해가 빨라집니다

입력을 왼쪽에 두고 오른쪽으로 연산 상자를 놓은 뒤, 각 상자마다 순전파 식과 국소 역전파 규칙을 한 줄씩 적어 보면 됩니다. 예를 들어 곱셈 상자 a*b는 순전파가 ab이고, a로 가는 기울기는 위 기울기×b, b로 가는 기울기는 위 기울기×a입니다. 덧셈은 위 기울기를 양쪽에 그대로 복제합니다.

다중 경로가 합쳐지는 지점에서는 기울기가 더해집니다. 잔차 연결 y = x + F(x)에서 x로 가는 기울기는 위 기울기와 F 경로를 통해 돌아온 기울기의 합입니다. 항등 항이 있기 때문에 위 기울기가 최소한 그대로 전달됩니다.

skip connection은 값의 지름길이면서 동시에 기울기의 고속도로입니다.

순전파에서 저장한 값이 역전파의 연료가 됩니다

많은 국소 미분은 순전파 때의 값을 필요로 합니다. ReLU는 어느 자리가 양수였는지 알아야 하고, 곱셈은 상대 피연산자 값이 필요하며, 배치 정규화는 배치 통계를 사용합니다. 그래서 학습 모드에서는 중간 활성화를 메모리에 남깁니다.

추론만 할 때는 이런 저장이 필요 없어 메모리 사용량이 줄어듭니다. OOM이 학습에서만 난다면 배치 크기, 시퀀스 길이, 체크포인팅, 활성화 저장 비용을 먼저 의심하게 되는 이유도 여기에 있습니다.

재계산과 저장의 균형은 하드웨어 예산의 문제입니다. 수학적 기울기 자체는 같습니다. 큰 모델을 파인튜닝할 때 그레이디언트 체크포인팅을 켜는 결정은 역전파를 포기하는 것이 아니라, 같은 연쇄법칙을 다른 비용 구조로 실행하는 선택입니다.

이 시리즈를 한 줄로 잇는 관점

벡터와 행렬이 값을 옮기고, 활성화가 그 흐름을 꺾어 표현력을 만들고, 손실이 틀린 확신을 벌하며, 기울기가 내려갈 방향을 가리키고, 역전파가 그 방향을 모든 가중치에 배분합니다. 이 글은 그중에서도 마지막 장면, 즉 기울기가 어떻게 돌아오는지를 붙잡습니다.

새 모델을 가져와도 질문은 크게 달라지지 않습니다. 어떤 텐서가 어떤 연산으로 흐르는지, 손실이 무엇을 벌주는지, 기울기가 어디로 돌아오는지를 보면 됩니다. 역전파는 그 질문들을 하나의 계산 그래프로 묶어 주는 공통 언어입니다.

이 글이 다루는 범위

이 글은 자동미분 엔진 구현 튜토리얼은 아닙니다. 또한 모든 층의 야코비안 유도서를 대신하지도 않습니다. 여기서 다룬 것은 빌더가 학습을 해석할 때 필요한 핵심 장면, 즉 연쇄법칙이 출력 기울기를 앞 층 가중치로 어떻게 흘려보내는가입니다.

여러분은 loss.backward()를 볼 때 어떤 지점에서 가장 자주 막히는지 궁금합니다.