[이상국 칼럼] 괴델 에셔 바하 중간 정리 (2) 계층과 자유 의지, 그리고 창조자의 문제
글쓴이 :
아포리아
조회 : 33,456
괴델 에셔 바하 중간 정리 (2) 계층과 자유 의지, 그리고 창조자의 문제
1. 요즘 인기 있는 온라인 게임이 워낙 많긴 하지만 그래도 스타크래프트만큼 긴 역사를 자랑하는 게임은 흔치 않다. 나의 편견일지는 몰라도 이 글을 읽는 사람들 중에 스타크래프트의 대가나 그 게임에 관심이 많은 사람은 그다지 많을 것 같지 않다. 나 자신도 사실 별 관심이 없긴 했다. 전략 게임을 싫어하는 것은 아니지만 내가 하는 전략 게임은 주로 히어로즈 오브 마이트 앤드 매직과 같은 턴베이스 게임인데 플레이어들이 모두 동시에 쉬지 않고 게임을 컨트롤해야하는 스타크래프트와 같은 실시간 게임과 달리 턴베이스 게임은 서로 돌아가면서 자기 차례에 유닛들을 움직인다. 실시간 게임은 나같이 손이 느리고 눈과 손 사이의 협력관계가 그리 좋지 않는 사람이 하기는 매우 어렵고 튜토리얼 단계도 잘 넘어가지 못하는 수준이라 딱히 관심을 갖지 않았다. 그러다가 뜬금없이 이 게임에 관심을 겢게 된 계기는 얼마 전에 세계바둑 챔피언을 꺽은 프로그램에 이용된 구글의 인공지능 엔진인 딥 마인드를 스타크래프트에 적용하기로 했다는 기사를 봤기 때문이다. 이 소식을 접한 주변 사람들은 대부분 구글의 인공지능 엔진이 쉽게 스타크래프트 세계 챔피언을 꺾을 것이라는 의견을 보였다. 바둑에 비해서 스타크래프트 같은 게임은 어린애들 장난에 불과하다는 생각 때문인 것 같다. 하지만 내 생각엔 컴퓨터 게임이라고 해서 꼭 그렇게 단순하게 얕잡아볼 수는 없을 것 같다. 두 게임 모두 실제의 현실을 다루는 것이 아니라 잘 정리된 가상 속의 현실, 즉 숫자로 쉽게 정리할 수 있는 대상을 다루기 때문에 실제 현실에 비해서 컴퓨터가 다루기 쉬운 작업임은 분명하다. 컴퓨터가 스타크래프트를 한다고 해도 컴퓨터가 모니터를 보면서 마우스를 움직여서 유닛을 움직이는 것은 아니고 게임의 현재 상태를 컴퓨터가 처리할 수 있는 형태의 입력으로 받아서 정해진 신호를 스타크래프트 게임이 실행되는 서버에 보내서 유닛을 움직이는 형태로 게임이 진행될 것이기 때문에 모니터와 마우스 같은 거추장스러운 입출력 장치도 필요 없게 된다. 따라서 만약 무조건 손이 빠른 사람이 이기는 게임이라면 당연히 사람이 컴퓨터의 속도를 따라잡을 수는 없기 때문에 상대가 되지 않는 게임이 될 것이다.
2. 하지만 전략이 조금이라도 필요하다면 문제는 전혀 달라진다. 내 생각에 스타크래프트 경기를 하는 것이 세 가지 면에서 바둑을 두는 것보다는 컴퓨터가 다루기 어려운 작업인데 첫째는 게임의 현재 상태의 표현의 어려움이고 두 번째는 실시간성, 그리고 세 번째는 학습할만한 경기 결과의 양이 적다는 점이다. 바둑의 경우 게임의 현재 상태를 나타내기 위해서는 몇 개의 숫자만 있으면 된다. 심지어 바둑 경기 전체를 나타내는 것도 그다지 많은 숫자를 필요로 하지 않는다. 예를 들어 200 수의 바둑 게임이라면 1에서 19까지의 숫자 400 개면 완벽하게 표현이 된다. (한 수를 나타내는 데에 가로, 세로 좌표를 위해 숫자 두개가 필요하다) 하지만 스타크래프트의 경우 한 순간을 표현하는 데만도 정형화되어 있지 않은 엄청나게 많은 변수가 필요할 뿐 아니라 각 변수 값 자체가 동적으로 변하기 때문에 특정 단계에서 입력 값을 정하기가 쉽지 않다. 물론 엄청나게 복잡해보이긴 해도 근본적인 메커니즘은 바둑에 비해서 훨씬 단순하다고 주장하는 사람이 있을지는 몰라도 이는 사람의 입장에서 하는 얘기지 컴퓨터의 입장에서는 복잡한 변수들을 단순한 몇 개의 표현으로 바꾸는 것이 그리 쉬운 문제가 아니다. 현재 기술 수준에서 사람의 능력에 비해 컴퓨터가 가장 뒤떨어지는 것이 요약 능력이기 때문이다. 두 번째로 실시간성 역시 큰 문제가 될 수 있다. 바둑의 경우 다음 수를 결정하는 데에 컴퓨터로서는 영겁에 가까우 시간인 수십 초의 시간이 주어지지만 스타크래프트는 계산 결과를 기다려주지 않고 계산이 끝나 출력값을 내기 전에 현 상태가 많이 바뀌면 다시 계산을 해야 하는 악순환이 반복될 가능성이 많아진다. 다음으로 학습 자료의 부족도 큰 문제가 될 수 있다. 바둑의 경우는 엄청난 수의 수준급 경기에 대한 기록이 있고 각각이 모두 경기에 대한 완벽한 기록이다. 앞에서 본 것처럼 400여개의 숫자면 하나의 경기를 완벽하게 재현할 수 있는 것이다. 반면에 스타크래프트의 경우 수준급 경기의 수가 바둑에 비해서 그리 많지 않고 각 경기에 대한 기록도 불완전한 기록 밖에는 남아 있지 않다. 구글의 인공지능이 학습할 수 있는 형태로 경기 결과를 기록하는 작업이 이미 진행되고 있긴 하겠지만 그 이전에 이루어진 경기들에 대한 기록은 거의 남아 있지 않다고 봐야 할 것이다. 사실 세 번째 문제를 제외하고는 연산속도만 빨라지면 모두 해결되는 문제이고 학습 자료의 부족도 시간이 지나면 해결 될 수 있는 문제이다. 하지만 바둑 경기에서 사용된 컴퓨터에 비해서는 훨씬 성능이 좋은 컴퓨터가 필요할 것 같다. 현재 바둑 챔피언과의 경기에서 약간 우위를 보이는 수준이라면 스타크래프트의 챔피언을 꺾을 수 있을 정도의 수준이 되려면 앞으로 4,5년은 더 기다려야하지 않을까 싶다.
3. 어쨌든 컴퓨터가 할 수 있는 일의 게임의 범위가 조금씩 늘어나고 있긴 한 것 같다. 실제 생활에서 도움이 될 만한 현실과 관련된 작업들 중에서도 조금씩 할 수 있는 일이 생겨가고 있긴 한 것 같다. 하지만 그 속도는 사람들이 기대하는 수준에 비해 턱도 없이 느리다. 이는 인공지능과 함께 많은 관심을 받고 있는 빅데이터의 경우도 마찬가지이다. 무조건 많은 데이터만 얻어낼 수 있으면 쓸 만한 결론을 내릴 수 있다고 믿는 사람이 아직도 많은데 그 중에는 아직도 구글의 독감 추세 분석을 빅데이터의 성공적인 사례로 드는 사람이 있다. 구슬 독감 추세 분석의 경우 딱 한 번 우연히 맞는 결과를 내놓고 나서 그 이후로는 계속 엉뚱한 결과를 내는 바람에 지금은 서비스 자체가 중단된 상태인데도 말이다. 이는 마치 첫 월말고사에서 답을 잘 찍어서 우연히 90점을 맞았지만 그 후 1년 내내 낙제 성적을 맞은 학생의 성적을 평가할 때 한 번 90점 맞았다고 우수하게 평가하는 꼴이나 마찬가지이다. 인공지능은 이제 걸음마 단계로 무슨 일을 할 수 있을지 이것저것 집적대는 단계이지만 벌써부터 그 기술적 한계는 명확하다. 물론 그다지 가능성이 있어 보이지는 않지만 어떤 획기적인 새로운 기술이 개발되어 새로운 지평을 열게 될지도 모른다. 현실의 기술의 발전을 예측하는 것과는 반대로 이론적인 한계에 대해서는 지금도 명확히 얘기할 수 있다. 수학적인 이론은 변화하지 않기 때문이다. 지금은 맞는 이론이 시간이 지난다고 해서 틀리게 되는 경우는 없다. 인공지능의 실질적 응용에 있어서 이론적 한계가 어떤 영향을 줄 수 있을지는 모르지만 그 한계에 대해서 생각해 보는 것이 인공지능에 대한 이해와 그와 더불어 인공지능과 비교한 인간 의식의 특성에 대한 이해에 약간이나마 도움이 될 수 있을지 모르겠다.
4. 인공지능에 대한 이론적 한계는 몇 가지 증명된 것이 있지만 그 중에 가장 이해하기 쉬운 것은 컴퓨터의 작업 소요 시간에 대한 이론이다. 간단하게 결론부터 말하자면 컴퓨터는 자신이 작업을 하는 데에 얼마나 시간이 걸릴지 모른다는 것이다. 물론 작업시간에 대한 계산이 가능한 경우도 있지만 일반적으로 작업시간을 계산할 수 있는 알고리즘은 존재하지 않는다는 것이다. 심지어 어떤 작업을 할 때 이 작업이 영원히 끝나지 않을지도 모른다는 것을 컴퓨터 자신은 알 수 없다는 것이 이 이론의 결론이다. 이 결과를 좀 더 정확하게 이해하기 위해서는 컴퓨터는 주어진 작업을 수행하는 것 이외에는 더 이상 아무것도 할 수 없다는 사실을 반드시 주지할 필요가 있다. 예를 들면 다음과 같은 작업을 보자. [1]'주어진 숫자에 2를 더하고 그 결과가 홀수이면 그 결과에 2를 더하고 이런 과정 중에 결과가 짝수이면 작업을 멈춰라' 만약 처음에 주어진 숫자가 0이라면 2를 더했을 때 바로 짝수가 나오니까 작업이 끝날 것이고 처음에 주어진 숫자가 1이라면 2를 아무리 더해도 계속 홀수가 나올 것이기 때문에 작업은 영영 멈추지 않을 것이다. 무한의 시간이 걸리는 작업은 시킬 필요가 없기 때문에 그런 작업은 컴퓨터가 하지 않겠다고 거부하게 하고 싶다면 다음과 같은 작업 목록을 주면 될 것이다. [2]'주어진 숫자에 2를 더하고 그 결과가 홀수이면 그 결과에 2를 더하고 이런 과정 중에 결과가 짝수이면 작업을 멈춰라. 만약에 앞의 작업이 영원히 끝나지 않는 작업이라면 작업을 거부하라.' 여기서 문제는 두번째 문장이다. 일반적인 문장으로는 간단하게 서술할 수 있는 명령이지만 이를 컴퓨터에 줄 수 있는 명령의 형태로 바꿀 수 없다는 것이다. [1]과 같은 문장은 사람의 문장이고 보통 사람의 의도를 나타낸다. 이를 컴퓨터가 알아들을 수 있는 형태로 서술해야 하는데 예를 들어 다음과 같은 형태이다. (1)숫자 변수 = 주어진 숫자 (2)숫자 변수 = 숫자 + 2 (3)만약 숫자 변수가 홀수이면 앞문장 반복 (4)만약 숫자 변수가 짝수이면 작업 중단 이런 형태의 구체적인 명령 목록을 소스코드라고 부른다. 사실 진짜 소스코드는 아니고 알아보기 형태로 바꿔쓴 것이지만 실제 소스코드와 크게 차이는 없다. 실제 사용되는 컴퓨터 언어인 python을 이용해 표현하면 대략 다음과 같다. number = input("주어진 숫자는?") while number % 2 == 1: number = number + 2 print("작업 완료") 어쨌든 [1]은 컴퓨터가 알아들을 수 있는 소스코드 형태로 서술이 가능하지만 [2]의 두번째 문장은 이런 형태의 소스코드로 변환할 수 없다는 것이 결론이다. 이는 기술적인 문제가 아니라 근본적인 수학적인 문제이므로 기술의 발전과는 관계가 없다. 아무리 기술이 발전한다고 해도 불가능하다는 것이다.
5. 그렇다면 사람은 어떨까? 사람은 자신이 주어진 작업 목록에 따라서 삶을 살아가고 있다면 자신이 빠져나올 수 없는 영원한 루프 속에 갇혀 있다면 그런 사실을 알 수 있을까? 많은 사람들이 수백년 동안 이 문제를 고민했지만 누구도 이에 대한 명확한 답을 말한 사람은 없다. 많은 사람들이 사람은 자신의 자유 의지에 따라 살아간다고 생각하지만 그런 문제에 대해 무지하게 자세히 생각하는 사람들 중에는 그런 자유 의지가 없다고 생각하는 사람이 꽤 많은 것 같다. 인간으로서 인간에 대한 이야기를 하기는 어렵지만 컴퓨터에 대한 이야기는 할 수 있다. 다시 말해 사람이 컴퓨터의 작업 시간을 컴퓨터의 작업 목록을 이해하고 그 작업이 얼마나 걸릴지 계산하는 것은 가능하다. 그 이유는 사람은 컴퓨터의 작업 목록을 볼 수 있기 때문이다. 그렇다면 컴퓨터도 자신의 작업 목록을 보면 되지 않는냐고 생각할 수도 있지만 그것은 컴퓨터가 작업 목록에 나와 있는 일 이외에는 할 수 없다는 것을 잊고 하는 얘기이다. 컴퓨터가 자신의 작업 목록을 보기 위해서는 '내 작업 목록을 보라'는 작업이 작업 목록에 추가되어야 한다. 그런 작업이 추가된 작업 목록은 새로운 목록이고 그 새로운 목록을 보기 위해서는 '새로운 작업 목록을 보라'는 작업이 추가되어야 한다. 이런 과정은 영원히 반복되어야 하고 완전한 작업 목록을 보는 것은 영원히 불가능한 일이다. 이런 과정은 괴델에셔바하를 읽은 사람들에게는 상당히 낯익은 과정일 것이다. 그 책에서 가장 공을 들여서 설명하는 내용이 바로 이런 자기 참조의 가능성이다. 그러나 방금 살펴본 수학 이론의 결과에 따르면 이는 불가능한 작업이다. 괴에바에 자세히 설명되어 있는 것처럼 괴델의 불완정성 정리에 따라 정수론을 설명할 수 있는 모든 공리 체계가 불완전할 수밖에 없듯이 자신의 소스코드를 완벽하게 참조할 수 있는 컴퓨터는 논리적으로 불가능한 것이다. 하지만 이런 결론들은 모두 수학적인 논리 체계를 전제하고 하는 이야기들이다. 앞의 글에서 살펴본 것처럼 사람들이 살고 있는 세상은 주체나, 원인 / 결과, 의도 등 논리적으로 표현할 수 없는 개념들을 기반으로 해서 구성되기 때문에 이러한 결론들을 바로 적용할 수는 없다. 반면에 컴퓨터는 철저히 논리적인 기반 위에서 동작하기 때문에 이런 이론들에서 나오는 제한에 묶일 수밖에는 없다. 비논리적 체계를 기반으로 하는 컴퓨터라는 말은 모순이다. 사람이 컴퓨터의 목록을 볼 수 있는 것은 사람이 컴퓨터를 설계했기 때문이다. 만약에 사람이 입력에 따라 미리 정해진 기계적인 동작을 하는 존재이고 누군가 사람을 설계했다면 그 누군가는 적어도 인지 계층 어디에선가는 사람에 대한 완벽한 이해를 할 수 있을 것이다. 그런 누군가가 존재한다는 가설을 펴는 사람들을 우리는 '신을 믿는 사람들'이라고 부른다. 반면 이런 가설을 철저히 부정하는 사람들을 '무신론자'라고 부른다. '신을 믿는 사람들'은 누군가가 작업 목록을 갖고 있고 그것을 토대로 사람이 동작하는 소스코드를 작성했다고 생각한다. 반면 소스코드는 우연과 환경적 요인 때문에 자연적으로 만들어진 것이지 누군가의 의도를 담은 작업 목록이 따로 있는 것은 아니라고 생각하는 사람들도 있다. 이런 사람들 중에는 작업 목록 자체가 의미 없는 것이라고 생각하는 사람들도 있고 작업 목록을 우리 나름대로 만들어나가야 한다고 생각하는 사람들도 있다. 소스코드를 누가 작성했는지, 작성한 사람의 의도가 담기 작업 목록이 존재하는지는 수백 년 동안의 논쟁이 있었지만 결론을 내지 못한 상태이고 어쩌면 영영 해결되지 않을 문제일지도 모른다. 이런 입장의 차이는 사람들이 세계를 보는 관점을 가르는데 가장 중요한 요소로 작용하기도 한다.
6. 사람의 동작을 결정하는 소스코드가 무엇인지도 의견이 분분하긴 하지만 DNA가 소스코드의 중요한 부분을 차지한다는 사실에 대해서는 반박하는 사람이 적은 것 같다. 그러나 DNA가 사람의 행동과 생각을 결정하는 데에 얼마나 많은 영향을 끼치는 지는 아직 논란이 분분한 상태이다. 일단 여기서 생각해볼 수 있는 것은 소스코드를 결정한 작업 목록의 존재여부이다. 이 시리즈 바로 전 글의 주장이 맞다고 한다면 상위 레벨의 기계적 동작방식은 하위 레벨로부터 구성될 수 있지만 (그것이 이해 가능한 언어로 요약될 수 있는지는 또 다른 문제이지만) 그것이 상위 레벨에 대한 본질적인 설명은 될 수 있다. 소스코드와 작업 목록과의 관계도 마찬가지이다. 소스코드를 만드는 데에는 작업 목록을 사용할 수 있지만 소스코드로부터 작업 목록을 이끌어 내는 것은 무척 어려운 일이다. 심지어 앞에서 살펴본 대로 소스코드로 나타낼 수 없는 작업 목록도 존재한다. 앞에서 본 것처럼 수학적으로 불가능하다는 것이 증명된 작업 목록도 있지만 그렇게 명확하게 증명할 수는 없어도 소스코드로 작성해낼 수 없는 작업 목록은 꽤 많을 것으로 예상된다. 작업 목록을 알 수 있는 존재는 창조자 밖에 없다고 한다면 만약에 창조자가 존재하지 않는다고 한다면 어떻게 할 것인가? 창조자의 문제를 생각함에 있어서 원인과 결과의 관계를 빼놓을 수는 없다. 다음 글에서 원인과 결과의 문제를 살펴보면서 소스코드와 작업 목록의 문제에 대해서 좀 더 생각해 보도록 하자. 이 문제는 많은 사람이 살펴본 문제이지만 계층과 연관시켜서 생가해보면 좀 더 다른 각도에서 새로운 이해가 조금이라도 가능할지 모르겠다.
* 이 글에 대한 권한은 아포리아에 있습니다. copyrights@aporia.co.kr ([이상국 칼럼] Aporia Review of Books, Vol.4, No.11, 2016년 11월, 이상국, 소프트웨어 엔지니어)