머신러닝AI2023. 4. 2. 19:08

많은 사람들이 ChatGPT 질의를 위해 OpenAI 사이트에 접속해서 사용한다. 해당 웹 화면에 그대로 접속해 활용하는 방법이다. 그런데 OpenAI는 이러한 직접적인 웹서비스 외에도, 별도로 개발해서 사용할 수 있는 API를 지원한다.

 

 게다가, 이 API 사용방법은 개발자에게는 매우 쉽고 몇가지 장점이 있는데, 유료 사용을 염두해두면 특히 더 그렇다. API 1회 사용에 $0.01이면 ChatGPT Plus라는 $20짜리 정액 요금제에 비해, 2천문장을 물어봐야 한달에 간신히 $20을 쓸 수 있는 종량제 형태의 사용이 가능하다. 그리고 이 API 사용시 처음 $18은 무료이기도 하다. 이 무료도 개인은 다 쓰기가 쉽지 않다.

 

 그러면 직접 한번 사용해보자. S/W 개발 경험이 있는 사람을 가정해보았다.

 

0) 우선 OpenAI의 API를 사용하기 위해서는 API key를 받아야 한다.

 

 API Key는 일종의 API사용 인증암호 같은 것이라고 생각하면 된다. OpenAI에 가입했다면 이미 준비가 거의 끝난 셈이고, API Key생성 버튼(Create new secret key 버튼)을 누르면 곧바로 알 수 있다. openai.com에 로그인이 되었다면 https://platform.openai.com 에 접속하여 아래 화면처럼 API 생성을 해보자.

 

 

Create new secret key를 누르면 secret key가 생성된다. 생성시 별도로 잘 기록해 숨겨둔다.

 

위 화면의 SECRET KEY 에 "sk-...NCss"로 표기된 것에 실제로는 더 많은 알파벳(?)들이 숨겨져 있는 긴 문자열이다. 참고로 위 왼쪽 메뉴에서 'Usage'를 누르면 지금까지 API를 호출한 사용량을 알 수 있다. $18의 무료 사용이 끝나면 유료로 넘어가게 된다.

 

1) API를 python을 호출해서 사용해보자.

 

https://medium.com/nerd-for-tech/create-ai-application-in-minutes-with-openai-api-5e84bd3ec5d0 에 간단하게 잘 설명되어 있다. python을 쓸 수 있는 환경 하에서

 

$ pip install openai 해서 설치한 후

 

아래 python code를 실행한다. 세부 옵션들은 여기서는 설명을 생략한다.

 

import os
import openai
import config
openai.api_key = "위 얻어낸 SECRET KEY를 넣는다"
response = openai.Completion.create(
engine="davinci",
prompt="Blog topics dealing with daily life living on Mars\n\n1.",
temperature=0.3,
max_tokens=64,
top_p=1,
frequency_penalty=0.5,
presence_penalty=0)
print(response)

 

여기 나오는 설정 변수들을 간단히 설명해보면 아래와 같으니 참조하면 된다. 실제로는 각 값 간에 영향을 주는 부분이 있어서 시행착오 속에 값을 결정하게 된다고 한다.

 

ㅇmax_tokens

  최대 생성 토큰 길이로 GPT3의 경우 2048 까지 잡을 수 있다. 모델마다 최대 토큰 값은 차이가 있다.

 

ㅇtemperature

  문장의 임의성을 조절하는 변수로 0으로 갈수록 답변이 정형화되고 고정되며, 1로 갈수록 창의력이 높아지고 임의적이 된다.

 

ㅇtop_p

  해당 변수는 통상 확률값으로 커지면 커질수록 더 많은 후보 토큰 중에 랜덤하게 고르게 된다. 따라서 temperature와 유사하게 작동되는데, temperature를 지정하여 사용하는 경우 이 값은 1로 설정해서 사용하도록 추천하고 있다

(즉 temperature나 top_p중 하나만 1보다 작은 값을 설정하고, 나머지는 1로 설정하여 중립화시킨다)

 

ㅇfrequency_penalty

  이미 생성시에 사용한 단어들이 자주 출현함에 따른 신규 사용 확률을 조절한다. 높은 값일수록 사용확률을 낮춘다.

 

ㅇpresence_penalty

  생성시에 사용한 단어의 출현을 조절한다. frequency는 사용 빈도수에 의해 조절됨에 반해 presence는 기사용 여부에 의해 조절된다.

 

 

 

2) 아예 ChatGPT 챗봇 사이트를 만들어 보자.

 

서버 환경을 갖춘 개발자라면 아예 오픈소스를 통해 OpenAI와 동일한 웹사이트 환경을 자체 운영할 수 있다. 즉 위 API를 python으로 쉘에서 실행하는 것이 아니라, 나만의 사이트를 통해 위 가성비 좋은 API를 경유해서 ChatGPT를 사용하는 것이다. 물론 요즘에는 많은 회사들이 메신저나 앱에서 이러한 ChatGPT 연결 서비스를 제공하지만, 나만의 환경을 갖는 장점도 존재한다. 여러가지 실험이나 ChatGPT 상위 버전 사용 등 API를 직접 연결하면 다양한 것들을 경험할 수 있다.

 

Linux ubuntu 환경이라면 docker를 통해 아래 서비스가 가능하다.

https://github.com/mckaywrigley/chatbot-ui

 

mckaywrigley의 chatbot 오픈소스 (node.js/docker 기반)

  A. 여기서는 linux ubuntu 20.04 에서 docker를 설치해서 테스트 해보았다. port 3000번을 docker의 내부 3000번 포트로 연결하기 때문에, 외부에 3000번을 열어줄 필요가 있다.

 

  - docker, node.js, npm을 설치한다.

  - 아래 git을 clone하여 docker image를 build하고 실행한다

  

   $ cd /work/

   $ git clone https://github.com/mckaywrigley/chatbot-ui

   $ cd chatbot-ui

   $ docker build -t chatgpt-ui .                  #도커 이미지를 만든다
   $ docker run -e OPENAI_API_KEY=xxxxxxxx -p 3000:3000 chatgpt-ui

 

  B. http://대상서버IP:3000/ 으로 접속한다

 

생각보다 손쉽게 OpenAI의 API를 활용할 수 있다. 시간이 지날수록 이 OpenAI의 API KEY를 통해 다양하게 연결할 수 있는 더 많은 오픈소스와 플러그인이 나올것이라 예상된다. 오늘은 일단 여기까지 한번 확인해 보았다.

 

반응형
Posted by 작동미학
순수수학2023. 4. 2. 18:33

 책 "허수(Imagaing numbers)"를 쓴 배리 마주르(Barry Mazur)가 지적했듯이, 음수와 음수를 곱하면 양수가 나오는 것은 의외로 어린 학생들에게 설명하기가 어렵다. 그것은 6개가 든 사과 봉지가 2개가 있을때 전체가 12개가 된다는 6*2=12가 굉장히 자명한 것과는 차이를 보인다. -6을 두번 곱하면 -12가 되는 것도 그렇다 치자. 그런데 왜 -1과 -1을 곱하면 1이 되는가?

 

 정답은 수학 연산체계가 즉 교환법칙이나 결합법칙 등 여러가지 면에서 모순적이지 않기 위해서는 그것이 양수가 되어야 한다는 점이다. 

 

 (-1) * 0 = 0

 (-1) * (-1 + 1) = 0

 (-1)*(-1) + (-1 * 1 ) = 0

 (-1)*(-1) + (-1) = 0

(-1)*(-1) = 1

 

 그런데, 이 설명은 좀 납득하기 어려운 점이 있다. 앞서 6개가 든 사과 봉지가 2개가 있으면 12개가 되듯이, 눈으로 보이는 직관적인 설명을 하기가 어렵기 때문이다.

 

 이런 문제는 수학에서 드물지 않다. 논리적으로는 그러하다는 것을 따라가보면 맞는데, 직관적으로 마음에 와닿지 않는다. 그래서 이 음수에 대한 질문이 가치있는 이유는 이러한 아주 단순해보이며 수학적으로 자명한 진실이 왜 설명하기 어려운지를 우리가 생각해보아야 한다는 점이다. 예를 들면 허수라는 것은 존재하지도 않는데 대체 무엇이고 sqrt(2)="루트2"는 왜 피타고라스 학파가 존재하지 않는 수라며 비밀로 했을까?

 

 이 "설명 난해함"에는 중요한 함의가 숨어있는데, 바로 수학적 체계와 인간 인지의 차이에 대한 내용이다. 그 간격을 이해하면 이 난해함이 자명해지는 것을 알 수 있다.

 

 인간의 인지는 기본적으로 태양계의 지구라는 곳에서 생존하기 위해 진화한 지능에 근거한다. 자연계의 생존 경쟁을 위해서 머리를 써서 예측해야했고, 가끔은 중력의 포물선이 머리속에 들어있는 것이 아닌가 할 정도로 우아하게 멀리서 날아오는 공을 잡아낸다.

 

 반면에 수학은 대칭과 보존, 변화 등이 얽혀 있는 논리 체계이다. 그것은 일반화, 무모순 여러가지 것들을 필요로 하며 -1 과 -1 이 곱하면 당연히 1이 되는 체계이다.

 

 그래서 인간의 인지 체계와 수학의 대칭체계는 일부 부조화한다. 이를테면 양수 곱은 이해할 수 있지만 음수 곱은 어렵다. 만약에 인간이 수학의 논리체계가 모두 극명히 드러나는 환경에서 진화했다면 수학 전체가 이렇게 어렵지 않을 것이다. 그것은 마치 인간이 미시세계에서 살아왔더라면, 그 알 수 없는 양자역학을 던지는 공의 움직임을 쉽게 이해할 수 있는 것처럼 깨달을 수 있을 것이라는 기대와 비슷하다. 그러나 인간은 거시세계의 동물이며 거기서 진화한 생명체이다. 이 세상이 수학적이라고 필자는 믿지만, 인간이 처한 환경은 그러한 수학의 일부분만을 경험할 뿐이다. 그것은 전체 수학의 모습과는 괴리가 있다. 그리고 이러한 괴리는 서로가 자명한 상황에서도 "설명 난해함"을 만들어 낸다.

 

 오히려 이런 관점에서는 인간이 수학을 만들어 내고, 완성해온 과정이 놀랍다. 인간이 가진 인지와 수학 체계의 어긋남을 이겨내기 위해, 여러가지를 상상하고 논리적으로 다시 시도해봄으로써 인간은 한단계 한단계 이 거대한 수학체계를 발전시켰다. 자신이 이해할 수 없는 것도 가정하며 앞뒤의 퍼즐을 맞추자, 듣도 보도 못한 '허수'가 탄생했으며, 그것이 원래 이 수학 체계안에 존재하는 것이라는 것을 깨닫는 것도 그러한 역사의 일환이다. 그렇게 자신의 인지 경험과 어울리지 않는 이 수학의 논리 체계를 어렵게 어렵게 확장해 받아들이고 있다고 볼 수 있다.

 

 여기서 재미있게도, 수학자라는 직업을 가진 이는 일반인 대비 수학 체계에 대해서 더 잘 이해하고 받아들인다. 방정식을 보면 마치 눈에 빤히 보이는 물고기의 움직임처럼, 일반인이 전혀 알아내지 못하는 것을 바로 집어낸다. 그래서 이 아름다운 대칭 체계를 머리 속에 일반 사람보다 더 잘 그리면서 이해하고 그것을 직업으로 선택한 사람들을 우리는 수학자라고 부른다. 그러나 그럼에도 불구하고 인간이 가진 깊은 인지 체계와 논리 체계의 수학 사이에는 어쩔 수 없는 괴리가 존재한다. 그것이 더 빠르게 이 분야가 발전되지 못한 이유이며, 상상 외에는 탈출구가 없었던 이유다.

 

 이런 관점에서 수학의 궁극적으로 완성된 체계는 무엇일까? 만약에 우리가 수학에 완전히 익숙해진 지능을 갖고 태어났다면, 음수와 음수를 곱하면 양수가 된다는 사실이 마치 숨을 쉬는 것처럼 자연스럽게 느껴지는 지능을 부여받았다면 우리는 어디까지 완성해낼 수 있을까? 그 지향점은 어떻게 될까? 지금까지 다양한 상상으로 한걸음 한걸음 진화시켜왔고, 완전히 새로운 수학 분야를 열어가며 앞으로 나간 천재들이 그리는 방향은 무엇일까?

 

 정답을 알아서 질문하는 것은 아니다. 여기에 대답하기 위해서는 수학의 모든 일반적인 것들이 숨쉬는 것처럼 자연스러운 지능을 만나야 할텐데, 계속 우리는 훈련에 의해서 그러한 이들을 만나게 되고 있는 것인지 모르겠다. 대칭과 보존의 체계 속에서 그것들을 일반화하고 더 쉽게 개념화하는, 더 많은 것을 더 단순하게 설명하는 이들이 그들이며 그 방향이다. 인간의 인지 체계를 조금더 수학적인 것에 적응하려고 노력하고, 지속적으로 위 방향을 추구하는 이들이 더 큰 답을 찾아나가지 않을까? 인간의 인지와 수학 체계의 괴리가 무엇인지 더 잘 이해하고, 수학 체계가 지는 방향에 맞추어 더 끊임없이 일반화해나가는 노력만이 이 분야를 확장할 수 있지 않을까. 어찌보면 당연한 이야기지만 한번쯤은 곱씹어볼 일이다.

 

 

 

 

반응형
Posted by 작동미학
머신러닝AI2023. 3. 29. 00:54

 사실 이 ChatGPT와 알파고(AlphaGo)는 공통점이 있다. 둘다 사람이나 제대로 해낼 줄 알았던 일을 대규모 신경망으로 대량의 데이터를 집어넣어 해결한 셈이다. 그런데 여기에는 더 깊은 공통점이 있다.

 

 조금 비약하자면 바둑과 ChatGPT는 비슷한 일을 한다. 즉 어떤 흐름 속에 다음 수를 예측한다. 바둑은 이미 둔 흑백의 좌표 흐름을 따라 다음에 어디에 두어야 하는지 선택하는 문제이다. 바둑판 19*19의 좌표의 점 중 다음 둘 곳을 선택하는 문제이며 361개의 점 중 하나를 계속 선택해간다.

 

 ChatGPT의 직전 버전인 GPT-2는 흔히 vocab size(단어 사전 크기라고 해보자)라는 전체 token(단어라고 하자)의 종류가 대략 5만건 정도 된다고 알려져있다. 이 녀석은 바둑판의 361개 점이 아니라, 5만여개의 점에서 선택을 하는 것과 같다. 여하튼 token 하나를 뱉으면, 다시 또 그 다음 token을 맞추는 문제이다. 비슷하지 않은가?

 

 여기서 ChatGPT의 핵심 학습의 단순함은 그저 인터넷의 수많은 문장에서 한 단어(토큰)를 일부러 숨기고, 이 정답을 알고 있는 가려진 토큰을 신경망이 맞추는 방식으로 해결했다는데 있다. 알파고는 사람의 기보를 통해 이런 학습 문제를 해결했고, 나중에는 알파제로는 강화학습을 통해 해결한 셈이다. 그런데 여기 관련해서는 ChatGPT가 훨씬 유리한 것은 별 수고도 없이, 학습할 직접적인 정답지를 가지고 있다는 점이다. 바로 문장이 정답을 품고 있다. 빈칸을 맞춘다니, 이 얼마나 멋진 방법인가! 인터넷에 널린 문장에서 한 단어만 가리고 맞추면 상을 주고 틀리면 벌을 내리면 되는 것이다. 그것을 수천억 문장을 반복한다. 기보 수만개를 가지고 학습했던 알파고가 불쌍해지는 순간이다. 사람이 둔 기보는 구하는데 한계가 있다. 그런데 인터넷의 문장은 품질이 좀 문제일 수는 있지만, 차고 넘친다.

 

 물론 알파고와 ChatGPT는 모델의 구조가 다르기는 하다. ChatGPT는 Transformer라는 구조인데 알파고는 좀 다르다. 그래도 역시 수행하는 일은 별반 다르지 않다. 예컨데 정답 기보 데이터만 충분하면(ChatGPT는 5천억 token 이상의 데이터로 학습되었다) ChatGPT의 token을 각각 바둑판의 좌표에 대응시키고, 그 정답 기보로 학습시키면 ChatGPT는 그대로 바둑의 기보를 말처럼 읊는 모습이 되는 것이다. ChatGPT는 곧바로 바둑을 배우게 될것이다. (그런데 현실에서는 기보 데이터가 부족해 이게 잘 안될 수 있겠다)

 

 다시 정리해보면, 제한된 vocab size(단어사전크기)을 갖고 대량의 데이터를 구해서 정답을 제공할 수 있으면, 인간 수준으로 끌어올릴 수 있는 툴을 인간이 갖게 된 셈이다. 바둑은 361개짜리 vocab에 과거 수를 361까지 정도만 되는 문제이고, 사람의 대화는 5만개짜리 vocab(GPT-2)에 과거 token을 4096개(GPT-3.5) 정도 보면 되는 문제이다. 후자인 ChatGPT가 알파고에 비해 유리한 점은, 알파고와 적은 수의 기보와 강화학습에 의지해야 했던 점에 비해서, text corpus의 대규모 문장 속에서 빈칸 맞추기를 통해 직접 학습할 수 있었다. 이렇게 정답이 곧바로 판정되는 데이터는 학습의 지름길이다.

 

 그러면 이 두 AI 모델을 통해 바라볼 수 있는 미래는 어떤 것인가?

 

 넘쳐나는 인터넷의 데이터 관점에서는 이제 남은 것이 사진, 영상, 음성 정도를 활용 검토해 볼 수 있겠다. 별 전처리 없이 정답을 바로 알 수 있는 것은 사진이라면 특정 영역을 가리고 맞추는 방식이 아닐까? 영상도 어딘가 몇 frame 후의 장면을 맞추는 것이 가능해보인다. 음성은 뭔가 특정 구간을 가리고 역시 그 구간을 맞추는 형식을 상상해 볼 수 있겠다. 그렇게 학습하면 각기 이미지, 음성, 영상 유추가 가능해지리라 기대할 수 있다.

 

 그런데 이녀석들은 각기 vocab size(?)도 상당히 크고, 정답지도 균일하지가 않은 단점이 있다. ChatGPT(GPT-2가정)의 5만개 vocab size에 비교해보자. 사진을 특정 크기로 자르고 그 중 하나를 가린다면, 흑백 이미지라고 해도 20*20영역이면 벌써 20*20*256=10만개의 vocab size가 된다. 아 그러고보니 binary 이미지로 하면 꽤 잘 될수도 있겠다! 그래 인터넷 모든 사진을 일정 크기로 resize하고, 일정 크기로 자른 후 엄청나게 학습시키면 무언가 나머지 사진영역을 맞추는 무언가가 나올 수도 있겠다(문장에 기반한 것보다는 더 다양성이 커서 잘 안될것 같은 생각이 들지만)

 

 음성도 역시 적절한 크기로 잘라 똑같은 방식으로 할 수 있지 않을까? 물론 역시 사진과 비슷한 단점들이 있겠다. 이렇게 저렇게 사실 인터넷에 수도 없이 존재하는 사진/영상/음성 등을 생각해보면, 정말 "문장"을 가지고 학습하는 것은 신의 한 수 였다는 생각이 든다. 그렇게 알파고의 바둑이나 문장을 가지고 학습하는 방식이나 비슷하며, 오히려 할만한 문제였다는 생각이 드는 것이다. 인터넷의 대규모 데이터 중 가장 학습시키기 쉬운 것이 바로 문장 데이터였던 것이다! 그래서 돌이켜보면 대규모 언어 모델에서 이 방법을 처음 쓴 ELMO와 BERT를 거쳐 OpenAI의 ChatGPT가 제대로 학습시켜 상용화한 셈이다.

 

 그렇게 제일 유리한 문장 데이터를 통한 학습의 권좌를 빼앗기게 되었다. 하지만 여전히 미래는 열려있다. 이 대규모 정답지 데이터인 text corpus기반의 학습은 아마 여러가지로 다른 형태로 시도될 수 있겠다. 아무리 생각해도 이만한 데이터가 없다. 그리고 앞서 설명한 사진, 영상, 음성, 기타 인터넷에서 구할 수 있는 모든 것 중에 vocab size가 크지 않고, 데이터가 많으며, 과거를 참고해야할 token의 길이가 크지 않는 문제를 발견하는 회사는 ChatGPT의 다음 흐름을 쥐지 않겠는가?

 

 알파고와 ChatGPT는 그래서 위의 공통된 특성을 갖고 있었고, 유사한 특성을 갖는 다음 모델이 그 자리를 찾아 헤매이지 않을까? 그 모델이 할 수 있는 일이 다음 AI가 히트를 칠 능력이 되지 않을까? 이렇게 상상해볼 수 있겠다.

 

반응형
Posted by 작동미학