Chapter 9: 생성 모델 - 변분 오토인코더(VAE)
이 장에서는 기존 데이터의 특징을 학습해 실제와 유사한 새로운 데이터를 만들어내는 생성 모델의 세계를 다룹니다. 그중에서도 수학적 기반이 탄탄한 변분 오토인코더(VAE)를 집중적으로 살펴봅니다.
변분 오토인코더 (VAE)의 이해
VAE는 데이터의 복잡한 특징을 압축된 표현(Dense representation)으로 학습한 뒤, 이를 바탕으로 새로운 샘플을 생성해내는 강력한 생성 모델입니다. DeepChem을 이용해 VAE를 어떻게 구현하는지 확인해 보세요.
import deepchem as dc
from deepchem.models.optimizers import ExponentialDecay
from deepchem.models.seqtoseq import AspuruGuzikAutoEncoder
import numpy as np
from rdkit import Chem
# 새로운 분자를 생성하기 위해 변분 오토인코더(VAE)를 훈련합니다.
# 먼저 훈련 데이터를 로드합니다.
tasks, datasets, transformers = dc.molnet.load_muv()
train_dataset, valid_dataset, test_dataset = datasets
train_smiles = train_dataset.ids
# 사용된 토큰(문자) 집합과 SMILES 문자열의 최대 길이를 확인합니다.
tokens = set()
for s in train_smiles:
tokens = tokens.union(set(s))
tokens = sorted(list(tokens))
max_length = max(len(s) for s in train_smiles)
# 모델을 구축합니다.
batch_size = 100
batches_per_epoch = len(train_smiles) / batch_size
learning_rate = ExponentialDecay(0.001, 0.95, batches_per_epoch)
model = AspuruGuzikAutoEncoder(
tokens,
max_length,
model_dir="vae",
batch_size=batch_size,
learning_rate=learning_rate,
)
# 모델을 훈련합니다.
def generate_sequences(epochs):
for i in range(epochs):
for s in train_smiles:
yield (s, s)
model.fit_sequences(generate_sequences(50))
# 새로운 분자를 생성합니다.
predictions = model.predict_from_embeddings(np.random.normal(size=(1000, 196)))
molecules = []
for p in predictions:
smiles = "".join(p)
if Chem.MolFromSmiles(smiles) is not None:
molecules.append(smiles)
print("생성된 분자 목록:")
for m in molecules:
print(m)