인간은 태어난 순간부터 언어를 접합니다. 아기가 세상에 나온 순간 부모로부터 불리는 이름은 처음에는 그저 여러 소리 중 하나로 들리겠지요. 하지만 점점 커가면서 부모가 아기에게 내는 소리는  장난감에서 나는 방울 소리나 음악 소리와는 다르게 어떠한 의미가 있다는 것을 서서히 깨우쳐 나갈 것입니다. 어떠한 형태의 소리는 자기를 부르는 것을 의미하고, 다른 형태는 밥 먹을 시간이 되었다는 것을 알려준다는 것을 아기는 놀라운 속도로 배워갑니다.

언어를 이해한다는 것은 무슨 의미일까요?

NLP에서 가장 큰 화두는 언어 이해 (natural language understanding; NLU)입니다. 거의 모든 NLP 문제는 NLU가 필요합니다. 대화 시스템 (dialogue system)은 유저가 무엇을 원하는지 이해하여 답을 해야 하고, 감성 분석 (sentiment analysis)는 글쓴이가 어떤 주제에 대해 어떤 감성을 가지고 있는지 파악하여 숫자로 나타내야 합니다. 그렇기에 NLP 시스템을 만들려면 위 질문에 대한 답, 아니 완벽하게 답할 수는 없기에 어느 정도의 방향성은 가지고 있어야만 한다고 생각합니다.

위클리 NLP의 지난 두 달 동안 기술적인 내용의 기초를 다루었습니다. 하지만 오늘은 조금은 철학적이고, 추상적인 부분을 이야기해보려 합니다. 기존의 글은 bottom-up approach였다면, 오늘의 글은 top-down approach인 것이죠. (일부러 조금은 개념적으로 이해하기 쉽고 재밌는 것부터 시작하였습니다. 처음부터 너무 추상적으로 들어가면 독자 여러분이 다 도망가셨겠죠?  ^^)

** 오늘 글은 조경현 교수님의 NLP 강의 노트의 Chapter 1: Introduction을 많이 참조하였습니다. 저도 대학원생이었을 때 교수님이 너무나 어려운 개념을 명쾌하게 설명해주셔서 학문적 오르가즘(?)을 느꼈던 기억이 있습니다. 이 내용을 조금 더 쉽게 풀어보려고 합니다.

언어란 무엇인가?

현대 언어학의 아버지라고 불리는 Noam Chomsky는 언어를 발생시키는 규칙들의 집합이 존재한다고 믿었습니다. 수많은 규칙들이 있고 이에 따라 우리는 말을 하거나 글을 쓴다는 것이죠. 예를 들어 모든 언어에는 정해진 어순이라는 것이 있습니다.

나는 사과를 먹는다 : <주어> + <목적어> + <동사>

그리고 ~는, ~를 같은 조사에 대한 규칙이 또 있죠. 하나하나 분석을 하자면 엄청나게 많은 규칙이 있을 것입니다. Chomsky는 이를 context-free grammar (CFG)라고 불렀고, 이는 현대 언어학의 근간이 되었습니다. 많은 언어학자들이 하는 일은 하나의 언어가 어떻게 쓰이는지, 그로 인해 어떠한 규칙들이 있는지 연구하는 일입니다.

CFG는 프로그래밍 언어를 만들 때 역시 쓰입니다. 프로그래밍 언어는 컴퓨터 컴파일러가 이해해야 하는 인공 언어 (artificial language)이기 때문에 무조건 규칙에 의해 파생된 구문만 이해할 수 있고, 인간의 언어와 다르게 예외 문법을 처리할 필요가 없기 때문에 (compile error를 고치는 건 프로그래머의 몫), CFG라는 일종의 프레임워크가 상당히 적합합니다.

하지만 인간의 언어는 어떨까요? 예를 들어 이 문장을 한번 봅시다:

나는 먹는다 사과를

위에 어순에 관한 규칙을 어긴 문장입니다만, 우리는 이 문장을 이해하는데 큰 문제가 없습니다. 이처럼 컴파일러와는 다르게 인간은 예외 경우를 상당히 유연하게 처리할 수 있다는 것을 알 수 있습니다. 이런 예외까지 생각하면 우리 뇌에는 얼마나 많은 언어 규칙을 습득하고 있는 것일까요?

이미 정석으로 언어를 배운다고 해도 엄청나게 많은 규칙이 필요한데요..?

언어를 컴퓨터에게 가르친다면?

이 많은 언어 규칙들이 우리의 뇌에 저장이 되어있다고 가정을 해봅시다. 그렇다면 이것들을 컴퓨터에게 어떻게 가르킬 수 있을까요? 우리 뇌 안에 있는 규칙들이 엑셀 시트에 한 줄 한 줄 정리해 있으면 얼마나 좋을까요. 하지만 그건 불가능하겠죠.

그렇다면 일단 우리의 뇌에서 나오는 언어를 하나의 함수라고 생각해보면 어떨까요?

함수: 두 개의 변수 x, y 사이에서, x가 일정한 범위 내에서 값이 변하는 데 따라서 y의 값이 종속적으로 정해질 때, x에 대하여 y 이르는 말. y가 x의 함수라는 것은 y=f(x)로 표시한다.
함수를 진짜 간단하게 표현하자면

우리가 대화를 하는 경우를 생각해봅시다. 어떤 화자가 어떤 말을 하였을 때, 우리는 화자의 말, 본인의 멘탈 상태, 주변 환경 등을 고려하여 답을 같은 언어로 뱉거나 행동으로 취합니다.

input (x) - 말하는 사람이 전달한 말, 듣는 이의 멘탈 상태, 주변 환경 등
output (y) - 듣는 사람이 반응하는 말 그리고/또는 행동

이처럼 우리는 대화, 더 나아가 언어를 함수라는 모델로 정의할 수 있습니다. 그렇다면 컴퓨터는 이 함수를 찾으면 됩니다. x와 y의 상관관계만 찾으면 되는 겁니다! 참 쉽죠?

언어라는 함수는 2차 방정식이 아니라...

중학교 때 배운 2차 함수 방정식을 기억하시나요? y = ax+b 에서 a와 b만 구하면 x와 y의 상관관계를 계산할 수 있었죠. 하지만 언어를 표현하는 함수는 이것보다는 훨씬 더 복잡할 것입니다. n차 방정식에서 n이 2가 아니라 쉽게 100, 1000, 10000이 될 수도 있습니다.

이런 고차원 함수의 완벽한 답을 찾는 것은 불가능하기에, 근사치를 구하는 방법밖에 없습니다. 이를 function approximation이라고 합니다. 예를 들어, 이미 우리가 배운 linear regression 역시 선형 함수의 approximate를 데이터를 통해 구하는 것입니다.

linear function을 데이터를 통해 approximate 한 linear regression

그렇다면 언어라는 엄청나게 복잡한 시스템을 어떻게 함수로 표현하여 approximate 할 수 있을까요? 다행히 우리에게는 머신 러닝이 있습니다. 머신 러닝의 본질은 수많은 데이터가 주어졌을 때 어떠한 형태의 함수에 fit 하는 것입니다. 특히 딥 러닝은 엄청나게 복잡하고 parameter (매개 변수)가 많은 non-linear function을 approximate 하는데 유용한 기술입니다. 그렇기 때문에 NLP는 필연적으로 머신 러닝, 더 나아가 딥 러닝과 떼 놓으려 해도 뗄 수 없는 학문이 된 것입니다.


언어 전체를 하나의 함수로 표현하는 것은 쉽지도 않을뿐더러, 실용적이지도 않습니다. 만일 그럴 수 있다면 AI의 최종 목표라는 Artificial General Intelligence  (AGI)에 거의 근접한 것이겠죠. 현재 NLP 시스템의 문제들은 굉장히 구체적입니다 - 감정 분석 (sentiment  analysis), 기계 번역 (machine translation), 이미지 설명 (image captioning) 등 기능적인  요소에 충실합니다. 그렇기 때문에 각 문제마다 별도의 subfunction을 학습하는 방식을 택합니다 (물론 추후에 BERT  같이 language modelling을 이용해 많은 NLP 문제에 도움이 되는 모델이 나오기는 합니다. 그건 다른 글에!)

오늘 글은 NLP와 머신 러닝이 왜 밀접한 연관이 있을 수밖에 없는지 설명해보았습니다. 조금은 어려운 글이었을지도 모르겠네요. 이 개념을 잘 이해하시면 NLP 문제들을 좀 더 명확하고 깊게 이해하실 수 있을 거라 생각합니다! 다음 글은 머신 러닝에서 function approximation이 어떻게 이루어지는지 간단히 살펴보도록 하겠습니다.

Reference

- Kyunghyun Cho, Chapter 1: Introduction,  Natural Language Understanding with Distributed Representation