4.4 nn.Embedding()

tmdwo1016·6일 전

4.4 nn.Embedding()

이번에는 파이토치 상에서 임베딩 벡터를 사용하는 것에 대해 알아볼 예정이다. 그렇다면 임베딩 벡터가 무엇일까?

벡터 임베딩이란?

백터 임베딩 : 텍스트, 이미지, 오디오 같은 비정형 데이터를 인공지능과 머신러닝 모델이 이해할 수 있는 숫자 배열(벡터) 즉, 실수 벡터로 변환 시키는 것
-> 이렇게 만들면 데이터가ㅇ 원래 담고 있던 의미와 맥락을 최대한 반영해 줄 수 있다.

임베딩은 무엇일까?

임베딩은 차원이 높은 데이터를 고정된 차원의 벡터로 매핑하는 과정 (즉 비정형 데이터를 연산 가능하도록 만드는 것)
-> 이러한 연산을 바탕으로 이미지상의 특징을 확인 할 수 있고, 위치를 통해 유사도 검증까지 진행할 수 있다.

아래는 제일 자주 쓰는 기본 설정이다.

import torch #딥러닝과 텐서 연산에 사용하는 기본 라이브러리인 파이토치 불러오기 
import torch.nn as nn # 신경망으 만들 때 필요한 층(layer), 활성화 함수 , 손실함수등이 포함된 torch.nn 모듈을 불러오고, 앞으로 코드에서 간편하게 nn 이라는 이름으로 부르겠다는 의미
  • ex) nn.Linear : 입력과 출력을 연결하는 완전연결층 생성
  • ex) nn.ReLU : 비선형성을 부여한는 ReLU 활성화 함수 사용

1. 임베딩 층은 룩업 테이블 이다.

룩업 테이블이 뭘까?

수많은 단어나 토큰의 고차원 벡터 데이터르 ㄹ모아둔 사전, 또는 주소록을 의미

입베딩 층의 입력으로 사용하기 위한 시퀀스의 각 단어들은 정수 인코딩 되있어야 한다.
여기서 임베딩 층은 입력으로 들어온 정수들에 대해 밀집 벡터로 매핑 하고, 신경망 학습 과정에서 가중치를 부여하는 과정을 거친다.

정수 밀집? 임베딩 벡터로 매핑?

특정 단어와 매핑되는 정수를 인덱스로 가지는 테이블로부터 임베딩 벡터값을 가져오는 사전을 룩업 테이블이라고 한다. 여기서 이 룩업 테이블은 단어 집합의 크기만큼 행을 가지게 된다.
쉽게 말하면 특정 단어에 해당하는 인덱스 번호가 부여되며 이과정을 정수로 인코딩 한다고 한다.
그런 다음 인데스 번호에 따라 룩업 테이블에서는 각각 단어마다 실수로 베터화가 진행 되는데 이게 벡터로 임베딩화 시킨다는 것이다.
그렇게 벡터화된 단어는 훈련과정에서 입력값으로 사용되고 학습을 거치게 된다.

결론은 정수 밀집은 훈련과정을 위한 특정 단어에 고유 번호를 부여하는 과정, 임베딩 백터로 매핑은 단어의 이미와 특징을 담은 여러개의 실수 배열로 다시 변환하는 과정

룩업 테입블 과정 코드

train_data = 'you need to know how to code' # train data

# 중복을 제거한 단어들의 집합인 단어 집합 생성.
word_set = set(train_data.split()) # 문장 공백 기준으로 쪼개서 리스트 만들기 

# 단어 집합의 각 단어에 고유한 정수 맵핑.
vocab = {word: i+2 for i, word in enumerate(word_set)} # 단어들을 순서대로 돌면서 번호를 매김. 이때 특별한 의미를 가진 토큰을 위해 0과 1번은 비워둠
vocab['<unk>'] = 0 # 사전에 없거나 모르는 단어 0
vocab['<pad>'] = 1 # 문장 기이를 똑값이 맞춰줄 때 빈공간을 채우는 공백용 토큰 1
print(vocab)

nn.Embedding을 사용한 학습 테이블 생성 코드

embedding_layer = nn.Embedding(num_embeddings=len(vocab), 
                               embedding_dim=3,
                               padding_idx=1)
  • num_embeddings : 임베딩을 할 단어들의 개수. 다시 말해 단어 집합의 크기입니다.
  • embedding_dim : 임베딩 할 벡터의 차원입니다. 사용자가 정해주는 하이퍼파라미터입니다.
  • padding_idx : 선택적으로 사용하는 인자입니다. 패딩을 위한 토큰의 인덱스를 알려줍니다.
profile
할 게 많은데 놀거야?

0개의 댓글