NLP & Word Embeddings

Sequence Model-NLP & Word Embeddings

Deep Learning을 NLP에 도입하면 매우 강력해진다. 단어를 vector화 하고 embedding layer를 도입해서 신경망을 학습시키면 다양한 NLP 분야에서 뛰어난 성능을 발휘한다.



Word Representation

onehot

앞의 글 RNN 에서는 one-hot representation으로 단어를 vector로 표현하였다.

해당 표현법의 한계는 한 단어가 vocabulary 의 크기만큼의 dimension을 가져야 하기 때문에 크기가 매우 커져 계산량이 많아질 수 있다. 또한 단어들 사이의 일반화가 이루어질 수없다. 즉 단어 사이의 관계를 정의하지 못한다는 것이다.

예를들어 "I want glass of orange __"라는 문장이 있다는 우리는 높은 확률로 빈칸에 들어갈 말이 juice가 될 수 있다는 것을 유추할 수 있을 것이며, 신경망 또한 학습을 통해서 알 수 있을 것이다.

만약 orange 대신 apple이 들어간 문장이 있다고 생각해보자. 우리는 orange와 apple이 둘 다 과일이라는 유사성을 가지고 있는것을 바탕으로 apple 뒤에도 juice가 들어간다고 생각할 수 있다.

하지만 one hot vector를 사용해서는 이러한 단어간의 관계를 학습할 수 없다. 벡터간의 공통점도 없고, 내적을해도 0이다.

이런 단점들을 해결해 줄 수 있는 방법이 바로 Word embedding이다.

embedding

Word embedding은 단어마다 공통된 features에 대한 확률을 mapping한다.

만약 feature가 300개면 각 단어는 300의 dimension을 가질것이고, Man=e5391, King=e4914등의 이름으로 지정할 수 있을것이다.

이와 같은 방법을 사용하면, Apple과 Orange는 자연스럽게 매우 유사한 feature들을 가질 것이고, 앞의 예제에서 Orange 뒤에 juice가 들어가야 한다는 것을 알아챈 시점에서 빠르게 apple 뒤에도 juice가 들어갈 수 있다는 것을 학습할 것이다.

물론 단어의 feature들은 위의 표처럼 명시적으로 표시되어있지 않고, 우리가 해석하기에는 다소 어려움이 있을 것이다. 또한 수백개의 매우 고차원 dimension에 대하여 embedding 되기 때문에 직접적인 단어의 위치는 직관적으로 알기 어렵다. 이를 2D의 위치상에서 정의하기 위해 t-SNE 라는 알고리즘을 쓴다.

tsne

각 단어들을 2D상의 위치에 나타내보면 비슷한 단어끼리는 그룹을 형성하는 현상을 발견할 수 있다.

이처럼 Word Embedding은 NLP에 있어서 가장 중요한 아이디어 중 하나였다.



Using Word Embeddings

사람의 이름을 찾아내는 Named entity recognition model이 있다고 해보자.

"Sally Johnson is an orange farmer"라는 문장에서 Sally Johnson이 사람이라는 것을 알 수 있는 방법 중 하나는 farmer가 사람이라는 것을 아는것이다.

해당 학습을 거친 후에는 "Robert Lin is an apple farmer" 라는 문장이 나와도 Robert Lin이 사람이라는 것을 찾아낼 수 있다.

반면에 apple farmer 대신 durian cultivator 같은 training set에는 없었던 단어들이 나오면 어떻게 해야할까?

Word Embedding의 특징은 인터넷에서 얻을 수 있는 수백억, 혹은 수천억의 unlabeled data를 학습에 활용할 수 있다는 것이다. 이런 방대한 data를 학습하여 durian과 orange가 비슷하다는 것을 알고, farmer 와 cultivator가 비슷하다는 것을 알게 되면 이 embedding의 일부를 사용해 원래의 task에 transfer 하여 쓸 수 있다.

Word Embedding을 Transfer Learning에 활용하는 방법은 다음과 같다.

  1. 매우 큰 규모의 text corpus를 사용해 word embedding 학습.(혹은 이미 embedding된 trained data 사용)
  2. embedding된 data를 새로운 task를 위한 더 작은 training set로 transfer
  3. (선택사항) 새로운 data에 대해서 word embedding을 fine tuning

이러한 과정은 language modeling이나 기계번역 같은 일부를 제외한 대부분의 NLP작업에서 매우 유용하게 적용된다.



Properties of Word Embeddings

table

Man:Woman의 관계를 King에 적용시키면 그 대상은 무엇이 될까? 우리는 당연히 Queen 이란느 것을 알고 있다. 이런 관계 유추를 알고리즘에도 도입시킬 수 있을까?

Word Embedding은 단어간의 관계 유추에 매우 유능하다. 예를들어 위의 Word Embedding vector의 Man의 vector인 e5391에 Woman의 vector인 e9853을 뺀다면 [-2 0 0 0] 정도의 4차원 vector가 나온다. 이는 곧 다른 항목들은 유사하고 성별에서 크게 차이가 난다는 단어의 관계를 설명한다.

마찬가지로 King 에서 Queen을 빼보자. 마찬가지로 [-2 0 0 0] 정도의 4차원 vector가 나온다. 이 값은 Man-Woman과 유사한 값일 것이다. 이는 곧 Man:Woman의 관계와 King:Queen의 관계가 유사하다는 의미다.

이를 수식화 하면 아래와 같이 표현할 수 있다.

sim

즉 similarity가 최대가 되는 vector ew를 찾는것이다. 이때 유사도는 cosin 유사도를 사용한다.(유클라디안 거리도 사용 가능)



Embedding Matrix

10000개의 단어를 가지는 vocabulary 집합을 사용한다고 해보자. Embedding matrix를 E라고 하고, One hot matrix를 O라고 할 때 j번째 단어에 해당하는 Embedding vector ej = E.dot(oj) 로 구할 수 있다.

이 때, Embedding matrix는 랜덤으로 초기화된 배열이고, one-hot vector는 1만개의 dimension 중 1개를 제외하면 다 0이기 때문에 실질적으로 이런 내적 계산은 효율성이 좋지 않기 때문에 실제로 구할때는 다른 방법을 사용하도록 한다.


Learning Word Embeddings

General

Language model을 Training할 때 입력된 문장의 모든 단어에 대해서 one hot vector를 곱하고 softmax에 집어넣는 것은 필요 이상으로 계산량이 늘어난다.

따라서 문장의 전체 단어를 넣는 대신 정해진 개수의 context 를 사용하는 방법이 있다.

예를들어 target 앞의 4개의 단어를 context로 사용하겠다고 정하면, 문장의 길이에 상관없이 앞의 4단어를 embedding하고 softmax에 넣어 예측한다.

context는 앞의 1단어, 앞뒤 4단어, 근처의1단어 등등 넓은 폭에서 선택할 수 있다.


Skip-gram

skip-gram은 기존처럼 target의 앞이나 앞의 몇 단어를 context로 설정하는 것이 아니라, 문장 내에서 랜덤하게 context를 고른다. 그 후 context 근처의 단어 중 임의로 target word를 고른다.

context를 균일한 분포에서 랜덤하게 고르면 the, of, a, to...와 같은 자주 등장하는 단어들이 지배적으로 선정되기 때문에, 이를 방지하기 위해 heuristic한 방법들이 존재한다.

Model의 구성은 다음과 같다.

model의 목적은 context c 를 target t 에 mapping하는것이 목적이다. context의 one-hot vector o_c를 embedding matrix E와 내적하여 e_c를 만든다. 이렇게 만들어진 ec를 softmax에 넣어 y_hat을 만든다.

skipgram

m은 vocabulary의 개수, theta_T는 softmax의 파라미터이다.

yi는 정답인 단어의 one-hot vector이고 yhat은 전체vocab 단어의 정답이 될 수 있는 확률의 m dimension벡터다.

softmax의 과정에서 확률을 계산할 때, vocabulary 안의 모든 단어에 대한 합을 계산해야 하기 때문에 연산 속도에서 불이익을 얻는다.

이를 해결하기 위해 hierarchical softmax 라는 기법을 사용할 수 있다. 전체에 대하여 확률을 계산하는 것이 아니라 Binary tree 처럼 첫번째 몇개의 집합에 대해서 target이 있을 확률, 그 다음 몇개의 집합에 대해서 있을 확률...으로 계산한다.

또한 tree는 보통 대칭으로 balanced하게 구성되지 않고, 자주 등장하는 단어일수록 tree의 위쪽 노드에 배치해 더 적은 탐색을 가능하게 한다.


Negative Sampling

skip-gram이 중심 단어로부터 주변 단어를 예측하는 모델이었다면 Negative sampling은 중심단어와 주변단어를 주고(1개 혹은 전부), 추가로 vocabulary에서 k개의 무작위 샘플을 뽑는다.

negative

그리고 원래 문장에서 orange의 주변에 있던 Juice pair는 1을 라벨링해주고, vocab에서 무작위로 뽑은 pair에는 0(negative)를 라벨링해준다.

그리고 전체 vocab대신에 이 k+1개의 pair에 대해서 softmax를 계산한다. 이를 통해 계산량을 획기적으로 줄일 수 있다.


GloVe (global vectors for word representation)

GloVe의 핵심 개념은 동시 등장 행렬(Co-occurrence Matrix)이다.

Xij 는 중심단어 i가 등장했을 때 윈도우 내에서 j가 등장한 횟수를 나타낸다. N 사이즈 window의 앞 뒤만큼 context를 설정한다면 Xij와 xji는 대칭일것이다. (Xij를 transpose 해도 같음.)

예를들어

"I like deep learning"

"I like NLP"

"I enjoying flying"

이라는 세 문장이 있다고 하자. window size N=1일 때 생성되는 동시 등장 행렬은 다음과 같다.

glove

ex) i='I', j='Like'라면 X_ij = 2

동시 등장 행렬을 이용하여 동시 등장 확률 을 계산할 수 있다. P(k|i) 는 단어 i 의 전체 등장 횟수 중에 i와 k가 같은 context내에서 등장한 횟수이다. 예를 들어 P(Deep|Like) = 2/3 가 될것이다.

GloVe의 목적은 'target 과 context 단어에 대한 임베딩된 벡터의 내적(wi.T, wj) **이 전체 코퍼스의 **동시 등장 확률이 되도록 만드는 것이다.'

이를 위해 일련의 Loss function 도출과정 을 거치면 아래와 같은 Loss function이 나온다.

gloveloss



Debiasing Word Embeddings

  1. Identify bias direction
  2. Neutralize: For every word that is not definitional, project to get rid of bias.
  3. Equalize pairs

연관글