cs

ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 단어 임베딩 -1: 원핫 임베딩, SVD기반 임베딩
    개인 스터디/NLP 2020. 6. 30. 11:07

    자연어를 컴퓨터에서 처리하기 위해서는 우선 자연어 단어를 컴퓨터가 이해할 수 있는 단위인 숫자로 바꾸는 과정이 필요합니다.

     

    1. One-hot encoding

    원 핫 인코딩은 단어를 벡터로 인코딩하는 가장 간단한 방법입니다.

    원 핫 인코딩을 위해서는 우선 문서에 등장하는 모든 단어를 모아 단어 사전(vocabulary)를 작성합니다.

    만약 가지고 있는 문서가 "나는 사탕보다 초콜릿이 좋다" 라면 ["나", "는", "사탕", "보다", "초콜릿", "이", "좋다"]와 같은 단어 사전을 가지게 될 것입니다.

    원 핫 인코딩은 이 단어들을 오직 0과 1로 이루어진 벡터로 변환합니다. 각 벡터에서는 1이 단 한 번 등장하며, 서로 다른 단어가 임베딩된 벡터에서는 서로 다른 위치에 1이 등장하게 됩니다.

    문서를 $D$, 단어 사전을 $V$라고 한다면 이를 수식으로 나타내면 다음과 같습니다.

     

    $h: D \rightarrow \left\{ 0, 1\right\}^{|V|}$

    $h(w_i) = (y_1, y_2, \ldots, y_{|V|})$, $y_i = 1$ if $i=j$, else $y_i =0$ for $w_i \in V$

     

    원 핫 인코딩으로 단어를 임베딩하게 되면 서로 다른 단어들 간의 내적값은 0이 됩니다.

    즉, 각 단어는 서로 독립적입니다.

     

    원 핫 인코딩 방식은 간단하고 직관적인 반면, 단점도 가지고 있습니다.

    먼저, 단어의 수가 늘어날수록 필요한 공간의 차원도 같이 늘어나게 됩니다.

    그리고 위의 예시 문장을 사람이 본다면 '사탕'과 '초콜릿' 이 '사탕'과 '나'보다 유사하다고 판단할 수 있지만,

    원 핫 인코딩 방식을 통해 임베딩할 경우 '사탕'과 '초콜릿', 그리고 '사탕'과 '나'는 모두 같은 거리를 가지게 됩니다.

     

    2. SVD(Singlar Value Decomposition) 기반 단어 임베딩

    Singular Value Decomposition이란, 임의의 $m \times n$ 행렬 X를 다음과 같이 분해하는 것입니다.

     

    $X = USV^T$

     

    이 때 $U \in \mathbb{R}^{m \times m}$, $V \in \mathbb{R}^{n \times n}$인 직교 정사각행렬이며,

    $S \in \mathbb{R}^{m \times n}$ 인 대각행렬입니다.

     

    그림1. SVD

     

    2-1. window-based co-occurence matrix

    앞서 원핫 인코딩에서 모든 단어를 서로 독립적이라고 가정함으로써 단어 사이의 유사도를 반영하지 못하는 문제가 있다는 것을 보았습니다. 그렇다면 유사한 단어는 어떤 단어일까요?

     

    여기서는 서로 비슷한 단어는 같은 맥락으로 자주 등장한다는 가정을 하겠습니다. 예를 들어 '사탕'과 '초콜릿'은 같은 맥락으로 등장할 확률이 높지만, '사탕'과 '태블릿'은 같은 맥락으로등장할 확률이 상대적으로 낮다고 생각하는 것입니다.

     

    맥락을 반영하게 위해서 window 라는 것을 가정합니다. 단어의 앞뒤 n단어를 참조하는 것입니다. "나는 사탕이 좋다." 라는 문장을 예시로 봅시다. 만약 윈도우 사이즈가 1이라면, '사탕'에 맥락을 부여하는 단어는 다음과 같을 것입니다.

    사탕 좋다

    만약 윈도우 사이즈를 2로 늘린다면 '사탕'에 맥락을 부여하는 단어들은 다음과 같이 나타낼 수 있을 것입니다.

    사탕 좋다

     

    "나는 사탕이 좋다.", "나는 초콜릿이 좋다", "태블릿은 편리하다" 라는 세 문장을 가지고 단어 사전을 만들면 ["나", "는(은)", "사탕", "이", "좋다", "초콜릿", "태블릿", "편리하다"]와 같은 결과가 나옵니다.

    그러면 윈도우 사이즈를 1로 가지는 co-occurence matrix는 다음과 같이 정의될 것입니다.

     

    $X = \begin{bmatrix} 0& 2& 0& 0& 0& 0& 0& 0\\2& 0& 1& 0& 0& 1& 1& 1\\0& 1& 0& 1& 0& 0& 0& 0\\0& 0& 1& 0& 2& 1& 0& 0\\0& 0& 0& 2& 0& 0& 0& 0\\0& 1& 0& 1& 0& 0& 0& 0\\0& 1& 0& 0& 0& 0& 0& 0\\ 0& 1& 0& 0& 0& 0& 0& 0\\\end{bmatrix}$

     

    앞서와 같이 문서를 $D$, 단어 사전을 $V$라고 표현하면 co-occuerence matrix의 크기는 $|V| \times |V|$가 됩니다.

    이 행렬은 문서의 크기가 커질수록 따라서 매우 커질 뿐더러, 매우 sparse하기도 합니다.

    몇 가지 무관한 단어(불용어)를 제거함으로써 행렬의 크기를 줄일 수 있지만, 그 결과로 나오는 행렬 역시 매우 크고 sparse합니다.

     

    여기에서 SVD가 활용됩니다. 정사각행렬$X$에 SVD를 적용하여 $USV^T$로 변환하게 되면, $U$의 각 열벡터와 $V$의 각 행벡터는 $X$의 정규화된 고유벡터가 되고 $S$의 대각성분은 $X$의 고유값이 됩니다. 즉, 다음과 같습니다.

     

    $X = USV^T = \begin{bmatrix}| & |& & |\\u_1 & u_2& \ldots& u_{|V|} \\|& | & &|\end{bmatrix}\begin{bmatrix} \sigma_1&0&\ldots\\0&\sigma2&\ldots\\\vdots&\vdots&\ddots \end{bmatrix}\begin{bmatrix} - & v_1&-  \\ - & v_2&- \\ & \vdots & \\ -& v_{|V|} & -\end{bmatrix}$

     

    SVD를 활용하여 X에 차원 축소를 가할 수 있습니다.

    PCA는 가장 중요한 $k$개의 축에 데이터를 투사하는 차원 축소 방식이며, 각 축은 해당 매트릭스의 고유값, 각 축의 중요도는 상응하는 고유벡터가 됩니다. (참고: PCA)

     

    가장 큰 k개의 고유값에 상응하는 고유벡터 k개를 뽑습니다.

    일반성을 잃지 않고, 이 벡터들을 $u_1, \ldots, u_k$라고 할 수 있습니다.

     

    $X' = U'S'V'^T =\begin{bmatrix}| & |& & |\\u_1 & u_2& \ldots& u_{k} \\|& | & &|\end{bmatrix}\begin{bmatrix} \sigma_1&0&\ldots\\0&\sigma2&\ldots\\\vdots&\vdots&\ddots \end{bmatrix}\begin{bmatrix} - & v_1&-  \\ - & v_2&- \\ & \vdots & \\ -& v_{k} & -\end{bmatrix}$

     

    이렇게 근사된 $X'$는 기존의 $X$와 유사한 값을 가지게 됩니다.

     

    이제 위 식의 양 변의 오른쪽 끝에 $V' $ 를 곱해 보겠습니다.

    여기에서 각 $v_k$는 정규화된 고유벡터이므로$v_i v_j^T$는 $i=j$일 때 1이고 $i \neq j$일 때 0입니다.

    즉, $V'^TV'=I_{k \times k}$입니다. 

     

    따라서, $V'X' = U'S'$ 입니다. PCA의 관점에서 보면 이것은 $v_1, \ldots, v_k$로 이루어진 subspace에 X'의 벡터들을 투영한 것과 같습니다.

    이 투영값들을 새로운 단어 벡터로 정의하면, 우리는 $|V|$차원의 sparse한 단어 벡터들을 맥락을 가진 $k$차원의 단어 벡터들로 변환했다고 볼 수 있습니다.

     

    co-occurence matrix방식은 원핫 인코딩 방식에 비해 맥락과 차원 두 가지 문제를 개선했지만, 여전히 여러 문제점을 가지고 있습니다.

     

    1. 문서에 새로운 단어가 추가될 때마다 초기 행렬의 차원이 변한다.

    2. 큰 문서에서 대부분의 단어가 함께 등장하지 않으므로 초기 행렬이 매우 sparse하다.

    3. 일반적으로 행렬의 크기가 상당히 크다

    4. SVD를 수행하기 위해  quadratic cost가 든다.

     

    위와 같은 문제를 해결하기 위한 몇 가지 방법이 존재합니다.

    1. 불용어를 무시하기

    2. ramp window를 적용하기(co-occurence count에 단어 사이의 거리로 가중치를 가하기)

    3. pearson correlation을 사용하기

     

    그러나, 위 문제들은 iteration 기반 단어 임베딩 방법들로 인해 상당수 해결이 가능합니다.

     

    참고: https://cs224d.stanford.edu/lecture_notes/notes1.pdf

     

    댓글

:D