2020. 5. 21. 01:10ㆍAI/모두를 위한 딥러닝
이 포스트는 모두를 위한 딥러닝 - Tensor Flow를 정리한 내용을 담았습니다.
누구나 이해할 수 있는 수준으로 설명하고자 하였으며 LAB의 코드는 TF2.0에 맞추어 재작성되었습니다.
이번 포스트는 저번 포스트에 이어 딥네트워크를 학습하는 방법인 Backpropagation(역전파)에 대해 알아보겠습니다. 먼저 저번 포스트에서 XOR 문제를 딥러닝으로 풀 때 아래와 같이 W와 b가 미리 적절한 값으로 정해져 있었습니다. 그렇다면 이 W와 b는 어떤 알고리즘을 통해 정해졌을까요? 정답은 Backpropagation, 역전파 알고리즘입니다. Backpropagation 알고리즘을 살펴보기 전에, 편미분과 합성함수의 미분법인 chain rule(연쇄 법칙)에 대해 짚고 넘어가겠습니다.

왜 미분일까요? 아래 그림 2.1,2의 딥 네트워크 모형을 보겠습니다. 딥 네트워크는 input layer의 모든 노드들이 hidden layer의 모든 노드와 output layer의 노드에 영향을 줍니다. 그림 2.2의 딥 네트워크 모형의 주황색 선은 input layer의 X1 노드에서의 간선을 표시한 것인데, 이처럼 하나의 노드는 이후 레이어의 모든 노드에 영향을 줍니다. 이를 한마디로 표현하면 다음과 같습니다. "X1이 Ŷ에 미치는 영향을 알아야만 X1노드의 W와 b를 조절할 수 있습니다". 잠시 저번 포스트로 넘어가 Backpropagation이 나오게 된 배경을 소개하면 이러한 문제해결 과정에서 하나의 노드가 모든 노드에 영향을 미친다는 특성 때문에 입력이 늘어나고 hidden layer가 많아질수록 구조가 복잡해지고 계산량이 너무 많아진다는 문제점이 있습니다. 이러한 문제점을 두고 1969년 Marvin Minsky 교수님은 다음과 같이 말했습니다.
Perceptron (1969) by Marvin Minsky, founder of the MIT AI Lab
"No one on earth had found a viable way to train MLPs good enough to learn such simple functions."
이러한 문제를 해결한 것이 바로 Backpropagation 알고리즘(1974, 1982 by Paul Werbos, 1986 by Hinton)입니다. 다시 돌아가 그렇다면 input layer의 노드가 Ŷ에 미치는 영향을 알기 위해 미분으로 접근하는 이유는 무엇일까요? 저도 이 부분에 대해 완벽한 이해가 부족해 찾아본 결과다음과 같은 해설을 영상 댓글에서 찾을 수 있었습니다. x가 f에 미치는 영향을 알기 위해 f를 x로 미분하면 df/dx로, 결국 x가 f에 영향을 미치는 결과값이라고 해석할 수 있습니다. 거리/시간 = 속력의 예를 보면 시간이 거리에 미치는 영향이 크다는 말은 다른 말로 속력이 크다는 의미이며, 반대로 영향이 작다면 속력이 작다는 의미로 해석할 수 있습니다.


먼저 편미분에 대해 알아보겠습니다. 편미분은 다변수 함수에서 미분하는 값 이외의 나머지 변수를 상수로 두어 미분하는 것입니다. 쉽게 설명하여 f(x,y)와 같이 변수가 2개인 함수를 x에 대해 미분하는 경우, y를 모두 상수로 생각하여 미분(df/dx)하는 방법입니다. 하나의 예로 z = f(x,y) = x^2 + xy + y을 x에 대해 편미분하겠습니다. 순서에 따라 x에 대해 편미분할 때 x 이외의 변수인 y를 상수로 두면 ∂z/∂x는 z = f(x) = x^2 + yx + y인 일변수 함수를 미분하는 것이므로 ∂z/∂x = 2x + y의 결과를 얻을 수 있습니다.
다음으로 chain rule(연쇄 법칙)에 대해 알아보겠습니다. 아마 chain rule은 이미 고등 수학과정에서 합성함수의 도함수에 관한 공식으로 익숙해져있을 것입니다. 뉴턴 표기법으로 (f ·g)'(x) = f'(g(x))g'(x)으로 배운 chain rule을 라이프니츠 표기법으로 살펴보면, 일변수 합성함수 y = f(g(x))에서 g(x) = t, y = f(t)로 표기할 때 아래의 식이 성립합니다. 여기서 g(x) = t를 chain으로 매개하여 미분하고 있기 때문에 이 방법을 chain rule이라고 부릅니다. chain rule은 이번 포스트에서 연산에 있어 특히 중요하니 아래의 내용을 보기전 포스트의 글뿐만 아니라 구글링등을 통해 완벽히 본인의 것으로 만드시길 바랍니다.

이제 Backpropagation(역전파)알고리즘을 예시를 통해 알아보겠습니다. f(x) = Wx + b, g(x) = Wx의 함수가 있을 때, 이를 딥 네트워크 모형으로 표현하면 아래와 같습니다.

우리의 목적은 W와 b값을 적절하게 조절하는 것으로, 이를 위해 W와 b가 f에 미치는 영향을 알아야하기 때문에 W와 b를 f에 대해 미분해야합니다. 아래는 이번 포스트의 핵심으로, 미분하는 과정을 나타냈으며 결과는 ∂f/∂W = x, ∂f/∂x = W, ∂f/∂b = 1이며 W와 x에 대해 미분하는 과정에서 chain rule이 사용된 것이 확인됩니다.

중요한 것은 미분 값입니다. 예를 들어 W = -2, x = 5, b = 3로 설정하면 W에 대한 미분값은 x = 5입니다. W에 대한 미분값은 곧 W가 f에 미치는 영향을 의미하기 때문에 결국 W값의 변화에 따른 f의 변화가 1 : 5의 비율임을 알 수 있습니다. 실제로 f(x) = Wx + b에서 W값을 1 증가하면 f값이 -7에서 -2로, 5 증가하였음을 볼 수 있습니다. 마찬가지로 b에 대한 미분 값은 b가 f에 미치는 영향으로, b값의 변화에 따른 f의 변화가 1:1로 비례합니다. 이제 우리는 W와 b가 각각 f에 미치는 영향을 알고 있기 때문에 이 정보를 토대로 우리는 W와 b를 적절하게 조절할 수 있습니다. 사실 위의 경우는 입력에서 f에 도달하기까지의 과정이 간단하기 때문에, 미분 없이도 간단한 계산을 반복하여 W와 b를 조절할 수 있습니다. 그렇다면 이번에는 다소 복잡한 경우에 대해 살펴보겠습니다. 아래 모형을 보겠습니다.

식을 보면 마지막 hidden layer에서 a + b = f입니다. 따라서 우리는 ∂f/∂a, ∂f/∂b가 둘 다 1이라는 것을 알고 Backpropagation알고리즘으로 앞으로 넘어가다보면 ∂f/∂g 또한 알 수 있습니다. 문제는 모형에서 원하는 것은 ∂f/∂x, ∂f/∂y이며, 이전에는 이 값을 계산하기 위해서는∂g/∂x부터 시작해서 레이어를 거치며 모든 노드를 계산해야만 했습니다. 하지만 우리는 ∂f/∂g를 알고있고, chain rule을 통해 ∂f/∂x를 ∂f/∂g ˙ ∂g/∂x로 풀어 계산할 수 있습니다. 마찬가지로 ∂f/∂y 또한 chain rule을 통해 계산할 수 있습니다. 이처럼 chain rule은 Backpropagation을 연산하는데 매우 중요합니다.
이제 Backpropagation에 대해 조금은 이해가 되었으리라 기대합니다. 저번 포스트에서 언급했듯이 순전파 과정이 자유투를 던지는 과정이라고하면 역전파 과정은 던진 공이 어느 곳에 도착했는지를 확인한 후 던지는 위치를 옮기는 과정이라고 생각하면 조금 더 쉽게 이해할 수 있습니다. 마지막으로 chain rule을 사용하여 sigmoid 함수를 미분하는 과정을 수식으로 보이겠습니다.

'AI > 모두를 위한 딥러닝' 카테고리의 다른 글
09-4. XOR 문제 keras로 풀어 Tensorboard로 확인 LAB (0) | 2020.06.13 |
---|---|
09-3. Neural Net for XOR LAB (0) | 2020.06.09 |
09. XOR 문제 딥러닝으로 풀기 (0) | 2020.05.11 |
08. 딥러닝의 기본개념, 역사 (0) | 2020.05.08 |
07-2. Model evaluation: Training and test data sets (0) | 2020.05.04 |