포뮬러를 사용한 모델 생성
신경망을 잘 사용하려면 데이터에 정규화를 적용한 뒤 신경망 모델을 만들어야 한다. 정규화가 절대적인 의무 사항은 아니지만 정규화를 적용하면 지역 해에 빠질 위험을 피한다.2
신경망은 가중치를 임의의 값으로 초기화한 후 반복적으로 가중치를 조절하면서 SSE 또는 엔트로피 기준을 최적화한다. 이처럼 반복적으로 답을 찾아가는 이유는 수식으로 단번에 최적의 가중치를 찾는 것이 어렵기 때문이다.
반복적인 탐색 과정은 가중치를 X 축, 최적화하는 대상을 Y 축에 놓고 그림을 그렸을 때, Y가 작아지도록 X 값을 약간씩 바꿔가는 것으로 이해할 수 있다. 예를 들어, 가중치가 그림 10-9의 ➊로 초기화됐다고 하자. 그러면 신경망 학습 알고리즘은 ➋ → ➌ → ➍ → ➎로 가중치를 바꿔가면서 Y 값을 점점 작아지게 만든다.
그러나 이 방법은 ➍ 이후 ➎로 가중치를 바꾸지는 않는다. 왜냐하면 ➎에서의 Y 값은 ➍에서의 Y 값보다 크기 때문이다. 그러나 전체 그림을 보면 Y가 최소가 되는 가중치는 ➎를 한참 지나 오른쪽에 있는 전역 해(global minimum)다. 결과적으로 이 학습 방법은 가중치의 초깃값이 무엇이었는지에 따라 최적의 X로 ➍를 출력할 수 있다.
➍는 그림 전체로 보았을 때는 최적 값이 아니지만 그림의 일부분만 보았을 때는 최적의 값이므로 지역 해라 한다. 반면 전역 해는 전체 그림을 보았을 때 Y를 최소로 하는 가중치다.
아래 예에서는 정규화 과정 없이 아아리스 데이터에 대한 신경망 모델을 만들었다.
> library(nnet) > m <- nnet(Species ~., data=iris, size=3) # 은닉층 노드 수 = 3 # weights: 27 initial value 209.776713 iter 10 value 68.839766 iter 20 value 68.325309 iter 30 value 48.408527 iter 40 value 11.403077 iter 50 value 7.095460 iter 60 value 6.106387 iter 70 value 5.988069 iter 80 value 5.965337 iter 90 value 5.959421 iter 100 value 5.958498 final value 5.958498 stopped after 100 iterations
아이리스 데이터 자신에 대한 예측 결과는 다음과 같다.
> predict(m, newdata=iris)
setosa versicolor virginica
1 9.999874e-01 1.263331e-05 3.959453e-28
2 9.999588e-01 4.118988e-05 7.729874e-27
3 9.999766e-01 2.335103e-05 1.855355e-27
4 9.999421e-01 5.786730e-05 1.817189e-26
5 9.999888e-01 1.119066e-05 2.918959e-28
...
146 8.955349e-19 1.350138e-05 9.999865e-01
147 1.310257e-15 1.087811e-03 9.989122e-01
148 1.559853e-15 1.208206e-03 9.987918e-01
149 4.507296e-19 8.928967e-06 9.999911e-01
150 2.071929e-13 2.276016e-02 9.772398e-01
만약 모델로부터 예측된 분류를 바로 얻고자 한다면 다음과 같이 type에 class를 지정한다.
> predict(m, newdata=iris, type="class")
지금까지 보인 방법은 nnet( )에 포뮬러를 지정한 형태였다. 포뮬러를 지정할 경우 nnet( )은 다음과 같이 동작하도록 되어 있다.
1. linout의 기본값이 FALSE므로 출력층에서 선형 함수가 아니라 시그모이드 함수가 사용된다.
2. 예측 대상이 되는 분류(즉, Y의 레벨)의 수가 2개라면 엔트로피를 사용해 파라미터가 추정된다. 분류의 수가 3개 이상이라면 SSE(Sum of Squared Errors)로 파라미터가 추정되며 소프트맥스가 적용된다.
2 신경망 뉴스 그룹에 올라온 FAQ(http://www.faqs.org/faqs/ai-faq/neural-nets/part2/)를 참고하기 바란다.