27. 딥넷트웍 학습 시키기 (backpropagation) (lec 09-3)


헐.. 캡쳐하고 보니까 제목이 9-2라고 되어 있네. 교수님께서 미분 특별편을 나중에 넣어서 생긴 현상. 이것도 추억이니까, 수정하지 않고 그대로 두겠음.

이전 동영상에 나온 Neural Network 복습. 여러 개의 입력이 발생할 수 있는데, 이들 입력을 행렬을 사용해서 하나로 통합한 것까지 진행하고, 어떻게 W1, W2, b1, b2를 학습시킬 수 있을까, 고민하는 것까지 진행했다.


결론은 gradient descent 알고리듬. 모양이 어찌 되었든 미분을 사용해서 cost가 줄어드는 방향으로 진행해서 최저점에 도착하면 된다.



Neural Network은 여러 개의 layer를 두어서 복잡한 문제까지 해결할 수 있도록 구성된다. 첫 번째 layer를 input layer, 마지막 layer를 output layer, 중간에 있는 모두를 hidden layer라고 부른다. 말 그대로 눈에 보이지 않기 때문에 붙은 이름이다. 눈에 보이지 않기 때문에 내부를 파악하기 어려운 단점이 존재한다. 심한 경우 동작하는 방식을 이해하지 못할 수도 있다.

그림 제목이 Derivation인 것처럼 이 문제를 해결한 방식은 미분이다. 앞쪽 layer가 뒤쪽 layer에 어떤 영향을 끼쳤는지 알 수 있으면, 그 반대 또한 알 수 있다.


앞에서부터 뒤로 진행하면서 W와 b를 바꾸어 나갈 때 forward propagation이라고 하고, 뒤에서부터 앞으로 거꾸로 진행하면서 바꾸어 나갈 때 backward propagation이라고 한다.

Neural Network에 포함된 여러 개의 layer 중에서 결과에 가장 큰 영향을 주는 것은 뒤쪽 layer가 되고, 이들 layer부터 수정해 나가는 것이 어찌 보면 타당하다. 결론적으로 많은 layer 중에서 뒤쪽에 있는 일부만 수정을 하는 것이 훨씬 더 좋은 예측을 할 수 있게 된다.


덧셈이 됐건 곱셈이 됐건 숫자들에 대한 연산을 하는 것일 뿐이다. 덧셈이라는 것을 알고 있기 때문에 그 반대로 미분을 해서 추적하는 것이 가능하다.

이번 그림에서 사용되는 값은 w, x, b, g, f의 다섯 가지다. w, x, b, g가 변화할 때, f가 어느 정도 변화하는지 구하려는 것이 이번 그림의 목표다. 이제부터 설명하는 공식이 쉽건 어렵건 중요한 것이 아니다. backpropagation이라고 하는 알고리듬이 동작한다는 것을 이해하기만 하면 된다.

  f = wx + b,  g = wx,  f = g + b

g는 w와 x를 곱해서 만들어 진다고 그림에 있으니까, g = wx라고 할 수 있다. 그렇다면 f = wx + b는 f = g + b라고 얘기해도 된다.

먼저 g를 미분해 보자. g = wx이다. x로 미분하는 것은 x가 1 변화할 때, g의 변화량을 의미한다. w로 미분하는 것은 w가 1 변화할 때, g의 변화량을 의미한다.

  w = -2, x = 5  -->  g = -2 * 5 = -10
  w = -1, x = 5  -->  g = -1 * 5 = -5      # w가 1 변할 때 x(5)만큼 변화
  w = -2, x = 6  -->  g = -2 * 6 = -12    # x가 1 변할 때 w(-2)만큼 변화

  g를 x로 미분하면 w가 되고, w로 미분하면 x가 된다.


f를 미분할 수 있는 값은 인접한 g와 b, 두 가지가 있다. g로 미분하는 것은 g가 1 변화할 때, f의 변화량을 의미한다. b로 미분하는 것은 b가 1 변화할 때, f의 변화량을 의미한다.

  g = -10, b = 3  -->  f = -10 + 3 = -7
  g =   -9, b = 3  -->  f =   -9 + 3 = -6     # g가 1 변할 때, 1만큼 변화
  g = -10, b = 4  -->  f = -10 + 4 = -6     # b가 1 변할 때, 1만큼 변화

  f를 g나 b로 미분하면 1이 된다.


이번에는 편미분에 도전하자. w가 1 변화할 때, f가 어떻게 바뀌는지 알고 싶다. 그럴려면 w가 바뀔 때 인접한 g가 바뀌는 값과 g가 바뀔 때 인접한 f가 바뀌는 값을 알면 된다.

  δf/δw(f를 w로 미분) = δf/δg(f를 g로 미분) * δg/δw(g를 w로 미분) = 1 * x = x(5)

  w = -2, x = 5, b = 3  -->  f = -2*5 + 3 = -7
  w = -1, x = 5, b = 3  -->  f = -1*5 + 3 = -2   # w가 1 변할 때 5만큼 변화


x가 변화할 때 f가 어떻게 바뀌는지도 알아보자.

  δf/δx(f를 x로 미분) = δf/δg(f를 g로 미분) * δg/δx(g를 x로 미분) = 1 * w = w(-2)

  w = -2, x = 5, b = 3  -->  f = -2*5 + 3 = -7
  w = -2, x = 6, b = 3  -->  f = -2*6 + 3 = -9   # x가 1 변할 때 -2만큼 변화


이번 그림만 갖고 판단한다면, 맨 앞에 있는 w와 x는 input layer, 마지막에 있는 f는 output layer, 중간에 있는 g는 hidden layer에 해당한다. 놀랍게도 input layer에 있는 값을 1만큼 수정할 때 output layer의 값이 어떻게 바뀌는지 계산할 수 있었다. 간단하긴 하지만, backpropagation 알고리듬이 동작하는 원리를 확인할 수 있었다.


Neural Network은 이번 그림처럼 계산이 길게 늘어서 있는 형태일 뿐이다. 2개 layer에 대해 가능했다면, 그림처럼 엄청 많아도 미분을 통해 첫 번째 layer까지 진행할 수 있다. 김성훈 교수님께서는 이 부분에 대해 간단한 미분이라고 여러 번 강조하셨다.


앞에 나온 그림을 깔끔하게 정리.


sigmoid를 예로 들어 설명하셨다. 결국 sigmoid 또한 여러 개의 계산으로 나누어질 수 있고, 역으로 미분을 통해 어느 정도의 영향을 줬는지 판단할 수 있다고 하셨다. 영향력을 판단할 수 있으면, 얼마를 변경할 때 어떤 결과가 나오는지도 예측할 수 있게 된다.

g(z)를 풀어보면 위의 그림이 나오고, 말로 하면 아래처럼 된다.

  1. z에 -1을 곱해서 음수로 만든다.
  2. exp(지수)를 계산한다.
  3. 1을 더한다.
  4. 앞의 결과를 분모로 취한다. (1/x)


텐서보드를 통해 본 hypothesis의 모습. Sigmoid도 있고 행렬 곱셈(MatMul)도 있다.


텐서보드를 통해 본 cost 함수의 모습. 많이 복잡해 보이지만, 이게 내부를 살펴볼 수 있는 가장 좋은 방법일 수 있다. 텍스트로 출력을 해서 본다고 상상해 보자. 끔찍하다.


똑같은 그림이 다시 나왔는데, 제목만 Back propagation으로 바뀌었다. 지금까지 설명한 내용이 back propagation이었고, 그림처럼 많은 layer에 대해서도 잘 동작한다는 것을 배웠다.


Minsky 교수로 인해 발생했던 암울한 침체기를 backpropagation을 통해 비로소 지날 수 있었다. 우리는 minsky 교수님께서 하지 못했던 일을 하게 됐다,라고 김성훈 교수님께서 말씀하셨다.