티스토리 뷰

프로그래밍의 영역은 바로 인공지능 자체를 만드는 영역인 만큼, 기계와 인간과의 경쟁에서 인간 최후의 보루로 여겨지곤 합니다.


이렇게 원하는 프로그램의 코드를 자동으로 생성하는 소프트웨어의 개발 시도가 과거에 없었던 것은 아닙니다. Program Synthesis라는 이 분야는 기존에도 이미 많은 연구가 진행되어 온 컴퓨터공학 분야로, 연역적인 방법이 아닌 인공지능 기법이 적용되기 시작한 것은 최근입니다.



이 중, 인공지능 기법인 RNN(Recurrent Neural Network)을 적용하여 꽤 인상적인 결과를 낸 소프트웨어 DeepCoder가 등장했습니다. 이 소프트웨어는 마이크로소프트 연구소와 케임브리지 대학교에서 공동개발한 것으로 현재 유명 인공지능 학회인 ICLR(International Conference on Learning Representations) 2017의 심사를 대기 중입니다. 논문은 이 링크에서 직접 읽어볼 수 있습니다.


DeepCoder에서는 먼저 Program Synthesis 문제를 적용하기 위한 특수한 언어를 정의합니다. 이는 컴퓨터 공학 연구에서 흔히 쓰는 방법인데요, 실제 프로그램 개발에서 사용하는 언어는 워낙 복합적이다 보니, 문제 정의 자체가 매우 복잡해지고 계산량이 많아집니다. 그렇기 때문에 연구에서 사용하기 위한, 비교적 적은 영역에서만 구현을 해놓은 Domain Specific Language(DSL)을 정의하여 사용합니다. 이 논문에서는 정수형 변수와 배열만을 변수의 값으로 갖는 언어로 DSL을 제한합니다. 다음 예제를 보면 쉽게 이해할 수 있을 겁니다.


DeepCoder에서 정의한 DSL(Domain Specific Language)로 작성한 프로그램의 예제(논문 발췌)


이렇게 정의한 DSL에서 DeepCoder은 원하는 프로그램 입력값과 출력값의 쌍에 맞는 코드를 찾아냅니다. 예를 들어 [4, 6, 8]이라는 배열에 대해서 [22, 16, 10]이라는 결과를 프로그램을 출력하고 싶을 때, ‘각 인자에 3씩 곱하고 2를 뺀 뒤 배열의 순서를 뒤집는’ 코드를 찾아내는 방식입니다. 이때 프로그램으로서 가능한 모든 코드의 집합을 Program Space라고 합니다. 예를 들어 정의한 DSL이 3개의 함수만 사용하고, 코드의 줄 수는 5줄로 제한을 한다면 대략 가능한 코드의 경우의 수는 3^5인 81가지일 것이고, 이 81가지가 Program Space를 구성합니다.


많은 Program Synthesis 연구가 이 Program Space에서 특수한 검색 알고리즘을 통해 원하는 코드를 찾아내는 방식을 사용합니다. 이 논문에서도 마찬가지로 기존의 여러 검색 방식을 사용하는데, 방대한 Program Space에서 더 빠르게 원하는 코드를 찾기 위해 바로 딥러닝 기법 중 하나인 RNN(Recurrent Neural Network)를 적용합니다. 이 RNN은 이미 알려진 프로그램들로부터, 입력에 대해 출력하는 값으로부터 그 프로그램의 성질을 유추할 수 있도록 훈련됩니다. 이 프로그램의 성질로는 특정 함수의 사용 여부나 반복문의 개수 등이 있을 수 있습니다. 검색 알고리즘들은 훈련된 프로그램 성질 결과를 바탕으로 우선순위를 정해 검색에 활용하게 됩니다.


인공신경망으로 훈련을 한 결과 코드에서 각 함수가 나타날 확률을 예상할 수 있게 됩니다.(논문 발췌)


이렇게 인공신경망을 통해 훈련을 시키면, 우선순위가 높은 후보가 실제로도 원하는 결과값을 줄 확률이 매우 높아지기 때문에, 훨씬 더 빠른 방법으로 Program Synthesis를 할 수 있는 것입니다. 논문에 따르면 5줄 코드에 대해서 이 방법을 적용했을 때, 기존 방법보다 과제 수행 속도가 최대 907배까지 빨라지게 됩니다.


코드가 5줄일 때 기존 방법에 비해 RNN을 적용한 Deepcoder의 성능 향상(DFS, Enumeration, λ^2은 RNN을 적용한 검색 알고리즘)


아직까지 DeepCoder의 성능이나 적용 범위에는 많은 한계가 있습니다. 대표적으로 논문에서 채택한 방법이 앞서 설명한 매우 간단하게 정의된 DSL에서만 적용된 것이기 때문에, 이것보다 훨씬 복잡한 실제 언어에 이 방법을 적용하기에는 더 많은 노력이 필요합니다. 실제로 인공지능 기법을 사용하지 않은 전통적인 Programming Synthesis 분야에서도 실제 언어에서의 연구 성과는 아직 많이 미미한 상태라서, 실용적인 수준으로 발전하기 까지는 아직 많은 시간이 걸릴 것으로 보입니다.


코드의 줄 수 자체도 Program Space가 방대해지는 것을 막기 위해 5줄로만 제한을 했기 때문에 인공신경망 훈련에 큰 시간이 소요되지 않았지만, 코드의 줄에 따라 Program Space가 기하급수적으로 커지기 때문에, 실용적인 경우에 있어서는 인공신경망을 적용하는 것에도 큰 버거움이 따를 것입니다.


하지만, DeepCoder는 인공 신경망을 Program Synthesis 영역에 적용했을 때 성능이 크게 향상될 수 있는 가능성을 처음으로 보여주었습니다. 또, 기존의 여타 다른 연구 성과와는 달리 어떤 프로그램이나 언어에 대해서도 일관되게 인공지능을 도입할 수 있는 ‘일반적인 방법론’을 제시했다는 측면에서도 큰 의의가 있는 것 같습니다.


궁극적으로, 저자 중 한 명인 Marc Brockschmidt에 따르면 DeepCoder의 성과가 더욱 발전하면 코딩을 모르는 사람도 원하는 기능을 설명하면 프로그램이 자동으로 완성되게끔 시스템을 구성할 것이라고 합니다.


MIT 교수 Armando Solar-Lezama은 “이런 종류의 기술이 제안하는 자동화는 잠재적으로 프로그램 개발에 엄청난 생산성 향상을 불러올 수 있다”고 내다보고 있습니다. 그는 아무리 Program Synthesis가 발전한다고 해도, 개발 영역에서 많은 부분을 차지하는 반복적이고 지루한 작업들을 대체하지, 섬세한 고난이도의 작업은 대체하기 힘들 것이라고 보고 있습니다. 또한 그는 한번에 긴 코드를 ‘짠’하고 내놓는 것은 비현실적으로 보일 수도 있지만, 실제로 긴 코드 자체도 작은 여러 조각의 코드가 합쳐진 것이기 때문에 Deepcoder의 접근법이 옳은 뱡향이라는 것을 시사했습니다.


Programming Synthesis 분야는 80년대 초반까지만 해도 왕성히 연구가 펼쳐졌던 분야였다고 합니다. 하지만 당시 대부분의 연구 결과가 확장되어 적용되는 데에 실패하면서, 이 분야에 대한 흥미는 많이 약해져 갔습니다. 인공지능 기법이 최근 파급력을 가져오면서, Deepcoder을 비롯해 이 분야에도 인공지능을 적용해보는 시도가 다시 이루어지고 있습니다. (Deepcoder 논문의 서문에 몇몇 연구가 소개되어 있음)


인공지능에 힘입어 이 분야가 다시 추진력을 얻을 수 있을지, 그리고 Deepcoder가 그 성과를 주도할 수 있을지 매우 흥미진진합니다. 이와는 별개로, 독자 분들이 이 글에 들어온 첫 순간부터 궁금했을 법한 ‘인공지능이 개발자의 영역도 대체할 수 있을까?’라는 질문에 대해서는, ‘아직은 대체할 수 있다는 정량적 근거가 거의 없다’라는 대답을 해볼 수 있을 것 같습니다. 정량적 근거는 없지만, Deepcoder를 비롯한 Program Synthesis 분야의 발전을 기대해봅니다.


참고기사

New Scientist, “AI learns to write its own code by stealing from other programs



페이스북 팔로우 하기

저작자 표시 비영리 변경 금지
신고

인기 포스팅 보기

댓글
댓글쓰기 폼