categorical value를 사용하는 one-hot encoding으로는 단어의 semantic 정보를 담기가 어렵다.
one-hot encoding으로부터 semantic 정보를 담을 수 있는 다른 word embedding 방법(ex. Word2Vec)을 사용해야 한다.
one-hot encoding 벡터를 그대로 넘기기에는 벡터가 너무 sparse해서 메모리 낭비가 크다.
따라서 sparse representation을 사용하여 각 one-hot encoding 벡터를 정수 하나로 표현할 수 있다.
token sequence를 여러 개의 정수로 표현할 수 있다.
sparse representation으로부터 Word2Vec을 구현하기 위해서는 보통 nn.Embedding이라는 인덱스로부터 embedding vector를 검색할 수 있는 좋은 모듈을 사용한다.
근데 어떻게 인덱스만 보고 embedding vector를 불러올 수 있을까 궁금해졋다.
그래서 직접 만들어 보고자 했다.
window_size가 로 설정한 후, CBOW 방법을 통해 word embedding을 학습하려면 입력은 다. (는 배치 크기)
word embedding을 학습하기 위한 가중치 매트릭스 는 다. (는 단어 사전의 크기, 는 embedding 벡터의 크기)
X_new = torch.stack([torch.bincount(x_i, minlength=V) for x_i in torch.unbind(X)])
embeddings = self.W(X_new)
return embeddings
torch.bincount로 각 정수가 얼마나 등장했는지 자기 자신의 인덱스의 정보를 표시한다.torch.bincount가 1d-vector에서만 가능하기 때문에 torch.unbind로 를 분해하여 각 행에 대하여 함수를 적용하고 torch.stack으로 합친다.nn.Embedding 쓰세요.