기울기 소실(Vanishing Gradient): 딥러닝이 '단기 기억상실증'에 걸린 이유
1. 도입: "사장님, 목소리가 안 들려요!"
지난 시간, 우리는 역전파(Backpropagation)를 통해 출력층의 에러(Loss)를 입력층까지 전달하며 학습한다는 것을 알았습니다. 이론상으로는 레이어가 깊을수록(Deep) 더 복잡한 문제를 잘 풀어야 합니다.
그런데 2000년대 초반까지 딥러닝은 암흑기였습니다. 레이어를 10층, 20층 쌓았더니 오히려 성능이 떨어지거나 학습이 아예 안 되는 현상이 발생했기 때문입니다.
마치 이런 상황입니다.
- CEO(출력층): "야! 제품 퀄리티가 왜 이래! (Loss 발생)"라고 고함을 칩니다.
- 임원 → 부장 → 과장...: 이 갈굼이 밑으로 내려가면서 전달되어야 하는데,
- 신입사원(입력층): "...? 위에서 무슨 말 했나요? 전 아무 말도 못 들었는데요?"
가장 중요한 기초 공사를 담당하는 앞단(입력층)의 파라미터들이 수정되지 않는 현상. 이것이 바로 기울기 소실(Vanishing Gradient) 문제입니다.
2. 원인 분석: 범인은 'Sigmoid'와 '곱셈'의 합작품
왜 신호가 사라질까요? 범인은 우리가 지난 수십 년간 딥러닝의 표준이라고 믿었던 활성 함수(Activation Function)인 시그모이드(Sigmoid), 그리고 연쇄 법칙(Chain Rule)의 필연적인 수학적 특성 때문입니다.
(1) Sigmoid의 배신: "너무 꽉 막힌 필터"
초기 딥러닝 연구자들은 시그모이드를 사랑했습니다. $0$과 $1$ 사이의 값만 내뱉는 게 마치 뉴런의 발화 확률 같았거든요. 하지만 개발자 관점에서 시그모이드는 "입력값을 뭉개버리는 압축기"입니다.
- 문제점 1: 기울기 상한선 (Max Gradient = 0.25)
- 시그모이드 함수 그래프를 미분해 보면 충격적인 사실을 알게 됩니다.
- 미분값의 최댓값이 고작 0.25입니다. (그것도 $x=0$일 때만)
- 입력값($x$)이 조금만 크거나 작아지면 기울기는 거의 0에 수렴합니다.
- 비유하자면, 마이크 볼륨을 최대로 줄여놓은 상태입니다. 아무리 소리쳐도 전달되는 건 속삭임뿐이죠.
(2) 연쇄 법칙의 비극: "0.25의 N제곱"
딥러닝 학습의 핵심은 가중치 = 가중치 - (학습률 * 기울기) 입니다. 기울기가 있어야 가중치가 변합니다.
그런데 역전파는 출력층부터 입력층까지 미분값들을 계속 곱해오는 과정입니다.
레이어가 30개라고 가정해 봅시다. 아무리 운이 좋아서 매번 최댓값(0.25)이 나온다고 해도 결과는 처참합니다.
$$0.25 \times 0.25 \times \dots \times 0.25 \, (30번) \approx 0.0000000000000000008$$
- 결과: 입력층 근처의 기울기는 컴퓨터가 표현할 수 있는 한계보다 작아져서 그냥 0(Underflow)이 되어버립니다.
- 현상: 앞단 레이어(Layer 1, 2...)의 가중치 업데이트 식은
w = w - 0이 됩니다. 즉, 학습이 멈춥니다. - 개발자스럽게 말하면, "패킷 손실률(Packet Loss)이 99.99%인 네트워크"와 같습니다. 뒤에서 아무리 에러 로그를 보내도 앞단 서버에는 도달하지 않는 상황이죠.
3. 해결책 1: ReLU - "아날로그를 버리고 디지털로 간다"
이 문제를 해결한 영웅은 복잡한 수학이 아니라, 너무나 단순한 코드 한 줄, ReLU(Rectified Linear Unit)였습니다.
제프리 힌튼 교수팀이 이걸 들고나왔을 때 다들 "이렇게 단순한 게 된다고?" 하고 놀랐습니다.
(1) 미분값의 혁명: "1 아니면 0"
ReLU의 코드는 다음과 같습니다.
Python
def relu(x):
return max(0, x)
이 함수의 미분(기울기)은 아주 명쾌합니다.
- $x > 0$ (활성화): 기울기는 1입니다.
- $x \le 0$ (비활성화): 기울기는 0입니다.
이게 왜 중요할까요? 양수 구간에서는 값을 아무리 곱해도 작아지지 않습니다.
$$1 \times 1 \times 1 \times \dots \times 1 = 1$$
시그모이드가 0.25씩 깎아먹던 신호를, ReLU는 손실 없이(Lossless) 그대로 통과시킵니다. CEO의 고함소리가 100층 밑의 신입사원에게까지 생생하게(Gradient = 1) 전달되는 것입니다.
(2) 성능 최적화: exp() vs if
개발자 관점에서 또 다른 장점이 있습니다. 시그모이드는 exp(x) 같은 지수 연산을 씁니다. 이거 CPU/GPU 입장에서 꽤 비싼 연산입니다. 반면 ReLU는 단순한 비교 연산(if x > 0)입니다. 연산 속도가 비교할 수 없을 만큼 빠릅니다.
(3) 주의점: Dying ReLU
물론 단점도 있습니다. 입력이 음수면 기울기가 0이 되어 아예 죽어버리는(Dying ReLU) 현상이 생깁니다. (한번 0이 되면 영원히 깨어나지 못하는 뉴런). 이를 해결하기 위해 음수일 때도 아주 살짝 기울기를 주는 Leaky ReLU 같은 변종들도 등장했죠.
4. 해결책 2: ResNet(잔차 연결) - "전용 핫라인 개설"
ReLU 덕분에 20~30층까진 쌓을 수 있게 되었습니다. 하지만 인간의 욕심은 끝이 없어서 100층, 1000층을 쌓고 싶어 했습니다. 그러자 다시 학습이 안 되기 시작했죠. 이때 등장한 구세주가 ResNet(Residual Network)입니다.
(1) 아이디어: "변화량만 배워라"
기존 신경망은 입력 $x$를 받아서 $H(x)$라는 '전체 출력'을 만들어내려 끙끙댔습니다.
ResNet의 핵심 아이디어인 Skip Connection(지름길)은 식을 살짝 비틉니다.
$$Output = F(x) + x$$
이게 무슨 뜻일까요?
- 모델($F(x)$)에게 "모든 걸 새로 만들라"고 시키는 게 아닙니다.
- "원본($x$)은 내가 옆으로 따로 챙겨줄 테니까, 너는 원본에서 '수정이 필요한 차이(Residual)'만큼만 계산해!"라고 짐을 덜어주는 것입니다.
(2) 역전파 고속도로 (Gradient Superhighway)
개발자 입장에서 더 중요한 건 역전파 때 벌어지는 일입니다.
미분 과정에서 덧셈($+$)은 아주 나이스한 성질을 가집니다. 미분하면 분배가 되죠.
$$\frac{\partial Output}{\partial x} = \frac{\partial F(x)}{\partial x} + 1$$
저 뒤에 붙은 $+ 1$이 보이시나요? 이게 핵심입니다.
설령 복잡한 레이어 $F(x)$를 거치다가 기울기가 0이 되어 사라지더라도, 최소한 '1'만큼의 기울기는 보존되어서 앞단으로 전달됩니다.
- 기존: 길이 막히면(Gradient Vanishing) 끝.
- ResNet: 국도가 막히면 옆에 뚫어놓은 직통 고속도로(Shortcut)를 타고 기울기가 입력층까지 쏜살같이 달려갑니다.
이 구조 덕분에 우리는 레이어를 152층(ResNet-152) 아니 1000층까지 쌓아도 학습이 가능한 시대를 맞이하게 되었습니다.
5. 결론: 딥러닝의 겨울을 끝낸 '엔지니어링의 승리'
기울기 소실 문제는 이론적인 한계처럼 보였습니다. 하지만 해결책을 뜯어보니 거창한 새로운 수학 공식을 만든 게 아니었습니다.

- ReLU: 복잡한 연산 버리고, 단순하게(Linear) 가자.
- ResNet: 막히면 돌아갈 길(Shortcut)을 뚫어주자.
어찌 보면 지극히 엔지니어링적인 접근으로 해결한 셈입니다.
오늘날 우리가 사용하는 Transformer(GPT), CNN 등 모든 최신 아키텍처는 이 두 가지(ReLU 계열 함수 + Skip Connection)가 기본 소양으로 깔려 있습니다.
이제 여러분은 파이토치 모델을 설계할 때 forward 함수 안에 return x + layer(x) 같은 코드를 보게 된다면, 이렇게 생각하시면 됩니다.
"아, 기울기가 소실되지 않도록 안전바(Shortcut)를 설치했구나. 이제 마음 놓고 레이어를 깊게 쌓아도 되겠네!"
댓글이 없습니다.