ABOUT ME

Contact.
Email:yj.anthonyjo@gmail.com
Introduce : CS Student.

Today
-
Yesterday
-
Total
-
  • 딥러닝 공부 - 신경망 첫걸음 정리_3_개념 마무리
    인공지능, 머신러닝 2020. 1. 29. 20:26
    반응형

    오랜만의 포스팅이다. 그동안 바쁘기도 했고, 공부하는 내용이 쉽지는 않아, 이해하는데 시간이 걸렸다. 우선, 블로그에 올리기 전에 손으로 정리해서 17장으로 정리하였다. 오늘은 이전에 포스팅한 이후 공부한 내용을 정리 해볼 것이다. 이 포스팅까지는 이론, 다음 포스팅으로는 실전 적용(MNIST)를 포스팅하겠다. 하지만, 정리를, Jupyter Notebook에 대부분 해서 그것의 스크린 샷 혹은, 파일 공유로 대체하겠다.



    경사하강법의 도입

    출력 값을 수식으로 구하는 것은 엄청난 짓에 가깝다. 너무 많은 가중치가 존재하고, 하나의 출력은 또 다른 입력이 되기 때문이다. 참고로 3계층 * 3개node의 출력은 다음과 같다.

    끔찍 그 자체이다.

    더군다나 이 출력을 바꾸려고 가중치를 수정하는 것은 정말 어렵다.

    또 학습 값들이 오류를 포함하고 있는 경우도 있다. 이때 가중치를 수정하는 것은 더 어려워진다. 어떻게  input to hidden의 W1,1가중를 바꾸어야 output node1의 출력값이 0.5가 바뀔까?.. 수식으로?? 음.. 그리고 이것을 수정한다고 해도, 다른 output node에 영향을 준다. 말도 안된다. 그래서 경사하강법을 사용한다. 


    경사하강법 : 최저점을 수식으로 구하지 못하는 상황에서 최적의 최저점을 찾는 과정 ( 현재 위치보다 더 좋은 지점을 찾아나가는 방법을 사용함)

    이는 미분, 편미분, 연쇄법칙을 이용한다. 그리고 이것을 증명하고 나면, 미분과 행렬을 사랑하게된다.

    경사하강법은, 오차함수를 두고, 오차값이 제일 낮을 때를 찾아가는 방식이다. 그리고 오차함수에 영향을 주는x축은 당연히 가중치이다. 이 가중치가 매우 많기 때문에 수많은 차원이 생겨난다. 그렇기에 편미분을 사용한


    다.

    오차함수 (손실함수, Loss Function)

    다양한 오차함수가 존재한다. 그런데 보통 많이 쓰는 것은 MSE(Mean Squard Error)이다. 이는, 말그대로 오차제곱 평균으로
    모든 출력노드 (T-O)^2, 즉 (목표-실제출력)^2의 합이 된다. 합으로 쓰는 것은 증명해보면 안다. 편미분으로 쓸데없는 값들은 다 날라간다. 얼마나 아름다운다.. 왜 학교에서 편미분과 연쇄법칙을 안 가르치는지 의문이 든다. 
    (굳이 MSE방식을 사용하는 것은, 이 오차함수를 사용할 때, 기울기가 완만하게되고, 첨점이 존재하지 않기 때문이다. 반례로, |T-O|를 사용하면, 첨점이 생기고, T-O을 사용하면, 합할때, 전체적인 오차가 상쇄되어 나타날 수 있다. )
    이 오차함수의 미분값, 기울기 값을 어떻게 사용하냐 하면, 다음 그림에 설명이 나와있다. 그래프를 그리고, 설명하기가 어렵다. 글씨가 안좋더라도..
    정리하자면, 오차함수의 기울기가 양수이면, 가중치 값을 음의 방향으로 움직일 때, 더 오차가 낮은 상태가 되고, 음수이면 가중치의 값을 양의방향으로 움직일 때, 더 낮은 오차의 상태가 된다.

    수식으로 Loss function 기울기구하기

    오차함수를 E라고 하자. 이때, 오차함수의 기울기는, 오차에 영향을 주는 것이, W가중치 이니, (delta)E / (delta)W_jk가 된다. k는 출력 계층이고, j는 이전 계층이다. 왜 k가 출력 계층이냐면, 오차는 실제로, 출력 계층에서만 존재하고, 다른 계층에서는 오차 재분배로 되기 때문이다.
    이를 계산해보자.

    좋다 결론이 났다. (위 과정을 이해하고 직접 한번 해보기 바란다. 진심 "와!"라는 감탄사가 안 나올 수가 없다.. 수학자들은 대단하고 미분과 행렬곱은 사랑이다.)

    이다. 그림의 마지막의 오타는 이해바란다.. 어쩄든 위 수식이 결론이다.

    이를 해석하자.

    (T_k-O_k)^2는 E_k^2 을, Sigmoid(...)는 O_k를 의미한다. 이를 적용해서 다시 바꾸어보자.

    가 된다. 얼마나 아름다운가..

    이를 이제 행렬 곱으로 표현해보자. 위의것 까지는 아직 행렬곱은 아니다. 그저 j,k에 수를 대입하면 맞아떨어지는 수식이다.

    이다. 이때, T는 전치를 의미한다. 우리가 보통 O를 행렬로 표기할때, 열로써 표기했는데, 여기서는 행으로 된 O가 필요했기에 전치를 적용했다.


    이를 이제 오차 재분배로 나머니 모든 계층에 적용하면 된다.


    이제, 새롭게 태어난 수정된 가중치 행렬을 구해보자.

    이때 우리는 학습률을 사용한다. 오버슈팅을 방지하기 위해서, 이는, 한번에 너무 많은 w값을 움직여, 최저 값을 지나친 경우를 막기 위해서이다. 이를 적용하면 다음과 같다. (alpha는 학습률이다)

    이다. 이때 -는 기울기가 양수일때, 음수방향으로, 음수일때 양수방향으로 w값을 조정한다는 것을 의미한다.

    더 풀어보자.

     이다. 여기서 []안에 있는 것 전체와, (O_j)T가 행렬곱이다.

    이를 모든 계층에 오차재분배에 따라 적용시키면 될 것이다. 아름답다.


    지금까지를 정리하면

    1. 뉴런은 어떤 원리인지는 모른다. 하지만, 우리는 그것을 따라할 것이다.(활성화 함수와, 계층의 노드들로)
    2. 가중치를 이용한 각 계층의 입력값(input값 제외, input은 input이다) (행렬 곱)과 출력값

    3. 학습

    1) 에러값 

     

    2) 오차역전파 & 재조합 (목적 : 모든 layer의 node에 E를 만들자) 

     

    3) 각 노드 가중치 학습 --> 경사하강법 이용

     

    이렇게 마무리 된다. 이것만 봐도 된다.


    행렬에 대한 것을 더 말해보자면, W는 행의 목적지가 동일, 열의 출발지가 동일하고, I는 열로 되어있고, O또한 열로 되어있다.





    학습 DATA 준비하기

    이제 모든 준비는 끝났다. DATA를 준비하자. 준비해야하는 DATA는 입력 값(I), 목표 출력값(T), 가중치(W)의 행렬이다.

    우선 sigmoid함수의 특징을 보자. 

    1st. 1과 0을 점근선으로 가지고있다.

    2nd. X값이 크면, 함수의 기울기가 작아진다 --> (delta)W_jk 에 sigmoid함수가 포함되어 영향을 미치므로, 가중치를 수정하는데 어려움이 생긴다. (W의 변화값이 매우 미흡)

    가중치의 학습능력이 떨어지는 이것을 포화라고 한다(거기다, 이 sigmoid는 해당노드의 출력값에 영향을 주고 그는 다음 노드의 입력값의 일부가 되므로 심각한 문제이다.)


    1. 입력값

    점근선 너머의 값은 만들수가 없다. 따라서 0<I<1의 값이 안정하다 (혹은 -1<I<1, 0제외 ) 

    (0이 포함되지 않는 것은, 가중치가 의미가 없어지기 때문)

    2. 목표값

    마찬가지로, 0<T<1로 지정한다. (마지막 출력은, sigmoid함수를 통해 나타나는데, 이는 0~1사이 이외 값은 출력 불가하다.)

    3. 가중치

    1st. 모든 계층의 각 노드는 다음 계층의 모든 노드에 연결된다. (FC,Fully Connected)
    2nd. 만약 한 노드에 들어오는 입력 값이 많다면, (이전계층의 노드 개수) 이 노드에 최종적으로 sigmoid함수에 적용되는 입력 값은, 그것들의 총합이므로, 포화가능성이 올라간다.
    3nd. 이 포화가능성을 낮추기 위해 가중치에서 해야될 것은, 들어오는 노드가 많다면, 가중치 초기화(가중치 초기 갑 지정) 범위를 0에 가깝게 하는 것이다. 이를 위해 수학자들은 다음과 같은 범위를 만들었다.

    4nd. 모든 가중치가 동일하면 안된다(이 경우를 대칭(symmetry)이라 하는데, 다음 계층의 모든 노드들이 같은 값을 받아 수정되는 값도 같아지는 사상초월의 사태가 발생한다.)

    이를 종합해보면, 가중치가 범위안에서 random하게 발생하게 되고, 이는 즉 평균이 0, 표준편차가 

    인 정규분포를 의미한다.


    이렇게 모든 개념정리가 완료되었다. 나머지는 실습이다. 

    지금 고등학생 입장에서 이해할 수 있는 것은 이정도가 끝일 것 같다. 우선, 모델들을 다루어보고 난 뒤에 더 심화적인 수학적 개념들을 학습하자.



    반응형

    댓글

Designed by Tistory.