![저작자표시-비영리-변경금지 88x31.png](https://licensebuttons.net/l/by-nc-nd/3.0/88x31.png)
역전파 알고리즘은 input과 output을 알고 있는 상태에서 신경망을 학습시키는 알고리즘입니다.
단일 뉴런에서는 다음과 같이 순방향(Forwardpass)으로 계산이 됩니다.
![mb-file.php?path=2022%2F05%2F14%2FF5302_1.png](https://www.robotstory.co.kr/wp-content/uploads/mangboard/2022/05/14/F5302_1.png)
순방향 계산으로부터 우리는 f(x, y)에 대한 x의 편미분값과 y의 편미분값을 구할 수 있습니다.
![mb-file.php?path=2022%2F05%2F14%2FF5304_3.png](https://www.robotstory.co.kr/wp-content/uploads/mangboard/2022/05/14/F5304_3.png)
이 값을 Local Gradient라고 합니다.
순방향을 통해 ouput을 구했다면 오차 L을 구할 수 있습니다. 오차 L로부터 역방향(Backwardpass)으로 편미분값을 구할 수 있습니다.
![mb-file.php?path=2022%2F05%2F14%2FF5303_2.png](https://www.robotstory.co.kr/wp-content/uploads/mangboard/2022/05/14/F5303_2.png)
![mb-file.php?path=2022%2F05%2F14%2FF5305_4.png](https://www.robotstory.co.kr/wp-content/uploads/mangboard/2022/05/14/F5305_4.png)
이 값을 Global Gradient라고 합니다.
우리는 역방향으로 오차에 대한 x와 y의 편미분값을 구해야 합니다. 이는 Chain Rule을 통해 다음과 같이 계산될 수 있습니다.
![mb-file.php?path=2022%2F05%2F14%2FF5306_5.png](https://www.robotstory.co.kr/wp-content/uploads/mangboard/2022/05/14/F5306_5.png)
![mb-file.php?path=2022%2F05%2F14%2FF5307_6.png](https://www.robotstory.co.kr/wp-content/uploads/mangboard/2022/05/14/F5307_6.png)
z = f(x, y) 이므로 각각의 편미분값은 Local Gradient * Global Gradient 와 같다는 것을 알 수 있습니다.
이제 은닉층을 포함한 심층 신경망을 통해 계산을 해보겠습니다. ![mb-file.php?path=2022%2F05%2F14%2FF5308_7.jpg](https://www.robotstory.co.kr/wp-content/uploads/mangboard/2022/05/14/F5308_7.jpg)
미분을 해야하므로 미분이 불가능한 계단함수 대신 활성함수로 로지스틱 함수를 사용하겠습니다.
전송함수값은 net, 활성함수값은 out으로 표시했습니다. 우선 출력값에서 가까운 가중치 w5 ~ w8 을 갱신하도록 하겠습니다.
w5를 기준으로 설명하겠습니다. w5+ 가 갱신값이라고 한다면 다음과 같은 식이 성립합니다.
![mb-file.php?path=2022%2F05%2F14%2FF5309_7.png](https://www.robotstory.co.kr/wp-content/uploads/mangboard/2022/05/14/F5309_7.png)
α 는 하이퍼 파라미터 학습률(Learning Rate)이며, 우리는 오차에 대한 편미분값을 구해야합니다. 위에 설명했듯이 Chain Rule 을 통해 Local Gradient 와 Global Gradient를 순차적으로 곱하면 됩니다.
![mb-file.php?path=2022%2F05%2F14%2FF5312_8.png](https://www.robotstory.co.kr/wp-content/uploads/mangboard/2022/05/14/F5312_8.png)
오차 L은 o1의 오차와 o2의 오차의 합의 평균과 같습니다.
![mb-file.php?path=2022%2F05%2F14%2FF5313_9.png](https://www.robotstory.co.kr/wp-content/uploads/mangboard/2022/05/14/F5313_9.png)
그러므로 오차에 대한 outo1 의 편미분값은 다음과 같습니다.
outo1 은 로지스틱 함수이므로 outo1 에 대한 neto1 의 편미분값은 로지스틱 함수를 미분한 값과 같습니다.
![mb-file.php?path=2022%2F05%2F14%2FF5315_11.png](https://www.robotstory.co.kr/wp-content/uploads/mangboard/2022/05/14/F5315_11.png)
![mb-file.php?path=2022%2F05%2F14%2FF5316_12.png](https://www.robotstory.co.kr/wp-content/uploads/mangboard/2022/05/14/F5316_12.png)
이때 첫번째 계산값과 두번째 계산값의 곱은 이후에 사용되므로 묶어서 δo1 이라고 한다면 다음과 같습니다.
![mb-file.php?path=2022%2F05%2F14%2FF5325_13.png](https://www.robotstory.co.kr/wp-content/uploads/mangboard/2022/05/14/F5325_13.png)
![mb-file.php?path=2022%2F05%2F14%2FF5326_14.png](https://www.robotstory.co.kr/wp-content/uploads/mangboard/2022/05/14/F5326_14.png)
나머지도 동일하게 구할 수 있습니다.
![mb-file.php?path=2022%2F05%2F14%2FF5327_15.png](https://www.robotstory.co.kr/wp-content/uploads/mangboard/2022/05/14/F5327_15.png)
![mb-file.php?path=2022%2F05%2F14%2FF5328_16.png](https://www.robotstory.co.kr/wp-content/uploads/mangboard/2022/05/14/F5328_16.png)
![mb-file.php?path=2022%2F05%2F14%2FF5329_17.png](https://www.robotstory.co.kr/wp-content/uploads/mangboard/2022/05/14/F5329_17.png)
이제 가중치 w1 ~ w4 을 갱신하도록 하겠습니다.
w1 을 기준으로 설명하겠습니다.
![mb-file.php?path=2022%2F05%2F14%2FF5322_18.png](https://www.robotstory.co.kr/wp-content/uploads/mangboard/2022/05/14/F5322_18.png)
outh1 은 o1과 o2 모두에 영향을 미치므로 다음과 같이 정리할 수 있습니다.
![mb-file.php?path=2022%2F05%2F14%2FF5324_19.png](https://www.robotstory.co.kr/wp-content/uploads/mangboard/2022/05/14/F5324_19.png)
outh1 은 로지스틱 함수이므로 outh1 에 대한 neth1 의 편미분값은 로지스틱 함수를 미분한 값과 같습니다.
![mb-file.php?path=2022%2F05%2F14%2FF5330_20.png](https://www.robotstory.co.kr/wp-content/uploads/mangboard/2022/05/14/F5330_20.png)
![mb-file.php?path=2022%2F05%2F14%2FF5331_21.png](https://www.robotstory.co.kr/wp-content/uploads/mangboard/2022/05/14/F5331_21.png)
마찬가지로 첫번째 계산값과 두번째 계산값의 곱을 묶어서 δh1 이라고 한다면 다음과 같습니다.
![mb-file.php?path=2022%2F05%2F14%2FF5332_22.png](https://www.robotstory.co.kr/wp-content/uploads/mangboard/2022/05/14/F5332_22.png)
![mb-file.php?path=2022%2F05%2F14%2FF5333_23.png](https://www.robotstory.co.kr/wp-content/uploads/mangboard/2022/05/14/F5333_23.png)
나머지도 동일하게 구할 수 있습니다.
![mb-file.php?path=2022%2F05%2F14%2FF5334_24.png](https://www.robotstory.co.kr/wp-content/uploads/mangboard/2022/05/14/F5334_24.png)
![mb-file.php?path=2022%2F05%2F14%2FF5336_25.png](https://www.robotstory.co.kr/wp-content/uploads/mangboard/2022/05/14/F5336_25.png)
![mb-file.php?path=2022%2F05%2F14%2FF5337_26.png](https://www.robotstory.co.kr/wp-content/uploads/mangboard/2022/05/14/F5337_26.png)
복잡해 보이지만 전체 가중치를 모두 반영하는 경사하강법의 경우 뉴런의 수가 많을수록 속도가 느려지는 반면 오차역전파 알고리즘의 경우 행렬을 통해 계산되므로 더욱 빠르게 학습을 할 수 있습니다. |