Python/Deep Learning

Seq2Seq 모델 개념 및 기초 구현

임베디드 친구 2025. 12. 28. 16:23
반응형

Seq2Seq 모델 개념 및 기초 구현

1. Seq2Seq 모델이란?

Seq2Seq(Sequence to Sequence) 모델은 입력 시퀀스를 받아 출력 시퀀스로 변환하는 딥러닝 모델입니다. 주로 기계 번역, 텍스트 요약, 챗봇 등의 자연어 처리(NLP) 문제에서 활용됩니다. 이 모델은 RNN(Recurrent Neural Network) 기반의 인코더(Encoder)와 디코더(Decoder) 구조를 갖습니다.

1.1 Seq2Seq 모델의 구조

Seq2Seq 모델은 크게 두 부분으로 나뉩니다:

  1. 인코더(Encoder): 입력 시퀀스를 받아 이를 고정된 크기의 컨텍스트 벡터(context vector)로 변환합니다.
  2. 디코더(Decoder): 인코더의 컨텍스트 벡터를 받아서 원하는 출력 시퀀스를 생성합니다.

이 모델은 훈련 시 입력과 출력 쌍을 학습하여 변환을 수행하며, 디코더는 일반적으로 Teacher Forcing 기법을 사용하여 학습합니다.

2. Seq2Seq 모델의 동작 원리

2.1 인코더 (Encoder)

인코더는 입력 시퀀스를 처리하는 RNN 계열의 신경망입니다. 주어진 입력을 한 번에 하나씩 처리하며, 마지막 상태 벡터를 컨텍스트 벡터로 변환합니다.

2.2 컨텍스트 벡터 (Context Vector)

인코더의 마지막 은닉 상태(hidden state)는 컨텍스트 벡터라고 불리며, 입력 시퀀스의 요약 정보가 담겨 있습니다. 이 벡터는 디코더로 전달됩니다.

2.3 디코더 (Decoder)

디코더는 인코더에서 전달받은 컨텍스트 벡터를 기반으로 출력을 생성하는 역할을 합니다. 디코더는 RNN, LSTM 또는 GRU로 구성되며, 이전 출력을 다음 입력으로 사용하는 방식으로 동작합니다.

3. Seq2Seq 모델 기초 구현 (TensorFlow & Keras 사용)

아래는 TensorFlow와 Keras를 사용하여 Seq2Seq 모델을 구현하는 코드입니다. 예제에서는 간단한 문장 변환 작업을 수행합니다.

3.1 필요한 라이브러리 불러오기

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

3.2 데이터 준비

# 입력 시퀀스와 출력 시퀀스를 정의합니다.
input_texts = ["hello", "how are you", "what is your name"]
target_texts = ["안녕하세요", "잘 지내세요", "이름이 뭐예요"]

# 문자 집합 정의
input_characters = sorted(set("".join(input_texts)))
target_characters = sorted(set("".join(target_texts)))

num_encoder_tokens = len(input_characters)
num_decoder_tokens = len(target_characters)
max_encoder_seq_length = max([len(txt) for txt in input_texts])
max_decoder_seq_length = max([len(txt) for txt in target_texts])

3.3 인코더 및 디코더 모델 구축

# 인코더 모델 정의
encoder_inputs = Input(shape=(None, num_encoder_tokens))
encoder_lstm = LSTM(256, return_state=True)
encoder_outputs, state_h, state_c = encoder_lstm(encoder_inputs)
encoder_states = [state_h, state_c]

# 디코더 모델 정의
decoder_inputs = Input(shape=(None, num_decoder_tokens))
decoder_lstm = LSTM(256, return_sequences=True, return_state=True)
decoder_outputs, _, _ = decoder_lstm(decoder_inputs, initial_state=encoder_states)
decoder_dense = Dense(num_decoder_tokens, activation='softmax')
decoder_outputs = decoder_dense(decoder_outputs)

# 모델 컴파일
model = Model([encoder_inputs, decoder_inputs], decoder_outputs)
model.compile(optimizer='adam', loss='categorical_crossentropy')

3.4 모델 훈련

# 데이터 인코딩 (원핫 벡터화)
encoder_input_data = np.zeros((len(input_texts), max_encoder_seq_length, num_encoder_tokens), dtype='float32')
decoder_input_data = np.zeros((len(target_texts), max_decoder_seq_length, num_decoder_tokens), dtype='float32')
decoder_target_data = np.zeros((len(target_texts), max_decoder_seq_length, num_decoder_tokens), dtype='float32')

# 데이터를 원핫 벡터 형태로 변환
for i, (input_text, target_text) in enumerate(zip(input_texts, target_texts)):
    for t, char in enumerate(input_text):
        encoder_input_data[i, t, input_characters.index(char)] = 1.0
    for t, char in enumerate(target_text):
        decoder_input_data[i, t, target_characters.index(char)] = 1.0
        if t > 0:
            decoder_target_data[i, t - 1, target_characters.index(char)] = 1.0

# 모델 학습
model.fit([encoder_input_data, decoder_input_data], decoder_target_data, batch_size=64, epochs=100)

3.5 모델 예측

def decode_sequence(input_seq):
    states_value = encoder_model.predict(input_seq)
    target_seq = np.zeros((1, 1, num_decoder_tokens))
    target_seq[0, 0, target_characters.index('\t')] = 1.0
    stop_condition = False
    decoded_sentence = ""
    while not stop_condition:
        output_tokens, h, c = decoder_model.predict([target_seq] + states_value)
        sampled_token_index = np.argmax(output_tokens[0, -1, :])
        sampled_char = target_characters[sampled_token_index]
        decoded_sentence += sampled_char
        if sampled_char == '\n' or len(decoded_sentence) > max_decoder_seq_length:
            stop_condition = True
        target_seq = np.zeros((1, 1, num_decoder_tokens))
        target_seq[0, 0, sampled_token_index] = 1.0
        states_value = [h, c]
    return decoded_sentence

4. 정리

Seq2Seq 모델은 기계 번역, 챗봇, 텍스트 요약과 같은 자연어 처리 문제를 해결하는 데 강력한 도구입니다. 인코더와 디코더를 이용해 시퀀스 데이터를 처리하며, LSTM, GRU, Transformer 등의 기술과 결합하면 더욱 강력한 모델을 만들 수 있습니다. 본 글에서는 TensorFlow 및 Keras를 사용하여 Seq2Seq 모델을 구현하는 기본적인 방법을 소개했습니다.

반응형