Sequence-to-Sequence (Seq2Seq) মডেল হল একটি ধরনের নিউরাল নেটওয়ার্ক আর্কিটেকচার যা একটি ইনপুট সিকোয়েন্স থেকে আউটপুট সিকোয়েন্স প্রেডিক্ট করতে ব্যবহৃত হয়। এটি মূলত Recurrent Neural Networks (RNNs) অথবা তাদের উন্নত সংস্করণ যেমন Long Short-Term Memory (LSTM) বা Gated Recurrent Units (GRU) ব্যবহার করে তৈরি করা হয়।
Seq2Seq মডেল মূলত Machine Translation, Speech Recognition, Text Summarization, এবং Time Series Prediction এর মতো কাজগুলোতে ব্যবহৃত হয়, যেখানে ইনপুট এবং আউটপুট উভয়ই একটি সিকোয়েন্স হিসেবে থাকে।
Sequence-to-Sequence মডেলের মূল ধারণা:
- Encoder: এটি ইনপুট সিকোয়েন্সকে প্রসেস করে এবং একটি স্ন্যাপশট তৈরি করে (একটি সেকেন্ডারি ভেক্টর বা hidden state)।
- Decoder: এটি এই স্ন্যাপশট বা hidden state থেকে আউটপুট সিকোয়েন্স তৈরি করে।
এটা মূলত দুটি অংশে বিভক্ত: Encoder এবং Decoder, যেখানে Encoder ইনপুট সিকোয়েন্সকে ক্যাপচার করে এবং Decoder এর মাধ্যমে সঠিক আউটপুট সিকোয়েন্স তৈরি হয়।
Sequence-to-Sequence মডেল কিভাবে কাজ করে:
- Encoder: প্রথমে ইনপুট সিকোয়েন্স (যেমন: একটি বাক্য) RNN, LSTM বা GRU দিয়ে প্রসেস করা হয়। এটি ইনপুট সিকোয়েন্সের সমস্ত ইনফরমেশন স্টোর করে একটি স্ন্যাপশট তৈরি করে (hidden state)।
- Decoder: Decoder অংশ এই hidden state বা স্ন্যাপশট ব্যবহার করে আউটপুট সিকোয়েন্স (যেমন: অন্য ভাষায় অনুবাদ) তৈরি করে।
- Training Process: Seq2Seq মডেলটি প্রশিক্ষণের সময় ইনপুট সিকোয়েন্স থেকে আউটপুট সিকোয়েন্সের মধ্যে সম্পর্ক শিখে এবং তারপরে নতুন ইনপুট সিকোয়েন্সের জন্য প্রেডিকশন করতে সক্ষম হয়।
Keras তে Seq2Seq মডেল ব্যবহার করে Prediction
এখানে আমরা একটি সাধারণ Seq2Seq মডেল তৈরি করার উদাহরণ দেখব, যেখানে ইনপুট সিকোয়েন্স একটি বাক্য হবে এবং আউটপুট সিকোয়েন্স হবে সেই বাক্যের অন্য ভাষায় অনুবাদ।
১. মডেল তৈরি এবং ডেটা প্রিপ্রসেসিং
প্রথমে আমরা Keras লাইব্রেরি এবং প্রয়োজনীয় মডিউলগুলো ইনস্টল করব এবং একটি Seq2Seq মডেল তৈরি করব।
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Input, LSTM, Dense
import numpy as np
# ইনপুট এবং আউটপুট সিকোয়েন্সের দৈর্ঘ্য
input_texts = ['Hello', 'How are you?', 'Good morning']
output_texts = ['Hola', '¿Cómo estás?', 'Buenos días']
# ইনপুট এবং আউটপুট সিকোয়েন্সের অক্ষরের সেট তৈরি করা
input_chars = sorted(set(''.join(input_texts)))
output_chars = sorted(set(''.join(output_texts)))
# অক্ষরের জন্য ইনডেক্স তৈরি করা
input_token_index = {char: i for i, char in enumerate(input_chars)}
output_token_index = {char: i for i, char in enumerate(output_chars)}
reverse_input_char_index = {i: char for char, i in input_token_index.items()}
reverse_output_char_index = {i: char for char, i in output_token_index.items()}
# ইনপুট এবং আউটপুট সিকোয়েন্সে প্যাডিং
max_input_len = max([len(txt) for txt in input_texts])
max_output_len = max([len(txt) for txt in output_texts])
encoder_input_data = np.zeros((len(input_texts), max_input_len, len(input_chars)), dtype='float32')
decoder_input_data = np.zeros((len(output_texts), max_output_len, len(output_chars)), dtype='float32')
decoder_target_data = np.zeros((len(output_texts), max_output_len, len(output_chars)), dtype='float32')
# ইনপুট এবং আউটপুট সিকোয়েন্সকে one-hot encode করা
for i, (input_text, output_text) in enumerate(zip(input_texts, output_texts)):
for t, char in enumerate(input_text):
encoder_input_data[i, t, input_token_index[char]] = 1.
for t, char in enumerate(output_text):
decoder_input_data[i, t, output_token_index[char]] = 1.
if t > 0:
decoder_target_data[i, t - 1, output_token_index[char]] = 1.
২. Seq2Seq মডেল তৈরি
এখন আমরা একটি Seq2Seq মডেল তৈরি করব, যেখানে দুটি LSTM লেয়ার থাকবে—একটি Encoder এবং একটি Decoder।
# Encoder অংশ
encoder_inputs = Input(shape=(None, len(input_chars)))
encoder = LSTM(256, return_state=True)
encoder_outputs, state_h, state_c = encoder(encoder_inputs)
encoder_states = [state_h, state_c]
# Decoder অংশ
decoder_inputs = Input(shape=(None, len(output_chars)))
decoder_lstm = LSTM(256, return_sequences=True, return_state=True)
decoder_outputs, _, _ = decoder_lstm(decoder_inputs, initial_state=encoder_states)
decoder_dense = Dense(len(output_chars), activation='softmax')
decoder_outputs = decoder_dense(decoder_outputs)
# মডেল তৈরি
model = Model([encoder_inputs, decoder_inputs], decoder_outputs)
# মডেল কম্পাইল করা
model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])
# মডেল প্রশিক্ষণ
model.fit([encoder_input_data, decoder_input_data], decoder_target_data, batch_size=64, epochs=100, validation_split=0.2)
এখানে:
- Encoder অংশ
LSTMলেয়ার দ্বারা ইনপুট সিকোয়েন্সের ফিচারগুলি শিখে একটি hidden state তৈরি করছে। - Decoder অংশ
LSTMলেয়ার দ্বারা hidden state ব্যবহার করে আউটপুট সিকোয়েন্স তৈরি করছে। - Dense লেয়ারটি আউটপুট সিকোয়েন্সের প্রতিটি সময়ের জন্য softmax অ্যাক্টিভেশন ফাংশন ব্যবহার করে আউটপুট প্রেডিকশন দেয়।
৩. Prediction এর জন্য Decoder তৈরি করা
আমরা প্রশিক্ষণের পরে মডেলটিকে prediction এর জন্য প্রস্তুত করতে পারি। Decoder এর জন্য একটি নতুন মডেল তৈরি করতে হবে যা প্রেডিকশন করবে।
# Decoder prediction এর জন্য মডেল তৈরি করা
decoder_state_input_h = Input(shape=(256,))
decoder_state_input_c = Input(shape=(256,))
decoder_states_inputs = [decoder_state_input_h, decoder_state_input_c]
decoder_lstm2 = LSTM(256, return_sequences=True, return_state=True)
decoder_outputs2, state_h2, state_c2 = decoder_lstm2(decoder_inputs, initial_state=decoder_states_inputs)
decoder_states = [state_h2, state_c2]
decoder_outputs2 = decoder_dense(decoder_outputs2)
decoder_model = Model([decoder_inputs] + decoder_states_inputs, [decoder_outputs2] + decoder_states)
৪. Prediction চালানো
এখন আমরা একটি ইনপুট সিকোয়েন্স দিয়ে আউটপুট সিকোয়েন্স (অর্থাৎ অনুবাদ) প্রেডিক্ট করতে পারব।
def decode_sequence(input_seq):
states_value = encoder.predict(input_seq)
target_seq = np.zeros((1, 1, len(output_chars)))
target_seq[0, 0, output_token_index['\t']] = 1.
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 = reverse_output_char_index[sampled_token_index]
decoded_sentence += sampled_char
if sampled_char == '\n' or len(decoded_sentence) > max_output_len:
stop_condition = True
target_seq = np.zeros((1, 1, len(output_chars)))
target_seq[0, 0, sampled_token_index] = 1.
states_value = [h, c]
return decoded_sentence
# Prediction চালানো
input_seq = encoder_input_data[0:1] # প্রথম ইনপুট সিকোয়েন্স
decoded_sentence = decode_sequence(input_seq)
print(f"Decoded sentence: {decoded_sentence}")
এখানে:
- decode_sequence ফাংশনটি ইনপুট সিকোয়েন্সের জন্য একটি আউটপুট সিকোয়েন্স প্রেডিক্ট করে।
- প্রতিটি সময় টোকেনের জন্য প্রেডিকশন করা হয় এবং অনুবাদটি তৈরি করা হয়।
সারাংশ
Sequence-to-Sequence (Seq2Seq) মডেল হল একটি শক্তিশালী আর্কিট
েকচার যা ইনপুট সিকোয়েন্স থেকে আউটপুট সিকোয়েন্স প্রেডিক্ট করতে ব্যবহৃত হয়। Keras-এ LSTM বা GRU লেয়ার দিয়ে Seq2Seq মডেল তৈরি করা যায়, যেখানে Encoder এবং Decoder অংশ ইনপুট ও আউটপুট সিকোয়েন্সের মধ্যকার সম্পর্ক শিখে। মডেলটি Machine Translation, Speech Recognition, Text Summarization, Time Series Prediction ইত্যাদি সমস্যার জন্য ব্যবহৃত হতে পারে।
Read more