본 포스팅은 스탠포드 대학교 CS244n 강의 자료를 참고하여 작성되었습니다.
Natural Language Processing (NLP)란 무엇인가?
자연어(Natural Language)란 인간이 실생활에서 사용하는 언어를 말하며, 자연어 처리(Natural Language Processing)이란 자연어의 의미를 분석하여 컴퓨터가 처리 할 수 있도록 하는 일을 말합니다. 인간의 언어는 의미를 전달하기 위한 어떤 구조적인 체계입니다. 예를 들어 "말을 하다." 와 "말이 달린다." 두 문장에서 말은 다른 의미를 지닙니다. 이에 따라 NLP는 다른 머신러닝이나 컴퓨터 비전과는 매우 다른 성격을 지닙니다. NLP는 아주 쉬운 영역부터 어려운 영역까지 다양한 과제가 있습니다. 쉬운 영역으로는 오타 확인, 키워드 찾기, 동의어 찾기, 문서 분해 (Parsing information from documents) 등이 있고, 어려운 영역으로는 기계 번역, 의미 분석, 질의 응답 등이 있습니다.
Word vectors
컴퓨터가 자연어를 처리하기 위한 첫 번째 관문은 컴퓨터가 인지할 수 있게 단어(words)를 표현하는 것 입니다. 세상에는 많은 단어 토큰이 존재하지만, 모든 토큰이 독립적이지 않습니다. 예를 들어, 영어에는 Feline과 Cat 같은 관계, 한국어에는 개와 강아지처럼 서로 완벽하게 독립이 아닌 단어 관계가 많이있습니다. 이러한 단어 토큰을 벡터화하고, 어떤 '단어의 공간'으로 인코딩하고자 하는 생각을 자연스럽게 할 수 있습니다. 이렇게 단어를 벡터화한 것을 word vector라고 부릅니다.
가장 기초적이고, 다른 표현 방법의 뼈대가 되는 표현 방법인 one-hot encoding 방식으로 word vector를 만들고, 이를 이용하여 후처리 하는 방법으로 단어 공간으로 인코딩시킵니다.
One-hot encoding을 자세히 살펴보겠습니다. 먼저 $|V|$ 크기의 단어가 있다고 가정하겠습니다.그러면 우리는 단어를 다음과 같이 표현 할 수 있습니다. $$w^{cat}=\begin{bmatrix}1\\0\\0\\\vdots\\0\end{bmatrix},w^{feline}=\begin{bmatrix}0\\1\\0\\\vdots\\0\end{bmatrix},w^{at}=\begin{bmatrix}0\\0\\1\\\vdots\\0\end{bmatrix},\cdots,w^{dog}=\begin{bmatrix}0\\0\\0\\\vdots\\1\end{bmatrix},$$ 여기에서 벡터의 크기는 $|V|$가 됩니다.
One-hot encoding 방법은 크게 상호 독립적이라 것과 데이터 공간을 많이 사용한다는 두 가지 문제점을 갖고 있습니다. 먼저 상호 독립적이라는 말은 $$w^{cat,\top}w^{feline}=0$$라는 의미로, 두 단어간에 비슷한 의미를 무시하게 됩니다. (물론 다른 뜻을 가진 두 단어에 대해서는 문제가 없습니다.) 이어서 이러한 one-hot encoding을 모아두면 $|V|\times |V|$만큼의 행렬이 필요하게 되어 데이터를 저장할 메모리를 많이 차지하는 문제점이 있습니다.
Word Embedding
Word Embedding이란 단어를 벡터로 나타내는 것을 포용합니다.
벡터의 형태에 따라서 Sparse Representation과 Dense Representation으로 구분 할 수 있습니다.
One-hot Encoding을 하는 것을 sparse representation이라고 할 수 있습니다. Sparse Representation은 벡터가 컴퓨팅 공간을 많이 차지할 뿐만 아니라, 단어와 단어의 관계를 고려하기 어렵습니다.
Dense Representation이란 One-hot Encoding된 벡터로 부터, 작은 차원으로 축소하고, 벡터의 형태가 sparse하지 않고 dense하도록하는 일련의 작업을 의미합니다. 예를 들어 위 cat, feline의 예제가 $$w^{cat,\top}w^{feline}=0.6$$ 같은 형태로 표현되도록 하는 작업입니다. 이번 포스팅에서는 Singular Value Decomposition을 다루고, Word Embedding의 중추적인 역할을 하는 Word2Vec, Glove을 다음 포스팅에서 각각 다루겠습니다. (사실은 word vector와 word embedding은 혼용되어 쓰이지만, 굳이 구분을 해둔 것 입니다.)
Word Matrix
SVD One-hot encoding과 비슷한 방법에, 벡터를 단어를 count 기반 표현하여 데이터화(행렬화)하는 것을 word matrix라고 부릅니다.
Word-Document Matrix
Word-Document Matrix는 한 문서에 단어의 등장 횟수를 행렬로 나타내는 방법입니다. Word-Document Matrix는 관계가 있는 단어가 같은 문서에서 빈번하게 등장할 것이라는 대전제에서 출발합니다. 예를 들어, 금융 관련 문서에 '은행', '주식', '채권', '돈', '금' 등이 같이 등장하는 상황을 말합니다.
Word-Document Matrix의 구체적인 설명은 예제와 함께하면 아주 간단합니다. 가상의 문서 2개를 가정하겠습니다. 문서 1번에는 금융 관련 내용이 실려있고, 문서 2번에는 동물원 관련 내용이 있습니다. 그러면 Word-Document Matrix를 다음과 같이 나타 낼 수 있습니다. $$\begin{array}{cc} & & \begin{array}{cc} 1 & 2 \end{array}\\ X= & \begin{array}{c} 은행\\ 주식\\ 채권 \\ 금 \\ 원숭이 \\ 서울대공원\end{array} & \left(\begin{array}{cc} 11 & 0 \\ 6 & 0 \\ 5 & 0 \\ 8 & 0 \\ 0 & 5 \\ 0 & 4 \end{array}\right) \end{array} $$ 즉, 문서 1은 은행, 주식, 채권, 금은 각각 11, 6, 5, 8 회 등장 하였고 원숭이, 서울대공원은 등장하지 않았고, 문서 2는 원숭이, 서울대공원만 각각 5회, 4회 등장한 문서를 위와 같이 요약하는 방법을 Word-Document Matrix라고 합니다.
Window based Co-occurrence Matrix
Word-Document Matrix는 문서 단위였다면, Window based co-occurrence matrix는 문장의 window 단위 입니다. 여기에서 window는 문장에서 한 번에 몇 단어 (혹은 몇 말뭉치(corpus))를 카운트할 크기를 의미합니다. 바로 예제와 같이 살펴 보도록 하겠습니다.
"I like an apple.", "I like you." 두 문장을 window 크기 1의 Co-occurrence matrix로 표현하는 예제를 고려해 보겠습니다.
긴 설명이 필요없이 직관적으로 이해할 수 있으실 겁니다. 작성 결과는 다음과 같습니다.
SVD 기반 방법
SVD 기반 방법은 앞에서 만들어진 word matrix를 $X$라고 하면, 이를 $X=\mathcal{U}\Sigma \mathcal{V}^{\top}$으로 분리하고, $\mathcal{U}$를 word embedding의 결과로 사용하는 것입니다. SVD에 관련된 내용은 이곳에 정리해두었습니다. Word Matrix를 SVD 하면, $$X=\left[u_{1},u_{2},\cdots,u_{|V|}\right]\begin{bmatrix}\sigma_{1}&\cdots&0\\0&\ddots&0\\0&\cdots&\sigma_{|V|}\end{bmatrix}\begin{bmatrix}v_{1}^{\top}\\\vdots\\v_{n}^{\top}\end{bmatrix}$$ 여기에서 $|V|$는 단어의 크기가 되고, $n$은 문서의 개수 혹은 $n=|V|$로 각각이 word-document matrix와 co-occurrence matrix와 대응됩니다.
Word Embedding의 목적은 의미있게 차원을 축소하여 워드 벡터를 dense하게 표현하는 것이 목적이라고 했습니다. 따라서 SVD를 그냥 사용하지 않고, $\Sigma$ 행렬의 대각 원소는 $X$ 행렬의 중요도를 나타냄에 따라 적당선에서 $k<|V|$, 짤라서 $\mathcal{U}$를 사용하게 됩니다. $$X=\left[u_{1},u_{2},\cdots,u_{k}\right]\begin{bmatrix}\sigma_{1}&\cdots&0\\0&\ddots&0\\0&\cdots&\sigma_{k}\end{bmatrix}\begin{bmatrix}v_{1}^{\top}\\\vdots\\v_{n}^{\top}\end{bmatrix}$$ 이때 어느 정도 축소해야 word matrix가 정보가 유지되는지 확인하기 위한 척도로 $$\frac{\sum_{i=1}^{k}\sigma_{i}}{\sum_{i=1}^{|V|}\sigma_{i}}$$를 이용하며, 전체 중요도에서 $k$개가 차지하는 비중을 의미하고, 분석하는 사람의 판단에 따라서 $k$를 정할 수 있습니다. 이렇게 크기가 축소된 $U$행렬을 반영하여 다시 계산한 $X$의 차원은 $k\times n$이 될 것입니다.
SVD 기반 방법의 단점
눈치 채셨겠지만 SVD 방법은 몇 가지 단점이 있습니다.
- 가장 큰 문제점은 새로운 단어가 추가되면 다시 계산해줘야 된다는 문제가 있습니다.
- 위 예제에서 살펴 보았듯 행렬에 0으로 코딩 되는 자리가 많아서 비효율적입니다.
- 단어의 수가 많아지면 행렬이 커져 계산이 비효율적입니다.
이런 단점을 극복하고자 나온 방법이 Word2vec 방법입니다. 그럼 이만 다음 포스팅에서 Word2vec으로 다시 찾아뵙겠습니다. :)
References
'Deep Learning > Word Embedding' 카테고리의 다른 글
Word2vec 학습 (2) | 2019.07.28 |
---|---|
Word2vec (0) | 2019.07.22 |
댓글