아주 깔끔하게 옷갈아 입히는 AI Model입니다. 이제 쇼핑몰에서도 자기 자신의 이미지에 옷을 입혀보고 구입하는 시대가 오겠습니다.

 

https://huggingface.co/spaces/levihsu/OOTDiffusion

 

 

Hugging Face에 상당히 좋은 품질고 성능의 AI Model이 있어서 소개합니다.

 

https://huggingface.co/ByteDance/SDXL-Lightning

 

ByteDance/SDXL-Lightning · Hugging Face

SDXL-Lightning SDXL-Lightning is a lightning-fast text-to-image generation model. It can generate high-quality 1024px images in a few steps. For more information, please refer to our research paper: SDXL-Lightning: Progressive Adversarial Diffusion Distill

huggingface.co

 

demo : https://huggingface.co/spaces/ByteDance/SDXL-Lightning

 

SDXL-Lightning - a Hugging Face Space by ByteDance

Running on Zero

huggingface.co

 

demo site에서 text만으로 image를 생성하는 경험을 해보세요.

"기초부터 차근 차근"

 

요즘 개발자들이 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를 설계했다는 얘기지요.

 

이번 포스팅은 지난 포스팅 [AI] 과거를 알고 미래가 보인다 - Perceptron(1)에 이어집니다. 

 

다층 퍼셉트론의 등장

1980년대 컴퓨팅 파워의 비약적인(?) 발전에 힘입어 단층 퍼센트론의 "선형학습"의 문제를 해결하고자 더 많은 "컴퓨팅 파워"을 사용하는 쪽으로 "neural network"이 발전하였고 결국은 복잡한 곡선 학습이 가능한 다층 퍼셉트론이 등장합니다.

 

입력과 출력사이에 히든레이어를 두어서 출력값을 다수의 노드에서 연결강도를 조정함으로써 "선형학습"문제를 해결하고 "XOR"문제를 해결합니다. 

 

이때 BPNN ( Back Propagation Neural Nework ), SOM (Self-Organizing Map)등을 부각되고 "지도학습", "비지도학습", "강화학습"등의 연구와 실제 응용 세례들이 등장합니다. finally는 "전문가 시스템" 즉 특정분야에서는 인간의 판단을 일부 대신할수있는 시스템을 만들수있지 않을까 하는 개념들이 등장합니다.

 

이때 활발히 상용화 되었던 것들이 "음성인식", "얼굴인식", "번호판인식"등의 제품들이 마구마구 나왔던것이 기억이 납니다.

 

그런데 이때 나왔던 제품들 정말 쓰레기에 가까웠습니다. 사실 정확한 판단을 위해서는 수많은 히든레이어가 필요하고 더많은 계층의 히든레이어가 필요했는데 그당시 장비들의 컴퓨팅파워는 그 계산량을 감당할수없었지요. ㅠ.ㅠ

 

이러한 상용화의 실패는 "제2의 AI 암흑기"를 불러옵니다.

시장은 더이상 AI에 대한 기대를 버리고 "시스템"과 "알고리즘"에 의존한 상용제품들을 내 놓고 IT산업을 발전 시킴니다.

 

클라우드의 등장

그디어 클라우드의 시대가 열립니다. 지금 신세대 개발자들에게는 당연한 환경이겠지만 10년~20년전 클라우드, 클러스터같은 개념이 소개되었을때 정말 적응하는데 힘들었던 기억이 납니다. 

 

각설하고 클라우드의 등장은 "무한한" 컴퓨팅 파워을 제공했고 이 무한한 컴퓨팅 파워를 바탕으로 Neural Network는 심각하게 복잡한 계산을 가능하게 했고 두둥~~~ "알파고"가 등장합니다.

 

Deep Learning의 등장

"무제한"의 컴퓨팅파워를 바탕으로 NN은 NN자체를 시간에 따라 복제하기 시작하고 히든레이어를 복제하고 이전 레이어로 역전파하기 시작했습니다. 과거의 컴퓨팅 파워로는 상상도 못하지만 지금은 가능한 시대가 되었습니다.

 

DNN ( Deep Neural Network ) 입니다. 그냥 딱봐도 어마어마한 계산량이지요.. 단순히 그린거지.. 상용화를 위해서는 하나의 히든레이에 수백 수천개의 노드가 필요합니다.

 

RNN ( recurrent neural network ) 입니다. 아싸리 입력에 따른 히든레이어를 복사해 나가고 가중치도 전파해 나갑니다. 계산량을 감히 상상도 할 수 없습니다.

 

마치면서

1편 부터 2편까지 모두 읽었다면 딥러닝이란것이 갑자기 어디서 툭 튀어 나온것도 아니고 굉장히 획기적인 신기술도 아니라는것을 알 수 있을것입니다. 시대의 흐름을 잘 읽은 사람들의 작품이라 하겠습니다. 그런데 개인적으로 AI분야에 많은 개발자들이 진입하려하는것에 좀 우려감이 있습니다. 왜냐하면 거기에는 여러분의 intelligence가 필요하지 않기 때문입니다. 

 

개인적으로는 Ai와도 연관되겠지만

  • Big Data Minning
  • Big Data Aggregating

분야가 AI와 발맞출수있는 올바른 방향이라 생각됩니다.

"기초부터 차근 차근"

 

요즘 개발자들이 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