딥러닝 분야에서 임베딩(embedding)은 데이터의 품질을 높이고, 더 나은 학습 결과를 얻기 위해 매우 유용한 기법입니다. 본 강좌에서는 횟수 기반 임베딩에 대해 소개하고, PyTorch를 사용해 이를 어떻게 구현하는지에 대해 살펴보겠습니다.
1. 임베딩이란 무엇인가?
임베딩은 고차원 데이터를 저차원으로 변환하여 의미를 가진 벡터 공간을 만드는 방법입니다. 특히 자연어 처리, 추천 시스템, 이미지 처리 분야에서 널리 사용됩니다. 예를 들어, 단어를 벡터로 표현하면 단어들 간의 의미적 유사성을 계산할 수 있습니다.
2. 횟수 기반 임베딩의 개념
횟수 기반 임베딩은 주어진 데이터의 출현 빈도(count)를 기반으로 단어 또는 객체를 임베딩하는 방법입니다. 이 방법은 주로 문서에서 단어의 출현 빈도를 기반으로 단어 간의 관계를 토대로 임베딩을 생성합니다. 가장 널리 알려진 방법은 TF-IDF(용어 빈도-역 문서 빈도)와 같은 접근 방식입니다.
2.1. TF-IDF의 기본 개념
TF-IDF는 문서 내의 특정 단어의 중요도를 평가하는 방법으로, 단순히 단어의 빈도(frequency)를 비교하는 것보다 더 유용한 정보를 제공합니다. TF는 ‘용어 빈도(Term Frequency)’를 의미하고, IDF는 ‘역 문서 빈도(Inverse Document Frequency)’를 의미합니다.
2.2. TF-IDF 계산
TF-IDF는 다음과 같이 계산됩니다:
TF = (해당 단어의 문서 내 출현 횟수) / (문서 내 전체 단어 수)
IDF = log(총 문서 수 / (해당 단어가 출현한 문서 수 + 1))
TF-IDF = TF * IDF
3. PyTorch로 횟수 기반 임베딩 구현하기
이제 PyTorch를 사용하여 횟수 기반 임베딩을 구현하는 방법을 살펴보겠습니다. 예제로는 간단한 텍스트 데이터셋을 사용하여 TF-IDF 임베딩을 계산해 보겠습니다.
3.1. 필요한 라이브러리 설치
pip install torch scikit-learn numpy pandas
3.2. 데이터 준비
우선 사용할 간단한 예제 데이터를 생성하겠습니다.
import pandas as pd
# 예제 데이터 생성
data = {
'text': [
'사과는 맛있다',
'바나나는 노란색이다',
'사과와 바나나는 과일이다',
'사과는 비타민이 많다',
'바나나 과일은 에너지원이다'
]
}
df = pd.DataFrame(data)
print(df)
3.3. TF-IDF 벡터화
이제 텍스트 데이터를 TF-IDF 벡터로 변환합니다. 이를 위해 sklearn
의 TfidfVectorizer
를 사용할 것입니다.
from sklearn.feature_extraction.text import TfidfVectorizer
# TF-IDF 벡터 생성
vectorizer = TfidfVectorizer()
tfidf_matrix = vectorizer.fit_transform(df['text'])
# 결과 출력
tfidf_df = pd.DataFrame(tfidf_matrix.toarray(), columns=vectorizer.get_feature_names_out())
print(tfidf_df)
3.4. PyTorch 데이터셋 및 DataLoader 준비
PyTorch에서 데이터를 처리할 수 있도록 Dataset
및 DataLoader
를 정의하겠습니다.
import torch
from torch.utils.data import Dataset, DataLoader
class TFIDFDataset(Dataset):
def __init__(self, tfidf_matrix):
self.tfidf_matrix = tfidf_matrix
def __len__(self):
return self.tfidf_matrix.shape[0]
def __getitem__(self, idx):
return torch.tensor(self.tfidf_matrix[idx], dtype=torch.float32)
# 데이터셋 생성
tfidf_dataset = TFIDFDataset(tfidf_df.values)
data_loader = DataLoader(tfidf_dataset, batch_size=2, shuffle=True)
3.5. 모델 정의
이제 간단한 신경망 모델을 정의하여 횟수 기반 임베딩을 학습해 보겠습니다.
import torch.nn as nn
class SimpleNN(nn.Module):
def __init__(self, input_dim, hidden_dim, output_dim):
super(SimpleNN, self).__init__()
self.fc1 = nn.Linear(input_dim, hidden_dim)
self.fc2 = nn.Linear(hidden_dim, output_dim)
def forward(self, x):
x = torch.relu(self.fc1(x))
x = self.fc2(x)
return x
# 모델 초기화
input_dim = tfidf_df.shape[1]
hidden_dim = 4
output_dim = 2 # 예를 들어, 두 개의 클래스로 분류
model = SimpleNN(input_dim, hidden_dim, output_dim)
3.6. 학습 과정 설정
모델을 학습하기 위해 손실 함수와 최적화 알고리즘을 정의합니다.
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
# 학습 과정
num_epochs = 100
for epoch in range(num_epochs):
for batch in data_loader:
optimizer.zero_grad()
outputs = model(batch)
labels = torch.tensor([0, 1]) # 더미 레이블
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
if (epoch+1) % 10 == 0:
print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')
4. 결론
본 강좌에서는 횟수 기반 임베딩의 개념과 이를 PyTorch로 구현하는 방법에 대해 살펴보았습니다. TF-IDF를 사용하여 단순한 텍스트 데이터셋의 임베딩을 생성하고, 간단한 신경망 모델을 정의하여 학습하는 과정을 보여드렸습니다. 이러한 임베딩 기법은 자연어 처리 및 데이터 분석에서 매우 유용하게 사용될 수 있습니다.
참고 문헌
- V. D. P. P. M. (2023). “Deep Learning: A Comprehensive Guide”. Cambridge Press.
- Goodfellow, I., Bengio, Y., & Courville, A. (2016). “Deep Learning”. MIT Press.