본문 바로가기
딥러닝 with Python

[개념정리] 인코딩과 임베딩의 차이(Encoding vs Embedding)

by CodeCrafter 2024. 7. 28.
반응형

이번에 알아볼 것은 

 

인코딩(Encoding)과 임베딩(Embedding)의 차이

 

에 대해서 알아보고자 합니다.

 

인코딩과 임베딩은 둘 다 데이터를 다른 형식으로 변환하는 과정이지만, 그 목적과 방식에 차이가 있습니다.

 

1. 인코딩(Encoding)

1) 인코딩(Encoding)

 - 인코딩은 데이터를 특정 형식으로 변환하는 과정을 말합니다.

 - 인코딩의 주요 목적은 데이터를 다른 시스템이나 저장 매체에서 처리할 수 있도록 변환하는 것입니다.

 - 예를 들어, 텍스트 데이터를 숫자 형식으로 변환하거나, 이진 데이터를 특정 문자셋으로 변환하는 것을 의미합니다. 아래는 대표적인 인코딩의 예시입니다

 

 a) 텍스트 인코딩(UTF-8)

  * UTF-8 인코딩은 텍스트 데이터를 바이트 형식으로 변환하는 일반적인 방법을 말합니다.

  * 이는 유니코드의 가변 길이 문자 인코딩 방식으로, 다양한 문자를 효율적으로 표현할 수 있습니다.

  * 아래는 파이썬 코드를 활용해서 알아본 예시입니다.

# 문자열을 UTF-8로 인코딩
text = "Hello, world!"
encoded_text = text.encode('utf-8')

print("Original text:", text)
print("Encoded text (UTF-8):", encoded_text)

  * 문자열이 UTF-8의 형식으로 바꾼 것을 알 수 있습니다.

 

b) 카테고리 인코딩 / 원핫 인코딩(One-Hot Encoding)

 * 카테고리 데이터(범주형 데이터)를 숫자 벡터로 변환하는 방법을 말합니다. 각 카테고리는 고유한 벡터로 변환되며, 해당 카테고리의 위치에만 1을 갖고 나머지 위치에는 0을 가지게 만드는 방법을 말합니다.

from sklearn.preprocessing import OneHotEncoder
import numpy as np

# 카테고리 데이터
categories = np.array([['red'], ['green'], ['blue'], ['green'], ['red']])

# One-Hot Encoding 적용
encoder = OneHotEncoder(sparse=False)
encoded_categories = encoder.fit_transform(categories)

print("Original categories:", categories.flatten())
print("Encoded categories (One-Hot):\n", encoded_categories)

 

 

red는 [0,0,1]로, green은 [0,1,0]으로, blue는 [1,0,0]으로 변환된 것을 확인할 수 있습니다.

 

c) 마지막으로 해시 인코딩(Hash encoding)에 대해서 알아보겠습니다. 해시 함수를 활용해서 텍스트 데이터를 고정된 크기의 벡터를 변환하는 방법을 말합니다. 주로 대규모 텍스트 데이터를 인코딩할 때 사용됩니다.

from sklearn.feature_extraction.text import HashingVectorizer

# 텍스트 데이터
texts = ["hello world", "machine learning", "deep learning"]

# Hashing Vectorizer 설정
vectorizer = HashingVectorizer(n_features=10)  # 10차원 벡터로 변환
hashed_texts = vectorizer.transform(texts)

print("Original texts:", texts)
print("Hashed texts (Hashing Encoding):\n", hashed_texts.toarray())

 

 

위 3개의 단어가 다음과 같이 10차원의 벡터로 변환된 것을 확인할 수 있습니다.

 

(이때, 해시 인코딩은 다음에 알아볼 임베딩과의 차이점이 있습니다. 해시 인코딩은 해시 암수를 활용해서 데이터를 고정된 크기의 벡터로 변환한다는 것이 그 차이입니다)

 

 

반응형

 

 

2. 임베딩(Embedding)

 - 임베딩은 고차원 데이터를 저차원 벡터 공간으로 변환하는 것을 의미합니다. 

 - 임베딩의 주 목적은 원본 데이터의 의미를 최대한 보존하면서 데이터의 차원을 줄여서 처리 성능을 향상시키는 것을 의미합니다.

 - 주로 자연어 처리(NLP)에서 단어를 벡터로 변환하는데 사용됩니다.

 * 예시로는, 단어를 고유한 벡터로 변환하여 의미적으로 유사한 단어들이 벡터 공간에서 가까이 위치하도록 하는 것입니다. 

 * 대표적으로 Word2Vec이 있는데 이를 활용한 예시를 통해 알아보겠습니다.

 * gensim library에 내장된 Word2Vec을 활용하였습니다. 

 

import gensim
from gensim.models import Word2Vec
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA

# 예시 텍스트 데이터
sentences = [
    ['hello', 'world'],
    ['machine', 'learning', 'is', 'fun'],
    ['deep', 'learning', 'is', 'a', 'subset', 'of', 'machine', 'learning'],
    ['python', 'is', 'a', 'great', 'programming', 'language']
]

# Word2Vec 모델 학습
model = Word2Vec(sentences, vector_size=10, window=2, min_count=1, workers=4)

# 단어 리스트
words = list(model.wv.index_to_key)

# 단어 벡터
word_vectors = [model.wv[word] for word in words]

# PCA로 차원 축소
pca = PCA(n_components=2)
result = pca.fit_transform(word_vectors)

# 시각화
plt.figure(figsize=(10, 5))
plt.scatter(result[:, 0], result[:, 1])

for i, word in enumerate(words):
    plt.annotate(word, xy=(result[i, 0], result[i, 1]))

plt.title("Word Embeddings Visualization")
plt.xlabel("PCA Component 1")
plt.ylabel("PCA Component 2")
plt.show()

 

 Word2Vec을 활용해서 주어진 setences를 의미 단위로 토큰화 한 뒤, 인코딩하고, 이를 의미적으로 가까운 것들이 서로 가까운 위치에 있도록 해줍니다.(의미적으로 가까운 것들을 가깝게 해주는 과정이, 위에서 알아본 단순 인코딩과 차이임을 알 수 있습니다)

 이 과정은 Word2Vec의 사전에 학습된 파라미터를 활용했습니다.

 그리고, 이렇게 고차원으로 임베딩된 벡터들을 2차원으로 시각화하기 위해 PCA라는 차원축소 기법을 활용해 2차원 평면상에 투영(Projection)하여 시각화한 예시입니다.

반응형

댓글