오늘은 오차 역전파에 대해 공부했습니다.
오차 역전파는 현대 딥러닝에서 매우 중요한 개념입니다. 따라서 이렇게 글로 작성해보았습니다.
회귀를 공부하면서 경사 하강법이 어떤 것인지 알았습니다. [ML] 회귀와 Gradient Descent(경사 하강법)
경사 하강법을 간단하게 요약하면, 가중치 값을 점진적으로 업데이트 하는 방법으로써 비용 함수를 해당되는 가중치로 편미분을 적용합니다.
하지만, 순조로워 보이던 상황 속 한가지 문제가 발생하게 됩니다.
"식이 너무 복잡해지면 어떡하지?"
앞에서 다층 퍼셉트론에 대해 공부했습니다. [CNN] Perceptron(퍼셉트론)
다층 퍼셉트론은 상대적으로 간단한 단일 퍼셉트론이 다수 결합된 것입니다.

심층 신경망이라고도 불리는 다층 퍼셉트론은 은닉층이 사용자가 원하는 만큼 생길 수 있습니다.
이로써 신경망의 층과 뉴런은 늘어나며, 복잡해집니다.

이때 각 뉴런마다 가중치가 생기게 되는데 경사 하강법을 적용하기 위해서는 비용 함수를 각 가중치에 대해 편미분 해야합니다.
신경망에서 데이터를 입력받아 결과값을 도출해 내는 과정을 순전파라고 하며, 이 과정을 역행하는 것을 역전파라고 합니다.

역전파는 가중치 값을 업데이트 하기위해 순전파의 과정을 역행합니다.
오차 역전파를 이해하기 위해선 미분의 연쇄 법칙을 알아야 합니다.
합성함수의 미분이라고도 불리는 연쇄 법칙은 합성함수의 모든 함수가 미분 가능한 함수로 이루어져 있다면 쉽게 미분이 가능하게 해줍니다.
예를들어, 아래와 같은 식이 있다고 가정하겠습니다.

이 식은 함수 f, g, h로 이루어진 합성함수입니다.
이때, h(x) = u, g(u) = z라고 가정하면, y = f(z)라는 식으로 변환 가능합니다.

우리는 y를 x에 대해 미분하려고 합니다.
이때, 연쇄법칙을 이용하면 비교적 쉽게 미분할 수 있습니다.

f(z)라는 함수는 z에 대해 미분이 가능하며, g(u)는 u에 대해 미분이 가능하고, h(x)는 x에 대해 미분이 가능합니다.
앞서, h(x) = u, g(u) = z라고 치환했기 때문에 z는 u에 대해 미분이 가능하고, u는 x에 대해 미분이 가능합니다. 이렇게 합성함수를 연쇄적으로 미분하여 곱하는 것을 미분의 연쇄 법칙이라고 합니다.
오차 역전파를 이용할 때, 연쇄 법칙이 사용됩니다.
이는 심층 신경망의 구조상 이해하기 편한데, 왼쪽에서 오른쪽으로 가는 구조로 되어있다고 했을 때, 모든 뉴런과 뉴런 사이에 가중치 W가 각각 독립변수로 존재합니다.
경사 하강법을 적용하기 위해서는 순전파를 통해 도출된 비용 함수를 각 W에 대해 편미분 해야합니다. 이때, 다시 맨 처음 W에 대해 편미분 하기보다는 순전파를 역행하며 양파껍질을 까듯이 경사 하강법을 수행하는 것이 더 쉽습니다.

그림을 보면 비용 함수를 각 W에 대해 편미분을 적용했습니다.
오차 역전파의 방향대로 편미분을 반복적으로 적용하면 앞에서 계산한 미분 값을 이용해 더 쉽게 해당 W에 대한 편미분을 구할 수 있습니다.
이렇게 해당 뉴런의 Output에 W를 미분한 값을 Local Gradient라고 하며, 이 값을 미분하기 전 모든 과정의 미분한 값을 Upstream Gradient이라고 합니다.
예를들어, s라는 비용 함수를 z에 대해 편미분 했다고 가정합시다.(여기서 z는 해당 뉴런의 Output)
이제 이렇게 미분된 값을 이용해 또다른 독립변수 W, x에 대해 편미분한 값을 각각 구해야 한다고 합시다.
이때, s라는 비용함수를 z에 대해 편미분한 값은 ds/dz라고 표현할 수 있습니다.
W, x라는 독립변수에 대해 편미분을 적용하기 전까지 과정인 ds/dz를 Upstream Gradient라고 부릅니다. 또한, W, x라는 독립변수에 대해 편미분을 적용한 값인 dz/dW나 dz/dx를 Local Gradient라고 부릅니다.
(아래 자료는 Stanford 대학교에서 제공한 자료입니다. reference에 출처 남겼습니다.)

그렇다면, Upstream Gradient가 여러개인 경우는 어떻게 해결해야 하는가?
Upstream Gradient가 여러개인 경우는 아래와 같습니다.

w1이라는 독립변수에 대한 편미분을 적용하기 위해 연쇄 법칙을 적용하려면 Upstream Gradient가 총 두 개의 경로에서 오게 됩니다.

주황색과 노란색으로 표현된 부분이 Upstream Gradient입니다.
이렇게 Upstream Gradient가 여러개가 나오는 경우 독립변수에 대해 편미분한 값은 각 Upstream Gradient에 Local Gradient를 곱한 값을 합한 값입니다.
이는 Upstream Gradient가 2개 이상일 때도 적용됩니다.
아마, 일반적인 케이스가 Upstream이 2개 이상인 경우일 것입니다.
이를 행렬의 내적으로 표현하면 다음과 같습니다.

최종적으로 오차 역전파를 정리하자면, 경사 하강법을 좀 더 쉽게 적용하기 위해 고안한 방법이라고 표현할 수 있겠습니다. 경사 하강법은 "원하는 독립변수에 대해 편미분을 적용하면 된다."라면, 오차 역전파는 "편미분을 더 쉽게 적용하려면 연쇄 법칙을 이용해서 이렇게 해야해"라는 것입니다.
오늘은 딥러닝(혹은, 현대 머신러닝)의 뼈대중 하나인 오차 역전파에 대해 공부해봤습니다. 이렇게 공부한 저의 지식이 나중에 저의 피와 살이 되어 저를 지탱해 주는 마음으로 글을 마치겠습니다. 감사합니다.
딥러닝 CNN 완벽 가이드 - TFKeras 버전
07-05 역전파(BackPropagation) 이해하기
Natural Language Processing
with Deep Learning