본문 바로가기

Data Analysis

기계학습 - Spark(6) - Word2Vec, 학습하는 부분 코드 분석2

코딩 조금하는 놈이 적은 지식을 갖고 직관에 상당히 의존해서 Word2Vec 스칼라 구현코드를 분석하는 글이다. 따라서 이 글은 틀릴 수 있다.


이번회는 지난회의 다듬어지지 않은 생각이 한층 정리된 글이다. 결론에 가기전에 벡터 스칼라곱과 y'=ax + y를 처리하는 saxpy(Scalar Alpha X Plus Y)함수의 의미를 추리해 본다. 


1. 스칼라곱은 아래처럼 다른 식으로 표현 가능한데. 

   

     cos값의 성질에 따라 두 벡터의 내각이 90도 이내면 양수, 90도이면 0, 90~270이내면 음수, 270도이면 0 ... 등이 된다. 따라서 이 값은 정반대의 벡터의 곱부터 직교하는 벡터의 곱을 거쳐 같은 방향의 벡터 곱까지이다.


2. saxpy함수는 알파값과 매개변수로 2개의 배열을 받는데 앞의 배열 값이 x 값 뒤의 배열값이 y값이고 그 값을 뒤의 배열로 넣는다. 예를 들면 알파값이 2이고 두개의 배열이 각각 X(3, 2, 1)  Y(1, 1, 1)이라고 하면 Y배열의 값은  y'=2x3 + 1 .... 등의 값으로 대체되어 T(7, 5, 3)이 된다.


이 saxpy연산은 Word2Vec 에서 학습을 할 때, 각 단어의 벡터 혹은 임시로 사용되는 원점벡터들사이에 적용되는데, 연산결과는 뒤의 벡터가 앞의 벡터쪽으로 이동하게 된다. 여기서 알파값이 양수이면 반시계방향으로 음수이면 시계방향으로 이동한다.




따라서 알파값이 중요한데, 이 값은 스칼라곱에서 유도된다. 이 유도하는 과정이 또한 오묘한데... 내 눈치로는 지수함수에 대한 수학자들의 맹신에 기인하는 것 같기도 하다. 유도는 이렇다. 스칼라곱을 일정 범위의 지수함수 값으로 대체하고, 다시 f(x)=x/(1+x) 함수를 적용한 값을 사용한다. 



위의 그림처럼 스칼라곱은 여러단계를 거쳐서 절대로 0.5 이상, 1 미만의 값을 갖는 최종값이 구해지는데, 이를 b라고 하면 알파값 = 1 - b 이다. 찬찬히 알파값이 유도되는 것을 따져보면, 두개의 벡터가 방향이 같을 수록 알파값은 작아진다.(최종값은 커지지만) 거꾸로 방향이 정반대일수록 알파값은 1에 가까워진다. 


 사실은 살짝 복잡한게 더 있다. 실재 알파값 = 1 - (노드의 코드값) - b 이다. 여기서 노드의 코드값은 앞에서 이진트리를 구성할 때 설명했듯이 왼쪽 노드인지 오른쪽 노드인지를 나타낸다. 어떤 단어가 이진트리상에서 왼쪽 노드인지 오른쪽 노드인지에 따라 왼쪽으로 돌지 오른쪽으로 돌지를 결정하고 왼쪽으로 돌 때는 같은 방향일 수록 천천히 오르쪽으로 돌 때는 빨리 돌도록 코딩이 되어 있다.


아무튼 여기까지 결론에 도달하기 위한 것들이 모두 다뤄진 것 같다. 다음회에 최종적으로 word2vec의 동작원리를 스칼라 소스코드를 분석한 것을 바탕으로 정리할까 한다.