제발 nn.Embedding은 사드세요

Junseong Park·2024년 8월 30일

TIL

목록 보기
5/7

발단

  • 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_sizeWW로 설정한 후, CBOW 방법을 통해 word embedding을 학습하려면 입력은 xZB×2W\mathbf{x} \in \mathbb{Z}^{B \times 2W}다. (BB는 배치 크기)

  • word embedding을 학습하기 위한 가중치 매트릭스 WWWRV×dwW \in \mathbb{R}^{V \times d_w}다. (VV는 단어 사전의 크기, dwd_w는 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.unbindXX를 분해하여 각 행에 대하여 함수를 적용하고 torch.stack으로 합친다.

결말

  • 그냥 nn.Embedding 쓰세요.
profile
부스트캠프 AI Tech 7기

0개의 댓글