지도 학습과 비지도 학습
대부분의 사람들은 자연어 처리를 알고리즘으로만 이해하려고 한다. 사실 그래서 자연어 처리가 어렵게 느껴진다. 자연어 처리의 본질은 데이터다. 엔지니어는 알고리즘만 알아서는 부족하다. 오히려 내가 처리하려는 데이터가 어떻게 생겼는지를 이해해야 한다. 데이트를 하려고 해도 이성을 다루는 기술만 배운 사람과 이성, 그 자체를 아는 사람은 다르다. 누가 연애에 성공할지는 보지 않아도 뻔한 거다.
머신러닝 이미지 처리의 경우 우리는 굳이 이미지를 이해하지 않아도 될 것 같다. 그냥 특정 사물이 있는 이미지를 알고리즘에 넣어주면 알고리즘이 알아서 사물의 이름을 알아맞혀 주었기 때문이다. 그런데 머신러닝은 그게 다가 아니다. GAN의 경우만 보더라도 이름 맞춰주기로 끝나지 않는다. 특정 목적에 맞게 이미지를 변형하기도 한다.
자연어 처리도 마찬가지다. 1. 집합으로 이루어진 자연어 덩어리에 레이블로 짝을 짓는가 하면, 2. 음성처리나 제너레이터처럼 어떤 단어의 다음 단어를 예측(생성) 하기도 한다. 사실 이 둘의 본질적인 차이를 아는 것이 자연어 처리 이해의 핵심이 된다. 이를 기술적으로만, 알고리즘적으로만 이해하려면 어렵다. 그런데 어렵지 않다. 이미 이 글을 읽는 당신은 그걸 아주 잘하고 있기 때문이다. 그걸 못하면 당신은 말하지도, 읽지도 못하기 때문이다.
1번의 경우를 보자. 당신은 어떤 글을 읽으면 그 글의 '의미'를 이해할 수 있다. 물론 읽는 사람의 지식 정도에 따라서 글은 전혀 다르게 읽힌다. 아는 만큼 보이는 법이다. 바꿔 말하면 아는 만큼 글과 의미를 짝짓는다. 이미지 처리를 해보았다면 이 과정이 좀 더 쉽게 이해된다. 이미지 처리의 경우 사진을 보고 그것의 레이블(이름)을 맞추는 것이 자연어 처리에서의 의미 이해와 같은 맥락이다.
그런데 우리는 항상 글을 읽고 의미를 이해하기만 하지는 않는다. 거꾸로도 가능하다. 어떤 주제가 주어지면 사람들은 그것을 토대로 이야기를 지어낼 수 있다. 자연어 처리에서도 이런 과정이 있다. 알고리즘에 키워드를 입력하면 그걸 바탕으로 말을 만들어내는 것이다. 요새는 이런 기술을 바탕으로 뉴스를 만든다던지 혹은 챗봇이 답변을 만든다던지 한다.
앞의 경우를 논리학에서는 '귀납적 추론'이라고 하고, 후자는 '연역적 추론'이라고 한다. 용어에 너무 집착할 필요는 없다. 사전의 정의와는 다소 차이가 날 수 있기 때문이다. 귀납적 추론은 부분에서 전체를 추론하는 방식이다. 장문의 글을 읽고 화자의 의도를 알아맞히는 것과 같다. 앞서서는 의도나 의미를 레이블이라고 했는데, 왠지 의도는 한 단어 이상일 것 같다. 그렇다. 레이블도 한 단어로만 이루어질 필요는 없다.
사실 명사라는 게 그렇다. 명사 자체가 어떤 문장을 한 단어로 압축한 것이다. 밥을 먹는 행위가 식사라는 명사로 대표representation된다.
'사람이 밥을 먹는다.' = '식사'
'사람이 밥을 먹는다'를 듣고 '식사'를 떠올린다면 귀납적이다. 반대로 '식사'를 듣고 '사람이 밥을 먹는다'를 떠올린다면 연역적이다. 그리고 자연어 처리에서는 두 과정이 모두 필요하다. 상황에 따라 다른 것이다.
2번의 경우를 보자. 보통은 예측이라고 하는데, 예측은 곧 생성generation이다. 이는 함수가 답을 예측하는 것이 곧 답을 생성하는 것이라고 말할 수 있는 것과 같다. 음성인식이나 번역 문제에서 자주 사용된다. 당신은 남의 말을 들을 때, 매 순간 다음 단어가 무엇일지 예측을 한다. 시끄러운 공간에서 상대의 말이 잘 들리지 않거나 일부만 들렸을 때를 떠올려보자. 당신은 다 듣지 못했지만, 상대가 말하려는 전체 문장이나 다음 말을 예측할 수 있다. 물론 가끔은 틀린다.
어떤 단어의 다음에 올 단어는 앞서 말한 단어들을 고려하면 그 경우의 수가 한정된다. 클럽과 같은 시끄러운 공간이라고 치자. 당신이 테이블에 앉아 있는데 처음 보는 상대방이 "나이.. 어쩌고.."라고 한다. 뭔 말인지 자세히 들릴 리가 없다. 그래도 당신은 그게 나이를 묻는 것임을 찰떡같이 알아듣는다. 클럽이란 곳이 뻔하기 때문이다. 사실 당신은 '클럽', '이성'이라는 정보를 가지고 '나이... 어쩌고'를 복원한 거다. 상대는 "나이가 어떻게 되세요?"라고 물었다.
이런 걸 하는 대표적인 알고리즘은 RNN 계열과 Attention 계열이다. 물론 두 알고리즘은 거의 모든 자연어 처리에 사용된다. 보통은 시퀀스를 학습한다고 하지만, 시퀀스라 하면 RNN 한정이고 맥락context학습까지 진행하면 Attention이다.
그런데 1번과 2번은 어떤 관계를 가지고 있을까?
'2=1+1'을 자연어에 비유해보자. 이퀄로 이루어진 등식은 언어에서 '정의'에 해당하는 것이다. "2는 1과 1을 더한 것이다."라고 말할 수 있다. 이때 '2'는 레이블(의미)이고, '1+1'은 피처들의 집합(서술)이다. 우리는 '2'라는 맥락을 알고 있고, '1+?'이라는 지문을 들으면 ?가 1이라고 예측할 수 있다. 자연어 처리도 이와 같다.
지도 학습supervised learning은 의미와 서술을 짝지어 알고리즘을 학습시키는 것이다. '2=1+1'만 있는 게 아니다. '2=2+0', '2=3-1'... 등 수없이 많은 요소(피처)의 조합이 있을 수 있다.
비지도 학습unsupervised learning은 서술 안에서의 패턴을 예측하는 것이다. '1+?'에서 '?'를 바로 예측하는 것이다. 2가 없는데 이걸 어떻게 추론할 수 있는지 반론이 있을 수 있다. 그런데 실제 자연어는 이렇게 단순하게 서술되지 않는다. 어떤 대상(주제, 의미, 레이블)을 표현하고자 다양하고 긴 서술법이 동원된다. 그러므로 각각의 서술의 일부가 제시되면 다음 말을 예측하는 것을 훈련시킨다.
그런데 이 방법에는 문제가 있다. 전체 맥락(의미)을 모르는 상황에서 부분을 예측하면 그 경우의 수가 너무 많아진다는 것이다. 그래서 보통은 엔지니어가 자신이 훈련시킬 알고리즘에 '범위'를 미리 한정시킨다. 맥락을 고정시키는 것이다. 그래야 학습이 잘 될 테니깐.
물론 이 범위를 맥락 인식이라는 개념으로 해결할 수도 있다. 아직은 먼 미래의 이야기다. 현재 자연어 처리 기술이 여기까지 진도를 나가지 못했기 때문이다. 하지만 멀지 않았다. 조만간 인간처럼 말할 수 있는 알고리즘이 나올 것이다. Attention이 비슷한 방향으로 발전하고 있기 때문이다.