word2vec 돌아보기
랜덤 벡터로 시작하여, corpus를 순회하며 target word가 등장했을 때 window 안에 context word가 등장할 확률을 높이는 방향으로 학습한다.
이 때 동시 등장 확률은 다음과 같이 계산한다.
: context word의 벡터를 전치한 것 과 center word의 벡터 를 내적한 후 exponential을 구한다.
는 배열 x의 각 요소에 대해 를 반환한다. 는 자연상수.
자연상수가 밑인 지수함수를 미분한 결과는 그 자신이다.
이런 특성으로 인해 자연상수를 밑으로 사용하면 미분 결과가 깔끔해지고 목적함수에 집어넣어도 기울기를 발생시켜 역전파가 용이해진다.
: 모든 context word에 대해 를 구하고 더해 분자 값을 나눈다.
벡터의 내적에 softmax 함수를 적용한 것과 같은 효과
예시 시각화. center word 각각에 대해 outside word 들의 벡터를 내적하고, 내적한 결과에 softmax를 적용한다.
결과 벡터 시각화 예시
지금까지 소개한 Gradient descent도 단점이 있다. corpus의 모든 단어에 대해 window 안의 단어들과 목적함수의 미분을 수행하기 때문에 corpus가 커질수록 비효율적이라는 것.
여기에서 Stochastic gradient descent (SGD)가 등장한다. SGD는 미니 배치 방식처럼 window를 샘플링하며 여러 번 Gradient descent를 수행한다.
앙상블처럼 여러번 GD를 수행한 결과를 평균내기 때문에 노이즈가 적으며 더 중요한 장점은 각 미니배치가 독립적으로 수행될 수 있기때문에 병렬연산이 가능하다는 점이다.
하지만 SGD를 사용하는 경우에도 문제가 발생하는데.. 샘플링을 하기 때문에 연산을 하는 파라미터 개수에 비해 실제 존재하는 값이 적기 때문에 연산이 비효율적이다.
이를 해결하기 위해서는 두 가지 방법을 사용할 수 있는데, 하나는 값이 존재하는 row의 인덱스를 저장해놨다가 해당 row만 업데이트하는 것이고, 다른 하나는 word vector를 해싱하는 방법이다.
기타 word2vec에 대한 부연설명
지금까지 학습한 방법은 naive softmax로 간단하지만 느린 방법이다. negative sampling을 통해 성능을 향상시킬 수 있다.
위에서 본 의 normalization term인 은 계산하기 매우 비싸다. vocab의 모든 단어 벡터에 대해 현재 단어의 벡터와 내적을 하고 exponential해 더해줘야 한다.
negative sampling의 핵심 아이디어는 이런 계산을 이진 분류 문제로 만드는 것이다. 즉, context word는 target word와 등장할 확률을 높이는 동시에 window 밖에 있는 단어는 target word와 등장할 확률을 낮춘다.