딥러닝 공부 - 신경망 첫걸음 정리_2
계층 3
이어서 3계층 신경망에 행렬곱을 적용해서 출력 값을 구해보자.
앞으로 계속 쓸거 같아 그려봤다.
이렇게 되었을때, 초기 Input Layer에 들어가는 값을 I_1 I_2 I_3라고 하자
그러면 Hidden Layer 에 들어가는 값은, X값은 전에 포스팅 했던 대로, X_hidden=I(입력값 행렬 I_1 ~ I_3) * W_input(input layer의 가중치 행렬, W_i(1,1) ~ W_i(3,3))이다.
그리고, Hidden Layer에서 나온 값 O_hidden= Sigmoid(X_hidden)이다 아름답지 않은가..
이제 X_output을 구해보자.
X_output = O_hidden * W_hidden(hiddden layer의 가중치 행렬, W_h(1,1) ~ W_h(3.3))이 된다.
그리고 최종 출력 값인 O_output = Sigmoid(X_output)이 된다.
굳이 하나의 식으로 정리하자면
즉 O_output = Sigmoid(Sigmoid(I*W_input)*W_hidden)이다. 솔직히 필요없다.
이런식으로 계속 다음 계층으로 노드로 값을 전달해 나가면 되는 것이다.
이렇게 다음 앞쪽 노드로, 계층으로 값을전달해나가는 방식을 전파법(순전파) (forward Propagation)이라고 한다.
(주의하자.. input layer에서는 sigmoid 함수를 적용시키지 않는다.)
4. 드디어 가중치 학습의 세계로
1) 여러노드에서 가중치 학습하기
그림으로 표현하면 다음과 같다. 그러면 여기서 나오는 오차는 어떻게 적용시켜야 할까?
기울기의 정도(비례해서)로 분배한다. 위 그림에서 나온 오차를 e이라고 하면 이때, 이전 계층, 즉 W_i가 적용되는 계층의 노드에는
가 이전 계층의 첫번째 노드에 적용될 것이고,
가 이전 계층의 두번재 노드에 적용된다.
지금 이걸로 어떻게 가중치를 바꾸는지 안나왔다고 흥분하지 말자. 나중에 나올거 같다. 지금은 어떻게 오차가 적용되는지가 중요하다.
그리고 이렇게 오차를 하나의 계층에서 이전 계층으로, 역으로 전파하는데 가중치를 이용하여 전파하는 방법을 역전파(back propagation)이라고 한다.
출력 계층의 노드수가 여러개라고 해도, 같은 방법으로 적용시키면 된다. 이것이 가중치를 학습의 기준으로 삼았을 때 좋은 점이다. 만약, 우리가 활성화 함수를 수정하는 것으로, 학습을 한다고 하면, 출력노드에서 나온 오차를 적용할때마다 다른 출력노드에 영향을 주는 것이므로, 원하는 결과를 얻기가 굉장히 어렵다. 가중치를 수정의 대상으로 하면, 하나의 출력노드에 따른 오차를 그 출력노드에 해당하는 가중치에 적용하고 다른건 다른 가중치에 적용하면 된다. 얼마나 편한가. 아름답다.
2) 다중 계층에서의 오차 역전파
이걸 행렬곱으로 나타내보자.
이다. 여기서 '은 _을 대체한다.
이를 더 간단히 해보자. 우리가 가중치에 비례해서 오류를 나누어 준다는 것의 목적은, 가중치가 큰 쪽에 더 많은 오류를 준다는 것을 의미하는 것 밖에 없다. 그러면 이렇게 할 수 도 있다.
분모를 없애버리는 것이다. 분모를 없애더라도 위의 목적(의미)는 달성할 수 있다. 바로 가중치가 더 큰 쪽에 상대적으로 많은 오류를 분배해주는 것이다. (실제로 이렇게 해도 신경망에 문제가 없다. 자세한 정보 : http://bit.ly/2m2z2YY)
그렇게 하면
이 된다. 훨씬 간단하다.
(아래내용 한번 더 확인하기+필기로 정리 하기)
그리고 이것의 앞 행렬(w'h(1,1)...w'h(2,2))은 앞서 사용해왔던 가중치의 전치(행렬의 행과 열을 바꿈)와 같다는 것을 알 수 있다. 따라서 이것을 기호로만 정리하면
Error_hidden=W_T(전치)_hidden_output * error_output 임을 알 수 있다.
오늘은 여기까지 하고 마치겠다. 앞으로 한개의 개념(이론)만이 남아있다. 바로 가중치 계산과 경사하강법이다. 마무리하고 실습으로 넘어갈 생각에 벌써부터 설랜다.