ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Word Embedding (4주차)
    NAVER AI TECH 2023. 3. 27. 18:14

    우리는 자연어 처리가 컴퓨터가 인간의 언어를 이해, 해석 및 생성하는 방법이라는 점을 배웠다. 그러나 컴퓨터가 이해할 수 있는 것은 숫자뿐이다. 따라서 자연어 처리에서 말뭉치를 숫자로 변환하는 작업은 필수적이다. 자연어를 벡터로 변환하는 가장 쉬운 방법은 one-hot encoding을 적용하는 것이다.

     

    예를 들어서 "I really really love eating ice cream."이라는 문장이 있다고 하자. 이때, 중복되는 단어를 제외하면 'I', 'really', 'love', 'eating', 'ice', 'cream'이라는 6개의 단어가 있다. 6개의 단어에 one-hot encoding을 적용하게 되면 각 단어에 순서대로 다음 벡터가 할당되게 된다.

    [1, 0, 0, 0, 0, 0]

    [0, 1, 0, 0, 0, 0]

    [0, 0, 1, 0, 0, 0]

    [0, 0, 0, 1, 0, 0]

    [0, 0, 0, 0, 1, 0]

    [0, 0, 0, 0, 0, 1]

     

    one-hot encoding의 문제점은 one-hot vector가 단어 사이의 유사성을 전혀 측정하지 못한다는 것이다. 위 예시에서 두 단어 사이의 유클리드 거리가 $\sqrt{2}$로 고정됨을 확인할 수 있다. 단어 사이의 유사성까지 고려하여 단어를 벡터화하는 과정을 Word Embedding이라고 부른다. 대표적인 방법으로 Word2Vec과 GloVe가 있다. 하나씩 살펴보자.

     

     

    (아래 Word2Vec 내용은 딥 러닝을 이용한 자연어 처리 입문을 참고하여 작성하였습니다.)

    Word2Vec

    Word2Vec를 적용하기 위해서는 하나의 가정이 필요하다. 바로, "비슷한 문맥에서 등장하는 단어들은 비슷한 의미를 가진다."이다. 여기서 하나의 hyper-parameter가 등장하게 된다. "얼마나 비슷해야 하는데?" == "얼마나 근처에 있어야 하는데?" 이 범위를 window라고 부르자. 예를 들어 "The cute cat in my room is eating the fish."라는 문장이 있다고 하자. window = 2라면 'The'라는 중심 단어에 대한 주변 단어는 'cute'와 'cat'이 될 것이고, 'cat'이라는 중심 단어에 대한 주변 단어는 'The', 'cute', 'in', 'my'가 될 것이다. 

     

    다음으로 Word2Vec의 구조에 대해서 살펴보기로 하자. Word2Vec은 hidden layer가 하나인 shallow neural network 형태로 구성되어 있다. 즉, Input layer $\rightarrow$ Hidden layer $\rightarrow$ Output layer의 형태이다. 여기서 Input layer와 Output layer에 각각 주변 단어와 중심 단어를 넣는다면 CBOW(Continuous Bag of Words)라고 부르고 중심 단어와 주변 단어를 넣는다면 Skip-gram이라고 부른다.

     

    CBOW(Continuous Bag of Words)

    위 예시에서 'cat'이 중심 단어일 때 주변 단어는 'The', 'cute', 'in', 'my'였다.

    1. one-hot encoding을 적용한다.

    주변 단어:

    [1, 0, 0, 0, 0]  $\leftarrow$  'The'

    [0, 1, 0, 0, 0]  $\leftarrow$  'cute'

    [0, 0, 0, 1, 0]  $\leftarrow$  'in'

    [0, 0, 0, 0, 1]  $\leftarrow$  'my'

    중심 단어:

    [0, 0, 1, 0, 0]  $\leftarrow$  'cat'

     

    2. 주변 단어를 input layer에, 중심 단어를 output layer에 적용한다.

    이때 모든 단어를 한 번에 집어 넣는다고 생각하지 말고 하나씩 집어 넣는다고 생각해보자. 먼저 단어 'The'에 대해 생각해보자. input layer의 경우 1 $\times$ 5크기의 벡터 $X_1$ = [1, 0, 0, 0, 0]이 되고 output layer의 경우 1 $\times$ 5크기의 벡터 $Y$ = [0, 0, 1, 0, 0]이 된다.

     

    3. hidden layer의 크기 M을 결정한다.

    이번 예시에서는 M을 3이라고 하자. 그러면 다음과 같은 수식으로 CBOW의 구조를 나타낼 수 있다.

    $X_1M_1 \rightarrow H$

    (연산 시 $M_1$의 첫번째 행을 그대로 읽어오게 된다. 해당 행을 나중에 임베딩 벡터로 활용하게 된다.)

    $HM_2 \rightarrow Y_{temporary}$

    softmax$(Y_{temporary}) \rightarrow Y$

    각 행렬 혹은 벡터의 크기는 다음과 같다.

    1 $\times$ 5  : $X_1$

    5 $\times$ 3  : $M_1$

    1 $\times$ 3  : $H$

    3 $\times$ 5  : $M_2$

    5 $\times$ 1  : $Y$

     

    4. 위 구조에 대해 loss 값을 최소로 하는 $M_1$과 $M_2$의 weight 값을 찾는다.

    5. 최종적으로 얻은 $M_1$ 행렬의 행을 각 단어의 임베딩 벡터로 사용한다.

    6. 다른 주변 단어에 대해서 2~5번 과정을 반복해주자.

     

    Skip-gram

    input layer에 중심 단어를 output layer에 주변 단어를 넣는다는 점을 빼고는 CBOW와 동일하다. 전반적으로 Skip-gram이 CBOW보다 성능이 좋다고 알려져 있다.

     

     

    (아래 GloVe 내용은 딥 러닝을 이용한 자연어 처리 입문을 참고하여 작성하였습니다.)

    GloVe(Global Vectors for Word Representation)

    GloVe의 아이디어를 한 줄로 요약하면 '임베딩 된 중심 단어와 주변 단어 벡터의 내적이 전체 코퍼스에서의 동시 등장 확률이 되도록 만드는 것'입니다. 손실 함수는 다음과 같습니다.

    $Loss function = \sum_{m,n=1}^V f(X_{mn})(w_m^Tw_n^~ + b_m +b_n^~ - logX_{mn})^2$

     

    $X_{mn}$: 중심 단어 m이 등장했을 때 윈도우 내 주변 단어 n이 등장하는 횟수

    $w_m$: 중심 단어 m의 임베딩 벡터

    $w_n^~$: 주변 단어 n의 임베딩 벡터

    $f(X_{mn})$:

    1) $0 \times log0 = 0$임을 활용

    2) 빈도수가 낮은 단어에 대해서 낮은 weight를 빈도수가 높은 단어에 대해서 높은 weight를 부여

    GloVe는 Word2Vec과 유사한 성능을 보이는 것으로 알려져 있다.

     

     

    'NAVER AI TECH' 카테고리의 다른 글

    7주차 회고록 (Level 1 Project 종료)  (0) 2023.04.22
    Attention Is All You Need  (0) 2023.03.28
    Intro to NLP (4주차)  (0) 2023.03.27
    3주차 회고록 (DL Basic & Data Visualization & Git)  (0) 2023.03.24
    2주차 회고록 (PyTorch)  (0) 2023.03.17

    댓글

Designed by Tistory.