Chapter 3 of 18
Why order matters and how machines can exploit it
একটি LSTM মডেল তৈরি করার আগে আপনাকে জানতে হবে এটি ঠিক কী ধরণের ডেটার জন্য ডিজাইন করা হয়েছে। আমাদের আশেপাশের সব ডেটাই কিন্তু সিকোয়েন্সিয়াল (sequential) নয় — তবে বাস্তব জগতের একটা বিশাল অংশের সমস্যা আসলে সিকোয়েন্সিয়াল। আর সিকোয়েন্সিয়াল ডেটার এমন কিছু বিশেষ বৈশিষ্ট্য আছে যার কারণে প্রথাগত বা সাধারণ মেশিন লার্নিং (ML) পদ্ধতিগুলো এমন কিছু সূক্ষ্ম উপায়ে ব্যর্থ হয় যা সহজে ধরা বা শনাক্ত করা যায় না।
সিকোয়েন্সিয়াল ডেটা (Sequential data) হলো এমন ডেটা যেখানে উপাদানগুলোর ক্রম বা সাজানোর নিয়ম (order) অত্যন্ত অর্থবহ এবং প্রতিটি উপাদানের অর্থ তার আগে কী এসেছিল তার ওপর নির্ভর করে।
ট্যাবুলার বা টেবিল আকারের ডেটাসেটের সাথে এর তুলনা করা যাক — যেমন কোনো বাড়ির দামের ডেটা, যেখানে বাড়ির আয়তন, বেডরুমের সংখ্যা এবং লোকেশন ইত্যাদি কলাম বা ফিচার রয়েছে। আপনি যদি এই টেবিলের রোগুলোকে (rows) এলোমেলো (shuffle) করে দেন, তবুও প্রতিটি রো-এর ভেতরের তথ্যের অর্থ কিন্তু একই থাকবে। এবার নিচের বাক্যটি লক্ষ্য করুন:
"The bank raised interest rates." (ব্যাংক সুদের হার বাড়িয়েছে।)
এখন এই বাক্যের শব্দগুলোকে যদি আমরা এলোমেলো করে দিই:
"Rates the bank interest raised."
এখানে ব্যবহৃত শব্দগুলো কিন্তু একদম হুবহু আগের মতোই আছে; কিন্তু এর অর্থটি হারিয়ে গেছে। দ্বিতীয় বাক্যটি পুরোপুরি অর্থহীন। সিকোয়েন্সিয়াল ডেটার ক্ষেত্রে শব্দের বা তথ্যের ক্রমটি কোনো আনুষঙ্গিক বিষয় নয় — এটিই আসলে তথ্যের মূল অংশ।
একটি ট্যাবুলার ডেটাসেট হলো কিছু কাগজের তাসের (index cards) মতো যা আপনি সহজেই উলটপালট করতে পারেন এবং তবুও প্রতিটি কার্ড আলাদাভাবে পড়তে ও বুঝতে পারেন। কিন্তু সিকোয়েন্সিয়াল ডেটাসেট হলো একটি সিনেমার মতো: ছবির ফ্রেমগুলো যদি আপনি এলোমেলো করে দেখেন, তবে তা কেবল দেখতেই অদ্ভুত লাগবে না, বরং সিনেমার পুরো গল্পটাই ধ্বংস হয়ে যাবে।
| বৈশিষ্ট্য | টাইম সিরিজ (Time Series) | ন্যাচারাল ল্যাঙ্গুয়েজ (Natural Language) |
|---|---|---|
| মানের ধরণ (Value type) | কন্টিনিউয়াস সংখ্যা (যেমন: তাপমাত্রা, দরদাম) | নির্দিষ্ট শব্দভাণ্ডার (vocabulary) থেকে নেওয়া ডিসক্রিট বা আলাদা টোকেন |
| ব্যবধান (Spacing) | সাধারণত নিয়মিত বিরতিতে (যেমন: প্রতি ঘণ্টা বা প্রতিদিন) | পরিবর্তনশীল — শব্দ, সাব-ওয়ার্ড বা ক্যারেক্টার অনুসারে |
| সাধারণ প্যাটার্ন | ট্রেন্ড বা গতিধারা, ঋতুভিত্তিক পরিবর্তন (seasonality), নয়েজ বা কোলাহল | সিনট্যাক্স (ব্যাকরণ), সিমেন্টিকস (ভাবার্থ), দীর্ঘস্থায়ী রেফারেন্স |
| রিপ্রেজেন্টেশন | raw ফ্লট বা দশমিক সংখ্যা, যা প্রায়ই নরমালাইজড থাকে | ইন্টিজার বা পূর্ণসংখ্যা → লার্নড এমবেডিং (learned embeddings) |
| উদাহরণ কাজ | পূর্বাভাস দেওয়া (forecasting), অসঙ্গতি শনাক্তকরণ (anomaly detection) | সেন্টিমেন্ট বিশ্লেষণ, অনুবাদ করা, টেক্সট জেনারেশন |
টাইম সিরিজ হলো সময়ের ক্রমানুসারে সাজানো কিছু সংখ্যার পর্যবেক্ষণ — যেমন: প্রতিদিনের তাপমাত্রা, প্রতি ঘণ্টার বিদ্যুতের চাহিদা, কিংবা প্রতি মিনিটের শেয়ার বাজারের দর। এগুলোর মধ্যে প্রায়ই ট্রেন্ড (trend) (সময়ের সাথে সাথে দীর্ঘস্থায়ী উর্ধ্বমুখী বা নিম্নমুখী প্রবণতা), সিজনালিটি (seasonality) (নির্দিষ্ট সময় পর পর ফিরে আসা চক্র — যেমন প্রতিদিন, প্রতি সপ্তাহে বা প্রতি বছর) এবং নয়েজ (noise) (হঠাৎ ঘটে যাওয়া অনাকাঙ্ক্ষিত উঠানামা যা অনুমান করা যায় না) দেখতে পাওয়া যায়। একটি LSTM মডেলকে এই নয়েজের ভিড় থেকে আসল সিগন্যালটি খুঁজে বের করতে শিখতে হয়, আর একারণেই ডেটা প্রিপারেশন (data preparation) চ্যাপ্টারটি অত্যন্ত গুরুত্বপূর্ণ।
টেক্সট বা আমাদের মুখের ভাষাও সিকোয়েন্সিয়াল, কিন্তু এটি কন্টিনিউয়াস সংখ্যার বদলে ডিসক্রিট (discrete) বা আলাদা আলাদা উপাদান নিয়ে গঠিত: এটি মূলত একটি নির্দিষ্ট শব্দভাণ্ডার (vocabulary) থেকে নেওয়া টোকেন (tokens)-এর ক্রম, কন্টিনিউয়াস স্কেলের কোনো বিন্দু নয়।
একটি সিকোয়েন্স মডেল যে ক্ষুদ্রতম অংশ বা উপাদানকে একটি একক আইটেম বা জিনিস হিসেবে প্রসেস করে, তাকেই টোকেন (token) বলে। টোকেনাইজার (tokenizer)-এর ওপর ভিত্তি করে এটি একটি পুরো শব্দ ("bank"), একটি সাব-ওয়ার্ড বা শব্দের অংশ (যেমন "bank", "ing"), কিংবা একটি একক ক্যারেক্টার বা অক্ষরও হতে পারে।
নিউরাল নেটওয়ার্ক কেবল সংখ্যার হিসাব বোঝে, শব্দের নয়। তাই raw টেক্সট থেকে এমন কিছু তৈরি করা যা একটি LSTM প্রসেস করতে পারে, তার জন্য মূলত দুটি ধাপ রয়েছে:
ইন্টিজার এনকোডিং (Integer Encoding)
প্রতিটি ইউনিক বা আলাদা টোকেনকে একটি ইউনিক ইন্টিজার বা আইডি দেওয়া। যেমন: "the" → ১, "bank" → ২, "raised" → ৩, "rates" → ৪।
এমবেডিং (Embedding)
প্রতিটি ইন্টিজার আইডিকে একটি ডেন্স লার্নড ভেক্টরে (dense learned vector) রূপান্তর করা — যা মূলত একটি হাই-ডাইমেনশনাল স্পেস বা তলের বিন্দু, যেখানে সমার্থক শব্দগুলো কাছাকাছি অবস্থান করে।
ইন্টিজার আইডিগুলো মডেলকে একটি কৃত্রিম বা ভুল গাণিতিক সম্পর্ক তৈরি করতে বাধ্য করে — যেমন মডেলটি ধরে নিতে পারে আইডি ৪ হলো আইডি ২-এর দ্বিগুণ, যা টেক্সটের ক্ষেত্রে সম্পূর্ণ অর্থহীন। তাই আইডিগুলোকে রিক্যারেন্ট লেয়ারে পাঠানোর আগে অবশ্যই এমবেডিংয়ে রূপান্তর করতে হবে। একারণেই Keras-এর টেক্সট মডেলগুলোর শুরুতে প্রায় সবসময় Embedding লেয়ারটি দেখতে পাওয়া যায়।
এমবেডিং হলো একটি ডিসক্রিট টোকেনের জন্য শেখা (learned), ডেন্স এবং ফিক্সড-দৈর্ঘ্যের ভেক্টর রিপ্রেজেন্টেশন। ট্রেনিং প্রসেসের সময় এই ভেক্টরগুলো নেটওয়ার্কের অন্য সব প্যারামিটারের সাথে সাথেই শেখা হয়, যাতে একই রকম অর্থ বা ব্যবহার সম্পন্ন টোকেনগুলো ভেক্টর স্পেসে জ্যামিতিকভাবে কাছাকাছি চলে আসে।
উদাহরণস্বরূপ, "Bank" (ব্যাংক) এবং "lender" (ঋণদাতা) শব্দ দুটির ভেক্টর কাছাকাছি অবস্থান করবে; কিন্তু "bank" এবং "banana" (কলা) শব্দ দুটির ভেক্টর অনেক দূরে চলে যাবে। এটি নেটওয়ার্কের জেনারালাইজেশন বা সাধারণীকরণে চমৎকার সাহায্য করে: নেটওয়ার্ক যদি "bank" সম্পর্কে নতুন কিছু শেখে, তবে ভেক্টর কাছাকাছি থাকার কারণে সেই জ্ঞানের কিছু অংশ স্বয়ংক্রিয়ভাবে "lender"-এর জন্যও প্রযোজ্য হয়ে যায়।
একটি দীর্ঘ সিকোয়েন্স সরাসরি ট্রেনিংয়ের উদাহরণ হিসেবে ব্যবহার করা যায় না। আমরা এটিকে একটি স্লাইডিং উইন্ডো (sliding window) ব্যবহার করে অনেকগুলো নির্দিষ্ট দৈর্ঘ্যের ছোট ছোট উদাহরণে রূপান্তর করি: দৈর্ঘ্যের একটি উইন্ডো সিকোয়েন্সের ওপর দিয়ে এক ধাপ করে স্লাইড করে যায় এবং প্রতিবার একটি (input, target) জোড়া তৈরি করে।
উদাহরণ: ধরা যাক একটি সিকোয়েন্স এবং উইন্ডো সাইজ , যেখানে আমরা পরবর্তী মানটি প্রেডিক্ট করতে চাই:
| ইনপুট উইন্ডো (Input Window) | টার্গেট (Target) |
|---|---|
| [10, 12, 13] | 15 |
| [12, 13, 15] | 14 |
| [13, 15, 14] | 16 |
এভাবেই একটি দীর্ঘ টাইম সিরিজ ডেটা থেকে LSTM-এর জন্য হাজার হাজার সুপারভাইজড ট্রেনিং উদাহরণ তৈরি করা হয় এবং একটি ট্রেন করা LSTM ইনফ্যারেন্স বা প্রেডিকশনের সময় ক্রমানুসারে একের পর এক মাল্টি-স্টেপ পূর্বাভাস দিতে পারে।
সিকোয়েন্স মডেলিং করার সময় সবচেয়ে ভালো একটি অভ্যাস হলো আপনার কাজটিকে তার ইনপুট ও আউটপুটের শেপ (shape) বা প্যাটার্ন দিয়ে ক্লাসিফাই করা:
| শেপ (Shape) | উদাহরণ | সাধারণ ব্যবহার |
|---|---|---|
| Many-to-one (অনেক থেকে এক) | একটি সম্পূর্ণ রিভিউর লেখা → একটি ইতিবাচক/নেতিবাচক লেবেল | ক্লাসিফিকেশন (Classification) |
| Many-to-many aligned (অনেক থেকে অনেক - সারিবদ্ধ) | ইনপুটের প্রতিটি শব্দের জন্য পার্ট-অফ-স্পিচ (POS) ট্যাগ | সিকোয়েন্স লেবেলিং (Sequence labeling) |
| Many-to-many unaligned (অনেক থেকে অনেক - অসাড়িবদ্ধ) | একটি বাক্যকে অন্য একটি ভাষায় অনুবাদ করা | Seq2Seq (যা অ্যাডভান্সড আর্কিটেকচার চ্যাপ্টারে আছে) |
| One-to-many (এক থেকে অনেক) | একটি ইমেজ এমবেডিং থেকে ক্যাপশন জেনারেট করা | জেনারেটিভ ডিকোডিং (Generative decoding) |
কোড এডিটর খোলার আগেই নিজের প্রবলেমের শেপটি চিনে নেওয়া আপনাকে অনেক বড় বড় ভুল ডিজাইন করা থেকে বাঁচাবে।
এই চ্যাপ্টারের সবকিছুই — টোকেনাইজেশন, এমবেডিং, স্লাইডিং উইন্ডো এবং প্রবলেম শেপ — ডেটা প্রিপারেশন এবং বিল্ডিং এলএসটিএম চ্যাপ্টারগুলোতে সরাসরি কোড আকারে আসবে। এগুলো এখন বুঝে রাখার অর্থ হলো কোড করার সময় প্রতিটি প্রি-প্রসেসিং লাইনের পেছনের আসল কারণটি আপনি নিজে থেকেই জানবেন, কেবল কপি-পেস্ট করতে হবে না।