[파이썬] 텍스트 생성을 위한 LSTM 및 GAN 기반 모델

텍스트 생성은 인공지능 분야에서 매우 중요한 작업 중 하나입니다. 최근에는 순환 신경망(LSTM)과 생성적 적대 신경망(GAN)과 같은 딥러닝 모델을 사용하여 텍스트 생성 작업을 수행하는 것이 일반적입니다. 이 블로그 포스트에서는 Python에서 LSTM 및 GAN을 기반으로한 텍스트 생성 모델을 만드는 방법에 대해 알아보겠습니다.

LSTM을 사용한 텍스트 생성

LSTM은 순환 신경망의 한 종류로, 시퀀스 데이터에 대해 장기 의존 관계를 학습할 수 있습니다. 이러한 특성을 활용하여 LSTM을 사용하여 텍스트를 생성할 수 있습니다. 아래는 LSTM을 사용한 텍스트 생성의 예입니다.

import numpy as np
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense

# 텍스트 데이터 준비
text = "Some sample text data for training our LSTM model"
chars = sorted(list(set(text)))
char_to_idx = {c: i for i, c in enumerate(chars)}
idx_to_char = {i: c for i, c in enumerate(chars)}

# 입력 시퀀스 및 타깃 시퀀스 생성
seq_length = 50
x_data = []
y_data = []
for i in range(len(text) - seq_length):
    seq_in = text[i:i + seq_length]
    seq_out = text[i + seq_length]
    x_data.append([char_to_idx[char] for char in seq_in])
    y_data.append(char_to_idx[seq_out])

# LSTM 모델 구축
vocab_size = len(chars)
hidden_size = 128
model = Sequential()
model.add(LSTM(hidden_size, input_shape=(seq_length, 1)))
model.add(Dense(vocab_size, activation='softmax'))
model.compile(loss='sparse_categorical_crossentropy', optimizer='adam')

# LSTM 모델 훈련
x_data = np.reshape(x_data, (len(x_data), seq_length, 1))
y_data = np.array(y_data)
model.fit(x_data, y_data, epochs=20, batch_size=128)

위의 코드에서는 주어진 텍스트 데이터를 사용하여 LSTM 모델을 생성하고 훈련합니다. 모델은 Sequential 모델을 사용하여 구축되고, LSTM 레이어와 밀집 레이어로 구성됩니다. sparse_categorical_crossentropy 손실 함수와 adam 옵티마이저를 사용하여 모델을 컴파일합니다. 그 후 모델을 훈련하게 됩니다.

GAN을 사용한 텍스트 생성

GAN은 생성자(generator)와 판별자(discriminator)라는 두 개의 신경망으로 구성되는 생성적 적대 신경망입니다. 생성자는 무작위 노이즈 벡터를 사용하여 가짜 텍스트를 생성하고, 판별자는 가짜 텍스트와 실제 텍스트를 구분하는 역할을 합니다. 아래는 GAN을 사용한 텍스트 생성의 예입니다.

import numpy as np
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Reshape, LSTM

# 텍스트 데이터 준비
text = "Some sample text data for training our GAN model"
chars = sorted(list(set(text)))
char_to_idx = {c: i for i, c in enumerate(chars)}
idx_to_char = {i: c for i, c in enumerate(chars)}

# 입력 노이즈 생성
latent_dim = 100
num_samples = len(text)
z = np.random.normal(0, 1, (num_samples, latent_dim))

# 생성자 모델 구축
generator = Sequential()
generator.add(Dense(128, input_dim=latent_dim, activation='relu'))
generator.add(Reshape((1, 128)))
generator.add(LSTM(256, return_sequences=True))
generator.add(Dense(len(chars), activation='softmax'))

# 판별자 모델 구축
discriminator = Sequential()
discriminator.add(LSTM(256, input_shape=(1, len(chars)), return_sequences=True))
discriminator.add(Dense(128, activation='relu'))
discriminator.add(Dense(1, activation='sigmoid'))

# GAN 모델 구축
gan = Sequential([generator, discriminator])

# GAN 모델 훈련
optimizer = tf.keras.optimizers.Adam()
gan.compile(loss='binary_crossentropy', optimizer=optimizer)
gan.fit(z, np.ones((num_samples, 1)), epochs=50, batch_size=128)

위의 코드에서는 GAN을 사용하여 텍스트를 생성하는 예시입니다. 먼저, 주어진 텍스트 데이터를 사용하여 생성자와 판별자 모델을 생성합니다. 생성자는 무작위 노이즈 벡터를 입력으로 받아 가짜 텍스트를 생성하는 역할을 합니다. 판별자는 실제 텍스트와 가짜 텍스트를 구분하는 역할을 합니다. 마지막으로 생성자와 판별자를 결합하여 GAN 모델을 만들고, 이를 훈련하는 과정을 수행합니다.