yg log --graph --oneline --all

Home Stack Notes AboutRSS

3. CNN 4강 - 신경망과 역전파

작성 · 4분 읽기 · 조회수 —

CNN 기초 · 3 / 5

들어가며

이번 강의는 체감상 지금까지 중 가장 어려웠다. 역전파(Backpropagation)라는 개념이 등장하는데, “gradient를 역방향으로 전파한다”는 말은 알겠는데 왜 그래야 하는지, 실제로 어떻게 계산되는지가 처음에 도무지 와닿지 않았다.

처음엔 그냥 미분 한 번 하면 되는 거 아닌가 하고 가볍게 봤는데, 막상 들여다보니 왜 역방향으로 가야 하는지, 왜 중간값을 저장해야 하는지를 이해하는 게 전부였다. 인터넷을 찾아보니 나만 어려운 게 아니라 대부분의 입문자가 여기서 벽을 만난다고 한다.

역전파의 본질은 “Loss에서 시작해, 각 가중치가 Loss에 얼마나 기여했는지를 chain rule로 역추적하는 것”이다.


Gradient Descent 복습

본격적으로 역전파에 들어가기 전에, 학습이 어떻게 진행되는지부터 짚고 간다.

가장 예측을 잘하는 W를 구하기 위해 경사 하강법(Gradient Descent)을 사용한다. learning rate(step size)에 따라 가중치가 얼마나 많이 업데이트될지 결정되고, mini-batch를 통해 전체 데이터셋을 나눠서 스텝으로 업데이트한다.

요소 역할
learning rate (step size) 가중치를 한 번에 얼마나 업데이트할지 결정
mini-batch 전체 데이터셋을 나눠 스텝 단위로 업데이트
learning rate scheduling 스텝 크기를 단계적으로 조절해 더 효과적으로 Loss를 낮춤

Neural Network 구조

수식으로 본 신경망

신경망은 수식으로 이렇게 표현된다:

\[f = Wx,\ x \in \mathbb{R}^{D},\ W_{1} \in \mathbb{R}^{H \times D},\ W_{2}\in \mathbb{R}^{C \times H}\] \[f_{2} = W_{2}max(0,W_{1}x)\] \[f_{3} = W_{3}max(0, f_{2})\]

입력값 x와 출력값 f의 벡터 크기는 가중치의 벡터 사이즈로 결정된다.

ReLU와 비선형성이 핵심인 이유

여기서 max(0, x)가 ReLU 활성화 함수인데, 이걸 넣는 이유가 핵심이다.

비선형성을 보장해서 모델을 심층으로 만들 수 있고, 더 복잡하고 세밀한 분류/추론이 가능해지기 때문이다.

만약 활성화 함수 없이 선형 변환만 여러 번 쌓으면, 결국 하나의 선형 변환과 같아서 의미가 없다.


활성화 함수 종류

대표적인 활성화 함수들

함수 특징
ReLU 가장 많이 쓰임. 미분이 쉽고 gradient vanishing이 없음
Leaky ReLU 음수 영역에서도 작은 기울기 유지
Sigmoid 출력이 0~1, 하지만 깊은 네트워크에서 문제 있음
Tanh 출력이 -1~1
ELU 음수 영역에서 완만한 곡선
GELU 트랜스포머에서 많이 쓰임

Gradient Vanishing이 생기는 이유

sigmoid와 Tanh는 출력값이 -1~1 범위이고 기울기도 0~1 사이라서, 레이어를 거듭할수록 기울기가 계속 곱해지면서 0에 수렴한다. 이게 바로 Gradient Vanishing 문제다.

ReLU는 양수 영역에서 기울기가 항상 1이라서 이 문제가 없다.


규제항과 뉴런 개수

규제항(L1, L2 regularization)으로 일반화 성능을 높이고, 뉴런의 개수는… 솔직히 정답이 없다. 유사 사례를 참고하고 실험으로 알아보는 수밖에 없다.

이 부분이 딥러닝에서 가장 “경험적”인 영역인 것 같다.


Back Propagation과 Chain Rule

이번 강의의 핵심이다.

Loss에 대한 가중치 기울기

전체 네트워크에 대해 Loss값의 편미분:

\[\frac{\partial L}{\partial f}\]

우리가 알고 싶은 건 “Loss에 대한 가중치 W의 기울기”인데, W가 여러 레이어를 거쳐서 Loss로 가니까 바로 미분할 수가 없다. 그래서 Chain Rule을 써서 단계별로 미분한다:

\[\frac{\partial L}{\partial W} = \frac{\partial f}{\partial W} \cdot \frac{\partial L}{\partial f}\]

구체적인 함수에 적용

$f(W,X) = \frac{1}{1+e^{-(W \cdot X)}}$ 일 때, 또한 손실함수가 softmax Loss일 때:

\[L_{i} = -log\left(\frac{e^{f}}{\sum\limits_{all}e^{f}}\right)\]

각각의 항 $\frac{\partial f}{\partial W}$, $\frac{\partial L}{\partial f}$는 각각의 수식을 편미분해서 구할 수 있다.

매번 손으로 미분하나?

처음에 이걸 보고 “이걸 매번 손으로 미분하나?” 싶었는데, 그렇지 않다.

PyTorch 같은 라이브러리가 sigmoid, ReLU 같은 함수를 다 미분해주는 클래스를 갖고 있다. Autograd라는 기능이 이 역전파 계산을 자동으로 해준다.


Jacobian 행렬

야코비안이 의미하는 것

입력 벡터 x가 신경망 f를 통과해서 y로 출력될 때, $x \in \mathbb{R}^{N},\ y \in \mathbb{R}^{M}$ 에 대한 야코비안 행렬:

\[\frac{\partial y}{\partial x} \in \mathbb{R}^{N \times M}\]

이 행렬은 입력 벡터의 각 원소가 미소 변화할 때 출력 벡터가 얼마나 변하는지를 나타낸다.

왜 직접 계산하지 않는가

하지만 $N \times M$ 크기의 행렬을 매 레이어마다 계산하는 건 비용이 엄청나다. 그래서 실제로는 가중치 행렬 $W_{N \times M}$의 편미분 값을 이용해서 훨씬 효율적으로 계산한다.


헷갈리기 쉬운 포인트

인터넷에서 역전파 관련 질문을 찾아보면 정말 많은 사람들이 같은 곳에서 막힌다.

1. “Chain Rule은 아는데, 왜 역방향으로 가야 하나?”

순전파에서는 입력 → 출력 방향으로 값을 계산하지만, 우리가 알고 싶은 건 “Loss에 대한 각 레이어 가중치의 기울기”다. Loss는 맨 끝에 있으니까, 거기서부터 역방향으로 chain rule을 적용하는 게 자연스럽다. 순방향으로 하면 모든 경로를 다 탐색해야 해서 비효율적이다.

방향 무엇을 계산 효율
순전파 (forward) 입력 → 출력 값 예측에 필요
역전파 (backward) Loss → 각 가중치 기울기 맨 끝(Loss)에서 시작해 역추적, 효율적

2. “중간값을 왜 저장해야 하나?”

역전파에서 chain rule을 적용하려면 순전파에서 계산한 중간값(각 레이어의 출력)이 필요하다. 그래서 역전파는 순전파보다 메모리를 훨씬 많이 쓴다.

GPU 메모리가 부족한 이유 중 하나가 바로 이것이다.

3. “Gradient Vanishing은 왜 깊은 네트워크에서만 문제인가?”

sigmoid의 최대 기울기가 0.25다. 레이어가 10개면 $0.25^{10} \approx 0.000001$로 기울기가 사실상 사라진다. 레이어가 2~3개일 때는 괜찮은데, 깊어질수록 곱셈이 누적되면서 문제가 된다. ReLU가 이걸 해결한 이유는 양수 영역에서 기울기가 1이라서 아무리 곱해도 줄어들지 않기 때문이다.

4. “역전파를 이해하려면 어떤 수학이 필요한가?”

최소한 편미분, chain rule, 행렬 곱셈은 알아야 한다. 고등학교 수학만으로 충분하다 — 아니다. 고등학교 수학만으로는 좀 어렵고, 대학 미적분과 선형대수 기초가 필요하다.


정리하며

역전파의 핵심은 결국 이 한 줄로 정리된다.

“Loss에서 시작해서, chain rule로 각 가중치가 Loss에 얼마나 기여했는지를 역방향으로 계산한다.”

수식이 복잡해 보이지만, 개념적으로는 “책임 추적”에 가깝다. 다음 강의에서는 이 개념을 이미지에 특화시킨 합성곱 신경망(CNN)의 구조를 배운다.