지난 포스팅에서 우리는 Word2vec의 손실함수를 Optimization 하는 과정에 대해 배웠다. (참조 2024.03.19 - [자연어처리] - [자연어처리 CS224N] #2-1. Word2Vec Optimization (SGD))
그런데 지난 글에서 알아본 바로는 우리는 cross entropy 연산을 통해 구한 오차로부터 임베딩 테이블에 있는 모든 단어에 대한 임베딩 벡터 값을 업데이트 한다고 했다. 단어 집합의 크기가 매우 크다면 이 작업은 굉장히 오랜 시간이 걸릴 것이다. 크게 중요하지 않은 계산까지도 모두 거쳐야 하기 때문에 연산량이 매우 많고 비효율적이다.
그래서 이를 해결하기 위해 negative sampling을 사용한다. 이 방법은 Word2vec이 학습 과정에서 전체 단어 집합이 아니라 일부 단어 집합에만 집중할 수 있도록 한다.
핵심 아이디어는 이진 분류 문제로 생각하는 것이다. 원래는 단어 집합의 개수만큼 클래스가 있는 다중 클래스 분류 문제의 일종이었는데, 어떻게 이진 분류 문제로 바꿀 수 있을까? 중심 단어와 window size 내부의 주변 단어들은 true pair로 분류하고, 그렇지 않은 나머지 단어들은 무작위로 선택하여 noise pair로 분류한다. 이러한 네거티브 샘플링을 사용하면 불필요한 연산이 줄어드므로 계산량도 줄고, 성능도 오히려 좋아질 수 있다.
구체적인 내용은 여기에 정리가 너무 잘되어 있다. https://wikidocs.net/69141
그러면 Skip-gram with Negative sampling(SGNS)의 손실함수에 대해 알아보자.
우리는 이 함수를 최대화하고 싶다. 손실함수를 구성하는 두 항도 각각을 최대화해야 하겠다. 단순히 생각하면서 하나씩 해결해보자.
- log함수는 x값이 클 수록 큰 값이 나온다. 그렇다면 log함수 안에 있는 시그모이드 함수의 값이 커야하겠다.
시그모이드 함수는 x값이 클수록 1에 가까운 값이 나온다. 따라서 시그모이드 함수 안에 들어간 주변 단어와 중심 단어의 내적은 클수록 좋다. 내적이 크다는 것은 유사도가 높다는 것을 의미한다. - 그럼 다음 항을 보자. 거의 형태가 비슷하긴 한데 시그모이드 함수 안에 마이너스(-)가 붙어 있다. 또 앞에는 시그마로 합의 연산을 취하고 있다. 이 부분이 noise pair에 해당하는 부분의 연산이다. 전체 값이 커져야 하는데, 시그모이드 함수 안에 마이너스가 붙어 있다는 것은 음수일 정도로 값이 작다는 것. 즉 유사도가 낮다는 것이다.
손실 함수 형태가 이와 같기에, 손실 함수를 최대화 하는 방향으로 학습한다는 것은 true pair들 간의 유사도를 높이고, noise pair들 간의 유사도를 낮추는 방향으로 학습한다는 것과 같다.
그런데 Sampling은 어떻게 하나? k개의 noise pair는 어떻게 만들었나?가 궁금할 것이다.
전체 단어 개수를 전부 다 센 다음에 특정 단어가 몇 번 나올지(unigram distribution)를 확률로 만들어서 샘플링을 한다. 그런데 이렇게하면 자주 나오는 단어만 너무 샘플링된다는 문제점이 있어 지수승 3/4를 곱하여 사용한다. 이렇게 지수승을 곱해주면 분포를 넓혀줄 수 있고, 더 골고루 샘플링되도록 할 수 있다.
효율적인 것 같은 네거티브 샘플링이지만 여기서도 문제가 있다. SGD로 학습을 하면 너무 sparse하게 결과가 나온다는 것이다. 만약 중심 단어가 1개이고, window size가 3이라면 총 학습해야 하는 단어는 7개이다.(3+1+3) 그러면 SGNS에서는 7개에 대해서만 gradient를 계산하고 u,v를 업데이트한다. 이렇게 되면 너어무 sparse해진다. 만약 전체 벡터의 개수가 100개라면..? 100000개라면..? 학습은 완료되었는데 대부분의 값들이 0으로 채워져 있는 상황이 발생한다.
그래서
.... 작성중
'자연어처리' 카테고리의 다른 글
[자연어처리 CS224N] #5-2 Neural Language Model, Perplexity (0) | 2024.03.26 |
---|---|
[자연어처리 CS224N] #5-1. n-gram Language Model (1) | 2024.03.24 |
[자연어처리 CS224N] #2-3. GloVe (2) | 2024.03.24 |
[자연어처리 CS224N] #2-1. Word2Vec Optimization (SGD) (1) | 2024.03.19 |
[자연어처리 CS224N] #1. Introduction and Word Vectors (0) | 2024.03.11 |