Backpropagation

햄스터·2024년 12월 14일

FOML

목록 보기
6/12

Backpropagation을 배울 때에는 기호에 압도되지 않으면 할 만 합니다.

알고 들어가면 좋을 것 중 두 개가 있습니다.

σ(x)=(1σ(x))σ(x)\sigma'(x) = (1-\sigma(x))\sigma(x)

입니다.
또,

f(x,y)=xy+x2f(x,y) = xy + x^2

같이 computational graph를 그릴 때 하나의 변수가 두번 등장하는 경우,

역전파를 통해 gradient를 계산하면
제일 위쪽 xx가 받는 gradient는 2x입니다.
제일 아래 xx가 받는 gradient는 y이구요.

이 경우에는, 그냥 xx가 받는 gradient를 2x+y로 계산하면 됩니다.

Terminology

입력은 x1...xdx_1 ... x_d로 표현합니다.
그 입력들에 대한 선형합은 z1=i=1dwixi+bz_1 = \sum_{i=1}^dw_ix_i + b로 표현합니다.

거기에 sigmoid까지 적용하면 aa라고 칭합니다. a1=a(z1)a_1 = a(z_1)이 성립하겠죠.


여러 node로 확장을 합니다.

하나의 neuron을 보면 3가지 값이 보이는데,
z12z_1^22번째 layer1번째 node선형합이 됩니다.
b12b_1^22번째 layer1번째 nodeBias이구요.
a12a_1^22번째 layer1번째 nodeActivation function까지 적용한 출력치입니다.

w112w_{11}^2node12node_1^2로 향하는 이전 layer의 1번째 node에서 온 weight다
이렇게 이해하면 되겠습니다.

w132w_{13}^2node12node_1^2로 향하는 이전 layer의 3번째 node에서 온 weight다, 이렇게 되겠구요.

이것만 이해하면 Terminology는 어렵지 않습니다.

Forward Computation을 할 때 Matrix Representation으로도 나타낼 수 있습니다.
2번째 layer의 선형합 결과인 z12z^2_1w212,w222,...w_{21}^2, w_{22}^2, ...와 각 입력 layer들의 선형합에 bias를 더한것으로 표현되죠.

마지막으로 나온 출력층의 결과와 정답의 결과를 비교하여,
Loss Function을 정의할 수 있습니다.

지금은 그냥 MSE로 정의한 것 같네요.
Cross-Entropy같은 방식으로 정의할 수도 있습니다.

만약 Li(w)=12k=1m(oiktik)2\mathcal{L}_i(w) = \frac{1}{2}\sum_{k=1}^m(o_{ik}-t_{ik})^2,
L(w)=i=1nLi(w)\mathcal{L}(w) = \sum_{i=1}^n \mathcal{L}_i(w)로 정의한다면,

L\mathcal{L}을 학습가능한 모든 가중치로 미분합니다.
가령 Lw112\frac{\partial \mathcal{L}}{\partial w_{11}^2}를 구한다면, 그건 다른 표현으로 Δw112\Delta w_{11}^2가 되고,
그 값에 learning rate η\eta를 곱해서 가중치를 업데이트 해주겠죠.

물론 layer가 커질수록 이 과정이 엄청 복잡해지는데,
(식이 많이 쌓이기 때문이에요)
이걸 Computational Graph로 극복할 수 있습니다.


다음과 같은 식에서, 우리가 궁극적으로 찾고자 하는 건,
w...w...b...b...들의 기울기를 계산하는게 목표입니다.
Lw...\frac{\partial \mathcal{L}}{\partial w...}Lb...\frac{\partial \mathcal{L}}{\partial b...}를 다 찾는게 목표인거죠.

bbww에 대한 미분값을 알기 위해서는 자연스럽게
zzaa도 전부 기용하게 됩니다.

우리가 아는건, zz가 앞쪽 layer의 수많은 aa들과 자신으로 향하는 수많은 ww의 선형합, 거기에 bias까지 더해서 만들어진 것을 알고 있습니다.

z13=z^3_1 = 선형합 + b13b_1^3이죠?
그러면 gradient를 역 분배 해줄 때,

x+y=kx+y=k면, kk의 gradient가 5일 때, Backward propagation에서
xxyy에 gradient가 얼마씩 들어갔죠? 5씩 들어갔습니다!

따라서 Lz13\frac{\partial \mathcal{L}}{\partial z_{1}^3} = Lb13\frac{\partial \mathcal{L}}{\partial b_{1}^3}이 되는거죠.

w133w_{13}^3 입장에서 볼까요?
z13z_1^3은 선형합 + 선형합 + w133a32w^3_{13}a^2_3입니다.
gradient를 분배해주면, 결국
Lw133=Lz13×z13w133\frac{\partial \mathcal{L}}{\partial w_{13}^3} = \frac{\partial \mathcal{L}}{\partial z_{1}^3} \times\frac{\partial \mathcal{z^3_1}}{\partial w_{13}^3}이 되는데,
앞의 gradient는 알고 있고, 뒤의 gradient는 결국 a32a_3^2와 같죠.

결국 포인트는, Lzjl\frac{\partial \mathcal{L}}{\partial z_{j}^l}만 알면 나머지 bias나 weight는 너무 쉽게 구해진다는 것입니다.
선형합이거든요.

그리고 그 매우 중요한 Lzjl\frac{\partial \mathcal{L}}{\partial z_{j}^l}를, 특별한 이름으로 δjl\delta_j^l로 부르겠습니다.

a13a_1^3σ(z13)\sigma(z^3_1)이고,
우리가 구하고 싶은 δ13\delta_1^3Lz13\frac{\partial \mathcal{L}}{\partial z_{1}^3}이고, 그 값은 La13a13z13\frac{\partial \mathcal{L}}{\partial a_{1}^3}\frac{\partial a_1^3}{\partial z_{1}^3}과 같습니다.

이제 Weight에 대한 gradient를 구할 수 있습니다.
앞서 아는 내용이 Lz13\frac{\partial \mathcal{L}}{\partial z_1^3}이었으니, 그 값을 이용해 Chain Rule을 적용하면
앞의 중요한 δ\deltaa12a_1^2와의 곱으로 나타난다~를 알 수 있습니다.

또 강조됐죠. 결국은 δjl\delta_j^l이 중요합니다.

이 내용이죠.

weight는 구했는데, 그럼 bias의 미분값은요?

더 쉽죠.
z=z =선형합 + bb 잖아요?
Lz\frac{\partial \mathcal{L}}{\partial z}의 값 (δ\delta)가 그대로 분배됩니다.

자, 이제는 aa에 대한 gradient를 구해봅시다.
여기서 보이듯, a12a_1^2는 총 2개의 zz에 영향을 미치고 있습니다.
backward로 계산되는 gradient도 2개가 오겠죠?

선형합 + a12w213=z23a_1^2w_{21}^3 = z_2^3이고, 선형합 + a12w113=z13a_1^2w_{11}^3 = z_1^3입니다.

결국 a12a_1^2가 감당할 gradient는 δ23w213+δ13w113\delta_2^3w_{21}^3 +\delta_1^3w_{11}^3이 되겠네요.

굳이 \sum으로 표현하면 j=12wj13δj3\sum_{j=1}^2w_{j1}^3\delta_j^3으로 표현됩니다.

아 또 나왔죠. 결국은 δ\delta가 또 또 중요합니다.

무한히 복잡해보이는데, 그냥 matrix representation으로 일반화를 했을 뿐입니다.
그냥 aa의 gradient는 (a\nabla a) zz에 대한 aa의 gradient ×\times LL에 대한 zz의 gradient (δ\delta)의 합으로 표현된다,
근데 zz에 대한 aa의 gradient가 해당 zz로 향하는 ww니까,
w11l×δ1l+w21l×δ2l+...w_{11}^l \times \delta_1^l + w_{21}^l \times \delta_2^l + ... = a1l1\nabla a_1^{l-1}이라고 생각하면 되겠습니다.

어렵진 않아요!

조금 더 simple한 예시를 봅시다.

hidden층 딱 하나, 출력층 딱 하나로 구성되어 있다고 합시다.
원래 wjikw_{ji}^k로 표시되던건 k번째 layer의 j번째 node로 향하던 i번째 node로부터의 weight인데,
이젠 그런 몇번째 layer를 구분할 필요가 없으니,
wjikw_{ji}^kwjiw_{ji}로 단순화됩니다.

hjh_j는 hidden의 j번째 node의 output인데요,
sigmoid인 11+ex\frac{1}{1+e^{-x}}를 activation function 삼아서,
거기에 input으로 wj0+wj1x1+wj2x2+...+wjdxdw_{j0} + w_{j1}x_1 + w_{j2}x_2 + ... + w_{jd}x_d를 넣어준 것이죠.

oko_k는 output의 k번째 node의 output이고,
sigmoid를 activation function으로 삼아서,
그 input으로 wk0+wk1h1+wk2h2+..+wkphpw_{k0} + w_{k1}h_1 + w_{k2}h_2 + .. + w_{kp}h_p를 넣은거구요.

그리고 그걸 쭉~~ 써서, Loss를 MSE 방식으로 표현한게 밑의 Ln(w)\mathcal{L}_n(w) 식입니다.

쉽죠?
식에 압도당할 필요는 없습니다.

근데 아무튼 우리는 Loss Function을 미분...을..해야하는데
솔직히 저 복잡한 식을 미분하고 싶지는 않잖아요?
Chain Rule을 사용할 수 있습니다.

wkjw_{kj}의 gradient를 구해봅시다.
wk1h1+wk2h2+....+wkphp=netkw_{k1}h_1 + w_{k2}h_2 + .... + w_{kp}h_p = net_k로 정의합니다.
netknet_kkk node가 받는 입력값이 되겠죠.

그러면 oko_ksigmoid(ok)sigmoid(o_k)가 되구요,
Ln(w)=12k=1m(tkok)2\mathcal{L}_n(w) = \frac{1}{2}\sum_{k=1}^m(t_k-o_k)^2로 정의합니다.

한번만 back propagation을 해봅시다.

netknet_kwkjw_{kj}로 미분하면 붙어있는 hjh_j만 튀어나오겠죠.
앞에 붙은 gradient들은요?

Lok\frac{\partial \mathcal{L}}{\partial o_k}는 loss function을 output으로 미분하는 것이니까,
평범한 합성함수 미분과 같죠. (tkok)-(t_k - o_k)가 나옵니다.

oknetk\frac{\partial {o_k}}{\partial net_k}ok=sigmoid(netk)o_k = sigmoid(net_k)임을 이용하면, sigmoid 함수 미분이 됩니다.
앞에서 했었죠!

이 값은 sigmoid(netk)(1sigmoid(netk))sigmoid(net_k)(1-sigmoid(net_k))이며, sigmoid(netk)=oksigmoid(net_k) = o_k니까,
ok(1ok)o_k(1-o_k)가 되겠네요.

결국 구하고자 하는 Lnwkj=(tkok)ok(1ok)hj\frac{\partial \mathcal{L}_n}{\partial w_{kj}} = -(t_k-o_k)o_k(1-o_k)h_j가 됩니다!

input과 hidden 사이의 wjiw_{ji}의 gradient를 구하려고 해도, 똑같습니다.
Chain rule만 조금 추가될 뿐입니다.

차근차근히 직접 해보면, 어렵지 않아요.

무식하게 식을 다 외우는 것보다는,
결국은 Loss를 hkh_k에 대해 미분하고,
hk=σ(netk)h_k = \sigma(net_k)임을 이용해서 netknet_k의 gradient도 구하고,
netknet_k의 gradient를 이용해서 ww들의 gradient도 구하고,
ww들의 gradient를 이용해서 hh들의 gradient도 구하고,
그걸 다시 이용하고,,,

그냥 이걸 해주면 됩니다.

profile
햄스터가 세상을 지배한다.

0개의 댓글