이번에는 퍼셉트론 학습 방법에 대해서 알아보고 그걸 더러운 C++로 구현해 볼껀데...그전에 신경망의 의한 패턴 분류가 어떻게 일루어 지는지를 살펴보자능. 이제 끝임 하악하악
페턴 분류
일단 페턴이란거 뭐냐믄.....어떤 오브젝트를 정량적으로 표현한거라구 한다능. 외우고 있긴 하지만 이게 뭔소린진 나도 가슴으로 느껴지진 않네 -_-;;; 아무튼 페턴은 크가 공간 페턴 spatial pattern 이랑 시변 페턴 temporal pattern 으로 구분된다능. 공간 페턴은 쉽게 말하면 그림, 그러니까 이미지이고 시변 페턴은 음성 신호, 심전도 파형같은 것들이라능.
페턴 분류 시스템은 아래 그림과 같은 걸로 구성되 있다능. 일단 그림을 보고 하나씩 살펴보자능.
입력은 그냥 입력이구....트랜스튜서 transducer 라는건 실 세계의 데이터를 입력받아서 뉴로 컴퓨터, 그러니까 신경망이 처리하기 용이한 형태로 변환하는 기능을 한다능. 디지털 데이터를 다루는 신경망이면 디지털로 바꾸고 아날로그 데이터를 다루는 신경망이면 아날로그로 바꾸는거라능. 트랜스튜서의 출력을 페턴 백터 pattern vector 라구 한다능.
요 페턴 백터를 가지구 바로 분류기 classifier 에 입력해도 상관은 업ㅂ지만 특징 추출기 feature extractor 를 한번 거쳐서 분류할 페턴들 간의 특징이 잘 드러나도록 하면 분류기의 성능을 더 높일 수 있따능. 이제 특징 추출기에서 뽑아낸 특징 백터를 분류기로 분류하면 되는거라능. 단층 신경망을 사용한 패턴 분류기는 대충 이런식이라능
입력층 뉴런은 n개고 그걸 m개의 클러스터로 분류하는 분류기의 그림이라능. 그래서 출력층 뉴런이 m개임. 아무튼 이 뉴런들의 출력값중에 가장 큰값을 선택해서 입력된 특징 백터 x가 어떤 클러스터에 속하는지를 판별해 내는거라능
신경망의 패턴 분류
이제 신경망이 페턴을 어떻게 분류해 내는지를 또 보자. 이거까지만 알아보구 퍼셉트론 만들어 볼꺼라능. n차원의 패턴 공간에서 요렇게 생긴 패턴 하나는 하나의 점으로 표시 할 수 있다능.
x = [ x1 x2 x3 ... xn ]
비슷한 페턴들은 패턴 공간에서 끼리끼리 뭉쳐있을꺼라능. 그러니까 대충 이런 그림이 나올꺼라능.
저 빨간선을 기준으로 페턴을 두 그룹 j랑 k로 으로 나눌 수 있다능. 저 빨간선을 판단면 decision surface 라고 한다능. 그그에서는 패턴 공간이 2차원이라 선으로 표현된거구 페턴이 n차원이라면 n차원 초평면 hyperplane 이 될꺼심. 그리구 이 판단면을 정의하는 함수를 판별 함수 discriminant function 라구 한다능.
d(x)를 판별 함수라고 치구 dk(x)랑 dj(x) 를 각 그룹에 속한 패턴 x의 판별 함수 값이라고 하자. 그러면 어떤 패턴 x가 다음 조건을 만족하면 k 그룹에 속해 있다고 할 수 있다능.
dk(x) > dj(x) j ≠ k, j = 1, 2, 3, ...... R
R 은 클러스터의 갯수라능. 만약 패턴들을 두개의 클러스터로 분류하는 경우일 때
d1(x) = d2(x) or d1(x) - d2(x) = 0
이 된다면 클러스터 1, 2의 경계면이기 때문에 어떤 클러스터에 속한다고 말할 수 업ㅂ게된다. 바루 위에 있는 식을 판변면이라구 한다능. 그러면 T가 0인 양극성 계단 함수를 쓰는 신경망으로 패턴을 두개로 분류한다고 해보자. 입력 패턴이 클러스터 1에 속해면 +1, 클러스터 2에 속하면 -1 이라구 가르치면 될꺼라능.
입력 가중합은 NET는 이렇게 되고
NET = x · w
= x1*w1 + x2*w2 + x3*w3 ..... xn*wn + b
NET > T인 영역이랑 NET < T인 영역의 경계면은 요렇게 된다능
x1*w1 + x2*w2 + x3*w3 ..... xn*wn + b = 0
어떠냐능. 평면의 방정식 아니냐능. 요게바루 판단면....그러니까 저 빨간선이 되는거심. 그럼 이제 손으로 신경망을 한번 만들어 보자능.
2차원 패턴 공간에 패턴 4개가 있고 두개로 분류도 있다능. 빨간선은 대충 그어 봤다능.
입력 페턴
[ x1 x2 ]
클러스터
A [ 0 0 ]
0
B [ 1 0 ]
0
C [ 0 1 ]
0
D [ 1 1 ]
1
보면 알겠지만 AND의 진리표임 >_<. 대충 끄셔놓은 빨간선이 새로축 x2 하고 만나는 값을 1.5라고 하고 가로축 x1하고 만나는 값을 1.5 라고하고 기울기를 -1 이라고 치면.....
x2 = -x1 + 1.5
x1 + x2 - 1.5 = 0
이걸 가지고 신경망을 설계해보면....
요렇게 나온다. 그럼 다음 패턴을 또 해보자. 이번꺼는 XOR의 패턴이라능.
죽어따 깨나도 직선 하나로는 세모랑 네모를 구별할 수 업ㅂ다. 이렇게 직선 하나로 분리가 불가능한 경우를 선형 분리 불가능 linear non-separable 라고 한다. 반면 AND와 같은 경우 처럼 분리가 가능한 경우를 선형 분리 가능 linear separable 이라고 한다능.
벌써 눈치깠겠지만....단층 신경망은 선형 분리 불가능한 페턴을 분류해 낼 수가 업ㅂ다능. 이 경우에는 신경망을 다층으로 만들어서 은닉층에서 원래의 페턴 공간을 선형 분리 가능한 공간으로 맵핑 시킨후에 분리를 해내야 된다능. 이 정도로만 하구 다층 신경망 얘기는 나중에 기회가 되면 또 하자능.
퍼셉트론 Preceptron 학습법
누가 퍼셉트론을 처음 제안 했는지 같은 구질 구질한 역사 얘기는 건너 뛰고.....원래 퍼셉트론은 수용층, 연합층, 반응층 3계층으로 구성된 신경망인데 수용층은 별루 하는일이 업ㅂ어서 수용층이랑 연합층을 하나루 합칠수가 있다능. 그래서 생긴건 이렇게 생겼다능.
전에 봤던 그림이라능. 데헷 >_<. 아무튼 퍼셉트론 학습법에는 이진 활성화 함수랑 연속 활성화 함수 둘다를 쓸 수 있다능. 초기 연결 강도는 임의의 작은 값으로 설정하면 되구 학습 신호 γ 는 아래 처럼 구할 수 있다능.
간단하네. 신선함! 목표치 d랑 실제 출력 y의 오차를 학습 신호로 쓸 고 있음. 아무튼 k 단계의 연결 강도 변화량은 아래 처럼 구할 수 있다능.
N은 입력의 갯수고 M은 뉴런의 갯수라능. a는 학습률 α고 activation_function은 활성함수로 사용할 함수의 함수 포인터라능. 생성자에서 각 뉴런들의 연결강도를 바이어스의 연결강도까지 포함한 N+1개의 랜덤값으로 초기화 해줬다능. RandomGenerator 는 요렇게 생겼심.
안녕하세요~!! 인공지능 배우고 있는 학생입니다.
우연히 퍼셉트론 자료찾다가 블로그 오게되었는데요~!!
한번 실행해보고 싶어서 루비 설치하고 Ruby/Sdl 도 설치하고 나서
ruby init.rb 하면
./game_engine/GameEngine.rb:30:in `run': undefined method `poll' for SDL::Event
Class (NoMethodError)
from init.rb:18
이렇게 에러가 나거든요,, 왜 그럴까요?
참고로 루비는 1.86 윈도우 버전 설치했구요
SDL은 rubysdl-1.3.1-mswin32-1.8.6-p36 이걸로 설치했습니다.
시험기간이지만 포스팅은 하고 싶었고......그래서 소스 코드만 올린다능.
시험 끝나고 퍼셉트론 학습법에 대해서 주저리 해볼꺼라능
루비로 구현했고....or-gate의 진리표를 학습패턴으로 사용해 학습시켰다. 따라서 입력 뉴런은 두개 출력 뉴런은 하나라능
양극성 계단함수를 활성함수로 사용했다. (1은 1로 -1은 0으로 보고 페턴을 이해하면 된다능)
3회 학습시킨 결과 or-gate를 완전히 학습시키는데 성공했다. 가끔 2회만에 끝나기도 한다. ^^
댓글을 달아 주세요