Why NLP is difficult?
음성인식은 눈에 보이지 않는 signal을 다룹니다. 보이지도 않는 가운데 noise와 signal을 가려내야 하고, 소리의 특성상 noise와 signal은 그냥 더해져서 나타납니다. 게다가 time-step은 무지하게 길어요. 어려울 것 같습니다. 그렇다면 눈에 보이는 computer vision을 생각 해 보죠. 그런데 computer vision은 눈에 보이지만 이미지는 너무 크고, 다양합니다. 심지어 내 눈에는 다 똑같은 색깔인데 사실은 알고보면 다른 색이라고 합니다. 그럼 애초에 discrete한 단어들로 이루어져 있는 자연어처리를 해 볼까요? 그럼 NLP는 쉬울까요? 하지만 세상에 쉬운일은 없죠... Natural language processing도 다른 분야 못지않게 매우 어렵습니다. 어떠한 점들이 NLP를 어렵게 만드는 것일까요?
사람은 언어를 통해 타인과 교류하고, 의견과 지식을 전달 합니다. 소리로 표현된 말을 석판, 나무, 종이에 적기 시작하였고 사람의 지식은 본격적으로 축적되기 시작하였습니다. 이와 같이 언어는 사람의 생각과 지식을 내포하고 있습니다. 컴퓨터로 하여금 이러한 사람의 언어를 이해할 수 있게 한다면 컴퓨터에게도 지식과 의견을 전달 할 수 있을 것 입니다.
Ambiguity
아래의 문장을 한번 살펴볼까요. 어떤 회사의 번역이 가장 정확한지 살펴 볼까요. (2018년 4월 기준)
차를 마시러 공원에 가던 차 안에서 나는 그녀에게 차였다.
- Google: I was kicking her in the car that went to the park for tea.
- Microsoft: I was a car to her, in the car I had a car and went to the park.
- Naver: I got dumped by her on the way to the park for tea.
- Kakao: I was in the car going to the park for tea and I was in her car.
- SK: I got dumped by her in the car that was going to the park for a cup of tea.
안타깝게도 완벽한 번역은 없는 것 같습니다. 같은 차라는 단어가 세 번 등장하였고, 모두 다른 의미를 지니고 있습니다: tea, car, and kick (or dump). 일부는 표현을 빠뜨리기도 하였고, 다른 일부는 단어를 헷갈린 것 같습니다. 이렇게 단어의 중의성 때문에 문장을 해석하는데 모호함이 생기기도 합니다. 또 다른 상황을 살펴보겠습니다.
나는 철수를 안 때렸다.
- 철수는 맞았지만, 때린 사람이 나는 아니다.
- 나는 누군가를 때렸지만, 그게 철수는 아니다.
- 나는 누군가를 때린 적도 없고, 철수도 맞은 적이 없다.
위와 같이 문장 내 정보의 부족으로 인한 모호성이 발생 할 수 있습니다. 사람의 언어는 효율성을 극대화 하도록 발전하였기 때문에, 최소한의 표현으로 최대한의 정보를 표현하려 합니다. 따라서 앞뒤 문장의 context에 따라서 문장의 의미는 달라질 것 입니다. 사실 첫 예제의 차도 주변 단어들(context)를 보면 중의성을 해소(word sense disambiguation)할 수 있습니다. 아래의 예제도 문장 내 정보의 부족이 야기한 구조 해석의 문제입니다.
선생님은 울면서 돌아오는 우리를 위로 했다.
- (선생님은 울면서) 돌아오는 우리를 위로 했다.
- 선생님은 (울면서 돌아오는 우리를) 위로 했다.
Paraphrase
김치 싸대기로 유명한 드라마 모두 다 김치의 문제적 장면
- 여자가 김치를 어떤 남자에게 집어 던지고 있다.
- 여자가 어떤 남자에게 김치로 때리고 있다.
- 여자가 김치로 싸대기를 날리고 있다.
- 여자가 배추 김치 한 포기로 남자를 때리고 있다.
- 여자가 김치를 사용해 남자를 때리고 있다.
- 남자가 여자에게 김치로 싸대기를 맞고 있다.
- 남자가 여자로부터 김치로 맞고 있다.
- 김치가 여자에게 무기로 사용되어 남자를 후려치고 있다.
- 김치가 여자에게서 남자에게로 날라가고 있다.
영화나 드라마의 어떤 장면을 말로 표현 한다고 해 봅시다. 그럼 아주 다양한 표현이 나올 것 입니다. 하지만 알고보면 다 같은 장면을 묘사하고 있는 것이고, 그 안에 포함된 의미는 같다고 할 수 있을 것 입니다. 이와 같이 문장의 표현 형식은 다양하고, 비슷한 의미의 단어들이 존재하기 때문에 paraphrase의 문제가 존재합니다. 더군다나, 위에서 지적 한 것 처럼 미묘하게 사람들이 이해하고 있는 단어의 의미는 다를 수도 있을 것 입니다. 따라서 이 또한 더욱 paraphrase 문제의 어려움을 가중시킵니다.
Discrete, Not Continuous
사실은 discrete하기 때문에 그동안 쉽다고 느껴졌습니다. 하지만 neural network에 적용하기 위해서는 continuous한 값으로 바꾸어주어야 합니다. Word embedding이 그 역할 훌륭하게 수행하고 있긴 합니다. 하지만 애초에 continuous한 값이 아니었기 때문에 neural network 상에서 여러가지 방법을 구현할 때에 제약이 존재합니다.
Curse of Dimensionality
Discrete한 데이터이기 때문에 많은 종류의 데이터를 표현하기 위해서는 엄청난 dimension이 필요합니다. 예전에는 각 단어를 discrete한 symbol로써 다루었기 때문에, 마치 vocabulary size 만큼의 dimension이 있는 것이나 마찬가지였습니다. 이러한 sparseness를 해결하기 위해서 단어를 적절하게 segmentation하는 등 여러가지 노력이 필요하였습니다. 다행히 적절한 word embedding을 통해서 dimension reduction을 하여 이 문제를 해결함으로써, 이제는 이러한 문제는 예전보다 크게 다가오진 않습니다.
Noise and Normalization
모든 분야의 데이터에서 noise를 signal로 부터 적절히 분리해 내는 일은 매우 중요합니다. 그러한 과정에서 자칫 실수하면 data는 본래의 의미마저 같이 잃어버릴 수도 있습니다. 이러한 관점에서 NLP는 어려움이 존재 합니다. 특히, 다른 종류의 데이터에 비해서 데이터가 살짝 바뀌었을 때의 의미의 변화가 훨씬 크기 때문 입니다. 예를 들어 이미지에서 한 픽셀의 RGB값이 각각 0에서 255까지로 나타내어지고, 그 값중 하나의 수치가 1이 바뀌었다고 해도 해당 이미지의 의미는 변화가 없다고 할 수 있습니다. 하지만 단어는 discrete한 symbol이기 때문에, 단어가 살짝만 바뀌어도 문장의 의미가 완전히 다르게 변할 수도 있습니다. 또한, 마찬가지로 띄어쓰기나 어순의 차이로 인한 정제의 이슈도 큰 어려움이 될 수 있습니다. 이러한 어려움을 다루고 해결하기 위한 방법을 Preprocessing 챕터에서 다루도록 하겠습니다.