'워드 임베딩'은 각 단어를 좌표공간에 최적의 벡터로 표현하는(임베딩하는) 기법을 말한다.
그렇다면 표현된 벡터값이 '최적'인지를 어떻게 알 수 있을까
kitty : 아기 고양이
cat : 고양이
hamburger : 햄버거
위 단어들을 벡터를 통해 좌표공간으로 표현한다면, 'kitty'와 'cat'은 비슷한 위치할 것이다. 그러나 'hamburder'는 꽤 먼 거리에 표현될 것이다. 이와 같이 유사한 단어는 가까이, 유사하지 않은 단어는 멀리 위치하는 것을 '최적의 좌표값'으로 표현할 수 있다.
또 다른 예로 감정을 분류를 한다고 했을 때에
"기쁨", "환희"는 긍정적인 감정을 나타내는 단어들과 함께,
"분노", "증오"는 부정적인 감정을 나타내는 단어들과 비슷한 위치에 맵핑이 될 것이다.
Word2Vec Idea
'워드 투 벡터'의 아이디어는 "문장 내에서 비슷한 위치에 등장하는 단어는 유사한 의미를 가질 것이다" 에서 출발한다. 즉, 주변에 등장하는 단어들을 통해 중심 단어의 의미가 표현될 수 있다는 것으로 추정을 시작한다.
이를 위해 우선 워드를 토크나이징(Tokenizing)해준 후, 유니크한 단어만 모아서 사전(Vocabulary)을 만들어주어야 한다. 그 이후 문장에서 중심단어를 위주로 학습 데이터를 구축해준다. ( 중심 단어를 기점으로 앞, 뒤 단어들을 보고 관계를 봄 )
예를 들어 “I study math”라는 문장의 중심단어가 study 라고 한다면, (I study), (study I) , (study math) 와 같은 단어쌍을 학습 데이터로 구축한다.
토크나이징(Tokenizing) : 말그대로 문자(Text)를 컴퓨터가 이해할 수 있는 Token이라는 숫자 형태로 바꿔주는 행위
Word2Vec의 계산
문장의 단어의 갯수만큼에 Input, Output 벡터 사이즈를 입력/출력해준다. 이 때 연산에 사용되는 히든 레이어(hidden layer,은닉 층)의 차원(dim)은 사용자가 파라미터로 지정할 수 있다.
실제로 Tensorflow나 Pytorch와 같은 프레임워크에서는 임베딩 레이어와의 연산은 0이 아닌 1인 부분, 예를 들어 [0,0,1]의 벡터인 경우는 3번째 원소와 곱해지는 부분의 컬럼(column)만 뽑아서 계산해준다.
마지막 결과값으로 나온 벡터는 softmax 연산을 통해 가장 큰 값이 1, 나머지는 0으로 출력된다.
위의 연산이 반복되면서, 같이 등장하는 단어들 간의 벡터표현이 유사해지는 것을 아래 사이트에서 확인할 수 있다.