본문 바로가기
IT/[Everyday]Coding

딥러닝_Neural Network_퍼셉트론2

by Jang HyunWoong 2014. 12. 19.

신경망은 패턴인식에 자주 쓰인다. 예를들어 얼굴인식(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를 퍼셉트론에 추가하는 이유이다. 

 

그럼 지금까지 이해한 것을 코드로 만들어 보겠다.  

  1. #include <iostream>
  2. #include <random>
  3. using namespace std;
  4.  
  5. class Perceptron{
  6. float *weights;
  7. public:
  8. Perceptron(int n)
  9. {
  10. weights = new float[n]; 
  11. random_device rd;
  12. mt19937_64 mt(rd()); 
  13. uniform_real_distribution<double> distribution(-1.0, 1.0); 
  14. for(int i=0; i<sizeof(weights)-1; i++)
  15. {
  16. weights[i] = distribution(mt);
  17. }
  18. } 
  19. int feedforward(float inputs[]){
  20. float sum = 0;
  21. for(int i=0; i<sizeof(weights)-1; i++){
  22. sum += inputs[i]*weights[i];
  23. }
  24. return activate(sum);
  25. }
  26. int activate(float sum){
  27. if(sum>0) return 1;
  28. else return -1;
  29. }
  30. };
  31. int main() {
  32. // your code goes here
  33. Perceptron p(3);
  34. float point[] = {10, -15, 1};
  35. int result = p.feedforward(point); 
  36. cout << result << endl;
  37. return 0;
  38. }

 

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