딥러닝 공부 - 신경망 첫걸음 정리_3_개념 마무리
오랜만의 포스팅이다. 그동안 바쁘기도 했고, 공부하는 내용이 쉽지는 않아, 이해하는데 시간이 걸렸다. 우선, 블로그에 올리기 전에 손으로 정리해서 17장으로 정리하였다. 오늘은 이전에 포스팅한 이후 공부한 내용을 정리 해볼 것이다. 이 포스팅까지는 이론, 다음 포스팅으로는 실전 적용(MNIST)를 포스팅하겠다. 하지만, 정리를, Jupyter Notebook에 대부분 해서 그것의 스크린 샷 혹은, 파일 공유로 대체하겠다.
경사하강법의 도입
끔찍 그 자체이다.
더군다나 이 출력을 바꾸려고 가중치를 수정하는 것은 정말 어렵다.
또 학습 값들이 오류를 포함하고 있는 경우도 있다. 이때 가중치를 수정하는 것은 더 어려워진다. 어떻게 input to hidden의 W1,1가중를 바꾸어야 output node1의 출력값이 0.5가 바뀔까?.. 수식으로?? 음.. 그리고 이것을 수정한다고 해도, 다른 output node에 영향을 준다. 말도 안된다. 그래서 경사하강법을 사용한다.
경사하강법 : 최저점을 수식으로 구하지 못하는 상황에서 최적의 최저점을 찾는 과정 ( 현재 위치보다 더 좋은 지점을 찾아나가는 방법을 사용함)
오차함수 (손실함수, Loss Function)
수식으로 Loss function 기울기구하기
좋다 결론이 났다. (위 과정을 이해하고 직접 한번 해보기 바란다. 진심 "와!"라는 감탄사가 안 나올 수가 없다.. 수학자들은 대단하고 미분과 행렬곱은 사랑이다.)
이다. 그림의 마지막의 오타는 이해바란다.. 어쩄든 위 수식이 결론이다.
이를 해석하자.
(T_k-O_k)^2는 E_k^2 을, Sigmoid(...)는 O_k를 의미한다. 이를 적용해서 다시 바꾸어보자.
가 된다. 얼마나 아름다운가..
이를 이제 행렬 곱으로 표현해보자. 위의것 까지는 아직 행렬곱은 아니다. 그저 j,k에 수를 대입하면 맞아떨어지는 수식이다.
이다. 이때, T는 전치를 의미한다. 우리가 보통 O를 행렬로 표기할때, 열로써 표기했는데, 여기서는 행으로 된 O가 필요했기에 전치를 적용했다.
이를 이제 오차 재분배로 나머니 모든 계층에 적용하면 된다.
이제, 새롭게 태어난 수정된 가중치 행렬을 구해보자.
이다. 이때 -는 기울기가 양수일때, 음수방향으로, 음수일때 양수방향으로 w값을 조정한다는 것을 의미한다.
더 풀어보자.
이다. 여기서 []안에 있는 것 전체와, (O_j)T가 행렬곱이다.
이를 모든 계층에 오차재분배에 따라 적용시키면 될 것이다. 아름답다.
지금까지를 정리하면
3. 학습
1) 에러값
2) 오차역전파 & 재조합 (목적 : 모든 layer의 node에 E를 만들자)
3) 각 노드 가중치 학습 --> 경사하강법 이용
이렇게 마무리 된다. 이것만 봐도 된다.
행렬에 대한 것을 더 말해보자면, W는 행의 목적지가 동일, 열의 출발지가 동일하고, I는 열로 되어있고, O또한 열로 되어있다.
학습 DATA 준비하기
우선 sigmoid함수의 특징을 보자.
1st. 1과 0을 점근선으로 가지고있다.
2nd. X값이 크면, 함수의 기울기가 작아진다 --> (delta)W_jk 에 sigmoid함수가 포함되어 영향을 미치므로, 가중치를 수정하는데 어려움이 생긴다. (W의 변화값이 매우 미흡)
가중치의 학습능력이 떨어지는 이것을 포화라고 한다(거기다, 이 sigmoid는 해당노드의 출력값에 영향을 주고 그는 다음 노드의 입력값의 일부가 되므로 심각한 문제이다.)
1. 입력값
점근선 너머의 값은 만들수가 없다. 따라서 0<I<1의 값이 안정하다 (혹은 -1<I<1, 0제외 )
(0이 포함되지 않는 것은, 가중치가 의미가 없어지기 때문)
2. 목표값
3. 가중치
4nd. 모든 가중치가 동일하면 안된다(이 경우를 대칭(symmetry)이라 하는데, 다음 계층의 모든 노드들이 같은 값을 받아 수정되는 값도 같아지는 사상초월의 사태가 발생한다.)