"기초부터 차근 차근"

 

요즘 개발자들이 AI에 많이들 관심을 가지는것 같습니다만 "perceptron"을 물어보면 모르는 경우가 대부분입니다. AI = tensorflow라는 개념을 가지고 있지요. 사실 요즘은 오픈소스 생태계가 너무도 잘되어 있어서 SRE적으로 접근해도 됩니다. 그런데 개념을 잡지 못하면 오래가지 못해서 한계에 부딧칠겁니다. 근데 요즘 나오는 Deep Learning 기법들부터 이해하려하면 .... 또 역시 포기하게 되겠지요. Neural Network개념은 1960년대에 나온 개념입니다. 8비트 컴터도 없던 시절이지요. 이때 개념들부터 이해해 나가면 종국에는 Deep Learning의 영역까지 확장할수있을꺼라 확신합니다.

 

AI (Artificial Intelligence)의 역사

1980년대 부터 개발을 하고 AI에 관심을 가져온 사람으로써 경험과 느낌들을 기반으로 기술한 역사로 "역사학" 공부하시는분들하고는 의견이 다를 수 있음을 밝힙니다. 

 

perceptron은 1950년대에 "Frank Rosenblatt"이 수학적으로 제안한 AI의 초기 모델로 다들 기본적으로 알고 있는 뉴런이라는 인간의 뇌의 구조에 기반한 아이디어로 정립된 이론입니다. 8비트 컴퓨터가 나오기도 전에 이미 수학적으로 AI를 설계했다는 얘기지요.

 

Neural Network (단층 percentron)

Neural Network의 가장 단순한 단층 percent 의 원리부터 이해해 볼께요.

Neural Network는 몇개의 입력을 Node와 연결하고 원하는 결과가 나올때 까지 연결강도를 조정하면서 결과값을 찾아 갑니다.

여러가지 수학적인것들이 나오는데 우리는 SRE적으로 이해하고 가져다 씁시다. ( 수학적으로 이해 하려고 하면 ... 흥미가 떨어져요 )

 

초심풀한 2개의 입력과 1개의 출력을 가지는 percentron을 만들었습니다.

class neural{
private:
    const float lr = 0.1;
public:
    float wx;
    float wy;
    float bias;
public:
    neural(){
        bias = -1;;
        wx = 0.5;
        wy = 0.5;
    }
    void train(int x, int y, int result){
        auto output = recall(x, y);
        auto error = result - output;
        
        wx += error * x * lr;
        wy += error * y * lr;

        bias += lr * error;
    }
    int recall(int x, int y){
        double sum = 0.0;
        
        sum += wx * x;
        sum += wy * y;
        
        return 1 / (1 + std::exp(-(sum + bias)));
    }
};

자 방금 우리는 역사적인 "인공지능"을 만들었습니다.

 

이제 이 인공지능에게 AND연산을 가르쳐 봅시다.

void train(const string & title, vector<vector<int>> data){
    neural n;
    for(int i=0;i<10000;i++){
        for(int j=0;j<data.size();j++){
            n.train(data[j][0], data[j][1], data[j][2]);
        }
    }

    cout << "< " << title << " --->" << endl;
    for(int j=0;j<data.size();j++){
        auto output = n.recall(data[j][0], data[j][1]);
        cout << "[" << data[j][0] << "," << data[j][1] << "] = " << output;
        if(output == data[j][2])
            cout << " <-- OK";
        else
            cout << " <-- FAIL, expected " << data[j][2];
        cout << endl;
    }
    cout << "neural : wx = " << n.wx << ", wy  = " << n.wy << ", bias = " << n.bias << endl;
}

int main(int argc, const char * argv[]) {
    train("AND", {
        {0, 0, 0},
        {0, 1, 0},
        {1, 0, 0},
        {1, 1, 1}
    });

    return 0;
}

결과는

< AND --->
[0,0] = 0 <-- OK
[0,1] = 0 <-- OK
[1,0] = 0 <-- OK
[1,1] = 1 <-- OK
neural : wx = 12.8, wy  = 12.8, bias = 11.3

우리는 어떤 로직도 심지 않고 심지어 AND연산의 어떤 연관관계도 분석하지 않았지만 neural network이 연결강도와 bias를 조정해 가면서 답을 스스로 찾고 있습니다.

 

이 인공지능에 몇까지를 더 가르쳐 봅시다.

OR NOR NAND
    train("OR", {
        {0, 0, 0},
        {0, 1, 1},
        {1, 0, 1},
        {1, 1, 1}
    });
    train("NOR", {
        {0, 0, 1},
        {0, 1, 0},
        {1, 0, 0},
        {1, 1, 0}
    });
    train("NAND", {
        {0, 0, 1},
        {0, 1, 1},
        {1, 0, 1},
        {1, 1, 0}
    });
[0,0] = 0 <-- OK
[0,1] = 1 <-- OK
[1,0] = 1 <-- OK
[1,1] = 1 <-- OK
neural : wx = 14.7, wy  = 14.7, bias = 22.2
[0,0] = 1 <-- OK
[0,1] = 0 <-- OK
[1,0] = 0 <-- OK
[1,1] = 0 <-- OK
neural : wx = -0.1, wy  = -0.1, bias = 36.8
[0,0] = 1 <-- OK
[0,1] = 1 <-- OK
[1,0] = 1 <-- OK
[1,1] = 0 <-- OK
neural : wx = -0.2, wy  = -0.0999999, bias = 37

훌륭히 배워가고 있습니다.

어짜피 다 가르쳐주고 답을 주는거라고 생각할수있는데 입력값이 수천/수만이 될경우를 생각해 봅시다.

 

선형학습문제

퍼셉트론은 상당한 반향을 이끌었습니다만 "선형학습"이라는 한계를 드러내며 사람들의 기억속에서 사라집니다. 심지어 "민스키와 패퍼트"라는 "퍼셉트론"이 책을 발간하면서 수학적으로 한계를 증명해 버렸다.

결국은 "AND", "OR", "NOR", "NAND"등은 선으로 두분류로 나눌수있지만 마지막 그림처럼 "XOR"처럼 선으로 2분류로 나눌 수 없는 경우는 학습할 수가 없는 문제가 있다. 

 

이걸 한번 우리 "인공 지능"에게 학습시켜 봅시다.

XOR
    train("XOR", {
        {0, 0, 0},
        {0, 1, 1},
        {1, 0, 1},
        {1, 1, 0}
    });
[0,0] = 1 <-- FAIL, expected 0
[0,1] = 1 <-- OK
[1,0] = 0 <-- FAIL, expected 1
[1,1] = 0 <-- OK
neural : wx = -0.0999999, wy  = 1.3411e-07, bias = 36.8

아무리 학습을 시켜도 답을 못 찾는다. 

 

다중 퍼셉트론의 등장

당시 열악한 컴퓨팅환경에서 단층퍼셉트도 입력층이 많아지게되면 상당한 부담이었고 AI연구는 침체기에 빠집니다. 그런데 16비트가 PC가 나오고 서버시장은 더욱 더 빠르게 발전하고 가성비 높은 컴퓨팅 환경이 갖춰지게 되고 "다중 퍼센트론"이 주목받게 되고 속속 연구가 이루어 지며 "전문가시스템"이라는 개념이 등장하는등 제2의 AI이 붐이 일어 납니다.

 

너무 길어 기는 관계로 다음 포스트에서 이어 가겠습니다.

+ Recent posts