DL

[NLP] 자연어처리 기초부터 Attention까지: word2vec(2)

gomduribo 2023. 8. 17. 16:29

*사이토 고키의 밑바닥부터 시작하는 딥러닝2를 공부하고 정리하는 내용입니다. 정리하는 과정에서 혹여나 잘못된 내용이 들어가 있을수 있습니다. 

 

이전 챕터에서 소개했던 word2vec에는 두가지 문제가 존재합니다.

첫번째로는, 어휘수가 많아지면 그것을 표현하는 각 단어의 원핫 벡터의 길이가 길어지게 됩니다. 그렇게 된다면 Win행렬과 원핫벡터의 연산에서 계산량이 많아지게 됩니다.

두번째로는, Wout과 은닉벡터의 연산에서도 계산량이 많아지게 되어 softmax계층에서 병목현상이 발생하게 됩니다. 

 

chap4에서는 이러한 word2vec의 문제를 개선하는 2가지 방법에 대해서 소개합니다.

 

Embedding 계층

Win과 입력층의 원핫 벡터의 연산은 단순히 단어의 분산 표현을 나타내는 Win행렬에서 특정 행을 추출하는 연산입니다. 그렇다면 거대한 Win행렬과 원핫 벡터를 연산하지 않고, Win에서 단어ID에 해당하는 행을 추출하는 Embedding 계층을 구현함으로써 문제를 해결할 수 있습니다.  

 

 

네거티브 샘플링

아래와 같은 CBOW모델에서 은닉층 이후 계산이 오래걸리는 부분은 두부분(Wout과 은닉층의 연산, softmax 층의 계층의 연산)입니다.

 

 

네거티브 샘플링 기법은 다중 클래스 분류 문제를 이진 분류로 근사하는 방법입니다. 이를테면, "맥락이 you와 goodbye일때, 타겟은 무엇입니까?"의 다중 클래스 분류 문제를 "맥락이 you와 goodbye일때, 타겟은 'say'입니까?"의 이진 분류 문제로 바꾸는 것입니다. 

즉, 아래 사진과 같이 Wout에 포함되어있는 say에 해당하는 열벡터와 은닉층 벡터의 내적연산을 진행하여 say에 해당하는 최종점수를 도출하는것입니다. 

 

 

이렇게 이진 분류 문제로 변환을 완성하려면 위에서 도출된 점수에 시그모이드 함수를 적용해 확률로 변환하고, 손실함수를 구할 때는 cross entropy함수를 적용해야합니다. 

 

하지만 이렇게 맥락 'you'와 'goodbye'의 정답타겟인 'say'인 경우만을 대상으로 이진분류를 진행하게 된다면 'say'가 아닌 다른 부정적인 경우에 대해서는 학습을 진행하지 못합니다. 따라서 'say'와 같은 긍정적인 경우에는 sigmoid계층의 출력이 1이 되도록, 'say'가 아닌 부정적인 경우에는 출력이 0에 가깝도록 학습을 하게 해주어야합니다.

 

하지만 정답 타겟이 아닌 부정적인 모든 경우를 학습하기에는 어휘수가 너무 많습니다. 따라서 이때 부정적인 경우를 샘플링해서 사용하는데 이것을 네거티브 샘플링이라고 부르는 것입니다. 

 

 

이렇게 네거티브 샘플링을 통하여 선별한 부정적인 경우에서 도출된 손실함수값을 최종손실에 반영하여 학습에 반영이 되도록 합니다.