pytorch에서 embedding을 위해 사용하는 nn.Embedding 레이어입니다.

사용 예시) https://github.com/huggingface/transformers/blob/main/src/transformers/models/bert/modeling_bert.py

self.word_embeddings = nn.Embedding(config.vocab_size, config.hidden_size, padding_idx=config.pad_token_id)
self.position_embeddings = nn.Embedding(config.max_position_embeddings, config.hidden_size)
self.token_type_embeddings = nn.Embedding(config.type_vocab_size, config.hidden_size)

이 임베딩 레이어는 처음부터 training data로부터 학습시킬 수도 있고, pre-trained word embedding들을 가져와 사용할 수도 있습니다.

Embedding → Embed → ‘끼워넣다’ → 다양한 길이와 문자들로 구성되어있는 단어들을 어떠한 틀에 끼워넣다. 로 생각하면 쉬울 것 같습니다.

<aside> 💡 자연어를 ‘수치화’ 하여 머신러닝 / 딥러닝 기법에 사용하기 위해 자연어를 vectorization (벡터화) 하는 것이고, 이를 word embedding이라 할 수 있다.

</aside>

임베딩 레이어의 작동 방식

임베딩레이어를 통해 임베딩을 수행하기 위해서는 입력 sequence의 각 단어들은 정수로 encoding되어 있어야 한다.

단어 → 단어에 해당하는 정수값 → embedding 층 통과 → dense vector

임베딩 레이어의 작동은 다음 그림과 같이 나타낼 수 있다.

Untitled

위 그림에서는 임베딩 차원은 5로 설정되어 잇다.

nn.Embedding은 위의 그림과 같이, integer로 들어온 입력을 one hot으로 바꾸어 어떠한 처리를 더 하는게 아니라 룩업테이블에서 임베딩 값을 가져옵니다.

실제 코드를 실행해 살펴보겠습니다.

  1. 간단한 문장으로 token(단어) key들과 그에 해당하는 정수값 values로 이뤄진 vocaburary 생성
import torch
import torch.nn as nn
sentence = "내 이름은 채영"
word_set = set(sentence.split())

vocab = {token: i+2 for i, token in enumerate(word_set)}
vocab['<unk>'] = 0
vocab['<pad>'] = 1

print(vocab)
# {'이름은': 2, '채영': 3, '내': 4, '<unk>': 0, '<pad>': 1}