일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- CVPR
- IROS
- linux
- docker
- 경희대
- 논문리뷰
- Python
- 딥러닝
- 2022
- pytorch
- 논문
- NeRF paper
- Neural Radiance Field
- NERF
- paper review
- ICCV 2021
- 리눅스
- CVPR2023
- panoptic segmentation
- 파이토치
- GAN
- panoptic nerf
- Deep Learning
- 융합연구
- Computer Vision
- Vae
- Paper
- Semantic Segmentation
- 논문 리뷰
- ICCV
- Today
- Total
윤제로의 제로베이스
파이토치의 nn.Embedding() 본문
07. 파이토치(PyTorch)의 nn.Embedding()
파이토치에서는 임베딩 벡터를 사용하는 방법이 크게 두 가지가 있습니다. 바로 임베딩 층(embedding layer)을 만들어 훈련 데이터로부터 처음부터 임베딩 벡터를 학습 ...
wikidocs.net
1. 임베딩 층은 룩업 테이블이다.
임베딩 층의 입력으로 사용하기 위해서 입력 시퀀스의 각 단어들은 모두 저웃 인코딩이 되어야 한다.
어떤 단어 -> 다멍에 부여된 고유한 정수값 -> 임베딩층 통과 -> 밀집 벡터
임베딩 층은 입력 정수에 대한 밀집 벡터로 맵핑하고 이 밀집 벡터는 인공 신경망의 학습 과정에서 가중치가 학습되는 것과 같은 방식으로 훈련된다.
훈련 과정에서 단어는 모델을 풀고자 하는 작업에 맞는 값으로 업데이트 된다.
특정 단어와 맵핑되는 정수를 인데그솔 가지는 테이블로부터 임베딩 벡터 값을 가져오는 룩업 테이블이라고 볼 수 있다.
그리고 이 테이블은 단어 집합의 크기만큼의 행을 가지고 있으므로 모든 단어는 고유한 임베딩을 가진다.
위 그림은 단어 great이 정수 인코딩 된 후 테이블로부터 해당 인덱스에 위치한 임베딩 벡터를 꺼내오는 모습이다.
위의 그림에서는 임베딩 벡터의 차원이 4로 설정되어져 있다.
그리고 단어 great은 정수 인코딩 과정에서 , 1,918번에 위치한 행을 단어 great의 임베딩 벡터로 사용한다.
임베딩 벡터는 모델의 입력이 되고 역전파 과정에서 단어 great의 임베딩 벡터값이 학습된다.
train_data = 'you need to know how to code'
# 중복을 제거한 단어들의 집합인 단어 집합 생성.
word_set = set(train_data.split())
# 단어 집합의 각 단어에 고유한 정수 맵핑.
vocab = {word: i+2 for i, word in enumerate(word_set)}
vocab['<unk>'] = 0
vocab['<pad>'] = 1
print(vocab)
임베딩 벡터 차원이 3인 임베딩 테이블을 구현한다.
# 단어 집합의 크기만큼의 행을 가지는 테이블 생성.
embedding_table = torch.FloatTensor([
[ 0.0, 0.0, 0.0],
[ 0.0, 0.0, 0.0],
[ 0.2, 0.9, 0.3],
[ 0.1, 0.5, 0.7],
[ 0.2, 0.1, 0.8],
[ 0.4, 0.1, 0.1],
[ 0.1, 0.8, 0.9],
[ 0.6, 0.1, 0.1]])
임의의 문장 'you need to run'에 대해서 룩업 테이블을 통해 임베딩 벡터들을 가져온다.
sample = 'you need to run'.split()
idxes = []
# 각 단어를 정수로 변환
for word in sample:
try:
idxes.append(vocab[word])
# 단어 집합에 없는 단어일 경우 <unk>로 대체된다.
except KeyError:
idxes.append(vocab['<unk>'])
idxes = torch.LongTensor(idxes)
# 각 정수를 인덱스로 임베딩 테이블에서 값을 가져온다.
lookup_result = embedding_table[idxes, :]
print(lookup_result)
2. 임베딩 층 사용하기
전처리 과정은 동일하게 거친다.
train_data = 'you need to know how to code'
# 중복을 제거한 단어들의 집합인 단어 집합 생성.
word_set = set(train_data.split())
# 단어 집합의 각 단어에 고유한 정수 맵핑.
vocab = {tkn: i+2 for i, tkn in enumerate(word_set)}
vocab['<unk>'] = 0
vocab['<pad>'] = 1
이제 nn.Embedding()을 사용하여 임베딩 테이블을 만든다.
import torch.nn as nn
embedding_layer = nn.Embedding(num_embeddings=len(vocab),
embedding_dim=3,
padding_idx=1)
nn.Embedding은 num_embeddings와 embedding_dim의 인자를 받는다.
- num_emgedding : 임베딩할 단어들의 개수. 단어 집합의 크기
- emgedding_dim : 임베딩 할 벡터의 차원. 사용자가 정해주는 하이퍼파라미터
- padding_idx : 선택적으로 사용하는 인자이다. 패딩을 위한 토큰의 인덱스를 알려준다.
'Background > Pytorch 기초' 카테고리의 다른 글
장단기 메모리(Long Short-Term Memory, LSTM) (0) | 2022.01.26 |
---|---|
순환 신경망(Recurrent Neural Network, RNN) (0) | 2022.01.26 |
글로브(GloVe) (0) | 2022.01.26 |
워드투벡터(Word2Vec) (1) | 2022.01.26 |
워드 임베딩(Word Embedding) (0) | 2022.01.19 |