과제로 MLP를 이용한 데이터 분류기를 구현해 보았습니다.
1. 설계 주제
동물의 특성 hair, feathers, eggs, milk, airborne, aquatic, predator, toothed, backbone, breathes, venomous, fins, legs, tail, domestic의 15가지 특징 벡터를 입력으로 받아 들여 어느 동물인지 구별하여 동물의 특징(서식지, 이동형태, 먹이)과 이름, 사진을 보여주는 분류기를 설계합니다.
2. 데이터 설명
입력 데이터는 100개이며, legs특성을 제외한 모든 특성은 참과 거짓을 나타내는 0, 1의 두 가지 값을 가지며 legs특성은 0, 2, 4, 5, 6 8의 값을 가집니다.
출력 데이터 또한 100개 이며 1개의 데이터마다 각 동물의 특징을 분류 할 수 있는 10개의 값을 가지고 있다. 값은 0.1과 0.9 두 가지입니다.
3. 분류기 설계
3.1 선택 이유
동물에 대한 특성을 입력하여 판별하기에 MLP(Multilayer Perceptron)는 학습 알고리즘으로서 어느 정도 성능이 좋은 오류 역전파 알고리즘을 사용하여 학습을 하고 많은 양의 데이터에 성능이 좋은 신경망 회로이기에 선택하게 되었습니다.
3.2 구조
MLP는 입력 층, 중간 층, 출력 층의 3가지 층으로 구성되어 있으며 중간층과 각 unit 의 입출력 특성을 비선형으로 함으로써 네트워크의 능력을 향상시킬 수 있습니다. 출력 값과 원하는 출력 값을 비교하여 그 차이를 감소시키는 방향으로 연결강도를 조정합니다.
3.3 구현
http://lcn.epfl.ch/tutorial/english/ 사이트의 C언어로 작성된 MLP를 이용한 빨간 망토라는 간단한 예제 프로그램을 바탕으로 WPF를 사용하여 C#언어로 구현하였습니다.
패턴수와 중간층 개수를 입력받아 초기화 시킬 수 있다. 학습 결과 확인을 쉽게 하기 위하여 동물 이름을 선택하면 동물의 속성을 보여주어 쉽게 속성을 체크할 수 있도록 하였습니다.
영어로 된 동물이름을 한글화 하였고 데이터 파일은 xml포맷을 사용하였습니다.
입력 값은 체크박스와 콤보박스로 여러 가지를 선택할 수 있게 하였습니다.
결과 값은 패턴 오류율, 오류율 0.01을 기준으로 학습 충분 패턴과 학습 필요 패턴을 구분하고 동물의 특징과 동물 사진을 보여줌으로써 결과 값을 확실하게 인식할 수 있도록 하였습니다. 빨간 망토 예제와 같은 정확성을 위하여 c#의 random함수와 exp함수를 사용하지 않고 c언어의 random함수와 exp함수를 dll로 만들어 import하여 사용하였습니다.
4. 실험
4.1 실험 데이터
100개의 입력 데이터는 ZOO 데이터 베이스를 사용하였고 본래 17가지 특성 중 마지막 2가지 특성의 의미를 파악하지 못해 2가지를 제외한 15가지 속성을 가지게 되었습니다.
100개의 출력 데이터는 각 동물의 특성을 나타낼 수 있도록 10가지로 분류하여 만들었습니다.
4.2 분류기 학습 및 학습 결과
입력데이터와 목표 출력데이터에 대하여 동물패턴을 학습시킨 결과는 다음과 같습니다.
중간층은 10개로 정하고 두 패턴씩만 검색해 보았습니다. 학습 횟수는 한번에 1000회 하였습니다.
- 처음화면
- 10패턴
학습횟수: 1000 학습횟수: 1000
송아지 검색 성공 메기 검색 성공
- 20패턴
학습 횟수: 1000 학습 횟수: 1000
돌고래 검색 성공 가제 검색 성공
- 30패턴
학습 횟수: 2000 학습 횟수: 3000
개구리 검색 성공 큰 박쥐 검색 성공
- 40패턴
학습 횟수: 18000 학습 횟수: 2000
홍학 검색 성공 고릴라 검색 성공
- 50 패턴
학습 횟수: 2000 학습 횟수: 32000
밍크 검색 성공 갈매기 검색 성공
- 60 패턴
학습 횟수: 14000 학습 횟수: 61000
염소 검색 성공 종달새 검색 성공
- 70 패턴
학습 횟수: 5000 학습 횟수: 83000
너구리 검색 성공 타조 검색 성공
- 80 패턴
학습 횟수: 1000 학습 횟수: 11000
해마 검색 성공 순록 검색 성공
- 90 패턴
학습 횟수: 15000 학습 횟수: 48000
작은 뱀 검색 성공 도둑 갈매기 검색 성공
- 100패턴
학습 횟수: 4000 학습 횟수: 12000
타조 검색 성공 백조 검색 성공
몇 십번의 실험을 하여 본 결과 대부분의 패턴들이 50000번 미만의 횟수로 학습이 되어 쉽게 검색 할 수 있었습니다. 학습 할수록 에러율이 감소 되었고 찾고자 하는 패턴의 값에 가까워 져 가는 걸 동물의 특징의 변화로 알 수 있었습니다.
패턴의 수가 증가할 수록 평균적으로 학습 횟수가 조금씩 증가 하였습니다. 하지만 간 혹 몇몇 패턴들은 오랜 학습 횟수에도 에러율이 감소하지 않고 일정 수준에서 맴돌았으며 검색이 되지 않았습니다. 또한 중간층의 개수가 증가 할수록 학습 속도가 감소 되어졌습니다.
4.3 실험 결과
패턴의 수가 증가 할 수 록 약간의 학습 횟수가 증가하였지만 대부분의 평균적 학습 횟수로 패턴을 찾을 수 있었습니다. 또한 학습 횟수에 따라 오류율이 줄어들면서 가까운 값을 찾아가는 것을 보고 오류역전파 알고리즘의 특징인 목표 출력 값에 가깝게 연결 강도를 조정하는 것을 볼 수 있었습니다. 그래서 많은 양의 데이터에 효율적인 MLP의 성능을 볼 수 있었습니다. 하지만 몇 몇 패턴들은 많은 학습 횟수에도 에러율이 줄지 않고 일정 수준에서 맴도는 현상으로 패턴을 찾지 못하여 오류 역전파 알고리즘의 문제점을 확인 할 수 있었습니다.
오인식의 이유는 오류역전파 알고리즘을 사용할 때 발생하는 다음 4가지 문제점과.
① 학습이 완료되기까지 많은 횟수의 반복학습이 필요.
② 응용분야에 따라 학습 파라미터의 조절이 필요.
③ 추가 학습시 전체적인 재학습이 필요.
④ 학습의 완료시점을 예측할 수 없음.
오류역전파 알고리즘의 문제점인 지역 최소점에 빠질 가능성이 있다는 점, 포화영역에서 잘 동작하지 않는다는 점, 신호기 입력에서 출력까지 한 방향으로만 흘러가는 전 방향 방식이라는 것입니다.
또한 중간층이 증가 할수록 학습 속도가 감소하는 것은 중간층이 있을 때 학습은 어려워 지기 때문이다. 왜냐하면 어떤 연결강도가 오차를 유발 시키는지 알 수 없기 때문입니다.
실험 결과가 간 혹 다른 동물이 나올 때가 있는데 입력 속성와 출력 속성이 같은 중복된 데이터가 몇 가지가 있어서 가장 나중에 일치하는 동물이 나오게 되는 것입니다.
실험결과 그래프는 다음과 같습니다.
5. 요약
MLP를 이용하여 15가지의 특성을 가지는 동물 입력패턴 100개와 이에 대응하는 목표 출력 패턴 100개를 학습시킨 후 찾고자 하는 동물의 특성을 입력하여 찾아내는 동물 분류기를 WPF를 사용하여 C#으로 구현하여 보았습니다. 입, 출력 데이터는 zoo 데이터베이스를 사용하여 분류기에 맞게 수정 및 생성하였습니다. 실험 결과 패턴이 증가함에 따라 학습 횟수도 조금씩 증가하였지만 대부분 평균적인 학습 횟수로 찾고자 하는 패턴을 검색할 수 있었습니다. 하지만 몇몇 패턴들은 일정 값에 머무르는 오류역전파 알고리즘의 문제점을 보였습니다.
또한 중간층이 많아짐에 따라 학습 속도가 감소가 감소함을 보였습니다. 이것은 중간층이 있으면 학습은 어려워 지기 때문입니다. 왜냐하면 어떤 연결강도가 오차를 유발 시키는지 알 수 없기 때문입니다.
오류역전파 학습 알고리즘은 다층의 구조를 갖는 복잡한 신경망 학습 알고리즘으로 최급하강법을 기본으로 한 매우 유용한 패턴인식 해법입니다.
하지만 문제점도 여러 가지 존재합니다.
지역 최소점에 빠질 가능성이 있다는 점, 포화영역에서 잘 동작하지 않는다는 점, 신호기 입력에서 출력까지 한 방향으로만 흘러가는 전 방향 방식이라는 것입니다.
또한 사용할 때 다음의 문제점이 있습니다.
① 학습이 완료되기까지 많은 횟수의 반복학습이 필요.
② 응용분야에 따라 학습 파라미터의 조절이 필요.
③ 추가 학습시 전체적인 재학습이 필요.
④ 학습의 완료시점을 예측할 수 없음.
1, 2 번을 해결하기 위한 해결방안으로는 일괄 수정법, 출력값의 제한, 모멘텀 방법, 수정 모멘텀 방법, 학습계수의 최적화 방법, 복잡도 방법, 선택적 재학습 방법, 연결강도 개수의 축소의 8가지 방법입니다. 하지만 3, 4번은 피할 수 없습니다.
이번 실험에서도 위와 같은 여러 가지 문제점이 발생하였습니다.
6. 소감
MLP를 구현하면서 많은 시행 착오가 있었지만 신경회로망에 대해 열심히 공부하고 조금이나마 알 수 있었던 좋은 시간이었습니다. 처음 C언어로 된 소스를 분석해서 C#으로 작성하고 입력데이터 한글화와 목표출력데이터 100개를 만드는데 2일정도의 시간이 소요되었습니다. 그 후에 많은 실험으로 잘못된 부분을 수정하고 수정해서 실험하게 되니 참으로 기뻤습니다. 이론적으로만 공부하던 내용을 직접 구현하고 실험해보니 재미도 있고 여러 가지 사실들에 대해 직접 느낄 수 있어서 재미있고 보람있는 시간이었습니다.
[ 시연영상 ]
전체 소스는 첨부파일을 다운 받으시면 됩니다.