Back propagation 2

 

미분은 순간변화율을 말합니다.(순간 변화율을 구하는 방법이 나누기라서 미분이라고 하지 않을까..)
우선 변화율이 무엇인지 이해해보자면, 변화율이란 상대적인 개념이라는 것을 알아야합니다.

‘f의 변화율이 3이다’라는 말은 온전한 표현은 아닙니다.
무엇에 대한 변화율인지가 빠졌기 때문입니다.  예를 들어, 속도(력)는 시간에 대한 위치변화(이동거리)의 변화율이고, 직선의 기울기는 x값에 대한 y값의 변화율입니다.

즉,  변화율을 말하려면 변화율의 기준이 되는 놈이 있어야 한다는 말이고 이 기준이 무엇이냐에 따라서 변화율 값이 의미하는 바가 달라집니다(속도에도 초속, 분속, 시속 의미는 다 다름). 아래의 식이 미분을 설명하는 가장 근본적인 식입니다.

 

왼쪽 그림은 기울기가 2인 직선입니다. 기울기가 2라는 말은 dy/dx = 2 라는 말로서, y변화량이 x변화량의 2배라는 말입니다. 즉, x가 1 증가하면 y는 2증가하고, x가 5 증가할 때 y는 10 증가한다는 말입니다.

그런데, 오른쪽 곡선 y=f(x)의 경우 변화율이 어떻게 될까요? 직선처럼 변화율이 항상 일정한 것이 아닙니다. 곡선의 경우는 변화율 자체가 계속 변화합니다. 순간 순간의 변화율은 계속 변하지만, 어떤 구간에서의 평균적인 변화율은 정의할 수 있습니다. 여기서 평균변화율의 개념이 나옵니다. 함수 f(x)의 구간 [a,b]에서의 평균변화율은 다음과 같이 주어집니다.

Δx는 구간에서의 x의 변화량을 나타낼 때 쓰는 표현입니다.  위의 평균 변화율 예에서, x는 a에서 b로 변했으므로 x의 변화량은 Δx = b – a 입니다.

하지만 미분의 원래 정의는 순간변화율 입니다.
즉, 위의 곡선의 예에서 구간의 평균변화율이 아닌 모든 x점에서의 순간 변화율을 구하는 것이 목적입니다.

x = a 일때의 변화율, x = b 일때의 변화율, … 등과 같이 한 점 한 점에서의 변화율을 구하고 싶은 것입니다. 곡선상의 어떤 한 점 부분을 무한히 확대한다고 해보겠습니다. 어떤 곡선도 무한히 확대하다 보면 부분적으로는 직선이 됩니다. 여기서 이 직선의 기울기가 바로 해당 점에서의 순간 변화율입니다.

위의 곡선 예에서 x = a 에서의 순간변화율 f'(a)는 다음과 같이 구할 수 있습니다.

Δx->0 이라는것은 0에 가까운 미세한 변화, 즉 무한히 확대하다 보면 부분적으로 직선이 된다는 부분에서의 변화를 말합니다. x= a가 기준이므로 분모는 x의 미세한 변화량을 말하고 분자는 이때의 y값의 미세한 변화량을 의미합니다.

그런데, x = a 한점에서가 아니라 모든 점에서의 순간 변화율을 구하고 싶으면 어떻게 해야 할까요?

그냥 x를 특정 값(여기서는 a)으로 국한시키지 않고 x자체에 대해 일반적으로 순간변화율을 구하면 됩니다.

이상 미분에 대한 기본적인 개념이며 다음으로 합성함수의 미분이라는 것에 대해 알아보겠습니다.

y= 2x를 x로 미분하면 dy/dx = 2 입니다. 이 말은 x가 1 증가하면 y는 2배로 2 증가한다는 말입니다. 그렇다면 y = 2x를 2x로 미분하면 어떻게 될까요? 답은 dy/d(2x) = 1 입니다. 즉, y와 2x의 변화속도가 같다는 말입니다.

환이라는 말을 들어보셨죠? 함성함수의 미분에 대해 말씀드리겠습니다.  2x를 하나의 새로운 변수 t로 놓고 생각해보겠습니다(치환).
그러면 y=t, t=2x이므로 dt/dx = 2 이고, dy/dt=1 입니다. 즉, t의 변화량은 x의 2배이고 y의 변화량은 t와 같다는 말입니다. 즉, y의 변화량은 x의 변화량의 2배라는 의미입니다. 이를 식으로 나타내면 아래와 같습니다.

즉, 처음부터 y를 x로 직접 미분하는 것 보다는 중간에 다리를 두어서 단계적으로 미분을 구하는 것이 합성함수의 미분법입니다.

 

미분을 하는 이유는 해당 곡선의 기울기(slope)를 알기 위해서 입니다.

위의 그림을 보면 기울기가 ‘+’이면 녹색이 되고 ‘-‘이면 빨간색, 기울기가 ‘0’이면 검정색이 됩니다. 이러한 특성은 미분법을 통해 쉽게 알 수 있습니다.

따라서 미분법을 이해하려면 먼저 기울기부터 정의해야 합니다. 기울기는 일차 함수인 y=ax+b로 예를 들어 기울기를 정의하겠습니다.

식 (1)에서 x1이 x2로 가까이 가면 식(1)은  미분 혹은 미분값으로 정의할 수 있습니다. (식 (2))

여기서 차분(difference), 미분소(differential)와 미분법(differentiation)이라는 용어를 주의해야 합니다.  차분(difference)은 두 값을 뺀 차이를 뜻합니다. 즉, 아래 식 (3)와 같이 x2와 x1 사이의 간격을 의미합니다.

위의 차분에서 x1이 x2로 한없이 가까이 가면 이를 미분소(differential)라고 합니다. 즉, 미분소는 차분의 극한값입니다.

차분의 극한 개념으로 위의 식(2) 를 보면 x와 y에 대한 미분소의 비율로써 미분값을 정의할 수 있습니다. 미분법은 이런 미분값을 얻기 위한 과정입니다.

 

 

예를 들어, e=(a+b)*(b+1) 이런 공식을 생각해봅시다. 여기에는 세가지 연산이 있습니다. 두 개의 더하기와 하나의 곱하기가 있습니다. 이에 대해 이야기 하기 위해, 두개의 중간 변수 c와 d를 소개하겠습니다. c와 d는 각 연산의 결과값을 담는 변수입니다.  여기서

  1.  c = a + b
  2. d = b + 1
  3. e = c * d

이렇게 3가지 공식을 갖는다고 할 수 있습니다. 각각의 연산을 노드들로 표현(계산 그래프)하면 아래의 그림과 같이 표현할 수 있습니다.

 

입력 변수를 특정 값으로 설정하고 그래프를 통해 노드를 계산하여 표현식을 평가할 수 있습니다. 예를들어 a = 2 및 b = 1로 설정합니다.

위의 그래프에서 미분을 통해 이야기를 해보겠습니다. a 가 c에 미치는 영향을 알고 싶다면 a가 조금이라도 변한다면, c는 어떻게 변경 될까요? 이것을 a와 관련하여 c의 편미분이라고 부릅니다.

이 그래프에서 편미분을 계산하려면 합 규칙과 곱 규칙이 필요합니다.

 

아래 그래프는 각 하위 노드의 미분을 보여줍니다.

직접 연결되지 않은 노드가 서로 어떻게 영향을 미치는지 이해하려면 어떻게 해야할까요? e가 어떻게 영향을 받는지 생각해보겠습니다.  입력변수의 숫자들이 속도를 의미한다고 가정하겠습니다. a를 1의 속도로 변경하면 c는 1의 속도로 변경됩니다. c의 속도가 1로 변경되면 e가 2의 속도로 변경됩니다. 따라서 e는 a에 대하여 1*2의 비율로 변경됩니다.

일반적으로 한 노드에서 다른 노드로가는 모든 가능한 경로하여 각 경로의 하단에 있는 노드의 도함수(Derivates)를 함게 곱합니다. 예를 들어, b와 관련하여 e의 도함수를 얻기 위해서는 다음을 얻어야 합니다.

이것은 b가 c를 통해 e에 어떻게 영향을 미치는지, 그리고 b가 d를 통해 e에 어떻게 영향을 미치는지를 설명합니다.

이제 본론인 Back propagation으로 돌아와 보겠습니다. 아래와 같은 다층 퍼셉트론이 있다고 가정하겠습니다. 여기서는 역전파의 개념만 살펴볼 예정이므로 각 층에 존재하는 바이어스는 생략했습니다. 또한 용어의 통일성을 위해 입력층의 x1, x2는 a1(1), a2(1)로 표기하였습니다.

위의 그림에서 는 l층의 i번째 노드와  l+1층의 j번째 노드를 연결하는 가중치 w를 의미합니다.
위 구조에서 적용되는 활성 함수는 sigmoid 함수 φ입니다.

입력층 -> 은닉층 사이의 값의 흐름은 다음과 같습니다.

그리고 은닉층 -> 출력층 사이의 값의 흐름은 다음과 같습니다.

이와 같이 입력층의 a1(1), a2(1)을 시작으로 출력층의 a1(3), a2(3) 값이 출력되는 과정을 순전파(feedforward)라 부릅니다.

실제 값과 출력된 예측값[ a1(3), a2(3) ]  차이를 줄이기 위해 오차제곱합을 비용함수로 도입합니다.

비용함수 J를 오차제곱합으로 정의하면 아래의 식과 같이 됩니다.

여기서 y1, y2는 트레이닝 데이터에 대한 각 노드에 대응되는 실제 값을 의미합니다. 순전파 과정이 1회 마무리되면 J1과 J2의 값이 결정됩니다.
입력값 a1(1), a2(1)과 실제값 y1, y2는 고정된 값이므로 J1과 J2는 결국 가중치 w1,1(1) ~ w2,2(2)를 변수로 가지는 함수가 됩니다.
즉, J1과 J2의 값이 최소가 되도록 w1,1(1)~w2,2(2)를 결정해야합니다.

각 층에서 가중치를 업데이트하기 위해서는 결국 각 층에서의 비용함수의 미분 값이 필요합니다.

순전파에 있어서 가중치의 값을 매우 미세하게 변화시키면 비용함수 J1, J2도 매우 미세하게 변화됩니다. 매우 미세하게 변화시킨다는 것은 미분을 한다는 말입니다. 그런데, 매우 미세한 영역으로 국한할 때 가중치의 미세변화와 이에 따른 비용함수의 미세변화가 선형적인 관계가 된다고 알려져 있습니다(위의 그림 참조). 선형적인 관계라는 이야기는 결국 비용함수를 매우 미세하게 변화시키면 이에 따라 가중치도 매우 미세하게 변화되는데 이 역시 선형적인 관계라는 말입니다.

이런 원리에 의해, 순전파를 통해 출력층에서 계산된 오차 J1, J2의 각 가중치에 따른 미세변화를 입력층 방향으로 역전파시키면서 가중치를 업데이트하고, 도 다시 입력값을 이용해 순전파시켜 출력층에서 새로운 오차를 계산하고, 이 오차를 또 다시 역전파시켜 가중치를 업데이트 하는 식으로 반복합니다.

역전파를 이용한 가중치 업데이트 절차는 다음과 같이 요약될 수 있습니다.

  1. 주어진 가중치 값을 이용해 출력층의 출력값을 계산합니다(순전파).
  2. 오차를 각 가중치로 미분한 값을 기존 가중치에서 빼줍니다.
  3. 2번 단계는 모든 가중치에 대해 이루어집니다.
  4. 1~3단계를 주어진 학습횟수 만큼 또는 주어진 허용 오차값에 도달할 때까지 반복합니다.

2번 단계의 가중치 업데이트 식을 수식으로 표현하면 다음과 같습니다.

여기서 Jtotal은 해당 노드가 영향을 미치는 오차의 총합입니다. 예를 들면 출력층의 노드 al(3)에서는 다른 노드의 오차에 영향을 전혀 미치지 않으므로 해당 노드에서 오차인 J1만 따지면 되지만, 은닉층의 a1(2) 노드는 출력층의 a1(3), a2(3) 노드의 오차에 영향을 미치므로 J1, J2 모두 더한 것이 Jtotal 값이 됩니다.

앞서 말한것처럼 역전파의 개념을 살펴보는 것이기 때문에 편의상 η(learning rate)는 1로 설정하겠습니다.
먼저 가중치 w1,1(2)에 대해서 계산을 해보겠습니다.

w1,1(2)에 대한 업데이트 식은 아래와 같습니다.

미분의 연쇄법칙에 의해 오차의 가중치에 대한 미분값은 아래의 식으로 표현될 수 있습니다.

위의 식에서 우항에 있는 3개의 미분값을 하나하나 구해보도록 하겠습니다.
역전파의 출발노드인 a1(3)에서 Jtotal 값은 J1 입니다. 따라서 위의 식에서 우항은 아래와 같이 계산됩니다.

따라서

역전파에서 가중치 업데이트를 위해 사용되는 오차의 가중치에 대한 미분값이 결국 역전파의 출발 노드의 활성 함수 값, 도착 노드의 활성 함수 값, 그리고 실제 값만으로 표현되는 것을 알 수 있습니다.

위의 식의 우항에서 처음 두개의 식 값을 아래와 같이 δ1(3)으로 놓겠습니다.

역전파에 의해 업데이트 되는 w1,1(2)는 다음과 같습니다.

마찬가지 방법으로 w1,2(2)에 대한 업데이트 수식도 다음과 같습니다.

δ2(3)을 아래와 같은 수식으로 정의하고,

w2,1(2), w2,2(2)에 대해서도 계산을 해보면 아래와 같습니다.

출력층에서 은닉층으로 역전파를 통해 전달되는 값이 결국  δ1(3)과 δ2(3) 뿐이더라도 관련된 가중치를 업데이트하는데 충분하다는 것을 알 수 있습니다.

이제 은닉층에서 입력층으로 향하는 역전파를 통해 w1,1(1)의 값을 업데이트 해보겠습니다.

w1,1(1)을 업데이트 하기 위해서 a1(2)에서 Jtotal을 w1,1(1)로 편미분한 값을 계산하겠습니다. 앞선 적용한것과 같이 미분의 연쇄법칙을 활용하면 다음과 같은 식이 됩니다.

위에서 언급했듯이 a1(2)에서 Jtotal은 J1과 J2를 더한 값이 됩니다. 따라서 위 식의 우항의 첫 번째 편미분값은 아래와 같이 계산됩니다.

그런데 출력층-> 은닉층으로 역전파를 통한 가중치 계산시에 등장한 식들을 참고하여 계산하면

가 됩니다.

나머지 편미분 값은 앞서 계산한 값이므로 넘어가겠습니다.
w1,1(1)을 업데이트 하기 위한 편미분 값은 다음과 같습니다.

위 식의 오른쪽 항에서 처음 두 식을 δ1(2)로 놓겠습니다.

최종적으로 w1,1(1)의 업데이트 식은 아래와 같게 됩니다.

동일하게 w1,2(1)의 업데이트 식은 아래와 같습니다.

마찬가지로,  δ2(2)를 다음과 같이 두고,

w2,1(1), w2,2(2)에 대한 업데이트 식을 나타내면 다음과 같습니다.

따라서 모든 가중치에 대한 업데이트 식은 아래와 같이 표현할 수 있습니다.

지금까지 다룬 역전파 알고리즘 개념을 그림으로 도식화하여 나타내보면 아래와 같습니다.

이와 같이 순전파 -> 역전파 -> 가중치 업데이트 -> 순전파 … 로 계속 반복해나가면 오차값이 0에 가까워지게 됩니다.


출처

1 : http://darkpgmr.tistory.com/45
2: https://ghebook.blogspot.kr/2010/06/differentiation.html
3: http://colah.github.io/posts/2015-08-Backprop/
https://brunch.co.kr/@chris-song/22
4: http://blog.naver.com/PostView.nhn?blogId=samsjang&logNo=221033626685&categoryNo=87&parentCategoryNo=0&viewDate=&currentPage=1&postListTopCurrentPage=1&from=search&userTopListOpen=true&userTopListCount=10&userTopListManageOpen=false&userTopListCurrentPage=1

댓글 남기기