2019년 4월 5일 금요일

인공지능이 인간에게 깨우쳐주는 것

인공지능에 대한 회의적 시각은 아직도 만연한데, 그건 인공지능에 대한 기술적으로 들어갈수록 더 그렇지 않나 싶다.
어차피 컴퓨터로 할 수 있는 연산이라는 것이 매우 제한적인 것이고, 그것들의 파생된 혹은 복잡하게 조합된 연산이라고 해 봐야 그 한계가 뻔해 보이기 때문일 수도 있다.

하지만 빅데이터, 데이터의 분류와 결합, 데이터의 검색과 변형, 딥러닝, 상황에 따른 유동적 확률의 적용 등이 엮어내서 도출되는 그 무언가가 과연 어떤 의미를 지니겠는가 하는 건 완전히 별개의 문제이다.

컴퓨터가 쉬지 않고 이 작업들을 기계적으로 반복하고 있다고 하더라도, 그 순간순간에 도출되는 중간 결과물들에 대한 의미의 판단마저 스스로 하지 못한다면, 막대한 리소스를 투입하고도 인간들이 얻을 수 있는 결과는 아무것도 없을 수 있다.

그렇다면 과연 컴퓨터가 스스로 어떤 의미를 파악하고 판단할 수 있겠는가?

바로 이 문제가 인공지능에 대한 의구심의 핵심이다.


알파고가 바둑에서 이기고 지는 것에 대해 대체 어떤 의미를 가지고 있을까?
이세돌이 졌을 때 느꼈던 패배감 좌절을 알 수 있을까?
그리고 한번 이겼을 때의 쾌감과 자신감을 알 수 있을까?
그건 그냥 감정이라고? 의미가 아닌?

자동 통역 시스템들은 자신들이 통역해야 할 문장의 의미를 알고는 있는걸까?
그래서 통역해낸 결과도 같은 의미를 가지고 있다는 걸 알고는 있는걸까?
그 결과를 다시 역변역했을 때, 최초의 문장과 조금이라도 달라졌다면 그게 어떤 차이인지 알고 있을까?
알리가 없지 않은가?


하지만 이와같은 인공지능에 대한 강한 의구심을 떨쳐낼 수 있는 개념은 따로 있다.

'그래서, 인간은 과연 정말 알고 있는건가?'

인간들이 알고 있다고 생각하는 것들이 정말 맞는것일까?
그냥 알고 있다고 생각하는 건 아닐까?
만약 신적인 존재, 전지적인 존재가 인간들의 지식을 보면 어떤 생각이 들까?
아주 단편적이고, 아주 제한적인 시간과 공간에서만 들어맞는 자기들만의 자식을 가지고 마치 절대 진리와 맞닿아 있을거라 우쭐거리는 존재?

그럼에도 불구하고, 인간의 과학기술이 현실세계에서 적용되고 효과를 보고 있다면, 컴퓨터의 인공지능 또한 제한적인 시간과 공간에서만이라도 그 나름대로의 효과가 있지 않겠는가?
인간의 지식이라는 것이 진리와 일치하지 않더라도 어떤 효과를 가지고 나름의 발전을 해 왔다면, 인공지능이 습득한 그 무언가도 나름대로의 효과를 가질 수 있지 않겠는가 말이다.(설령 인간이 보기에는 말도 안되거나 이해할 수 없다해도)


제목처럼, 인공지능의 한계가 뻔히도 보이지만, 그만큼 인간도 한계를 가지고 있다는 자기 반성의 기회를 주고 있다.
그리고 인공지능에 새로운 기대를 걸 수 있는 이유는, 인간이 스스로도 틀릴 수 있다는 겸허함 마음을 가진 토대에서만 가능한 일이 아닐까 싶다.

2019년 3월 21일 목요일

인간의 언어(Human Languages)

통상적으로 인간이 사용하는 언어를 자연언어 Natural Languages라고 부른다.
나와 같은 프로그래머는 프로그래밍 언어 Programming Languages와 구별하기 위한 이 표현을 그냥 편의상 받아들여서 사용하고 있다.

그런데 좀 우습지 않은가?
자연언어? Natural Languages?
마치 무언가 원초적인 힘을 가지고 있으며, 신성 불가침의 속성을 가지고 있다는 느낌을 주는 표현이 아닌가?


과거 자연언어 처리를 위한 방법으로 도입되었던 분석적 방법은 매우 제한적이거나 불완전한 면이 많았다.
어째서 이 방법에 문제가 많았던 것일까?
자연스럽게 인간의 언어를 이해하고 또 문장을 생성하기 위해서는 필요로 하는 문법이 너무나 많다고 할 수도 있다.
혹은 너무나 많은 예외 상황을 탓할 수도 있으며, 그나마도 어떤 예외를 적용할지 판단할 기준을 찾기가 너무 어렵다고도 할 수 있다.

사실은, 애초에 문법으로 배울 수 있는 언어는 아주 일부분이며, 단지 시작일 뿐이고, 수많은 예외 상황을 습득하는 것이 진짜 언어를 배우는 것이었기 때문일 것이다.

인간의 언어란, 아주 합리적이지도 않고, 이성적이지도 않다.
어쩌면 아주 오랜 시간을 거치면서 서로의 말이 제대로 전달될 수 있는 방법에 대해서 경험적으로 변형되어 온 것일지 모르겠다.

최근의 자연언어 처리는 빅데이터를 기반으로 하는 방법이 주로 사용되는 듯 하다.
그리고 이 방법의 문제도 많겠지만, 인간이 언어를 배우는 방법에 더 가까워 보인다.

그래야 일곱시 일곱분이 아닌 일곱시 칠분이라는 표현을 해석하고 생성할 수 있지 않겠는가.


잠깐 영어, 영어 공부에 대한 생각

한국인이 영어를 배우기 힘들어 하는 이유?
언어의 유사성이 매우 낮기 때문이 아닐까?
유사성이라함은 언어의 구조적인 유사성 뿐 아니라, 언어가 통용되는 사회 문화 철학적 유사성을 모두 함축하고 있다.

곰곰 생각해보면, 우리가 영어를 배우면서 종종 겪게되는 어려움은 이런거다.
"이러이러한 표현을 영어로 어떻게 말해야 하나요?"
그런데 간혹이긴 하지만, 이런 답변을 보게 된다.
"본토에서는 그런 식의 말을 쓰지 않는다. 그래도 굳이 영어로 표현하자면 ..."

이런 경우를 보면 정말 언어가 사고(思考)를 창조한다는 의미를 알게 된다.
언어로 표현할 수 없는(표현하지 않는) 것은 생각할 수도 없는 것이다.

유사성이 떨어지는 언어를 습득하기 위해서는 먼저 생각의 틀을 바꾸어야 한다.
한국인은 한국어로 생각을 하고 이걸 영어로 옮기려고 하지만, 이 경우에는 기존에 영어에서 쓰지 않던 새로운 표현 방식을 만들어 내야 한다.
그러니 외국인과의 대화에서 서로가 이해할 수 없어서 곤란해하는 경우가 속출하고 대화는 단절되고, 대화가 두려워지고, 관계는 서먹해지고...

원초적으로 따지면, 자신이 가지고 있던 모든 지식을 다 비우고, 영어가 사용되는 환경과 상황에서 생활하면서, 그곳에서 사용되는 표현 방식을 익히고 쓰면서 배워야 한다.
그런데 그게 가능하겠는가?
그렇다면 대안으로 외국인들이 사용하는 문장을 그냥 따라한다.
그 상황을 보면서 따라하고, 그 상황을 상상하면서 반복한다.
그렇게 한 문장 한 문장이 쌓이게 되면, 영어로 생각하는 영역과 한국어로 생각하는 영역이 다르다는 걸 알 수 있을 것이다.

애초에 이런 생각의 영역이 다를 거라는 생각은 없이, 언어가 단지 생각을 표현하는 수단이라고만 여겼기에 영어 공부는 틀렸던 거다.
언어는 생각을 표현하는 수단이기 이전에 생각을 만들어내는 도구다.
이 도구가 없다면 생각도 불가능하다.

한국어라는 도구가 만들어 내는 생각과, 영어라는 도구가 만들어 내는 생각은 아주 많이 다랐던 것이다.

2019년 2월 9일 토요일

malloc()의 구현 방법?

C 언어에서 흔하게 사용되는 메모리 할당 함수인 malloc()은 어떻게 구현되어 있을까?
함께 짝으로 사용되는 free()는 어떻게 구현되어 있을까?

흔하게 공룡책으로 불리우는 Operating System Concepts에서 배웠던 기억으로는 first-fit과 best-fit이라는 전략이 있다는... 어렴풋한 기억이 있을 뿐이다.
당시의 그 책은 매우 유용하기도 했지만, 다분히 교과서적이고 개념 위주였기에 실제 구현과는 거리가 좀 있었던 것으로 기억한다.

아무튼...
커다란 메모리 공간을 확보해서 힙으로 사용하도록 정한 후에, malloc()이라는 함수를 통해 메모리 할당 요청이 들어왔을 때, 그리고 메모리를 다 사용한 후에 free()라는 함수를 통해 메모리를 반납할 때, 이들을 어떤 식으로 처리하는 것이 좋을까?

우선은 잠시 생각해 본 아이디어를 끄적여 보겠다.

- 일단은 first-fit으로 구현.

- 메모리의 할당과 반납의 반복으로 힙은 여기 저기 조각난 상태가 될 것인데, 이 경우에 메모리 할당 요구가 발생하면, 비어있는 조각들 중에 크기가 맞는 것을 골라서 할당해 주어야 한다.
- 이를 위해 메모리 할당 테이블과 같은 별도의 정보를 관리하는 것도 하나의 방법이지만, 아주 작은 메모리의 할당이 많이 발생하면 관리를 위한 정보가 급격히 늘어나는 문제가 있다.
- 예전에 어떤 프로토콜 스택을 사용하면서 소스를 살펴보니, 이런 관리 정보를 힙 내부에 보관했던 기억이 있다. 즉, 사용하지 않은 힙의 메모리 내부에 비어있는 메모리 블럭들에 대한 정보를 저장하여 관리하는 것.
- 비어있는 메모리 블럭의 시작 부분에 블럭의 크기와 이전 블럭의 주소, 다음 블럭의 주소를 가지고 있는 구조. 최초의 힙은 블럭의 크기가 힙의 크기와 일치하고 이전 블럭의 주소와 다음 블럭의 주소는 null 값이 될 것이다. 전역 변수로 비어있는 첫번째 블럭의 주소만을 가지고 있으면 되고, 이 변수의 최초값은 힙의 시작 주소와 일치.
- 메모리 할당 요청이 들어오면 전역변수로 첫번째 빈 블럭부터 시작하여, 할당할수 있는 크기의 블럭이 나올 때까지 링크드 리스트처럼 연결된 블럭을 순회한다.
- 할당 가능한 블럭이 나오면, 할당 요청된 크기만큼을 할당하여 돌려주고, 블럭의 남은 조각을 새로운 블럭으로 리스트에 넣어주면 된다.

- 메모리 반납은 시작 주소만 있을 뿐, 크기는 없다. 위와같은 구조에서 해당 주소만이 주어졌을 때, 크기는 어떻게 알아내야 하는가?
- 할당된 메모리의 앞 부분에 할당된 블럭의 크기를 넣는다? --> 오케이.
- 그러면 비어있는 블럭의 맨 처음에도, 할당된 블럭의 맨 처음에도 그 블럭의 크기가 들어가는 셈.

- 메모리 얼라인먼트 문제?
- malloc()함수에서 할당 크기가 아니라, 메모리 단위와 개수로 할당을 받는 이유는 뭘까?

2019년 2월 7일 목요일

인공지능의 의미

인공지능은 한때, 흥미로운 SF의 소재였을 뿐 UFO나 외계인, 예티처럼 현실 세계에는 거의 아무런 영향을 끼치지 못하는 '꿈'의 기술이었다.

알파고의 출현은 가히 충격적이었다.
바둑이라는 게임에 한정된 것이었지만, 그 위력과 영향력에 대한 희망과 두려움은 전세계인에게 분명한 흔적을 남겼음에 틀림없다.
물론, 그 이후론 이렇다할 충격적인 인공지능의 출현이 보도되지 않아, 다시금 예전의 일상으로 돌아온 듯 하지만, 이제 우리의 생활이 큰 변화를 맞을 수 있다는 사실은 인정할 수 밖에 없어 보인다.

어쩌면 그렇게나 큰 충격은 다분히 우리가 생각하는 인공지능에 대한 무지에서 비롯된 것이 아닐까 싶다.
기계는 쉬지 않고 엄청난 속도로 학습하고 빠르게 진화할 수 있다고 생각하지만, 틀림없이 그건 아주 어려운 일이다.
마치 모든 분야에 속속들이 인공지능이 침투할것이라고 생각하겠지만, 그러기위해 필요한 자원(?)은 막대한 수준을 넘어 현재로썬 불가능할지도 모르는 수준일 것이다.

딥러닝, 빅데이터, 서칭 알고리즘, 데이터의 분류, 분산된 데이터의 적절한 결합, 이를 바탕으로 한 새로운 추론 등등...
각 기술의 작동 방식을 이해하기도 어렵지만, 이해한다 해도 어떤 데이터가 수집되어 있는지에 따라 결과는 큰 차이를 보일 것이기에, 인공지능 기술이 어떤 결과를 가져 올지는 예측하기 쉽지는 않다.

즉, 인공지능이 인간의 생활을 근본부터 바꾸리라는 희망이자 두려움에 대해서는 약간 냉정함을 가질 필요는 있어보인다.
상상처럼 '완벽한' 인공지능, 광범위한 영역에 단일한 메커니즘으로 운영되는 그런 인공지능은 여전히 '꿈'의 기술인 듯 하기 때문이다.


오히려, 인공지능에 대한 기대감과 시각을 바꿀 필요가 있어 보인다.

아마도 인공지능의 발전은 기대만큼 빠르지 못하고, 많은 자원을 필요로 하기에 중간중간 그 효용성에 대한 의문이 제기될 소지가 많다.
그럼에도 불구하고 꾸준히 발전시켜야할 분야라고 생각하는데, 그 이유는 이렇다.

수치나 논리로 설명을 하긴 어렵지만 직관적으로 이런 생각이 들곤 하는데,
가령 IQ가 80인 사람들이 제아무리 많이 모여도, 제아무리 많은 시간을 투자한다고 해도 아인슈타인의 상대성이론을 만들 수는 없겠다 싶은 생각.
물론 그 사람들이 모두 모여 덧셈 곱셈을 해 내는 속도는 이인슈타인보다 훨씬 빠르겠지만.

자칫, 타고난 지능에 대한 차별로 보일 수 있겠지만, 이건 오히려 그 반대의 상황이다.
즉, IQ가 80인 사람들이 아무리 노력하고 아무리 많이 모여도 이룰 수 없었던 수준에 도달하는 '방법'에 대한 얘기인 것이다.

과연 그런 방법이 존재할까?
만약 그 방법이 존재한다면, IQ 150인 사람이 IQ 200의 수준에 도달하는 방법도 찾을 수 있으며, 인간이 외계인 혹은 신의 수준에 도달하는 방법도 찾을 수 있을지 모른다.

인공지능은 바로 그 '방법'의 하나이다.
계산만 빠르게 하던 컴퓨터가 인간의 사고방식 수준에 도달하는 '방법'


사람은 개와 고양이를 구별할 수 있지만, 컴퓨터로는 그게 어려웠다고 한다.
사람들은 모두 언어를 구사하지만, 컴퓨터가 사람의 언어를 이해하는 건 아주 어려운 일이었다.
사실 그렇게 어려웠던 건, 사람들이 그런 능력을 공짜로 부여받았기에, 특별한 어려움 없이 습득한 능력이기에, 어떻게 그걸 하는 것인지 그들 자신도 그 '방법'을 모르고 있었던 것이다.

사실, 이제는 컴퓨터가 고양이와 개를 구별할 수 있다고 한다. 인간의 언어를 이해하고 명령대로 이행하고 번역이나 통역도 한다고 한다.
그게 단지 빅데이터를 통해 단순히 비교 검색하는 것으로 이루어지는, 컴퓨터의 인간 '흉내내기'에 불과한 것이 아닐까 생각하지만, 우리들 스스로도 우리가 어떻게 구별하고 어떻게 이해하고 있는지 모르는데, 컴퓨터의 그것을 비난할 수 있겠는가.