보통 사람들은 인공지능(AI, Artificial Intelligence)이라 하면, “사람의 형태를 갖추고 의사소통이 가능한 로봇”을 상상하고는 합니다. 터미네이터나 아이로봇, 혹은 마블 영화에 등장하는 자비스나 울트론을 생각하기도 하죠. 이들은 “스스로 생각하고, 사람과 의사소통이 가능”하다는 공통점이 있습니다.
반대로, 현재 우리가 일상에서 볼 수 있는 AI는, 시리나 빅스비, 구글 어시스턴트, 그 외 다양한 챗봇이 있습니다. 수많은 자연어 문장을 수집하거나, 전문 작가를 고용해서 감성적인 대본을 작성하고, 상황에 맞는 답변을 음성이나 문자로 제공하는 형태죠. 하지만 여전히 “스스로 생각해서”라는 부분은 잘 보이지 않습니다. 감성은 대본을 흉내낼 뿐이고, 말을 못알아듣는 경우도 많아서 “그래 그냥 내가 하고말지” 하는 경우가 많죠.
분명, 우리의 삶은, 이전에는 상상조차 할 수 없었을 정도로 발전했습니다. 예를 들어볼까요? 50년 전, 인류가 달에 사람을 보낼 때 사용했던 유도시스템의 CPU 성능은 2MHz 정도였습니다.
그런데,
- 신용카드나 USIM에 사용하는 IC칩의 성능은 25MHz 정도입니다. (약 10배 이상)
- LG V40이나 삼성 갤럭시 S9에는 2.8GHz, 1.8GHz 코어가 각각 네 개씩 들어가 있습니다. (약 9000배 이상)
하지만 여전히 우리는 음성비서에게 “아버지께 나 오늘 늦는다고 문자보내줘”라고 말하면, “오늘 늦는다”는 메시지만 전송되는 현실을 마주합니다.
왜 이런 차이가 발생할까요?
가장 큰 원인을 꼽자면, “AI에 대한 지나친 기대”와, “AI 발전 속도에 대한 무시”를 동시에 들어야 합니다. 빌게이츠가 했던 유명한 말이 있죠.
“우리는 2년 후 닥쳐올 변화는 과대평가하지만, 10년 후 닥쳐올 변화는 과소평가한다. “
사실, 현재 컴퓨터가 할 수 있는 일은, 집에 있는 컴퓨터로 할 수 있는 일과 동일합니다. 단순한 계산기 역할을 반복하고, 그것을 매우 빠르게 수행할 뿐이죠. 결국 인간 지능을 통해 업무영역을 하나하나 설정해주어야 합니다. 아무리 발전해도 결국 프로그래밍을 통해 작동해야 한다는 뜻입니다.
그런데 또 문제가 있습니다. 생각보다 많은 사람들이 “프로그래밍”이 무엇인지 잘 알지 못합니다. 프론트엔드와 백엔드 영역을 구분하지 못하고, 파일 핸들러와 SQL을 구분해서 사용하지 않습니다. 자바와 자바스크립트를 헷갈려 하는 일은 너무 익숙해서 새롭지도 않고, HTML로 프로그래밍 한다는 농담은 이제 지겹기까지 합니다.
그래서 준비했습니다. 프로그래밍이 무엇인지, AI는 그래서 뭔지, 최대한 쉽고 간단하게 알아봅시다.
프로그래밍이란?
프로그래머는 “사람이 사용하는 언어와 논리를, 컴퓨터가 실행(이해가 아닙니다)할 수 있는 언어로 바꿔주는 사람”입니다. 그리고 이 작업을 프로그래밍이라 할 수 있죠. 프로그래밍 언어와 문법은, 단지 그 과정에서 사용하는 도구일 뿐입니다. 예를 들어 GUI를 제작할 때 연필과 지우개를 쓸 수도 있습니다. 그림판에서 픽셀을 찍을 수도 있고, 포토샵과 일러스트레이터로 그리거나(보통 이렇죠), 캐드와 스케치업으로 설계하기도 합니다. 물론 각각 트렌드나 용도에 따라 다른 도구가 사용될 수 있죠. 디자이너 나름의 스타일이나, 협업하는 사람의 요청에 따라 달라질 수도 있겠습니다.
최근 유행하는 프로그래밍 스타일은 아래 세 종류 정도입니다.
(더 자세한 설명이나 다른 스타일은 프로그래밍 패러다임을 참고하세요)
절차지향
명령형 프로그래밍의 일종입니다. 기계어, 어셈블리어, C, 그 외 기타 전통적인 프로그래밍 언어에서 사용합니다. 아래 객체지향 언어와 함수형 언어에서도 적용 가능한 스타일이지만, 비효율적이기 때문에 개발 단계에서는 잘 적용하지 않는 추세입니다. 그림판으로 점을 찍는다고 생각하면 많이 비슷합니다.
객체지향
명령형 프로그래밍의 일종입니다. 자바(+코틀린), C#, Swift등, 최근 유행하는 대부분의 언어가 이 방식을 지원합니다. 객체를 떼다가 필요한 곳에 붙여서 사용하는 방식이므로, 실제 세계와 가장 유사하다고 많이 표현합니다. 컴포넌트를 조합해서 GUI를 완성하는 방식을 생각하면 됩니다.
함수형
선언형 프로그래밍의 일종입니다. 객체지향 프로그래밍과 관련이 있으나, 전혀 다른 스타일로 코드를 작성하는 경우가 많습니다. 순수 함수를 조합하여 소프트웨어를 만드는 방식이며, 객체 간에 인자(정보)뿐만 아니라 함수(기능, 작업, 문제 등)를 교환할 수 있다고 간단하게 이해하고 넘어갑시다.
물론, 모두 “실제 컴퓨터”를 기반으로 작동하기 때문에, 컴퓨터에 전달될 때는 0과 1로 이루어진 기계어로 변환하는 과정이 필요합니다. 즉, 모두 절차지향 스크립트 언어 기반으로 작동한다고 봐도 됩니다. 특정 줄에 적혀있는 명령어를 읽고, 그에 따라 동작합니다. 그리고 그 명령어 중 가장 기본은 바로 if 구문입니다.
if(조건){동작}
위와 같은 코드는 현재 프로그래밍에 사용되는 “대부분의” 언어에서 사용 가능합니다. 그럼, 순서대로 천천히 살펴보겠습니다.
- if : 특정 조건을 만족할 때 어떠한 동작을 실행하라는 명령어입니다.
- (조건) : 코드를 실행할 때 상태를 판단하여 참/거짓을 구분합니다. 예를 들어 1==1 은 참(true)이며, 1==2는 거짓(false)입니다.
(보통 “같다”를 표현할 때는 =를 두 개 사용합니다) - {동작} : 특정 조건이 참인 경우에만 특정 동작을 실행합니다. 여기에는 단순한 사칙연산부터, 특정 사용자가 요청한 회원정보 수정까지 다양한 동작이 들어갈 수 있습니다.
그리고 조건이나 동작이 복잡해지는 경우, 아래와 같이 작성할 수도 있습니다. 여기서 // 뒤에 있는 녹색 글은 주석(컴퓨터가 읽지 못하는 글)입니다.
if // 조건문 시작 ( 조건 // 검색버튼 Tap 발생하는 경우 ) { 동작 // 키보드 표시 }
그런데, 여전히 어렵습니다. 그래서 이전에 다루었던 프로토파이 툴을 예로 들어 (파이처럼 쉽게, 프로토파이) 설명해 보겠습니다. 프로토파이는 UX 디자인을 위한 툴이지만, 개발자 입장에서는 “GUI로 확인 가능한 객체지향 프로그래밍”이라고 볼 수 있습니다.
그럼 위에 있는 코드를 프로토파이 기준으로 다시 적어볼게요.
if(트리거){오브젝트.리스펀스}
“트리거가 발동하면 – 오브젝트가 – 리스펀스 한다”가 됩니다. 예를 들어, 프로토파이 프리뷰 화면에서 검색버튼을 탭 하면(트리거) 키보드(오브젝트)가 화면 위에 표시(리스펀스)되는 프로토타입을 만들 수 있습니다. 다시 개발자의 언어로 이야기하면, “검색버튼 콜백 들어오면 키보드 호출해서 화면 하단에 오버레이하고 입력 대기 상태로 전환한다”가 되겠습니다. 많이 달라 보이지만, 의미는 동일합니다.
그래서 개발자들은 이런 말을 하기도 합니다.
“새로운 언어가 어렵긴요, 변수랑 if만 있으면 어떻게든 돼요.”
조금 망언처럼 들립니다만, 사실상 저 말이 컴퓨터 프로그래밍의 정의(definition)이며, AI의 조건 중 하나인 “느슨한 튜링 완전성”입니다.
어떤 값을 기억하고(변수), 특정 조건을 만족하는지 확인하고(if), 요청한 작업을 처리한 뒤에 출력합니다(계산기). 이런 간단한 동작이 수없이 쌓여서, 우리가 보는 화면을 만들어냅니다.
만약, 이 과정을 좀 더 알고싶으시다면, 생활코딩 강의 중 WEBn을 참고하세요.
교양으로 코딩을 공부하려는 분들에게는 출구를, 직업으로 코딩을 공부하려는 분들에게는 입구를 제공합니다.
그래서 AI는 어떻게 만들어요?
일단, 설명을 위해 AI를 세 단계로 구분하겠습니다.
- 인공지능(Artificial Intelligence, AI)
- 기계학습(Machine Learning, ML)
- 딥러닝(Deep Learning, DL)
그리고 각각 어떻게 작동하는지 간단히 알아봅시다.
인공지능
AI는 우리가 보통 “전자기기”라 말하는 모든 기계를 포괄합니다. 모두 0과 1로 계산을 수행하죠. 하지만 전자계산기를 인공지능이라 부르기엔 많이 부족해보입니다. 그렇다면, 조금 정의를 좁혀서, 이젠 익숙한 “추천시스템”을 예로 들어봅시다. 추천시스템은 가장 기초적인 프로그래밍 방식에서 출발합니다.
if(트리거1){ // 트리거1 조건이 발생하면 오브젝트.리스펀스 // 오브젝트를 리스펀스 한다 }else if(트리거2){ // 트리거1이 발생하지 않고 트리거2가 발생하면 오브젝트2.리스펀스2 // 오브젝트2를 리스펀스2 한다 }else{ // 트리거1/2 모두 발생하지 않으면 오브젝트3.리스펀스3 // 오브젝트3을 리스펀스3 한다 }
이게 기본이라고 한다면, 추천시스템은 이걸 충분히 복잡한 상황으로 만들고, 훨씬 더 다양한 조건(if와 트리거)을 고려합니다.
if(트리거1){ if(트리거2){ if(트리거3){ if(트리거4){ if(트리거5){ if(트리거6){ if(트리거7){ // 트리거 1~7까지 모두 만족하는 경우 오브젝트.리스펀스 // 오브젝트를 리스펀스한다 } } } } } } }
이렇게 만들면 됩니다(물론 현업에서 저렇게 늘어놓으면 혼납니다).
여기까지는 컴퓨터 연산 능력이 충분히 좋고(if 하나하나를 순서대로 처리해야 하니까), 데이터도 충분히 많다면(트리거 각각에 데이터를 넣어야 하니까) 얼마든지 할 수 있는 수준입니다. 그리고, 넷플릭스와 유튜브가 이 분야에서는 최고라고들 하죠.
“어떤 태그가 있나? 이것도 있나? 혹시 이 태그 영상도 좋아하나? 그런데 이 영상은 시청기록이 꽤 긴데?
그럼 이 고양이를 보세요!”
그리고 이런 추천은 어지간해서는 빗나가지 않죠. 그래서 다음달 결제를 멈추지 않게 됩니다.
머신러닝
컴퓨터의 첫단계가 변수와 if, 즉, 참과 거짓을 구분하는 기능이라면, 두번째는 반복입니다.
컴퓨터에 똑같은 코드를 두 번 주면, 컴퓨터는 아무 말 없이 두 번 실행합니다.
if(트리거1){ 오브젝트.리스펀스 오브젝트1.리스펀스2 오브젝트2.리스펀스3 }
문장을 두 번 쓰지 않고, 그냥 숫자만 100을 넣으면 컴퓨터는 똑같은 행동을 100번 반복할 수도 있죠.
for(int i=0; i<100; i++){ // 오브젝트에 리스펀스 동작 100번 반복 오브젝트.리스펀스 }
게다가 전원이 꺼질 때까지 무한히 반복할 수도 있습니다.
while(true){ 오브젝트.리스펀스 // 오브젝트에 리스펀스 동작 무한반복 }
저 위에 있는 동작은 한 번 지나가고 나면 끝입니다. 하지만, 컴퓨터의 조건 중 하나인 기억 능력이 여기에 적용되면 어떨까요? 우리는 매출 현황을 기록하고 이걸 정리해서 표나 그래프로 만들 수 있습니다. 그러면 의사결정권자는 현재 상황을 좀 더 빠르게 이해할 수 있고, 사업 방향을 결정할 수 있겠죠.
이 과정이 자동화되면 어떨까요? 사용자 유형과 사용방식을 저장하고, 사용자 각각에 대해 콘텐츠를 자동으로 갱신해서 표시할 수도 있습니다. 넷플릭스나 유튜브, 혹은 수많은 웹 기반 서비스가 이렇게 하고 있죠. 우리는 서비스를 실행할 때마다 달라지는 화면이 이미 익숙합니다.
머신러닝을 그대로 번역하면 “기계 학습”이 됩니다. 특정한 점수판과 자료를 주고, 자료를 정리하고 취합한 뒤, 비슷한 문제 해결에 성공하면 가산점, 틀리면 감점처리합니다. 네, 학교에서 공부하는 학생과 동일하죠. 이렇게 계속 공부하다보면, 점점 더 쉽게(그리고 정확하게) 문제를 해결할 수 있게됩니다.
(좀 더 자세한 정의가 필요하시다면 앨런 튜링(1950), <계산 기계와 지능> 논문을 참고하세요)
여기에는 지도/비지도/강화학습 등 다양한 방법론이 있습니다. 하지만 일단 최대한 쉽고 간단하게 표현하자면,
“무식하게 성능좋은 컴퓨터에, 무식하게 큰 데이터를 넣어서, 무식하게 많이 계산하면,
똑똑한 결과가 나온다.”
가 됩니다. 병렬식 슈퍼컴퓨터에, 빅데이터를 넣어서, 머신러닝 코드를 실행한다는 뜻입니다. 충분히 많은 표본 각각을 검사해서, 전체 집단의 특성을 유추하는 과정이죠. 평균, 분산, 회귀선을 계산하고 최적화된 값을 제공하는데, 이는 엑셀이나 구글 스프레드시트만 있어도 가능합니다. 다만 데이터가 너무 크고, 계산과정도 오래 걸리기 때문에 컴퓨터로 자동화 시켰을 뿐이죠. 결국, 특별할 것도 없이, “대량 통계 작업”이라고 보면 됩니다.
가만히 살펴보면, 사람이 문제해결 할 때와 비슷합니다. 조금 더 쉽게는, “점심메뉴 고르기”라고 생각해도 됩니다.
“매운 음식 안먹고, 가격은 인당 최대 1만원, 네 명이 앉을 수 있고, 회사에서 거리가 10분 이내인…”
등으로 하나씩 줄여서, 어디로 갈지 결정하는 방식입니다. 그러다가 귀찮아지면 결국 가던 곳을 가는 “휴리스틱” 방법론을 사용할 수도 있습니다.
다만, 컴퓨터는 어지간해서는 지치지 않고, 지쳐도(낡아도) 같은 결과를 제공합니다. 게다가 단순계산은 사람보다 훨씬 빠르죠. 데이터와 학습 방향을 설정하면, 컴퓨터는 그 방향에 따라 학습(데이터를 정리하고 기록하는 일, 통계)합니다. 학습한 결과가 쌓이면 점차 “사람에게 더 유용한” 결과를 제공할 수 있습니다.
여기까지는 기존 컴퓨터에서도 얼마든지 작업이 가능합니다.
딥러닝
딥러닝은 머신러닝의 하위 분야 중 하나입니다. 기존 머신러닝 방식을 확장하여, 여러 층(Layer)을 깊게(Deep) 쌓아 인공신경망을 구성합니다. 예를 들어 사진을 인식한다고 하면 한 층에서는 색상을, 다음 층에서는 형태를 인식하여 패턴을 감지하는 방식입니다.
그런데 이 과정에서 뇌 구조 자체(인공신경망이라 부르기도 하는)를 모방합니다. 연산 방식이 기존 컴퓨터와는 차이가 있기 때문에 기존 계산기(Computer)로는 비효율적이죠. 큰 계산을 한 번 처리하기보다, 작은 계산을 여러번 반복하는 방식이기 때문입니다. 그래서 보통 병렬식 연산에 유리한 GPU(그래픽카드라고 많이 부르죠)가 많이 적용됩니다. 하지만 이 또한 여전히 비효율성이 존재합니다. 그래서 최근 트렌드는, 딥러닝 맞춤형 하드웨어입니다. 애플에서는 아이폰X부터 얼굴인식(FaceID)을 위한 딥러닝 프로세서(A11 Bionic)를 적용하여 화제가 된 바 있죠.
이런 맞춤형 하드웨어는 보통
- FPGA(Field-programmable Gate Array)
- ASIC(Application Specific Integrated Circuit)
가 많이 사용됩니다. (이외에도 많은 방식이 있으나 일단 생략합니다) 이 둘은, 기존 CPU는 특정 작업을 수행하기 위해 코드(위에 적은 if(조건){동작})가 필요했다면, 이러한 순서도 자체를 아예 회로에 넣어 계산 효율성을 극대화한다는 특징이 있습니다. 조건을 만족했는지, 혹은 동작이 무엇인지 따로 계산하지 않고 즉시 실행한다고 이해하면 됩니다.
FPGA는, 프로그래밍 가능한 반도체입니다. 반도체 작동 방식 자체를 프로그래밍을 통해 정의하고, 그에 따라 작동하도록 하드웨어를 구성하죠. 공유기나 서버 등, 보안이 중요한 곳에 자주 사용됩니다.
ASIC은, 주문형 반도체라는 뜻입니다. 특정 작업을 하기 위해서 아예 그 작업에 최적화된 반도체만으로 설계하고, 요청에 맞게 판매하는 형태입니다. 보통 FPGA로 특정 작업을 설계하고, 사용하지 않는 반도체를 빼서 집적도를 높이고 생산 단가를 낮춘 ASIC을 제작합니다. 최근에는 암호화폐 채굴을 전문으로 하는 ASIC이 유행이었습니다.
딥러닝은 사람의 뇌 자체를 모방하는 경우가 많습니다. 가상으로 사람의 뇌 구조(신경 다발)을 구성하고, 거기에 데이터를 넣었을 때 나오는 결과를 다음 층(Layer)에 전달합니다. 그리고 이 과정을 꾸준히 반복합니다.
다시 말하지만, 이건 정말로 간략화된 설명입니다. 실제 딥러닝은 선형 맞춤과 비선형 변환, 텐서, 그 외에 다양한 수학 알고리즘을 적용하는 분야입니다. 그냥 “아 이런 것이 있구나” 정도로만 생각해주세요.
프로토파이를 예로 들어 설명하자면, “트리거(입력)을 여러 개 주고, 리스펀스(출력)도 여러 개 주고, 그 과정을 기록하고 추적해서(디자인 테스트), 최적화된 방식(사용성 개선)을 찾는다.”가 됩니다.
이 과정에는 몇몇 문제가 있는데, 예를 들어 “구덩이에 빠지면 스스로는 못 빠져나온다.”가 있습니다.
울퉁불퉁한 종이를 주고, 거기서 가장 낮은 지점을 찾아야 한다고 가정해봅시다(경사하강법). 컴퓨터는 종이 전체(빅데이터)를 한 번에 볼 수 없기 때문에, 특정 지점에서 탐색을 시작합니다. 그리고 조금씩 좌표를 이동하다보면 얕은 구덩이에 빠지게 됩니다. 거기에서 주위를 둘러보면 오르막길밖에 보이지 않죠. 결국 해당 좌표를 “가장 얕은 지점”으로 판단합니다.
다른 문제로, 과적합(over fitting) 문제도 있습니다. 적은 데이터로 너무 학습을 많이 하는 경우 흔히 발생하는 문제인데요, 컴퓨터에게 “강아지가 살 집을 설계해라”고 했는데 강아지 사진이 하나밖에 없다보니 그 강아지를 위한 “갑옷 설계도”를 내놓는 경우입니다.
이외에도 데이터 재입력 시 학습이 또 필요하다거나, 같은 데이터를 입력했는데 학습 결과가 다르거나 등, 다양한 문제가 있습니다.
import tenserflow as tf 없이는 아무 것도 못하거나
그래서 문제가 뭐에요?
현실 세계의 복잡성
우리가 사는 세상에는 비슷한 상황이 매우 많이 존재합니다. 그래서 사람은 직관을 사용하여 비슷한 대상을 하나의 카테고리로 묶어 생각할 수 있죠. 각목과 나무젓가락은 비슷하게 생겼지만, 우리는 그 용도가 다름을 확실하게 알 수 있습니다. 흰 바탕에 대상만 있다면 구분하기 어려울 수도 있지만, 주변 사물과 크기를 비교하는 등 그것이 놓인 “맥락”을 보고 판단할 수 있죠. 이는 우리가 충분히 많은 학습을 하고, 그렇게 학습된 지식을 서로 연결하여 맥락을 인식할 수 있기 때문입니다.
하지만, 인공지능은 이렇게까지 지식을 연결하지 못합니다. 이미지를 인식하는 인공지능 프로젝트 중 대다수는 블루베리 머핀과 치와와 사진을 제대로 구분하기도 어려워합니다. 가끔은 초코칩쿠키 사진을 보고 테디베어라는 답변을 주기도 해요. 사실, 사람이 봐도 얼핏 봐서는 헷갈릴 수 있습니다. 아래 사진을, 안경을 벗고 멀리서 확인해보세요.
컴퓨터 연산능력 부족
사실, 이게 가장 큰 문제입니다. 사람 뇌 수준의 사고력과 창의력을 발휘하기에는, 아직 갈 길이 멀죠. 그래서 아직까지 AI가 발휘하는 뇌 성능은 단세포 생물이나 소형 포유류 수준입니다. 그래서 너무 많은 데이터를 한 번에 처리하지 못하고, 기존에 배운 지식을 다른 용도로 사용하기 위해 연결하지도 못합니다.
최근 인텔에서는 2019년까지 쥐 수준 AI를 만들겠다고 선언하기도 했습니다. 이후 인텔 로이히(Loihi)나 IBM 트루노스(TrueNorth)등 다양한 신경망 가속칩은 등장했지만, 상용화를 위해서는 아직 갈 길이 멀다고 하겠습니다. 물론, 객체로서 사고하고, 학습하고, 문제를 해결하는 능력은 AI가 쥐보다 훨씬 빠르겠죠. 억, 조, 그 외에 사람이 셀 수 없는 단위로 숫자 계산도 할 수 있습니다. 하지만 창의성이나 새로운 문제를 발견하는 능력은? 쥐 수준이라니까요.
아직 퇴근길에 터미네이터를 마주친 적은 없으니, 아마 근미래에 강인공지능이 생겨나지는 않나봅니다.
참고: 예쁜꼬마선충 프로젝트
- 신경과 감각 세포 모방
- 행동 지시 없이 전원만 켜 둠
- 실제 생물과 유사한 행동 표출
Mets HIT UX Team