참고자료
- 역전파(Backpropagation) 알고리즘은 한마디로 말하면, 손실함수(Loss function)의 극소값을 만드는 매개 변수의 값을 찾기 위해 경사 하강법(gradient descent)을 이용하는데, 경사 하강법을 하려면 손실 함수를 매개 변수들에 대해 미분(편미분)을 해야 한다. 인공 신경망(Neural network)에서 이러한 미분의 계산량을 줄여주고 효율적으로 계산할 수 있도록 만들어 주는 것이 바로 역전파 알고리즘이다.
1. 인공 신경망의 이해(Neural Network Overview)
우선 예제를 위해 사용될 인공 신경망을 소개한다. 역전파의 이해를 위해서 여기서 사용할 인공 신경망은 입력층(Input layer), 은닉층(Hiddel layer), 출력층(Output layer) 이렇게 3개의 층을 가진다. 또한 해당 인공 신경망(예제에서 사용될 neural network)은 두 개의 입력과, 두 개의 은닉층 뉴런, 두 개의 출력층 뉴런을 사용한다. 은닉층과 출력층의 모든 뉴런은 활성화 함수로 시그모이드(Sigmoid) 함수를 사용한다.
위의 그림은 여기서 사용할 인공 신경망의 모습을 보여준다. 은닉층과 출력층의 모든 뉴런에서 변수 z가 존재하는데 여기서 변수 z는 이전층의 모든 입력이 각각의 가중치와 곱해진 값들이 모두 더해진 가중합을 의미한다. 이 값은 뉴런에서 아직 시그모이드 함수를 거치지 않은 상태이다. 즉, 활성화 함수의 입력을 의미한다. z 우측의 ∣를 지나서 존재하는 변수 h또는 o는 z가 시그모이드 함수를 지난 후의 값으로 각 뉴런의 출력값을 의미한다. 이번 역전파 예제에서는 인공 신경망에 존재하는 모든 가중치 에 w대해서 역전파를 통해 업데이트하는 것을 목표로한다. 해당 인공 신경망은 편향(bias) b는 고려하지 않는다.
역전파 알고리즘은 순전파와 역전파를 번갈아 가면서 수행하면서 가중치 w를 업데이트 한다.
2. 순전파(Forward propagation)
주어진 값이 위의 그림과 같을 때 순전파를 진행해본다. 위의 그림에서 소수점 앞의 0은 생략하였다. 예를 들어 .25는 0.25를 의미한다. 파란색 숫자는 입력값을 의미하며, 빨간색 숫자는 각 가중치의 값을 의미한다. 앞으로 진행하는 계산의 결과값은 소수점 아래 여덟번째 자리까지 반올림하여 표기한다.
각 입력은 입력층에서 은닉층 방향으로 향하면서 각 입력에 해당하는 가중치와 곱해지고, 결과적으로 가중합으로 계산되어 은닉층 뉴런의 시그모이드 함수의 입력값이 된다. z1과 z2는 시그모이드 함수의 입력으로 사용되는 각각의 값에 해당된다.
z1=w1x1+w2x2=0.3×0.1+0.25×0.2=0.08
z2=w3x1+w4x2=0.4×0.1+0.35×0.2=0.11
z1과 z2는 각각의 은닉층 뉴런에서 시그모이드 함수를 지나게 되는데 시그모이드 함수가 리턴하는 결과값은 은닉층 뉴런의 최종 출력값이다.식에서는 각각 h1과 h2에 해당되며, 아래의 결과와 같다.
h1=sigmoid(z1)=1+e−z11=0.51998934
h2=sigmoid(z2)=1+e−z21=0.52747230
h1과 h2 이 두 값은 다시 출력층의 뉴런으로 향하게 되는데 이때 다시 각각의 값에 해당되는 가중치와 곱해지고, 다시 가중합 되어 출력층 뉴런의 시그모이드 함수의 입력값이 된다. 식에서는 각각 z3과 z4에 해당된다.
z3=w5h1+w6h2=0.45×h1+0.4×h2=0.44498412
z4=w7h1+w8h2=0.7×h1+0.6×h2=0.68047592
z3과 z4가 출력층 뉴런에서 시그모이드 함수를 지난 값은 이 인공 신경망이 최종적으로 계산한 출력값이다.(o1, o2) 제값을 예측하기 위한 값으로서 예측값이라고도 부른다.
o1=sigmoid(z3)=1+e−z31=0.60944600
o2=sigmoid(z4)=1+e−z41=0.66384491
이제 해야할 일은 예측값과 실제값의 오차를 계산하기 위한 오차 함수를 선택하는 것이다. 오차(Error)를 계산하기 위한 손실 함수(Loss function)로는 평균 제곱 오차 MSE를 사용한다. 식에서는 실제값을 target이라고 표현하였으며, 순전파를 통해 나온 예측값을 output으로 표현하였다. 그리고 각 오차를 모두 더하면 전체 오차 Etotal이 된다.
Eo1=21(targeto1−outputo1)2=0.02193381
Eo2=21(targeto2−outputo2)2=0.00203809
Etotal=Eo1+Eo2=0.02397190
3. 역전파 1단계(Backpropagation Step 1)
순전파가 입력층에서 출력층으로 향한다면 역전파는 반대로 출력층에서 입력층 방향으로 계산하면서 가중치를 업데이트해간다. 출력층 바로 이전의 은닉층을 N층이라고 하였을 때, 출력층과 N층 사이의 가중치를 업데이트하는 단계를 역전파 1단계, 그리고 N층과 N층의 이전층 사이의 가중치를 업데이트 하는 단계를 역전파 2단계라고 하고 진행하기로 한다.
역전파 1단계에서 업데이트 해야 할 가중치는 w5,w6,w7,w8총 4개이다. 각 가중치 업데이트는 경사 하강법(Gradient descent)을 사용하는데(경사하강법보다 Adam과 같이 더 나은 알고리즘이 있지만 기본이 경사 하강법에서 출발하므로 본 설명에서는 경사 하강법을 이용하기로 한다.) 먼저 w5를 경사 하강법을 이용해서 업데이트 하기 위해서 ∂w5∂Etotal을 계산한다.
3.1 ∂w5∂Etotal의 계산
∂w5∂Etotal을 계산하기 위해서 미분의 연쇄 법칙(Chain rule)을 이용하여 다음과 같이 풀어 쓸 수 있다.
∂w5∂Etotal=∂o1∂Etotal×∂z3∂o1×∂w5∂z3
Etotal=21(targeto1−outputo1)2+21(targeto2−outputo2)2 이므로,
∂o1∂Etotal=−(targeto1−outputo1)=−(0.4−0.60944600)=0.209446
∂z3∂o1=o1×(1−o1)=0.60944600×(1−0.60944600)=0.23802157
(sigmoid 함수의 미분은 1−e−x를 g(x)로 두고, dxdf(g(x))=dg(x)df(g(x))⋅dxdf(g(x))를 전개하면 f(x)(1−f(x))의 형태로 미분이 된다.)
∂w5∂z3=h1=0.51998934 (앞의 z3 전개에서...)
따라서,
∂w5∂Etotal=0.209446×0.23802157×0.51998934=0.02592286
3.2 ∂w6∂Etotal의 계산
∂w6∂Etotal=∂o1∂Etotal×∂z3∂o1×∂w6∂z3
∂o1∂Etotal=0.209446 (바로 앞에서 계산했었음...)
∂z3∂o1=0.23802157 (바로 앞에서 계산했었음...)
∂w6∂z3=h2=0.52747230 (앞의 z3 전개에서...)
따라서,
∂w6∂Etotal=0.209446×0.23802157×0.52747230=0.02629590
3.3 ∂w7∂Etotal의 계산
∂w7∂Etotal=∂o2∂Etotal×∂z4∂o2×∂w7∂z4
∂o2∂Etotal=−(targeto2−outputo2)=−(0.6−0.66384491)=0.06384491
∂z4∂o2=o2×(1−o2)=0.66384491×(1−0.66384491)=0.22315485
∂w7∂z4=h1=0.51998934
따라서,
∂w7∂Etotal=0.06384491×0.22315485×0.51998934=0.00740844
3.4 ∂w8∂Etotal의 계산
∂w8∂Etotal=∂o2∂Etotal×∂z4∂o2×∂w8∂z4
∂o2∂Etotal=0.06384491
∂z4∂o2=0.22315485
∂w8∂z4=h2=0.52747230
따라서,
∂w8∂Etotal=0.06384491×0.22315485×0.52747230=0.00751506
3.5 w5,w6,w7,w8 업데이트
경사 하강법(Gradient descent)의해 각 매개변수의 현재 값에서 편미분한 것을 빼주면 된다. 여기서 학습률(learning rate) α는 0.5로 설정하였다.
w5+=w5−α∂w5∂Etotal=0.45−0.5×0.02592286=0.43703857
w6+=w6−α∂w6∂Etotal=0.4−0.5×0.02629590=0.38685205
w7+=w7−α∂w7∂Etotal=0.7−0.5×0.00740844=0.69629578
w8+=w8−α∂w8∂Etotal=0.6−0.5×0.00751506=0.59624247
4. 역전파 2단계(Backpropagation Step 2)
역전파 1단계에서 매개변수 wk를 모두 업데이트하였다면 Neural network에서 layer를 한단계 왼쪽으로 이동하여 매개변수 wk를 계속 업데이트한다.
1단계를 완료하였다면 이제 입력층 방향으로 이동하며 다시 계산을 이어간다. 위의 그림에서 빨간색 화살표는 순전파의 정반대 방향인 역전파의 방향을 보여준다. 현재 인공 신경망(Neural network)은 은닉층(Hidden layer)이 1개밖에 없으므로 이번 단계가 마지막 단계이다. 하지만 은닉층이 더 많은 경우라면 입력층 방향으로 한 단계씩 계속해서 계산해가야 한다.(입력층까지 계속 layer를 이동하면서 모든 매개변수 wk를 업데이트한다.)
이번 단계에서 계산할 가중치는 w1,w2,w3,w4이다. 원리는 앞에서 1단계에서 했던 것과 동일하므로 앞에서 했던 것과 동일한 방식으로 진행해 보기로 한다.
4.1 ∂w1∂Etotal의 계산
∂w1∂Etotal=∂h1∂Etotal×∂z1∂h1×∂w1∂z1
∂h1∂Etotal=∂h1∂Eo1+∂h1∂Eo2 (h1이 o1,o2 양쪽에 영향을 미치므로 각각에 대한 미분을 합해준다.)
∂h1∂Eo1=∂z3∂Eo1×∂h1∂z3=∂o1∂Eo1×∂z3∂o1×∂h1∂z3=−(targeto1−outputo1)×o1(1−o1)×w5=0.209446×0.23802157×0.45=0.02243370 (이미 앞에서 다 계산했던 것들이다.)
∂h1∂Eo2=∂z4∂Eo2×∂h1∂z4=∂o2∂Eo2×∂z4∂o2×∂h1∂z4=−(targeto2−outputo2)×o2(1−o2)×w7=0.06384491×0.22315485×0.7=0.00997311 (마찬가지로 이미 앞에서 다 계산했던 것들이다.)
∂h1∂Etotal=0.02243370+0.00997311=0.03240681
∂z1∂h1=h1×(1−h1)=0.51998934×(1−0.51998934)=0.24960043
∂w1∂z1=x1=0.1
∂w1∂Etotal=0.03240681×0.24960043×0.1=0.00080888
4.2 ∂w2∂Etotal의 계산
∂w2∂Etotal=∂h1∂Etotal×∂z1∂h1×∂w2∂z1
∂h1∂Etotal=0.03240681 (바로 앞 4.1에서 이미 계산하였다.)
∂z1∂h1=0.24960043
∂w2∂z1=x2=0.2
∂w2∂Etotal=0.03240681×0.24960043×0.2=0.00161775
4.3 ∂w3∂Etotal의 계산
∂w3∂Etotal=∂h2∂Etotal×∂z2∂h2×∂w3∂z2
∂h2∂Etotal=∂h2∂Eo1+∂h2∂Eo2
∂h2∂Eo1=∂z3∂Eo1×∂h2∂z3=∂o1∂Eo1×∂z3∂o1×∂h2∂z3=−(targeto1−outputo1)×o1(1−o1)×w6=0.209446×0.23802157×0.4=0.01994107
∂h2∂Eo2=∂z4∂Eo2×∂h2∂z4=∂o2∂Eo2×∂z4∂o2×∂h2∂z4=−(targeto2−outputo2)×o2(1−o2)×w8=0.06384491×0.22315485×0.6=0.00854838
∂h2∂Etotal=0.01994107+0.00854838=0.02848945
∂z2∂h2=h2×(1−h2)=0.52747230×(1−0.52747230)=0.24924527
∂w3∂z2=x1=0.1
∂w3∂Etotal=0.02848945×0.24924527×0.1=0.00071009
4.4 ∂w4∂Etotal의 계산
∂w4∂Etotal=∂h2∂Etotal×∂z2∂h2×∂w4∂z2
앞에서 이미 계산했던 것들을 재사용한다.
∂h2∂Etotal=0.02848945
∂z2∂h2=0.24924527
∂w4∂z2=x2=0.2
∂w4∂Etotal=0.02848945×0.24924527×0.2=0.00142017
4.5 w1,w2,w3,w4 업데이트
w1+=w1−α∂w1∂Etotal=0.3−0.5×0.00080888=0.29959556
w2+=w2−α∂w2∂Etotal=0.25−0.5×0.00161775=0.24919112
w3+=w3−α∂w3∂Etotal=0.4−0.5×0.00071009=0.39964496
w4+=w4−α∂w4∂Etotal=0.35−0.5×0.00142017=0.34928991
5. 결과 확인
다시 순전파로 계산하되 update된 wk를 이용하여 전체 오차가 줄어들었는지 확인해 본다.
z1=w1x1+w2x2=0.29959556×0.1+0.24919112×0.2=0.07979778z2=w3x1+w4x2=0.39964496×0.1+0.34928991×0.2=0.10982248
h1=sigmoid(z1)=1+e−z11=0.51993887h2=sigmoid(z2)=1+e−z21=0.52742806
z3=w5h1+w6h2=0.43703857×0.51993887+0.38685205×0.52742806=0.43126996z4=w7h1+w8h2=0.69629578×0.51993887+0.59624247×0.52742806=0.67650625
o1=sigmoid(z3)=1+e−z31=0.60617688o2=sigmoid(z4)=1+e−z41=0.66295848
Eo1=21(targeto1−outputo1)2=0.02125445Eo2=21(targeto2−outputo2)2=0.00198189
Etotal=Eo1+Eo2=0.02125445+0.00198189=0.02323634
최초 순전파에서 구했던 전체 오차 Etotal이 0.02397190 이었고,
이후 역전파(Backpropagation) 알고리즘에 의해 업데이트 된 오차가 0.02323634으로 오차가 줄어든 것을 확인할 수 있다.
이렇게 순전파와 역전파를 반복하여 오차를 최소화하는 가중치(wk, 매개변수)를 찾는다.
이것이 바로 인공 신경망(Neural network)의 학습 과정이다.