'신경망/퍼셉트론'에 해당되는 글 4

  1. 2009/01/09 단층 신경망 (5)
  2. 2009/01/07 신경망의 분류와 학습 (2)
  3. 2009/01/06 생물학적 신경망과 인공 신경망 (5)
  4. 2008/12/29 뉴로 컴퓨터 개요 (2)
 

단층 신경망

신경망/퍼셉트론 | 2009/01/09 16:50 | Posted by DMW
크리에이티브 커먼즈 라이선스
Creative Commons License
 이번에는 퍼셉트론 학습 방법에 대해서 알아보고 그걸 더러운 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 단계의 연결 강도 변화량은 아래 처럼 구할 수 있다능.

k+1 단계의 연결 강도는 아래처럼 구하면 된다능.

다 끝났음. 이제 구현하면 된다능 >_<. 구체적인 프로세스는 http://www.filepang.co.kr/entry/퍼셉트론-학습-알고리즘 여기 나와 있으니까 꼭 보라능.

구현

 먼저 NeuralNetwork 라는 이름의 namespace를 하나 열구 클래스를 만들자능. 그리구나서 생성자에서 연결강도를 초기화 하면 되겠심.

namespace NeuralNetwork {
    template<int N, int M>
    class Perceptron{
    public:
        Perceptron(double (*activation_function)(double), double a = 0.1) {
            this->a = a;
            this->activation_function = activation_function;

            for (int i = 0; i < M; i++){
                weights[i].resize(N + 1);
                std::generate_n(weights[i].begin(), N + 1, RandomGenerator(-0.1, 0.1));
            }
        }
    private:
        std::vector<double> weights[M];
        double (*activation_function)(double);
        double a;
    };
}

 N은 입력의 갯수고 M은 뉴런의 갯수라능. a는 학습률 α고 activation_function은 활성함수로 사용할 함수의 함수 포인터라능. 생성자에서 각 뉴런들의 연결강도를 바이어스의 연결강도까지 포함한 N+1개의 랜덤값으로 초기화 해줬다능. RandomGenerator 는 요렇게 생겼심.

1
2
3
4
5
6
7
8
9
10
namespace NeuralNetwork {
    struct RandomGenerator {
        RandomGenerator(double _min = 0.0, double _max = 0.1) : min(_min), max(_max) {}
        double operator()(void) {
            double random = std::rand() / RAND_MAX;
            return random * (max - min) - min;
        }
        double min, max;
    };
}

T가 0인 양극성 계단 함수도 만들자능.

1
2
3
4
5
6
7
namespace NeuralNetwork {
    double bipolar_step_function(double x){
        if (x >= 0.0)
            return 1.0;
        return -1.0;
    }
}

이제 신경망의 출력을 구하는 함수를 만들어 보자능.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
namespace NeuralNetwork {
    template<int N, int M>
    class Perceptron{
    public:
        template<typename T>
        void recall(T input_begin, T input_end) {
            for (int i = 0; i < M; i++) {
                output_pattern[i] = std::inner_product(weights[i].begin(), weights[i].begin()+N, input_begin, 0.0);
                output_pattern[i] += weights[i][N] * 1.0;

                output_pattern[i] = activation_function(output_pattern[i]);
            }
        }
    public:
        double output_pattern[M];
    };
}

패턴 x를 받아서 가중합을 구하는데...입력에는 바이어스를 포함하지 않아도 되도록 했다능.

output_pattern[i] = std::inner_product(weights[i].begin(), weights[i].begin()+N, input_begin, 0.0);

바어어스를 제외한 가중합을 구하고...

output_pattern[i] += weights[i][N] * 1.0;
output_pattern[i] = activation_function(output_pattern[i]);

바이어스까지 포함시킨후에 출력값을 구했다능. 출력 output_pattern은 getter를 만들기 귀차느니까 public 으로 했다능. 이제 퍼셉트론 학습 방법을 사용해서 학습 시킬는 함수를 만들면 된다능.

namespace NeuralNetwork {
    template<int N, int M>
    class Perceptron{
    public:
        template<typename T>
        double learn(T input_begin, T input_end, T desired_being, T desired_end) {
            recall(input_begin, input_end);	                                        
            double error = hamming_distance(output_pattern, output_pattern + M,
                                            desired_being, desired_end);	        

            for (int i = 0; i < M; i++) { 			
                int j;
                double r = *(desired_being+i) - output_pattern[i];	

                for (j = 0; j < N; j++)
                    weights[i][j] += a * r * *(input_begin+j);		
                weights[i][j] += a * r * 1;                         
            }

            return error;
        }
    };
}

 파라미터로 패턴 x랑 기대하는 값 d를 입력 받았다능. 그리고나서 위에 링크에 있는데로 패턴 x를 입력으로 하는 출력을 구해내고 구해진 출력을 가지고 학습신호 γ를 구했심. γ랑 r이랑 비슷하게 생겼길래 학습 신호의 변수 이름은 r로 했다능.

recall(input_begin, input_end);

 출력을 구해나는 코드고 외부에서 학습이 얼마나 진행됐는지 알 수 있도록 현재의 출력과 기대값과의 오차를 계산해서 리턴하도록 해줬다능. 오차는 해밍 거리를 사용해서 구해냈다능.

double error = hamming_distance(output_pattern, output_pattern + M, desired_being, desired_end);

안에 있는  for문이 실제 학습을 진행 시키는 부분이라능. 출력층의 모든 뉴런들에서 학습 신호를 구해내고 바이어스를 포함한 모든 연결 강도를 변경한다능.

double r = *(desired_being+i) - output_pattern[i];

for (j = 0; j < N; j++)
    weights[i][j] += a * r * *(input_begin+j);
weights[i][j] += a * r * 1;

 마찬 가지로 learn 함수를 사용할때도 입력 패턴에 바이어스를 포함시키지 않도록 했기 때문에....바이어스 연결 강도는 내부 for 문에서 빼내서 따로 구했다능. 저렇게 밖에 못하겠더라능 -_-;;

전체 소스코드랑 OR 게이트의 학습 결과라능.

#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
#include <ctime>
#include <cmath>

namespace NeuralNetwork {
    struct RandomGenerator {
        RandomGenerator(double _min = 0.0, double _max = 0.1) : min(_min), max(_max) {}
        double operator()(void) {
            double random = std::rand() / RAND_MAX;
            return random * (max - min) - min;
        }
        double min, max;
    };

    template<typename T>
    double hamming_distance(T input_begin, T input_end, T desired_begin, T desired_end) {
        double distance = 0.0;

        for (; input_begin != input_end && desired_begin != desired_end; ++input_begin, ++desired_begin)
            distance += std::pow(*desired_begin - *input_begin, 2);

        return std::sqrt(distance);
    }

    double bipolar_step_function(double x){
        if (x >= 0.0)
            return 1.0;
        return -1.0;
    }

    double bipolar_sigmoid_function(double x){
        return (1.0 - std::exp(-x)) / (1.0 + std::exp(-x));
    }

    template<int N, int M>
    class Perceptron{
    public:
        Perceptron(double (*activation_function)(double), double a = 0.1) {
            this->a = a;                                            // learning rate
            this->activation_function = activation_function;        // activation functoin

            // initialize weights include bias
            for (int i = 0; i < M; i++){
                weights[i].resize(N + 1);
                std::generate_n(weights[i].begin(), N + 1, RandomGenerator(-0.1, 0.1));
            }

            std::fill(output_pattern, output_pattern + M, 0.0);     // initialize output
        }
        ~Perceptron() {}

        template<typename T>
        void recall(T input_begin, T input_end) {
            for (int i = 0; i < M; i++) {
                output_pattern[i] = std::inner_product(weights[i].begin(), weights[i].begin()+N, input_begin, 0.0);
                output_pattern[i] += weights[i][N] * 1.0;

                output_pattern[i] = activation_function(output_pattern[i]); // compute output
            }
        }

        template<typename T>
        double learn(T input_begin, T input_end, T desired_being, T desired_end) {
            recall(input_begin, input_end);	                                        // compute output
            double error = hamming_distance(output_pattern, output_pattern + M,
                                            desired_being, desired_end);	        // compute error

            for (int i = 0; i < M; i++) { 			// for all neurons in output layer
                int j;
                double r = *(desired_being+i) - output_pattern[i];	// compute learning signal

                for (j = 0; j < N; j++)
                    weights[i][j] += a * r * *(input_begin+j);		// compute delta_w and update weight
                weights[i][j] += a * r * 1;                         // update weight of bias
            }

            return error;
        }

    private:
        std::vector<double> weights[M];
        double (*activation_function)(double);
        double a;

    public:
        double output_pattern[M];
    };
}

int main(void)
{
    using namespace std;
    using namespace NeuralNetwork;

    srand(time(NULL));

    const int n = 2;
    const int m = 1;

    Perceptron<n, m> net(bipolar_step_function, 0.3);

    double input_pattern[4][n] = { {-1.0, -1.0}, {-1.0, 1.0}, {1.0, -1.0}, {1.0, 1.0} };
    double desired_pattern[4][m] = { {-1.0}, {1.0}, {1.0}, {1.0} };

    cout.precision(5);
    cout << showpoint << showpos;
    cout << "before learning...." << endl;

    for (int i = 0; i < 4; i++) {
        net.recall(input_pattern[i], input_pattern[i]+n);

        cout << "    [ ";
        copy(input_pattern[i], input_pattern[i]+n, ostream_iterator<double>(cout, " "));
        cout << "] : ";

        copy(net.output_pattern, net.output_pattern+m, ostream_iterator<double>(cout, " "));
        cout << endl;
    }

    cout << "\ntraining...." << endl;

    cout << noshowpos;
    for (int i = 0; i < 200; i++) {
        double error = 0.0;

        for (int j = 0; j < 4; j++)
            error += net.learn(input_pattern[j], input_pattern[j]+n,
                                desired_pattern[j], desired_pattern[j]+m);

        cout << "    #"  << i << " : error : " << error << endl;

        if (error == 0.0) {
            cout << "    Traning complete" << endl;
            break;
        }
    }

    cout << "\nafter learning...." << endl;
    cout << showpos;

    for (int i = 0; i < 4; i++) {
        net.recall(input_pattern[i], input_pattern[i] + n);

        cout << "    [ ";
        copy(input_pattern[i], input_pattern[i]+n, ostream_iterator<double>(cout, " "));
        cout << "] : ";

        copy(net.output_pattern, net.output_pattern+m, ostream_iterator<double>(cout, " "));
        cout << endl;
    }

    return 0;
}


Output:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
before learning....
    [ -1.0000 -1.0000 ] : -1.0000 
    [ -1.0000 +1.0000 ] : +1.0000 
    [ +1.0000 -1.0000 ] : +1.0000 
    [ +1.0000 +1.0000 ] : +1.0000 

training....
    #0 : error : 0.0000
    Traning complete

after learning....
    [ -1.0000 -1.0000 ] : -1.0000 
    [ -1.0000 +1.0000 ] : +1.0000 
    [ +1.0000 -1.0000 ] : +1.0000 
    [ +1.0000 +1.0000 ] : +1.0000 

웃기게도 초기연결강도가 분리에 성공했음 -_-;;
저작자 표시 비영리 동일 조건 변경 허락

'신경망 > 퍼셉트론' 카테고리의 다른 글

단층 신경망  (5) 2009/01/09
신경망의 분류와 학습  (2) 2009/01/07
생물학적 신경망과 인공 신경망  (5) 2009/01/06
뉴로 컴퓨터 개요  (2) 2008/12/29

댓글을 달아 주세요

  1. Favicon of http://eufonius.tistory.com BlogIcon prismatic 2009/01/09 18:01  댓글주소  수정/삭제  댓글쓰기

    우와 코드 길어! 루비로 반정도 하지 않았나요?!

    여튼 너무 감사합니다 ㅠㅜ 감동했음! 열심히 읽을게요!

  2. Favicon of http://blog.bab2min.pe.kr BlogIcon ∫2tdt=t²+c 2009/01/12 22:35  댓글주소  수정/삭제  댓글쓰기

    와우 이제 나도 신경망 프로그래밍을 하는건가ㅎㅎㅎ

신경망의 분류와 학습

신경망/퍼셉트론 | 2009/01/07 08:33 | Posted by DMW
크리에이티브 커먼즈 라이선스
Creative Commons License
 플라스틱흉의 기대에 부흥하고자 쓰기 시작한 신경망 이론에 관한 글들이 거의 끝나가고 있다. 이번에 신경망의 분류랑 학습에 대해서 알아보구, 다음글에서 신경망 모델중에 하나인 퍼셉트론을 구현해볼꺼다. 그러면 끝이라능.

신경망의 분류

지금까지 나온 신경망 모델은 디게 많은데 아래와 같은 조건들로 구별해 볼 수 있다능

1. 계층수 : 단층 구조, 다층 구조
2. 출력 형태 : 순방향 구조, 순환 구조
3. 데이터 유형 : 디지털, 아날로그
4. 학습 방법 : 지도 학습, 자율 학습, 경쟁식
5. 활성화 함수 : 단극성, 양극성

이제 이것들에 대해서 하나씩 살펴볼꺼라능.

먼저 계층수에 대해서 살펴보자. 신경망은 계층 layer 의 수에 따라 단층과 다층으로 나뉜다. 일단 그림을 보자능



 단층 single-layer 신경망은 가장 단순한 구조로 입력층 input layer 하구 출력층 output layer 으구 구성되 있다. 입력층 X는 외부로부터 입력을 받아들이는 역활을 하고 출력층 Y로 신경망에서 처리된 결과가 출력된다. 단층 신경망의 출력 y1....ym 은 이렇게 구한다. wij는 입력층 뉴런 j랑 출력층 뉴런 i와의 연결강도다.


 다층 multi-layer 신경망 은 단층 신경망보다 계층의 수가 더 많다. 당연한가 -_-;;;;......아무튼 입력층과 출력층 사이의 계층을 은닉층 hidden layer 라구 하는데 신경망의 외부에서는 이게 있는지 업ㅂ는지 확인할 방법이 업ㅂ어서 그렇게 부른다. 그림에는 은닉층이 하나 밖에 업ㅂ지만 몇개가 되도 상관은 업ㅂ다능. 아무튼 다층 신경망의 출력은 이렇게 구한다. vij 는 입력층 뉴련 j랑 은닉층 뉴런 i와의 연결 강도다.



 별다를꺼업ㅂ다 >_<.


 순방향 신경망 feedforward network 과 순환 신경망 recurrent network 은 출력층의 출력이 다시 신경망의 입력으로 회귀 되는지 않되는지를 가지고 구별하면 쉽다. 그러니까 뭐 이런식이다.


 출력이 다시 입력으로 들어간다. 꼭 조합논리회로랑 순차논리회로 그림이랑 비슷하다 >_<. 쪼금더 정확히 얘기하면 어떤 레이어의 출력이 더 앞에 있는 레이어나 자신의 입력으로 회귀되면 순환 신경망이다. 순환 신경망의 출력을 어떻게 구하는지는 대충 감이 올태니 그냥 넘어가자능.

데이터 유형에 따라 아날로그랑 디지털로 나누는거는 뭐...다 알태니까 대충 넘어가고 지도 학습 supervised learning 이랑 자율 학습 unsupervised learning, 경쟁식 학습 competitive learning 에 대해서 잠깐만 얘기하자능.

 지도 학습은 신경망의 학습에 입력 패턴 x랑 그에 해당하는  목표치 d 를 사용하는 학습방법이다. x와 d의 쌍 (x ,d)를 학습 패턴쌍 traning pattern pair 이라구 한다. 쉽게 말하면 영문자 A의 그림을 보여주고 이건 A다 라구 가르쳐주는거다. 자율 학습은 학습 패턴쌍이 존제하지 않는다. 입력 패턴 x들을 마구 보여주면 지가 알아서 비슷한것끼리 분류해논다. 신기빵빵함. 경쟁식 학습은 지도 학습이랑 비슷한데...연결 강도를 변화시키는 과정에서 차이가 있다. 학습 과정에서 승자 뉴런 winner neron 이 정해지고 승저 뉴련 주변의 뉴런들에 속한 연결강도들만 변한다.

이제 활성화 함수 얘기를 해보자능. 활성화 함수는 단조 증가하는 함수여야 한다. 대충 3가지 기준으로 구분해 볼 수 있다.

1. 단극성 unipolar / 양극성 bipolar 함수
2. 선형 linear / 비선형 nonlinear 함수
3. 연속 continuous / 이진 binary 함수

활성함수 몇 개들을 수식으로 살펴보자능.


많이 쓰인다고 생각하는거 몇 개들만 써봤다능. 저거 말고도 많음 -_-;. 더 설명한거는 업ㅂ고....시그모이드 함수의 경우 람다가 무한대에 가까워지면 계단 함수랑 동일한 형태가 된다. 보통 람다값으로 1을 많이 쓴다고 한다능.


신경망의 학습

 학습 방법의 분류는 위에서 봤으니까 일반적으로 학습이 어떤 단계를 거쳐서 이루어 지는지를 보자능. 먼저 지도 학습의 경우임.

1. 응용 목적에 적절한 신경망 구조를 설계한다.
2. 연결 강도를 초기화 한다.
3. 학습 패턴쌍 (x, d)를 입력하여 신경망의 출력 y를 구한다.
4. 출력 y랑 목표치 d를 비교해서 오차를 산출한다.
5. 오차를 학습 신호 발생기에 입력해서 연결강도 변화랑 Δw를 구한다.
5. 연결강도를 Δw만큼 변경한다.
7. 변화단 연결 강도에 대해서 3 ~ 6 단계를 반복한다.
8. 더 이상 연결 강도가 변하지 않으면 학습을 종료한다.

다음으로 자율 학습의 경우다

1. 응용 목적에 적합한 신경망 구조를 설계한다.
2. 연결 강도를 초기화한다.
3. 학습 패턴 x를 입력하여 신경망의 출력 y를 구한다.
4. 출력 y를 학습 신호 발생기에 입력하여 연결강도 변화랑 Δw를 구한다.
5. 연결강도를 Δw만큼 변경한다.
6. 변화단 연결 강도에 대해서 3 ~ 5 단계를 반복한다.
7. 더 이상 연결 강도가 변하지 않으면 학습을 종료한다.

경쟁식 학습의 경우는 지도 학습이랑 비슷하다구 위에서 썼고....연결 강도가 변경되는 방식을 쪼금 더 살펴보자능.


 위에 그림에서 보면 연결 강도 변화량 Δw는 학습 신호 learning signal γ, 입력 패턴 x, 목표치 d, 학습률 learning rate α 와 관련이 있음을 알 수 있다. 구체적으로 이런 관계다. 여기서 학습률은 신경망 모델에 따라 다른 값으로 연결 가중치의 변화률을 말한다. 0에서 1사이의 값이다. 자율 학습일경우 d만 홀랑 빼버리면 된다. k번째 학습 단계에서 Δw는 다음과 같이 구할 수 있다능.


 k+1번째 연결 강도를 구하는 공식두 나와있으니까 같이 보자능. 아무튼 신경망을 학습 시키는 방법은 신경망 모델에 따라 다른데 학습 신호를 발생 시키는 과정이 다를뿐이다. 어찌됐던 Δw는


요렇게 구하고 변화된 연결 강도는 Δw를 더해버리면 구할 수 있다.


저작자 표시 비영리 동일 조건 변경 허락

'신경망 > 퍼셉트론' 카테고리의 다른 글

단층 신경망  (5) 2009/01/09
신경망의 분류와 학습  (2) 2009/01/07
생물학적 신경망과 인공 신경망  (5) 2009/01/06
뉴로 컴퓨터 개요  (2) 2008/12/29

댓글을 달아 주세요

  1. heroant 2012/01/15 12:26  댓글주소  수정/삭제  댓글쓰기

    보기 좋게 정리 잘해놨네 ㅎㅎ 잘 보고 감.

크리에이티브 커먼즈 라이선스
Creative Commons License
생물학적 신경망

 자질구래한 얘기들은 다 건너뛰고 인공 신경망의 기초가 되는 뇌의 신경망에 대해서만 알아보자능. 신경계의 기능적 최소 단위는 뉴런 neuron 인데 이넘이 신경계의 흥분, 전달 같은일을 한다. 사람 뇌에는 졸 많은 뉴런이 있구 이 뉴런들이 졸 복잡해서 연결되어 있다. 이렇게 뉴런들이 연결된 형태를 신경망 neural network 이라구 부른다.

 뇌의 여러 부위중에 대뇌 피질에 뉴런이 많이 있구 대뇌 피질의 부위 마따 다른 형태의 뉴런이 있는데....대뇌 피질의 각 부위마다 담당하는 기능이 틀려서 그렇다. 요걸 대뇌 피질의 기능 국재 localization of cerebrum 라구 한다. 뉴런들은 시세포, 승모세포, 추체세포, 운동 뉴런....뭐 이렇게 종류가 여러가 있는데 이 중에서 운동 뉴런을 살펴보자능. 아래 보이는게 운동 뉴런의 그림이다. 내가 대충 그렸다능 >_<.


운동 뉴런은 크게 세포체, 수상돌기, 축삭돌기의 3부분으로 나뉜다.

세포체 soma, cell body : 세포핵이 있고 많은 수상돌기랑 하나의 축삭돌기가 연결되 있다. 뉴런으로 들어온 자극은 일정시간동안 세포체내에서 가중된다.

수상돌기 dendrite : 세포체 주의의 가느다란 섬유들, 인접한 뉴런에서부터 들어오는 세포들의 통로, CE 틱하게 얘기하면 입력 스트림 정도 되겠다. 보는것처럼 수가 많다.

축삭돌기 axon : 한개의 가늘고 긴 섬유로 되있다. 인접 뉴런으로 세포의 흥분을 전달하는 역활을 한다. 랑비에 마디 node of Ranvier 가 있어서 흥분이 빠르게 전달되도록 한다. 1mm 간격으로 있다구 한다. 그리구 축삭 융기부 axon hillock 에서 재미난 현상이 일어나는데, 수상돌기로 부터 입력된 자극이 임계치를 넘으면 축삭돌기로 신경 흥분을 내보낸다. 자극이 임계치보다 작으면 반응이 일어나지 않는다.

그리구 축삭돌기의 끝 부분이랑 다른 신경세포의 수상돌기나 세포체가 만나는 부분을 시넵스 synapse 라구 한다(사실 떨어져 있다). 이거 덕분에 신경 흥분의 전달 속도가 더 빨라질 수 있다구 한다. 시넵스에는 흥분성 excitatory 과 억제성 inhibitory 의 두가지 종류가 있다. 대충 어떤 역활을 하는지는 이름만 보면 감이 올태니까 넘어가자능. 궁금하면 구글신께 물어보자.

 뉴런이 활성화 되는데는 몇가지 조건이 있는데....다음과 같다.

1. 자극의 크기가 임계치 이상 커야 된다.
2. 자극이 일정 시간 이상 지속되야 한다.
3. 자극이 약할경우 자극을 반복해야 한다.
4. 일단 활성화된 뉴런은 일정 시간이 지나야 한다. (쿨타임)

 그리고 편견 bias 도 활성화야 관여한다고 한다.

 뇌에는 요런게 잔득 들어있어서 지들끼리 마구 연결되 있는데...기억된 정보는 뉴런간의 연결 강도, 그러니까 시넵스의 연결 강도의 형태로 저장되어 있다구 한다. 자극이 반복되면 그러니까 활성화가 반복되면 연결 강도가 변하게 된다. 이 변화 과정을 거쳐서 장기 기억이 되면 더 이상 연결 강도가 변하지 않게 된다. 물론 널리 인정되고있는 얘기가 그렇다는 거다능.


인공 신경망

 
 바로 위에서 설명한 것들을 수학적으로 모델링한게 인공 신경망이다. 인공 신경망에서 뉴런의 기능적 모델은 다음과 같다.


 NET는 입력들의 가중합 net input net weight 을 말하는거구 OUT는 당연히 출력이다.

NET =  ∑ 입력
OUT = f(NET)


 여기서 f(x)는 뉴런의 반응 여부(활성화 여부)를 결정하는 함수로 활성화 함수 activation function 라고 한다. 많은 종류의 활성화 함수가 있는데 다른거는 링크를 따라가서 보구(http://www.willamette.edu/~gorr/classes/cs449/Maple/ActivationFuncs/active.html) 여기서 사용된 활성화 함수는 임계치가 T인 계단 함수라구 치고 OUT를 구해보면 다음과 같다.


 생물학적 신경망은 뉴런 하나가 단독으로 기능하는게 아니라 여러개가 서로 상호작용 하고 있으니까 인공 신경망도 뉴런들을 마구 연결시켜 놔보면 대충 이런 그림이 된다.



 
 저 동그라미가 뉴런이구 겹쳐 있어서 이상하게 보이겠지만 화살표가 연결이다. 한글로 써놓인까 이상하네 -_-;; 아무튼 그림을 보면 딱 감이 오지 않냐능. 버택스가 뉴런이구 엣지가 시넵스 연결강도인 방향성 가중치 그래프라능. 이런 방식으로 생물학적 신경망을 모델링한것을 인공 신경망 모델이라고 한다. 일반적인 신경망 모델을 또 한번 보자능.



  그림에서 보면 하나의 뉴런에 입력들이 여러게 있구 입력 갯수만큼 연결 강도가 있고 출력이 하나 있다. 뉴런이 여러개 있으면 위에 위에 그림하구 똑같아 질꺼라능.....하악. 아무튼 일반적으로 입력하고 연결강도는 백터 형태로 표시 한다.

x = [ x1  x2  x3  ........  xn ]
w = [ w1  w2  w3  .......... wn ]


 뉴런 y의 NET는 다음과 같이 구할 수 있다.

NET  =  ∑(x*w)
        =  x1*w1 + x2*w2 + x3*w3 + ....... + xn*wn

백터 형태로 표현하면 다음과 같다.

NET = x · w

점이 잘 보이는 모르겠지만 내적이라능. 그리고 출력 OUT는 다음과 같다.

OUT = f( NET )
       = f( ∑(x*w) )
       = f( x · w )

f(x)  =  1   ; NET ≥ T
           0  ; NET < T

바이어스를 고려한 신경망 모델은 다음과 같다. 요게 인제 앞으로 많이 볼 신경망 모델이다.


바이어스의 입력값은 항상 1 이구 연결강도 b를 가지고 있다. 요걸 고려하면.....

x = [ x1  x2  x3  ........  xn   1 ]
w = [ w1  w2  w3  .......... wn  b ]

NET  = x · w
        =  ∑(x*w) + b
        =  x1*w1 + x2*w2 + x3*w3 + ....... + xn*wn + b

OUT = f( NET )
       = f( ∑(x*w) + b )
       = f( x · w )

가중합을 구할때 말고는 다른게 업ㅂ다. -_-;;
저작자 표시 비영리 동일 조건 변경 허락

'신경망 > 퍼셉트론' 카테고리의 다른 글

단층 신경망  (5) 2009/01/09
신경망의 분류와 학습  (2) 2009/01/07
생물학적 신경망과 인공 신경망  (5) 2009/01/06
뉴로 컴퓨터 개요  (2) 2008/12/29

댓글을 달아 주세요

  1. Favicon of http://blog.bab2min.pe.kr BlogIcon ∫2tdt=t²+c 2009/01/08 00:49  댓글주소  수정/삭제  댓글쓰기

    오 횽 멋있다능 우왕 나도 이제 신경망 공부해야지

  2. Favicon of http://magicpotato.com BlogIcon 마술potato 2009/08/18 23:25  댓글주소  수정/삭제  댓글쓰기

    횽아 안녕하세영
    '평면방정식' 검색하다가 들어왔다가 이게마지 하고 이것저것 보다가 댓글 남겨영
    재밌게 잘보고 간다능, 멋지다능 ',.'b

  3. BlogIcon The Quiett 2010/09/12 20:54  댓글주소  수정/삭제  댓글쓰기

    너무 힘들다능.......
    내말투 오타쿠 느낌 너무 강하다능.....
    님말투 완전 오타쿠갔다능......
    그러지 말라능

    능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능능

뉴로 컴퓨터 개요

신경망/퍼셉트론 | 2008/12/29 05:56 | Posted by DMW
크리에이티브 커먼즈 라이선스
Creative Commons License
개요
 
 기존의 디지털 컴퓨터는 수치 계산 처럼 잘 정의된 업무 처리에는 굉장히 탁월한 성능을 보이지만 음성 인식, 영상 인식, 연상, 추론등에는 지지부진한 모습을 보인다. 이에 대해서 뭐라고 하고 싶은 사람도 있겠지만...수치 계산같은 일에 비해서 지지부진하다는 얘기다. 아무튼 그래서 나온게 뉴로 컴퓨터다. 인간 두뇌의 신경망 조직을 모델링한 것이 신경망 모델이며 엄밀한 의미의 뉴로 컴퓨터는 신경망 구조를 사용해서 만든 컴퓨터를 뜻하지만, 뉴로 컴퓨팅, 신경망, 신경 회로망등의 용어를 혼용해서 부른다고 한다.

아무튼 뉴로 컴퓨터랑 디지털 컴퓨터는 요렇게 다르다.
  뉴로 컴퓨터
디지털 컴퓨터
 처리 데이터
 디지털, 아날로그
디지털
 처리 방식
 병렬 처리
 순차 처리
 기본 소자
 뉴런  논리 소자
 실행 근거
 학습  프로그램
 정보 저장
 뉴련간 연결강도
 기억장치
 정보 검색
 내용의 의함
 주소 지정
 응용 분야
 연상, 추론, 인식
 복잡한 계산


 디지털 컴퓨터는 프로그램에 의한 고숙 순차처리를 하는 반면에 뉴로 컴퓨터는 어떤 일을 수행하기 위해서는 미리 학습이 필요하고 병렬로 업무를 처리한다. 신경망을 구성하는 뉴런들은 상대적으로 속도는 느리지만 병렬처리에 의해서 연상, 패턴 인식등을 빠르게 수행할 수 있다. 물론 컴퓨터 프로그램으로 시뮬레이션을 하게 되면 멀티 스레딩을 하지 않는 이상 순차처리다. -_-;;

 
 그리고 정보의 저장에도 많은 차이가 있는데 뉴로 컴퓨터는 뉴련간의 연결강도에 의해 정보가 분산 저장된다. 덕분에 오류 감내 능력이 뛰어나다. 아무튼 이 연결강도를 변화시키는 과정을 학습이라고 하는데 신경망의 모델과 학습방법에 의해서 학습 시간이 길어질 수 도 있고 짧아질 수 도 있고 학습에 실패할 수 도 있다.


 뉴로 컴퓨터의 근간이 되는 신경망 모델은 예전부터 많은 연구가 진행되던 것으로 굉장히 많은 신경망 모델이 존재하구 있다. 구현방법도 다양한데 VLSI로도 만들 수 있고, 레이저를 사용한 광학적 구현도 있지만 프로그램을 작성해서 시뮬레이션해보는게 가장 만만하다. >_<

뉴로 컴퓨터, 그러니까 신경망은 구조상 복잡한 계산 같은거에는 적합하지가 않다. 따라서 복잡한 계산은 디지털 컴퓨터로 처리하고 연상이나 추론과 같은 업부등을 뉴로 컴퓨터로 보조하는게 당연하다. 요걸 실제 응용하는데 고려할 것들은 다음과 같다.


1. 어떤 신경망 모델을 사용할 것인가?
2. 신경망의 구조는 어떻게 할 것인가?
3. 어떻게 효과적으로 학습시킬 것인가?
4. 학습 패턴의 특징은 어떻게 추출할 것인가?
5. 구현은 어떻게 할 것인가?


 가장 먼저 어떤 신경망 모델을 사용할지 결정하구, 신경망의 뉴런은 몇개로 구성할지, 입력과 출력은 어떻게 할 것인지, 뉴런들의 연결은 어떻게 할것인지등등 신경망의 구조를 결정한다. 그 다음에 사용한 신경망의 종류에 따라 어떤 학습방법을 사용할 지를 결정한다. 그리구 나서 학습 패턴을 선정해야 되는데 지도학습 방법을 사용할 경우 입력과 출력 패턴의 짝을 학습 패턴이라고 하며, 자율학습의 경우는 입력 패턴만을 의미한다. 특징 추출이란 신경망이 사용되는 목적에 따라 패턴의 중요한 부분을 더 부각 시켜서 정보량으 줄이는 것이다. 그리고 구현을 하면 되는데....구현을 위에 쓴것처럼 여러가지 방법중에 하나로 하면 된다.

역사적 배경 그런건 쭉 쭉 쭉 다 건너뛰고 신경망의 응용분야는 음성 합성, 음성 인식, 문자 인식, 영상 처리, 시스템 제어, 연상 메모리, 전문가 시스템등등이 있다.
저작자 표시 비영리 동일 조건 변경 허락

'신경망 > 퍼셉트론' 카테고리의 다른 글

단층 신경망  (5) 2009/01/09
신경망의 분류와 학습  (2) 2009/01/07
생물학적 신경망과 인공 신경망  (5) 2009/01/06
뉴로 컴퓨터 개요  (2) 2008/12/29

댓글을 달아 주세요

  1. 2008/12/29 23:51  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다