Word Embedding (2) - Word2Vec
one-hot vector라는 것은 관련된 것만 1로 표현하고 다른것은 모두 0으로 표현하는 형태의 벡터를 의미한다.
예를들어, 혈액형 4가지를 표현한다고 하면,,
A형, B형, AB형, O형이 있을때 각각을 1, 2, 3, 4 등의 숫자로 표현하면 어쩔 수 없이 분류간의 대소관계가 생기게 된다. 이를 범주형 변수라고도 하는데, 이를 word 를 embedding 하는 데에 사용하기에는 적합하지 않다.
대신, A형을 [1 0 0 0], B형을 [0 1 0 0] 의 형태로 표현한다면 대소관계를 만들지 않고 분류할 수 있게 되고 이때 [1 0 0 0]과 같은 벡터를 one-hot vector라고 하는 것이다.
Word2Vec Algorithm
기본적인 아이디어는 coaccurance에 비례하여 벡터간의 거리를 점점 더 가깝게 만들어준다는 것이다.
coaccurance의 경우, 문장이 길어지게 되면 맨 앞 단어와 맨 끝 단어의 유사도가 떨어진다고 판단할 수 있다. 따라서 training set를 만들때엔 주어진 문장에 미리 정한 window size를 기준으로 끊어서 단어set를 만들게 된다.
예를 들어, "I study Spanish everyday"라는 문장이 있고, window size를 ±1로 잡으면 앞뒤로 한단어씩 더 본다는 것이다.
위의 그림처럼 window를 씌운다고 생각하면 쉽다. 맨 앞 단어부터 순서대로 윈도우를 옮기면서 단어세트를 생성해간다고 생각하면 되고, 이를 sliding window라고도 부른다..
추출한 단어세트를 나열해보면 (I, study), (study, I), (study, Spanish)등 주변단어를 가지고 word pair를 만들며 이것이 학습 data가 된다. 각 세트의 앞에 있는 글자가 input word이고 뒤에 있는 글자가 output word인 것이고 이는 순서를 구분한다는 것을 알 수 있다. 즉, 신경망에서 "I"가 들어가면 "study"가 출력되어야 한다는 형태로 학습되는 것이다.
추출한 data들을 학습시키는 방법은 다음과 같다.
Input layer 의 노드의 개수는 vocabulary 수이다. 즉, document에 있는 unique 한 단어의 수이다. Ouput layer은 만약 vacabulary의 수가 10이라고 한다면 ouput layer의 업무는 그 해당 10개의 단어 중 1개의 단어를 맞히는 것이므로 input layer의 노드 수와 마찬가지로 10개이다. Hidden layer의 노드의 수는 몇개의 차원으로 이루어지는 벡터 공간에 embedding 할 것인지에 따라 달라지며 그 차원의 수가 hidden layer의 노드의 개수이다.
W1과 W2는 Linear Transformation이다. 1의 column 과 2의 row는 각각 단어를 표현하고 있다. 단어간의 유사도를 판단하는 것은 내적계산으로 이루어진다. similar하다는 것은 벡터공간 상에서의 그 위치가 가까워야 한다는 것을 의미하고 이는 내적이 최대한 커지도록 하는 것과 같은 의미이다. Linear Transformation까지 거친 이후 최종적으로 softmax를 거쳐 학습을 진행하는데 이를 직접 행렬을 그려 쉽게 표현하자면 다음과 같다.
편의상 I study Spanish 라는 문장이라고 생각하고 (study, Spanish)라는 세트를 학습시킨다고 가정해보자. input 인 x에는 study에 해당하는 one-hot vector 가 들어갔다. I와 Spanish에 해당하는 칸은 0으로 표현하였고, study에 해당하는 것만 1로 표현되었음을 알 수 있다. 그림의 행렬계산으로만 보면 W2에서는 3번의 내적계산이 이루어진다. 하지만 W1의 파란빗금 친 부분만 살아남게 되는데, x의 해당 부분만 1이기 때문이다. 이로써 linear transformation 혹은 linear layer을 거칠때 one-hot vector을 입력으로 주게 되면 linear transformation 해주는 행렬에서 모든 내적계산으로 곱하고 있는 것은 비효율적임을 알 수 있다. 곱셈 연산을 해주지 않고 해당 column 나 뽑아오는 역할이라고 이해하면 좋을 것 같다.
Softmax 는 non linear unit 이다. 이는 지수승을 사용하여 주어진 벡터를 합이 1인 확률분포로 변환해주는 역할이다. 위의 예시와 같이 [0 1 0]의 입력이 주어졌을때 최종 결과값이 [0.2 0.1 0.7]이 출력되었다고 하면 이는 study라는 단어를 입력값으로 넣었을 때 I가 출력될 확률은 20%, study가 출력될 확률은 10%, Spanish가 출력될 확률은 70%인 것이다. 하지만 이상적인 ouput word의 확률분포는 Spanish가 100%인 것이다. 즉 GT(Ground Truth)는 [0 0 1]이라고 할 수 있다.
"학습시킨다"는 것은 [0.2 0.1 0.7]과 [0 0 1]을 가깝도록 만드는 loss를 걸어서 학습시키는 것이고, 여기서 쓰이는 loss가 softmax loss이다. 이때의 loss function은 100%인 정답 word에 해당하는 확률값(0.7)을 보고 이 값을 최대한 올리도록 loss 및 gradient가 계산되어 역전파를 통해 학습시키는 역할이다. softmax의 특성상 확률분포의 합이 1이기 때문에 0.7에 해당하는 확률값을 더 올리면 나머지는 낮아져야만 하고 결국엔 [0 0 1]에 근사하게 된다.
softmax를 활용하는 이유는 이렇게 해야 미분이 가능하고 역전파가 가능하기 때문에 뒤쪽에 위치한 parameter들을 학습시킬 수 있다.
word embedding을 시각화하여 볼 수 있는 사이트이다.
https://ronxin.github.io/wevi/
wevi
Training data (context|target): Presets: Update and Restart Update Learning Rate Next 20 100 500 PCA
ronxin.github.io
처음 학습을 시작하였을 때는 위와 같이 연한 색상으로 표현되지만, 학습을 진행할수록 아래와 같이 변화함을 알 수 있다.
벡터공간상에서의 단어끼리의 위치도 변화했음을 알 수 있는데,
가령 apple|eat , orange|eat 일때 두 eat은 같은 벡터이다. apple 을 입력했을 때에도 eat이 출력되어야 하고 orange가 입력되었을 때에도 eat이 출력되어야 한다. 즉, apple과 orange는 공통의 벡터와 가까워져야한다는 것을 알 수 있고, 결과적으로 appel과 orange 벡터의 위치는 서로 가까워진다. 이는 input이 공통이어도 마찬가지로 작용한다.
Property of Word2Vec - Linear Substructure
Word2Vec의 많은 자료들을 보면 유명한 수식을 볼 수 있다.
vec[queen] - vec[king] = vec[woman] - vec[man]
이로써 word vector는 공간상에서 단어들간의 관계를 보여줄 수 있음을 알 수 있다. 같은 관계는 같은 벡터들로 표현된다.
예를 들어 man-woman 의 관계는 아래처럼 시각화할 수 있고,
형용사의 비교급-최상급 간의 관계도 표현할 수 있다.
Application of Word2Vec
Word2Vec이 적용될 수 있는 곳들이다. 자연어를 처리해야하는 기술에서는 상당히 많이 쓰이고 있다는 것을 알 수 있다.
- Word siilarity
- Machine translation
- Part of Speech(POS) adn named entity recognition
- Sentiment Analysis
- Clustering
- Semantic lexicon building