Backpropagation 이해하기
딥러닝에서 모델은 예측을 하고, 예측이 얼마나 틀렸는지 loss로 계산한다.
이후 loss가 줄어드는 방향으로 weight를 조금씩 수정한다.
이때 필요한 것이 gradient이다.
gradient = loss를 현재 weight에 대해 미분한 값
즉, 어떤 weight를 바꾸면 loss가 얼마나 변하는 지를 나타내는 값이다.
gradient desecnt에서는 아래와 같이 weight를 업데이트한다.
new weight = current weight - learning rate * gradient
Backpropagation이란?
백프로파게이션, 즉 연전파는 loss에서부터 거꾸로 이동하면서 각 weight의 gradient를 계산하는 방법이다.
신경망 계산은 입력에서 출력 방향으로 진행되며, 이 과정을 forward propagation이라고 한다.
이러한 순전파를 반대로 계산하는 것이 역전파이다.
propagation : input -> hidden layer -> ouptut -> loss
backpropagation : loss -> output -> hidden layer -> input
핵심은 합성함수를 미분할 때 사용하는 chain rule이다.
$ y = (x + 1)^2 $ 라는 함수가 있을 때, 이를 두 단계로 나눌 수 있다.
$ u = x + 1 $ , $ y = u^2 $
즉, 흐름은 x -> u -> y 이며, 이때 y를 x에 대해 미분하려면 다음과 같이 계산한다.
$ dy / dx = dy / du * du / dx $
각 단계의 미분을 구한 뒤 곱해주는 것이다.
신경망에서도 마찬가지이다. 신경망은 여러 계산이 이어진 합성함수이기 때문에, 각 단계의 미분을 뒤에서부터 곱해가며 gradient를 구한다.
신경망에서 체인룰
신경망: x → z1 → a1 → z2 → a2 → loss
위와 같은 신경망이 있을 때, 이에 대한 의미는 다음과 같다.
z1: 첫 번째 layer에서 weight와 bias를 계산한 값
a1: z1이 activation function을 통과한 값
z2: 두 번째 layer에서 weight와 bias를 계산한 값
a2: z2가 activation function을 통과한 값
두번째 layer의 weight를 W2라고 하면, W2는 loss와 비교적 가까이에 있다.
W2 → z2 → a2 → loss
따라서 W2에 대한 gradient는 다음 흐름으로 구한다.
∂L/∂W2 = ∂L/∂a2 × ∂a2/∂z2 × ∂z2/∂W2
반면 첫번째 레이어의 weight인 W1은 더 앞쪽에 있다.
W1 → z1 → a1 → z2 → a2 → loss
그래서 W1에 대한 gradient는 더 긴 경로에 따라 계산된다.
∂L/∂W1
= ∂L/∂a2
× ∂a2/∂z2
× ∂z2/∂a1
× ∂a1/∂z1
× ∂z1/∂W1
W1이 바뀌면 z1이 바뀐다.
z1이 바뀌면 a1이 바뀐다.
a1이 바뀌면 z2가 바뀐다.
z2가 바뀌면 a2가 바뀐다.
a2가 바뀌면 최종적으로 loss가 바뀐다.
즉, 앞쪽 layer의 weight일수록 loss까지 가는 길이가 길기 때문에 더 많은 미분값을 곱해야 한다.
hidden node 하나가 output node 두 개 이상 연결되어 있다면, 그 경로 또한 그 수만큼이 된다.
따라서 각 경로를 통해 전달되는 gradient를 모두 더해야 한다.
딥러닝 학습 흐름
1. Forward propagation
입력을 넣어 예측값과 loss를 계산한다.
2. Backpropagation
loss에서부터 거꾸로 각 weight의 gradient를 계산한다.
3. Weight update
gradient를 이용해 weight를 수정한다.
이렇게 학습이 되는데, PyTorch에서는 이 과정을 직접 미분하지 않아도 된다.
loss.backward()
이 코드를 실행하면 파이토치가 자동으로 역전파를 수행해 각 weight의 gradient를 계산한다.
이후 optimizer가 gradient를 이용해 weight를 업데이트한다.
optimizer.step()
'STUDY > ML DL' 카테고리의 다른 글
| MLP를 행렬로 표현하기: 왜 비선형 Activation이 필요할까? (0) | 2026.05.11 |
|---|---|
| Training, Validation, Test 데이터와 K-Fold Cross Validation (0) | 2026.05.09 |
| NumPy : reshape, transpose, squeeze, newaxis (0) | 2026.05.09 |
| NumPy 기초 함수 정리: 수학 연산, 통계, axis (0) | 2026.05.08 |
| numpy : 배열 인덱싱과 슬라이싱, boolean 인덱싱 (0) | 2026.05.08 |