도서 : 신경망 첫걸음(한빛미디어)

지음 : 타리크라시드(송교석 옮김)


 

  • 이번에는 결과 값의 오차에 따른 가중치 업데이트 방식을 알아보고자 합니다.
  • 모든 연결된 노드에 대해 오차를 균일하게 나누어 분배하는 방식

모든 가중치에 동일한 오차를 부여하는 방식입니다.

 

  • 오차를 나누어 분배하지만 차별을 두는 방식 : 더 큰 가중치를 가지는 연결에 더 큰 오차를 분배

가중치의 크기에 따라 오차를 부여하는 방식입니다. 각각의 연결이 오차에 영향을 주는 정도에 비례해서 전달합니다.

  • 우리는 가중치를 두 가지 방법으로 활용한다는 것을 알게 되었습니다. 하나는 앞에서 살펴본 것 같이 하나의 계층에서 다음 계층으로 전파하는 데에 가중치를 이용하는 것, 그리고 두 번째는 오차를 하나의 계층에서 직전 계층으로 전파하는 데에도 이용한다는 것(역전파 - backpropagation)입니다.

  • 만약 출력 계층이 2개의 노드를 가진다면? 두 번째 노드에 대해서도 동일한 작업을 하게 됩니다.

  • 2개의 출력 노드를 가지는 그림입니다. 2개의 출력 노드 모두 오차를 가질 수 있습니다. 특히 우리가 아직 네트워크를 학습시키지 않은 경우에는 거의 무조건 오차를 가지고 있습니다.
  • e1의 경우 학습 데이터 t1에 의해 제공된 실제 값과 우리가 계산한 출력 값 o1 사이의 차이를 의미합니다. 다시 말해 e1 = t1 - o1입니다. 이렇게 보면 가중치 w(1,1)과 w(2,1)에 의해 e1이 영향을 받게 되었으므로 e1은 두 가중치에 업데이트에 영향을 주게 됩니다. 따라서 앞서 배운바와 같이 w(1,1)은 w(1,1)/{w(1,1) + w(2,1)}이라는 식이 업데이트를 하는데 사용되고 w(2,1)은 w(2,1)/{w(1,1) + w(2,1)}이라는 식이 사용됩니다.
  • 결론적으로 여러 개의 출력 노드가 있는 경우에도 그저 각각의 출력 노드를 개별적으로 처리하면 될 뿐, 복잡해질 것이 전혀 없다는 사실을 알게 되었습니다.

  • 그렇다면 멀리 떨어져 잇는 계층과 관련된 가중치, 즉 여러 개의 계층이 있는 경우는 어떻게 해야 할까요?
  • 3개 계층(입력, 은닉, 출력)이 존재하는 경우입니다. 먼저 오른쪽 끝의 최종 출력 계층부터 보겠습니다. 출력 계층의 오차를 이용해 출력 계층과 연결된 노드들의 가중치를 업데이트 합니다. 여기서 출력 계층의 오차를 e_output, 은닉 계층과 출력 계층사이의 가중치를 w_ho라고 표현하겠습니다.

  • w_ho의 경우는 앞서 배운 것 처럼 e_output을 이용하여 업데이트가 가능합니다. 그렇게 업데이트를 한 후 e_hidden을 이용하여 입력 계층과 은닉 계층사이의 가중치 w_ih를 업데이트 하면 될 것 같습니다. 그러나 e_hidden은 어떤 오차 값을 사용하는 것일까요?

 

 

 

  • 중간에 위치하는 은닉 계층은 사실 명백한 오차를 가지고 있지 않습니다. 직전 계층의 입력 값에 가중치를 적용한 후, 활성화 함수를 적용한 값이 은닉 계층의 출력 값입니다. 따라서 은닉 계층에는 목표로 하는 출력 값이 없는 것입니다. 오직 최종 출력 계층의 노드만이 학습 데이터로부터 얻은 실제 값, 즉 목표로 하는 출력 값을 가지고 있습니다.

  • 은닉 계층의 노드로부터 오는 2개의 연결 노드 각각에 대해 어떤 오차가 존재합니다. 우리는 이러한 2개의 연결 노드의 오차를 재조합(recombine)함으로써 은닉 계층의 노드의 에러로 사용할 수 있습니다.

  • 공식은 다음과 같습니다. e_hidden(1) = 연결 노드 w11, w12로 나뉘어 전달되는 오차의 합 = {e_output(1) * w(1,1)}/{w(1,1) + w(2,1)} + {e_output(2) * w(1,2)}/{w(1,2) + w(2,2)}

 

  • e1이 0.8, e2가 0.5이고 w(1,1)이 2.0, w(2,1)이 3.0, w(1,2)가 1.0, w(2,2)가 4.0이므로 은닉 계층의 1번째 노드에는 0.8*2.0/(2.0+3.0) = 0.32와 0.5*1.0/(1.0+4.0) = 0.1의 합이 e_hidden(1)의 값이 됩니다. 즉 0.42입니다.

 

  • 이 그림은 한 단계 더 나아가 은닉 계층의 e값을 이용하여 입력 계층의 e값을 구하는 것을 보여줍니다.


  • 행렬곱을 이용한 오차의 역전파

  • 앞서 본 예제는 엄청나게 간단한 구조의 계층들이었습니다. 물론 실제 역전파는 매우 복잡합니다. 그렇다면 우리는 역전파에도 행렬곱을 이용하여 복잡한 계산을 좀 더 간단하게 나타내야 할 것입니다.

  • 이렇게 행렬곱으로 표현하는 방식을 벡터화한다(vectorize)고 합니다.

  • 앞서 본 예제의 식들을 간단한 행렬곱으로 나타내보겠습니다.

  • 조금 복잡해 보이는 식이 되었지만 여기서 우리는 분수가 있는 행렬의 분모 부분은 일종의 정규화 인자(nomalizing factor)라고 할 수 있습니다. 만약 이 정규화 인자를 무시한다고 해도 우리는 되돌아오는 오차의 일정 비율 정도를 잃을 뿐입니다. 따라서 간단하게 e1*w(1,1)로 표현해도 되는 것 입니다. 이를 적용하면 행렬곱은 훨씬 보기 좋아집니다.

  • 우리가 지난 글에서 배웠던 w_hidden_output행렬의 전치(transpose)행렬로 보입니다. 이제 다음과 같이 오차의 역전파를 행렬로 간결하게 표현할 수 있게 되었습니다. -> error_hidden = W^T(hidden) * error_output

+ Recent posts