구글이 자연어 처리(정확히는 자연어 이해)를 수행하는 코드인 SyntaxNet을 오픈소스로 공개하였습니다. 원문 글은 구글 Research Blog에 2016년 5월 12일에 업데이트되었습니다. 해당 블로그의 글을 한글화하여 포스팅합니다. 개인적으로, 어색하게 직역되어 무슨뜻인지 이해가 불가능한 글을 상당히 싫어합니다. 이 글은 제가 원문의 글을 파악하고 이해한 후에 그 문장을 익숙한 한국어 문장으로 다시 작성하였습니다. 그렇지만 원저자의 의도를 왜곡하지는 않았습니다.


구글 블로그 : http://googleresearch.blogspot.kr/2016/05/announcing-syntaxnet-worlds-most.html

arXiv 논문 : http://arxiv.org/abs/1603.06042

Github Link : https://github.com/tensorflow/models/tree/master/syntaxnet



저희 구글에서는, 사람이 사용하는 언어컴퓨터읽고, 또 이해할 수 있는 정도의 인공지능적 방법을 구현하기 위해 오랜시간동안 연구하였습니다. 바로 오늘, 저희 연구의 성과를 여러분께 공개하게 되어서 기쁩니다. 저희가 선보이는 일명 SyntaxNet은 인공 신경망 프레임워크이며, open-source로 제공됩니다. 특히, 핵심기능이라 할 수 있는 자연어 이해(Natural Language Understanding)기능을 Google TensorFlow를 사용하여 구현하였습니다. 당신이 학습시키고자 하는 Data를 SyntaxNet model을 이용하여 처리할 수 있도록 모든 코드를 공개합니다. 뿐만 아니라, (영어에 한정하여) 텍스트 분석이 가능한 구문 분석기(English parser)를 제공합니다. 이것은 일명 Parsey McParseface라고 부르며, 이미 학습(trainning)이 완성된 상태로 제공되기 때문에 여러분은 별도의 trainning없이, 그저 활용하시면 됩니다.


Parsey McParseface는 언어의 구조를 분석하도록 학습된 아주 강력한 머신러닝 알고리즘입니다. 뿐만 아니라, 주어진 문장에서 각 개별 구성단어의 기능적 역할(functional role)을 파악하고 구분할 수 있습니다. 이 분야에 있어서는 저희 Parsey McParseface가 세계에서 가장 정확도가 높은 모델이라고 자부하며, 이것을 사용하여 다양한 개발자분들과 연구자분들이 각각 관심있으신 분야(자동 정보 추출, 언어 번역, 자연어 이해 등)에서 유용하게 사용하실 수 있으리라 기대합니다.


SyntaxNet은 어떤원리로 작동하는가?

SyntaxNet은 학계에서 통상 구문 분석기(Syntactic parser)라고 부르는 것의 Framework입니다. 대부분의 NLU 시스템에서 핵심적인 요소라고 보시면 됩니다. 입력값으로 문장(Sentence)가 주어지면, 각각을 어절(POS, A part of speech)단위로 구분하여 각 단어의 문법적인 역할을 파악하고 해당 tag를 부여합니다. 그리고 의존성 구분분석 트리(The dependency parse tree)로 표현합니다. 이렇게 함으로써 주어진 문장을 구성하고 있는 각 단어들의 문법적인 관계를 결정할 수 있습니다. 이 문법적 관계는 해당 문장이 내포하고있는 의미(meaning)와 아주 직접적인 연관이 있습니다. 아주 쉬운 예를 들어볼까요? "Alice saw Bob" 라는 아주 쉬운 문장을, 의존성 트리로 표현하자면 다음과 같습니다.

그림의 구조를 보시면, Alice와 Bob은 명사(nouns)로, saw는 동사(verb)로 분류되어 있습니다. 그중에서 주요 동사인 saw가 문장의 Root(트리에서 최상위 노드)이고, Alice는 saw의 주어(subject, nsubj:주격 명사구)이며, Bob은 직접목적어(dobj:direct object)입니다. 우리의 Parsey McParseface는 이런 문장을 정확하게 분석해낼 수 있습니다. 뿐만 아니라, 조금 더 복잡한 문장도 가능합니다.

이번에 시도한 문장은 "Alice who had been reading about SyntaxNet, saw Bob in the hallway yesterday." 입니다. 여기에서도 Alice는 주어이고, Bob은 목적어입니다. 추가적으로 Alice는 관계대명사 who와 함께 새로운 동사 reading의 수식을 받고 있고, Saw는 시간을 나타내고있는 명사 yesterday의 영향을 받고있습니다. 이렇게 문법적 관계를 일련의 트리구조로 표현하게 된다면, 좀 더 쉽게 문장의 의미를 파악할 수 있고 다양한 질문에 대해 답변을 할 수 있게 됩니다.
(예를 들어, 'Alice가 본 사람은 누구인가?', 'Bob을 본 사람은?', 'Alice가 읽은 책은 무엇에 관한 내용이었는가?', 'Alice가 Bob을 본 시각은?')

컴퓨터가 문장을 정확하게 분석하는 것이 왜 어려운가?

컴퓨터 구분분석에 있어서 가장 큰 문제로 꼽을 수 있는 것은, 인간의 언어가 상당히 복잡한 수준의 모호함(ambigutiy)을 갖기 때문입니다. 사람들은 보통 20~30 단어 길이의 문장을 구사하며, 이를 해석할 때 수백 수천 어쩌면 수만가지의 문법적 경우의 수를 가집니다. 자연어를 처리하는 구문분석기(Parser)는 이 모든 후보군에 대해 일일이 확인해야하며, 그중 가장 그럴듯하고 매끄럽게 문맥에 어울리는 것을 찾아내야합니다. 예를 들자면, "Alice drove down the street in her car"라는 문장은 다음과 같이 2가지로 해석이 가능합니다.

첫 번째는  'Alice가 그녀의 차를 운전하고 있는 거리'로 장소를 의미하는 반면, 두 번째는 '그녀의 차 안에 놓여있는 거리'로 해석됩니다. 두번째 해석은 사람이 보기에 상식적으로 맞지 않지만, 그렇다고해서 문법적으로 틀린 것은 아니기 때문에 컴퓨터 입장에서는 충분히 가능한 해석입니다. 바로 이 지점에서 전치사 'in'이 drove를 수식하느냐, 아니면 street를 수식하느냐에 따라 모호함(ambiguty)이 대두됩니다. 이것을 전치사 접속 모호성(Prepositional phrase attachment ambiguity)라고 부릅니다. 


역자 주 : 영어 원문으로 예시를 들다보니 이해가 잘 안될 수 있습니다. 한국어로 치자면 "훌륭한 작가의 그림을 보았다"라고 할 때, 불분명한 수식에 의해 '(훌륭한 작가)가 그린 그림을 보았다'인지, '작가가 그린 (훌륭한 그림)을 보았다'인지 두가지로 중의적 해석되는 상황에 대해 설명하고 있는 것입니다.

신기하게도 인간은 언어를 사용할 때 아주 놀라울정도로 모호성 문제에 잘 대처합니다. 하지만 컴퓨터가 처리하기에는 쉽지 않습니다. 아주 긴 문장에 대해, 가능한 다양한 중의적 해석을 모두 검토하려면 그 조합의 경우의 수가 급격히 커집니다. 보통 그중 상당수는 상식적으로 말이 안되는(implausible) 해석일 수도 있겠지만, 그럼에도 불구하고 그것이 문법적으로 가능한(possible)해석이라면 반드시 Paser의 검토를 거쳐서 후보군에서 기각시킬지 판단해야합니다.


SyntaxNet은 위에서 언급한 모호성문제에 대해 인공신경망(Neural network)을 적용하여 해결합니다. 입력된 문장을 왼쪽에서부터 오른쪽으로 처리하면서, 각 단어들 사이의 의존성을 고려하여 점진적으로 추가됩니다. 각 단계마다 모호한 가능성들에 대해 명확한 판단을 내려야하는데, 이때 Neural network을 사용하여 조금 더 그럴듯한(plausibility) 방향으로 해석하도록 결정합니다. 이런 이유에서 이 모델에서는 beam search라는 방식을 사용합니다. 매번 선택의 순간마다 최적우선탐색을 하도록 단순반복하는 것보다는, 다양한 가능성을 유지시키다가(Only K most promising states are kept for future consideration), 명백한 결격사유가 등장했을 때에야 비로소 후보군에서 탈락시키고 최적의 모범답안을 채택하는 것입니다. 다음 GIF 이미지를 통해 "I booked a ticket to Google"이라는 문장이 처리되는 과정을 살펴보겠습니다.


저희가 논문에서 자세히 설명했듯이, 예측 정확성을 최대치로 끌어올리기 위해서는 양질의 데이터를 통해 뉴럴넷을 잘 학습시키고, 그 결과물들을 잘 다듬어서 통합시키는 것이 매우 중요합니다. 
Parsey McParseface 와 SyntaxNet 은 저희가 구글의 TensorFlow 프레임워크를 사용하여 미리 학습시켜둔 아주아주 정교한 뉴럴네트워크입니다. 여러분은 이미 학습된 뉴럴넷을 그저 가져다가 사용하셔도 되고, 또는 구글에서 제공하는 Universal Treebanks Project에서 데이터를 통해, 당신만의 새로운 구문분석 모델을 당신의 컴퓨터에서 직접 학습시키실 수도 있습니다.


그래서, Parsey McParseface는 얼마나 정확하길래? 

NLP의 성능측정을 위해 표준으로 사용되는 기법은, 영어 뉴스에서 무작위로 문장을 뽑아내서 이것을 잘 처리하는지 확인하는 것입니다. 이것을 Penn Treebank라고 하며 지난 20년간 이 분야에서 판단기준으로 삼았었습니다. (역자 주 : 머신러닝에서 MNIST 데이터셋을 가장 기초적인 벤치마킹 용도로 사용하는 것과 비슷한 이치입니다.) 이 테스트에서 Parsey McParseface는 각 단어들 사이의 개별의존성을 94%이상 정확하게 파악했습니다. 이것은 그동안의 여타 연구결과를 모두 제쳤을 뿐만아니라, 저희의 자체 최고기록마저 갈아치운 정도의 성적을 거둔 것입니다. 이러한 작업을 사람이 해내는 능력이 어느정도인가에 대한 명시적인 연구결과는 없지만, 저희가 언어학에 능통한 사람들을 모집하여 자체적으로 실험한 결과 약 96~97% 수준인 것으로 보입니다. 이것은 거의 인간의 수준에 근접하게 도달했다는 뜻입니다. 하지만, 이것은 아주 잘 정돈된 text에 한정하여 실험한 결과이고, 인터넷웹 등에서 정돈되지 않은 텍스트를 집어넣어서 처리하는 것은 분석하기가 훨씬 더 어렵습니다. 이처럼 조금 더 어려운 테스트 과제에 대한 수행정확도를 측정하기 위해 구글에서는 새로운 벤치마킹 기준으로 WebTreebank를 2011년에 출시하였는데, Parsey McParseface은 이 데이터셋에 약 90%를 웃도는 정확성을 보이고 있습니다.

비록 아직 이것이 100%완벽하다고 할수는 없지만, 그럼에도 불구하고 다방면으로 활용하기에는 충분히 유용할 것입니다. 아직까지 해결하지 못한 오류의 원인은, 전치사 접속 모호성을 판단하기 위해서 실생활의 지식이 요구되는 경우(위의 예시에서, '거리'가 '차'안에 있을리는 없다는 사실)이거나, 전후문맥을 아주 정확히 파악해야만 이해가 가능한 경우입니다. 머신러닝, 특히 인공 신공망을 사용하면 이러한 모호성 오류를 상당부분 개선시킬 수 있지만, 아직 여전히 남겨진 숙제가 많다고 봅니다. 향후 저희는 영어 뿐만아니라 세계의 모든 언어를 이해할 수 있도록 할 것이며, 서로 다른 언어와 맥락 사이에서 상호 소통이 가능하도록 하는 것이 추진하고자 하는 목표입니다.


백문이 불여일견입니다. SyntaxNet code와 Parsey McParseface 구문분석기 model을 github에서 다운로드 하실 수 있습니다. 수고한 저희 팀의 메인 개발자들인 Chris Alberti, David Weiss, Daniel Andor, Michael Collins & Slav Petrov를 기억해주시고, 즐거운 코딩되시길 바랍니다.


CPUU님의 창작활동을 응원하고 싶으세요?