신경망은 패턴인식에 자주 쓰인다. 예를들어 얼굴인식(facebook에서 딥러닝을 통해 얼굴 인식을 개발했다고 들었다.), 손글씨 인식, 이미지 인식에 사용된다.
싱글 퍼셉트론으로 간단하게 패턴을 인식을 해보겠다.
예를들어 먼저 2차원에서 y=2x+1 과 같은 하나의 함수가 있을 때, 위의 보이는 선을 기준으로 두 사이드로 나눌 수 있다.
이것이 간단하게 생각하면 점들을 분류, 인식하는 것으로 생각할 수 있다.
만약에 퍼셉트론에 x, y inputs이 들어 온다고 하면 processor와 activation function을 통해 -1과 1로 output을 낼 수 있다. 이렇게 나타난 것을 분류되었다고 할 수 있다.
앞에서 봤던 그림 처럼, 두개의 input이 들어와서 weight와 계산을 한수 processor & activation function을 통해 output을 생성한다.
하지만 여기에 약간의 문제점이 있다. 만약에 input으로 x=0, y=0으로 들어 오게 된다면 weight를 곱해도 항상 sum 값은 0이기 때문에 output이 0이다. 생각해보면 (0, 0)의 값도 2차원에서 라인의 위 또는 아래에 값이 있게 된다.
이러한 문제를 해결하기 위해 bias 를 input으로 추가해준다. why? 0이되는 것을 방지하기 위해~
bias값은 항상 1값이다. 그리고 이것 또한 weight가 추가되어 연산을 한다.
논문이나 돌아다니다 보면 위와 같은 그림을 보는데 bias에 대해서 이해가 잘 안갔다.
하지만 수식을 보면서 그림을 함께보면 이해가 쉽다.
input에 (0, 0)값이 들어 오면
0 * weight1 = 0 (Input 0)
0 * weight2 = 0 (Input 1)
1 * weight3 = weight3 (bias)
output값으로 위의 값을 더하면 bias와 weight값에 따라 1 or -1 값이 나와 라인의 위, 아래에 위치할 수 있다.
이것이 bias를 퍼셉트론에 추가하는 이유이다.
그럼 지금까지 이해한 것을 코드로 만들어 보겠다.
- #include <iostream>
- #include <random>
- using namespace std;
- class Perceptron{
- float *weights;
- public:
- Perceptron(int n)
- {
- weights = new float[n];
- random_device rd;
- mt19937_64 mt(rd());
- uniform_real_distribution<double> distribution(-1.0, 1.0);
- for(int i=0; i<sizeof(weights)-1; i++)
- {
- weights[i] = distribution(mt);
- }
- }
- int feedforward(float inputs[]){
- float sum = 0;
- for(int i=0; i<sizeof(weights)-1; i++){
- sum += inputs[i]*weights[i];
- }
- return activate(sum);
- }
- int activate(float sum){
- if(sum>0) return 1;
- else return -1;
- }
- };
- int main() {
- // your code goes here
- Perceptron p(3);
- float point[] = {10, -15, 1};
- int result = p.feedforward(point);
- cout << result << endl;
- return 0;
- }
line 8-18:퍼셉트론 클래스를 만들었다. 퍼셉트론에서 input의 수를 n으로 받는다.
line 11-17: weight에 -1~ 1 사이 랜덤 값을 넣는다. C++ 11 버전으로 오면서 새롭게 생긴 랜덤값을 생성하는 방법이다. 기존에 rand() 함수를 사용하는 것보다 다양하고 편하게 구현할 수 있다.
line 19-30: feedforward로 processor에 넣어 진행한다. activation 함수를 넣어 -1과 1 사이값을 반환
line 33: 퍼셉트론에 x, y, bias 를 넣을 inputs을 생성한다.
그림으로 그려보면
result = 1 or -1 값이 나올 것이다.
이렇게 나왔지만 아직 확률이 정확하지 않다. 뉴런네트워크의 특징 중 하나는 에러를 학습해서 정화도를 더 높일 수 있다는 것인데
그것은 다음에 이어서 ...
'IT > [Everyday]Coding' 카테고리의 다른 글
딥러닝_Neural Network_멀티 퍼셉트론 (0) | 2014.12.19 |
---|---|
딥러닝_Neural Network_퍼셉트론3 (0) | 2014.12.19 |
딥러닝_Neural Network_퍼셉트론 (0) | 2014.12.19 |
딥러닝_Neural Network_서론 (0) | 2014.12.19 |
퀵정렬 (Quick Sort) (0) | 2014.12.19 |