TigerCow.Door



안녕하세요. 문범우입니다.

이번 포스팅에서는 Backpropagation에 대해서 알아보겠습니다.

지난 포스팅에서 XOR문제를 풀어보았는데, 정확하게 W나 b에 대한 값을 구하지는 못하였습니다. 그럼 이런 상황에서 어떻게 W와 b를 구하는지, 정확하게는 backpropagation이 어떻게 사용되는 것인지 알아보도록 하겠습니다.


* 해당 포스트의 모든 내용은 김성훈 교수님의 '모두를 위한 딥러닝'을 바탕으로 제작되었습니다.

관련한 상세 내용은 아래 링크를 참고해주세요.

https://hunkim.github.io/ml/




1. Intro


먼저, 우리가 어떻게 W나 b와 같은 값을 구할 수 있을까요?

우리가 그동안 다루어 보았던 Gradient의 개념을 이용합니다.

우리는 보통 결과로 나오는 Y값을 통해 Cost함수를 정의하였습니다.

그리고 위와 같은 그래프형태로 나타날때, W가 어떤 초기값으로 시작하는지에 상관없이 그 점에서의 기울기를 이용하여 global minimum을 찾을 수 있었습니다.

즉, 이것을 구현하기 위해서는 특정 위치에서의 미분값을 필요로 합니다.


그런데 이것이 Neural Network로 가면서 복잡해지기 시작합니다. 


위와 같이 노드들이 한두개가 아니고, 각 노드에도 우리가 저번에 사용했듯이 sigmoid함수를 사용하는 등의 상황이 있었기 때문입니다.

여기서 미분값을 구한다는 것은 입력값 X이 결과 값 Y에 끼치는 영향을 알아야 한다는 것입니다. 그런데 단순히 입력값 X 뿐아니라, 각각의 노드들에 대해서도 구해야 각 노드들에 대한 W와 b값을 구할 수 있게됩니다.


그리고 이것은 1969년에 Minsky교수님께서 아무도 이것을 구할 수 없다라고 하실만큼 복잡한 과정이 되어버립니다.



2. Backpropagation


그런데 그러한 문제를 Backpropagation으로 해결하게 되었습니다.

Backpropagation은 그 이름에서도 알 수 있듯이, 우리가 forward로 진행하여 얻은 결과값과 실제값을 비교하여 얻은 error, 즉 cost를 통해 다시 뒤로 돌아가는 과정(backward)을 통해 어떻게 무엇을 설정해야 하는지 알아내겠다라는 개념입니다.


그럼 간단한 예제를 통해 실제로 Backpropagation이 어떻게 작동되는지 살펴보도록 하겠습니다.


위와 같이 정의된 f, g가 있습니다.

그리고 이제 여기서 알고자 하는 것은 w가 f에 미치는 영향, x가 f에게 미치는 영향, b가 f에게 미치는 영향입니다.

즉 알고자 하는 것을 그래프에 표시해본다면 아래와 같습니다.



그럼 이제 각각의 값들을 알기 위해 아래와 같은 과정을 진행합니다.


 1. forward(w = -2, x = 5, b = 3)

 2. backward 


1번 과정은 우리가 학습 데이터에서 값을 가져오는 과정이고 그리고 그 후 2번과정을 통해 실제 미분값을 구해보도록 합니다.


1번에서 주어진 데이터를 입력해본다면, g = -10, f = -7의 값을 가지게 됩니다.

그리고 우리가 처음에 정의한 식들을 편미분하여 아래와 같은 결과를 얻을 수 있습니다.

이렇게 정리가 되면 벌써 b가 f에 미치는 영향을 알 수 있게 됩니다.

df/db = 1 이기 때문이죠.


그리고 이어서 나머지 두 값을 얻기 위해, 먼저 g가 f에 미치는 영향을 생각해보면 df/dg = 1 이라는 식이 있기 때문에 이도 쉽게 구할 수 있습니다.


따라서 w가 f에 미치는 영향을 구해봅니다.

df/dw를 구하는 것인데 이때 chain rule을 이용합니다.

즉, df/dw = df/dg * dg/dw 와 같이 생각합니다.

그런데 이렇게 두고보니 df/dg와 dg/dw 두 값모두 알고 있습니다.

df/dg = 1, dg/dw = x = 5 이므로, df/dw = 1 * 5 = 5가 됩니다.


동일한 방식으로, x가 f에 미치는 영향, df/dx를 구해보면 아래의 식과 같습니다.

df/dx = df/dg * dg/dx = 1 * w = 1 * (-2) = -2


이렇게 구할 수 있습니다.


즉, 우리가 지금 간단한 예제로 진행해보았지만 실제로 더 복잡한 모델에서도 위와 같이 뒤에서부터 하나씩 순서대로 계산하면 매우 간단하게 w와 b등과 같은 값을 구할 수 있습니다.


또한 우리가 사용했던 sigmoid도 위와 같은 방법을 적용시킬 수 있습니다.

위의 그래프와 같이 g값을 이용하여 1/x에 대한 미분값을 얻고, 그 값과 +1 자체의 미분값을 구합니다. 그리고 같은 과정을 반복하면서 앞쪽으로 나아가면 됩니다.



이러한 방법을 통해 아래 그림과 같이 매우 복잡한 모델에 대해서도 기계적이고 반복적인 계산을 통해 미분값, 기울기를 구할 수 있습니다.



블로그 이미지

Tigercow.Door

Back-end / Python / Database / AI / Algorithm / DeepLearning / etc

댓글을 달아 주세요