본문 바로가기
Coursera 강의/Deep Learning

Introduction to Word Embeddings

by 별준 2020. 12. 24.
해당 내용은 Coursera의 딥러닝 특화과정(Deep Learning Specialization)의 다섯 번째 강의 Recurrent Neural Network를 듣고 정리한 내용입니다. (Week 2)

- Introduction to Word Embeddings

[Word Representation]

저번주 강의에서 RNN, GRU, LSTM에 대해서 배웠고, 이번주에서는 NLP에 어떤 아이디어들을 적용할 수 있는지 살펴보도록 할 것이다.

NLP에서 중요한 아이디어 중의 하나는 Word Embedding(단어 임베딩)이다.

지난 주에 사용했던 1만개의 단어에 대해서 우리는 one-hot encoding을 통해서 단어를 표시했다.

즉, Man은 5391의 index를 갖고 있으며, 10000 dimension의 벡터에서 5391번째 요소만 1이고 나머지는 다 0으로 표시되는 벡터로 나타낼 수 있다. \(o_{5391}\)로 나타내며, o는 one-hot vector를 의미한다.

 

one-hot encoding의 약점 중의 하나는 각 단어를 하나의 object로 여기기 때문에 단어 간의 관계를 추론할 수 없다는 것이다. 예를 들어, I want a glass of orange _______ 를 통해서 빈칸에 juice가 들어가도록 학습했다고 하더라고, I want a glass of apple _______ 이라는 입력이 들어왔을 때, apple을 orange와 비교해서 비슷하다고 여겨서 juice를 추론할 수가 없다는 것이다.

두 개의 서로 다른 one-hot vector 사이에서의 곱셈 결과는 0이기 때문에, king/queen, man/woman 같은 관계를 학습할 수 없다.

 

따라서, 위와 같은 문제를 해결하기 위해서 Word Embedding을 통해서 각각의 단어들에 대해 features와 values를 학습하는 것이 필요하다. 

단어 임베딩은 위와 같은 matrix를 갖는다. row는 feature들을 의미하고, Gender/Royal/Age/... 등이 될 수 있다. 각 col은 보카에 존재하는 단어들이다.

그래서 Man이라는 단어를 보면 Gender에 해당하는 값이 -1에 가깝고, Woman은 1에 가까운 것을 볼 수 있다. 서로 반대되는 개념이기 때문에 두 합이 0에 가깝게 되는 것이다. Apple이나 Orange의 경우에는 성별과 거의 연관이 없기 때문에 Gender에 해당되는 값이 0에 가까운 것을 확인할 수 있다. 

이처럼 워드 임베딩을 통해서 각 특징에 대한 값들을 갖는 임베딩 행렬(Embedding Matrix)를 얻을 수 있다.

Man의 임베딩 벡터는 \(e_{5391}\)로 표현할 수 있고, e는 embedding을 의미한다.

 

I want a glass of orange juice.

I want a glass of apple _______.

워드 임베딩을 통해서 juice 앞의 apple과 orange과 유사하다는 것을 추론할 수 있기 때문에 apple 다음에 juice가 온다는 것을 더 쉽게 예측할 수 있다.

 

다만, 워드 임베딩에서 각 row가 어떤 특징을 의미하는지 해석하기는 어렵지만, one-hot encoding보다 단어간의 유사점과 차이점을 더 쉽게 알아낼 수 있는 장점을 갖고 있다. 

보통 feature의 개수로는 300 dimension을 많이 사용한다.

 

이렇게 300 dimension의 워드 임베딩 행렬을 조금 더 쉽게 이해하기 위해서 시각화를 할 수 있는데, 이 시각화 작업을 위해 사용되는 알고리즘은 t-SNE 알고리즘이다. 

t-SNE 알고리즘은 임베딩 행렬을 더 낮은 차원으로(여기서는 2D) 매핑해서 단어들을 시각화하며, 유사한 단어들을 서로 가까이에 있는 것을 확인할 수 있다.

 

[Using word embeddings]

기존의 이름을 인식하는 예제를 가지고 살펴보자. 

'Sally Johnson is an orange farmer'라는 example에서 Sally Johnson이 이름이라는 것을 확실히 하기 위한 방법 중의 하나는 orange farmer가 사람임을 알아내는 것이다. one-hot encoding이 아닌 word embedding을 사용해서 학습한 후에, 새로운 example 'Robert Lin is an apple farmer'에 대해서 apple이 orange와 유사하다는 것을 알기 때문에 Robert Lin이 사람 이름이라는 것을 더 쉽게 예측할 수 있다.

 

만약 apple farmer가 아닌 많이 사용되지 않는 과일인 'durian cultivator'라면 어떻게 될까?

training set의 수가 적고, training set에 durian과 cultivator가 포함되지 않을 수 있다. 하지만, durian이 과일이라는 것을 학습하고, cultivator가 사람을 나타낸다는 것을 학습한다면 training set에서 학습한 orange farmer에서 학습한 것을 durian cultivator에도 일반화하게 될 것이다.

단어 임베딩이 이렇게 일반화할 수 있는 이유 중의 하나는 단어 임베딩을 학습하는 알고리즘이 매우 큰 단어 뭉치들을 통해서 학습하기 때문이다.(10억~1000억개의 단어)

 

또한, 우리가 적은 수의 training set을 가지고 있다고 하더라도, Transfer Learning을 통해서 미리 학습된 단어 임베딩을 가지고 학습할 수 있다.(꽤 좋은 성능을 보여준다)

 

일반적인 NLP 작업에서 단어임베딩은 위와 같은 과정으로 진행된다. 하지만, Laguage model이나 Machine Translation에는 유용하지 않다. 앞서 배운 Transfer Learning처럼, A의 data는 많고 B의 data는 적을 때 더욱 효과적이다.

 

단어 임베딩은 Face encoding과 유사하다고 볼 수 있다.

앞서 CNN 강의에서 봤던 face encoding의 슬라이드인데, 이미지를 128D vector로 변환해서 이미지들을 비교하게 된다. 

한가지 차이점은 사진의 경우에는 처음보는 이미지더라도 encoding이 되지만, 단어 임베딩의 경우에는 입력으로 사용되는 단어가 정해져있기 때문에 UNK과 같은 알 수 없는 단어(voca에 존재하지 않는)가 포함된다. 즉, 정해진 단어만 학습한다는 의미이다.

 

[Properties of word embeddings]

단어임베딩의 중요한 부분은 이것이 유추하는 문제에 큰 도움을 준다는 것이다. 이에 대한 예제를 통해서 단어 임베딩의 특징을 살펴보자.

'남자(man)와 여자(woman)는 왕(king)과 ____과 같다'라는 유추 문제가 있을 때, 어떻게 예측할 수 있을까?

위 표와 같이 Man은 4차원 벡터로 표현되며, \(e_{5391} = e_{man}\)으로 나타낼 수 있다. 그리고 woman의 임베딩은 \(e_{woman}\)으로 표현하며, king/queen도 동일하게 표현된다. (실제로는 50~1000 차원을 사용한다)

 

그리고 \(e_{man} - e_{woman}\)과 \(e_{king} - e_{queen}\)을 시행해보면 다음과 같은 흥미로운 결과를 얻을 수 있다.

\[\begin{matrix} e_{man} - e_{woman} \approx \begin{bmatrix} -2 \\ 0 \\ 0 \\ 0 \end{bmatrix} && e_{king} - e_{queen} \approx \begin{bmatrix} -2 \\ 0 \\ 0 \\ 0 \end{bmatrix} \end{matrix}\]

이 결과에 의해서 우리는 man과 woman의 관계가 king과 queen의 관계와 유사하다고 추론할 수 있다.

 

직관적으로 이해하기 위해서 아래 슬라이드를 참조하자.

단어 임베딩은 약 300차원의 공간에서 표현될 것이고, 그 공간 안에서 각 단어들은 점으로 표현될 것이다. 

그리고, man과 woman의 차이와 king과 queen의 차이 벡터는 매우 유사할 것이다. 위에서 나타난 벡터(화살표)는 성별의 차이를 나타내는 벡터를 의미한다. 주의해야할 점은 300차원 안에서 그려진 벡터이다.(2차원이 아님)

여기서 우리가 해야할 것은 'man -> woman as king -> _____' 에서 우리는 빈칸의 단어 w를 찾는 것이고, 아래 방정식으로 찾을 수 있다.

Find word \(w\) : \(\text{arg }\underset{w}{max} \text{ sim}(e_w, e_{king} - e_{man} + e_{woman})\)

 

여기서 sim은 similarity function을 의미하며, 두 단어 사이의 유사성을 계산한다. 위 식에서 유사성을 최대화하는 단어를 찾게 되고, 따라서 queen이라는 단어라고 예측할 수 있을 것이다.(적절한 similarity function이 필요하다)

 

실제 논문에서는 30~75%의 정확성을 보여주고 있는데, 유추 문제에서 완전히 정확한 단어를 추론했을 경우에만 정답으로 인정하기 때문이다.

 

그리고 t-SNE 알고리즘에 대해서 언급하자면, 이 알고리즘은 300D을 2D로 매핑하는데, 매우 복잡하고 비선형적인 매핑이다. 따라서 임베딩을 통해서 단어간의 관계를 추론할 때, t-SNE를 통해 매핑된 임베딩 값으로 비교하면 안되고, 300D의 vector를 통해서 비교 연산을 수행해야한다.

 

일반적으로 Similarity function으로는 Cosing similarity를 가장 많이 사용한다.

또한 유클리디안 거리를 사용하기도 한다. \(\text{sim}(u, v) = \| u - v \|^2\)

 

[Embedding matrix]

단어 임베딩을 통해서 학습되는 것은 Embedding Matrix이다. 만약 1만개의 단어를 사용하고 특징으로 300 차원을 사용한다면 위와 같은 (300, 10k)의 차원의 matrix E를 가지게 된다. 그리고 voca에 담겨있는 10000개의 단어들을 각각 다르게 임베딩한다. 예를 들어, orange는 6257 column에 있으며, 이 열은 orange에 해당하는 임베딩 vector가 된다. 그리고 one-hot encoding을 통한 \(o_{6257}\)을 matrix E와 dot product를 수행하면 우리가 원하는 6257 column의 orange의 임베딩 vector를 얻을 수 있다. => \(E \cdot o_{6257} = e_{6257}\)

일반화하면 다음과 같다. 

Embedding for word j = \(E \cdot o_j = e_j\)

 

우리가 학습해야되는 것이 Embedding Matrix E라는 것이 가장 중요하며, 이 Matrix E는 초기에 무작위로 초기화된다.

하지만 위 공식에서 Matrix E를 one-hot vector o와 함께 곱하는 것으로 표현되어있는데, 이것은 꽤 비효율적이다. one-hot vector는 꽤 높은 차원인데, 대부분 0으로 채워져있기 때문에 메모리 낭비가 심하고, 연산량도 많다. 

실제로는 one-hot vector를 곱하는 것이 아닌 특화된 함수를 사용한다.

댓글