-
딥러닝 공부 - 신경망 첫걸음 정리_2인공지능, 머신러닝 2020. 1. 22. 04:22반응형
계층 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) 여러노드에서 가중치 학습하기
전에 선형함수의 기울기를 이용해서 분류자를 만들고, 기울기를 수정해 나감으로써, 학습을 해나갔다.그때는 선형함수 1개의 경우였다. 즉 1개의 노드가 다음 1개의 노드에 영향을 주는 가중치가 하나인 것과 같다. 우리는 오차를 이용한다. 이전에 선형함수 분류자에서도, 오차를 활용해 기울기(가중치 값)을 수정해나갔다.그렇다면 여러개의 노드가 다음 1개의 노드에게 영향을 준다면 어떻게 해야할까?그림으로 표현하면 다음과 같다. 그러면 여기서 나오는 오차는 어떻게 적용시켜야 할까?
기울기의 정도(비례해서)로 분배한다. 위 그림에서 나온 오차를 e이라고 하면 이때, 이전 계층, 즉 W_i가 적용되는 계층의 노드에는
가 이전 계층의 첫번째 노드에 적용될 것이고,
가 이전 계층의 두번재 노드에 적용된다.
지금 이걸로 어떻게 가중치를 바꾸는지 안나왔다고 흥분하지 말자. 나중에 나올거 같다. 지금은 어떻게 오차가 적용되는지가 중요하다.
그리고 이렇게 오차를 하나의 계층에서 이전 계층으로, 역으로 전파하는데 가중치를 이용하여 전파하는 방법을 역전파(back propagation)이라고 한다.
출력 계층의 노드수가 여러개라고 해도, 같은 방법으로 적용시키면 된다. 이것이 가중치를 학습의 기준으로 삼았을 때 좋은 점이다. 만약, 우리가 활성화 함수를 수정하는 것으로, 학습을 한다고 하면, 출력노드에서 나온 오차를 적용할때마다 다른 출력노드에 영향을 주는 것이므로, 원하는 결과를 얻기가 굉장히 어렵다. 가중치를 수정의 대상으로 하면, 하나의 출력노드에 따른 오차를 그 출력노드에 해당하는 가중치에 적용하고 다른건 다른 가중치에 적용하면 된다. 얼마나 편한가. 아름답다.
2) 다중 계층에서의 오차 역전파
앞서서는 입력 계층과 출력계층만 있는 경우를 보았다. 그러면 은닉계층(Hidden Layer)가 있는 신경망에서는 어떻게 적용될까?중요한 사실이 있다. 우리는 학습데이터를 가지고 머신러닝을 돌리고, 목표값(정답)과 실제출력을 비교해서 오차를 구한다 (e=t-실제 출력) 그리고 이 e는 안탑깝게도, 최종적으로 출력 계층의 노드에서 어떤 값이 나와야 하는지(목표값, 정답)과 오차만 알려준다. 그리고 Layer 2 ~ Output Layer 바로 전까지의 노드에서 어떤 값을 원하는 지는 안알려준다.(오차도 당연히..)그래서 우리는 차선책을 쓴다.위에서, 가중치의 비례해서 오차를 나누어준다고 했다. 그러면 그 오차들이 분배된 후 이전 계층에 하나의 노드에 적용되는 오차를 더해서 사용하면된다. 아래 예시를 보자. 이것만큼은 절대 컴퓨터로 그릴수가 (아니 그릴수는 있는데, 정말로 귀찮다.) 없다.이걸 행렬곱으로 나타내보자.
매우중요한 개념!! (이라고 생각한다)이렇게 행렬곱으로 표현하는 방식을 벡터화한다(vectorize)라고 한다. (드디어 밝혀진 벡터화(정말 많이 봤고 접했지만 뭔지 몰랐던..))간단하다.위에 사용한 문자, 기호를 사용하겠다.이다. 여기서 '은 _을 대체한다.
이를 더 간단히 해보자. 우리가 가중치에 비례해서 오류를 나누어 준다는 것의 목적은, 가중치가 큰 쪽에 더 많은 오류를 준다는 것을 의미하는 것 밖에 없다. 그러면 이렇게 할 수 도 있다.
분모를 없애버리는 것이다. 분모를 없애더라도 위의 목적(의미)는 달성할 수 있다. 바로 가중치가 더 큰 쪽에 상대적으로 많은 오류를 분배해주는 것이다. (실제로 이렇게 해도 신경망에 문제가 없다. 자세한 정보 : http://bit.ly/2m2z2YY)
그렇게 하면
이 된다. 훨씬 간단하다.
(아래내용 한번 더 확인하기+필기로 정리 하기)
그리고 이것의 앞 행렬(w'h(1,1)...w'h(2,2))은 앞서 사용해왔던 가중치의 전치(행렬의 행과 열을 바꿈)와 같다는 것을 알 수 있다. 따라서 이것을 기호로만 정리하면
Error_hidden=W_T(전치)_hidden_output * error_output 임을 알 수 있다.
오늘은 여기까지 하고 마치겠다. 앞으로 한개의 개념(이론)만이 남아있다. 바로 가중치 계산과 경사하강법이다. 마무리하고 실습으로 넘어갈 생각에 벌써부터 설랜다.
반응형'인공지능, 머신러닝' 카테고리의 다른 글
딥러닝 공부 - 신경망 첫걸음 정리_5_실습_Numpy, Matplotlib, Class (0) 2020.01.30 딥러닝 공부 - 신경망 첫걸음 정리_4_실습_여담 (jupyter notebook 자동화, 자동실행) (0) 2020.01.29 딥러닝 공부 - 신경망 첫걸음 정리_3_개념 마무리 (0) 2020.01.29 딥러닝 공부 - 신경망 첫걸음 정리 (0) 2020.01.19 Andrew ng교수님 강의 내용 복습 및 정리 1. What is Machine Learning? (0) 2020.01.18