우리가 사용하는 스마트폰에는 요즘 ‘자동완성’이라는 기능이 있다. 자동완성은 우리가 사용한 단어들을 토대로 그다음 단어를 예측해 빠른 타자가 가능하게 한다. 사람의 입장에서는 문맥을 파악해서 다음 단어를 추측하는 것이 그리 어렵지 않지만, 컴퓨터의 입장에서 본다면 상당히 어려운 기능이다. 0과 1로만 이루어진 컴퓨터가 어떻게 문맥을 파악하고, 내용을 이해하는 것일까?
컴퓨터는 단어를 우리처럼 뜻을 가진 단위로 인식하는 것이 아니라, 단어를 다차원 벡터로 인식한다. 이처럼 단어를 수로 이루어진 벡터로 만드는 과정을 word embedding이라고 한다. 이 과정의 아이디어는 단순한데, 우리가 MBTI 성격유형검사를 하는 것과 비슷하다. MBTI 검사는 다음과 같이 진행된다.
다양한 상황에서 우리의 행동을 조사한다.
이를 바탕으로 4가지 성격 특성에 대한 적합한 수치를 계산한다.
계산된 MBTI 결과를 통해 가장 유사한 값을 가지는 직업군을 추천한다.
이와 유사하게 word embedding과 자동완성은 다음과 같이 진행된다.
어떠한 문맥에서 해당 단어가 주로 등장하는지 빈도수를 조사한다.
이를 바탕으로 가장 적합한 N 차원 벡터를 계산한다.
계산된 벡터를 바탕으로 가장 유사한 값을 가지는 벡터의 단어를 추천한다.
이제 각 단계를 조금 더 면밀히 살펴보자. 이해를 돕기 위해 사용하는 단어의 수가 적은 세상을 생각해 보자. 이 세상에는 다음과 같은 단어와 문장만이 존재한다고 하자.
단어
철수, 사과, 먹는다, 배, 부르다, 고프다, 아프다
문장
철수는 배가 고프다.
철수는 배가 고파서 사과를 먹는다.
철수는 사과를 먹어서 배가 부르다.
철수는 사과를 먹어서 배가 아프다.
철수는 배가 부르다.
첫 번째 단계로, 우리는 이 데이터로부터 ‘문맥’을 조사해야 한다. ‘문맥’을 조사하는 방법은 이웃한 단어 쌍들을 모두 추출하는 것이다. 그러면 우리가 얻어내는 문맥은 다음과 같다.
문맥
(철수, 배), (배, 고프다)
(철수, 배), (배, 고프다), (고프다, 사과), (사과, 먹는다)
(철수, 사과), (사과, 먹는다), (먹는다, 배), (배, 부르다)
(철수, 사과), (사과, 먹는다), (먹는다, 배), (배, 아프다)
(철수, 배), (배, 부르다)
이제 두 번째 단계로 넘어와서 단어의 word embedding을 계산해야 한다. 모든 단어를 포함한 집합의 크기를 V라 할 때, 각 행이 word embedding 벡터가 되는 VxN행렬 W를 구하여 모든 단어의 word embedding을 구할 수 있다.
올바른 W값을 찾으려면, W’이라는 하나의 행렬이 더 필요하다. 이 행렬은 학습 과정에 이용된다. 잠깐 위의 세 번째 단계를 생각해보자. 우리는 결국 특정 상황에서 실제 문장과 유사하도록 그다음 단어를 추측해야 한다. 즉, 이전 단어가 ‘배’ 였다면 ‘고프다’, ‘부르다’, ‘아프다’가 올 확률이 ‘철수’나 ‘사과’보다는 높은 확률을 가지도록 계산해야 한다. 이때 이 확률을 계산해주는 VxN크기의 행렬이 W’이다. 즉, W’은 주어진 N 크기의 벡터에 따라 단어별로 올 수 있는 확률을 계산해주는 행렬이다.
이제 남은 일은 머신러닝을 통해 W와 W’ 행렬을 각 문맥에 대한 확률이 높도록 학습시키는 것이다. 즉, 각 문맥에 대하여 다음 값이 최대화되는 W와 W’를 구하면 된다[1].
그림 1. 계산 흐름도
이렇게 만들어진 word embedding을 통해 자동완성 기능이 구현된다. 물론, 실제로는 위의 예시처럼 적은 양의 데이터로 학습하는 것이 아니라, 현재까지의 온갖 문서와 글을 이용한다. N도 50은 넘는 값을 가지며 이웃한 쌍 뿐만 아니라 이웃한 2개, 3개의 단어 쌍까지 이용하여 문맥을 파악한다. 그렇게 학습되어 만들어진 W와 W’를 이용하여 적절한 단어를 확률에 기반하여 추천해주는 것이다.
또한, word embedding은 단어 사이의 연산을 가능하게 한다. 이제 각 단어가 벡터로 표현되었으므로 단어 간의 덧셈, 뺄셈 그리고 내적 연산이 가능해지는 것이다. 이를 통해 단어 쌍 사이의 관계를 파악할 수 있다. 뜻은 물론, 단어의 형태나 품사 등이 이 벡터에 내포되어 있기 때문에 [그림2]처럼 유사한 관계의 단어 쌍들은 일정한 차잇값을 가지게 된다. 더 나아가 ‘king – man + woman’과 같은 연산 결과는 수많은 단어 중에 ‘queen’이라는 단어의 word embedding에 가장 가까운 값을 가지게 된다[그림3].
그림 2. 유사한 단어 관계들의 모음[2]
그림 3. king - man + woman = queen [3]
자동완성 기능을 사용해봤다면 알겠지만, 자신이 대화하는 패턴에 따라서 추천되는 단어가 진화한다. 이는 우리가 쓴 글들이 학습하기 위한 데이터에 추가되어, 우리가 쓰는 단어와 문맥에 대해 확률 벡터의 오차가 줄어드는 방향으로 W와 W’가 변화하기 때문이다.
컴퓨터는 사람처럼 단어를 인식할 수 없다. 우리가 경험과 배움을 통해 문맥을 파악했다면, 컴퓨터는 수학을 통해 문맥을 파악한다. 이 과정에서 컴퓨터는 word embedding을 통해 단어를 벡터로 변환시키고, 우리가 글을 읽듯이 컴퓨터는 글을 ‘계산’한다. 두 방법은 매우 다르지만 컴퓨터가 자동완성을 통해 추천해준 단어는 우리가 쓰고자 했던 단어와 잘 맞아 떨어진다. 이는 우리가 글을 쓰는 데에 있어 숨어있는 규칙들이 많다는 것을 의미하며, 컴퓨터가 오로지 수학적인 계산만 하더라도 상당한 정확도를 자랑하는 것이 이를 증명해준다.
[참고문헌 및 그림 출처]
[1] Rong, Xin. “word2vec Parameter Learning Explained”. arXiv:1411.2738 [cs], 2016년 6월. arXiv.org, http://arxiv.org/abs/1411.2738.
[2] the Gradient, https://thegradient.pub/nlp-imagenet/
[3] jalammar.github.io, “http://jalammar.github.io/illustrated-word2vec/”
Written by GLEAP 8기 팽진희
Edited by GLEAP 학술팀·홍보팀
Comentários