STUDY/ML DL

Backpropagation

sed 2026. 5. 24. 20:23
SMALL

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()

 

LIST