Every equation, derived step by step with worked numerical examples
28 min read
Created ৫ আগ, ২০২৬
ভূমিকা (Motivation)
আমরা এর আগের চ্যাপ্টারে LSTM-এর প্রতিটি সমীকরণ বা সূত্রকে স্কেলার (scalars) দিয়ে শিখেছিলাম যাতে আপনি খাতা-কলমে প্রতিটি মান হিসাব করে দেখতে পারেন। কিন্তু বাস্তব জীবনের LSTM লেয়ারগুলো প্রতিটি টাইম স্টেপে ভেক্টর (vectors) নিয়ে কাজ করে। এই চ্যাপ্টারে আমরা একই ছয়টি সমীকরণকে পূর্ণ ভেক্টর ও ম্যাট্রিক্স আকারে নতুন করে দেখবো, প্রতিটি টেনসরের ডাইমেনশন বা শেপ অত্যন্ত নিখুঁতভাবে ট্র্যাক করবো, মোট লার্নেবল প্যারামিটারের (learnable parameters) সংখ্যা হিসাব করবো এবং ব্যাকওয়ার্ড পাস (backward pass) কীভাবে কাজ করে তা বের করবো। সাধারণত অধিকাংশ পাঠ্যপুস্তকে এই ব্যাকওয়ার্ড পাসের অংশটি এড়িয়ে যাওয়া হয়, অথচ এটিই সবচেয়ে স্পষ্টভাবে বুঝিয়ে দেয় যে কেন LSTM-কে ঠিক এভাবে ডিজাইন করা হয়েছিল।
নোটেশন এবং ডাইমেনশন (Notation and Dimensions)
যেকোনো LSTM লেয়ারের গঠন দুটি সংখ্যার ওপর ভিত্তি করে নির্ধারিত হয়:
nh — হিডেন স্টেট ht এবং সেল স্টেট Ct-এর সাইজ বা ডাইমেনশন (এটি একটি হাইপারপ্যারামিটার যা আপনি নিজে চুজ করেন, একে প্রায়ই "LSTM units"-এর সংখ্যা বলা হয়)
প্রতিটি রাশিরই একটি সুনির্দিষ্ট শেপ বা আকৃতি রয়েছে:
প্রতিটি LSTM রাশির শেপ বা সাইজ (* দিয়ে f, i, c, অথবা o বোঝায় — প্রতিটি গেটের জন্য আলাদা ওয়েট ও বায়াস থাকে)
রাশি
প্রতীক
শেপ (Shape)
অর্থ
ইনপুট (Input)
xₜ
(nₓ,)
t সময়ে ইনপুট ভেক্টর
হিডেন স্টেট
hₜ
(n_h,)
শর্ট-টার্ম স্টেট
সেল স্টেট
Cₜ
(n_h,)
লং-টার্ম স্টেট
ইনপুট ওয়েট
W_*
(n_h, nₓ)
xₜ থেকে গেটের প্রি-অ্যাক্টিভেশনে ম্যাপিং করে
রিক্যারেন্ট ওয়েট
U_*
(n_h, n_h)
h_{t-1} থেকে গেটের প্রি-অ্যাক্টিভেশনে ম্যাপিং করে
বায়াস (Bias)
b_*
(n_h,)
প্রতিটি গেটের নিজস্ব বায়াস
শেপের অমিল হওয়া LSTM ইমপ্লিমেন্টেশনের সবচেয়ে সাধারণ বাগ (Bug)
সবসময় চেক করে নিশ্চিত করুন: W∗xt-এর আউটপুট শেপ অবশ্যই (nh,) হতে হবে। যেহেতু xt-এর শেপ (nx,), তাই W∗-এর শেপ অবশ্যই (nh,nx) হতে হবে। অনেক ইমপ্লিমেন্টেশনে W∗ এবং U∗-কে একসাথে জুড়ে দিয়ে (nh,nx+nh) শেপের একটি একক ম্যাট্রিক্স তৈরি করা হয় এবং xt ও ht−1-কে একসাথে জুড়ে দিয়ে (nx+nh,) শেপের একটি একক ভেক্টর বানানো হয় — যাতে দুটি ম্যাট্রিক্স গুণের বদলে একটি গুনেই কাজ চলে যায়। গাণিতিকভাবে দুটি পদ্ধতি সম্পূর্ণ এক হলেও, একটি সামান্য ট্রান্সপজিশন ভুল (transposition error) নীরবে আপনার শেপ এলোমেলো করে দিতে পারে।
পূর্ণ ভেক্টরাইজড সমীকরণসমূহ (The Full Vectorized Equations)
আগের চ্যাপ্টারের ছয়টি LSTM সমীকরণকে এখন পূর্ণ ভেক্টর আকারে নিচে দেখানো হলো (এখানে প্রতিটি সিগময়েড σ এবং tanh ভেক্টরের প্রতিটি উপাদানের ওপর আলাদাভাবে বা element-wise প্রয়োগ করা হয়):
এখানে প্রতিটি ⊙ চিহ্ন (nh,) শেপের দুটি ভেক্টরের মধ্যে এলিমেন্ট-ওয়াইজ বা উপাদান-ভিত্তিক গুণ নির্দেশ করে।
প্যারামিটারের সংখ্যা হিসাব করা (Parameter Count)
চারটি গেটের প্রতিটিরই নিজস্ব W∗ (nh×nx টি প্যারামিটার), U∗ (nh×nh টি প্যারামিটার) এবং b∗ (nh টি প্যারামিটার) রয়েছে।
LSTM প্যারামিটার সংখ্যা
Total parameters=4×(nhnx+nh2+nh)=4nh(nx+nh+1)
গাণিতিক উদাহরণ: ধরা যাক nx=50 (৫০-ডাইমেনশনের ওয়ার্ড এমবেডিং) এবং nh=100 (১০০টি LSTM ইউনিট বা হিডেন সাইজ):
4×100×(50+100+1)=400×151=60400টিপ্যারামিটার
এই ডাইমেনশনগুলো দিয়ে Keras-এ একটি LSTM লেয়ার তৈরি করে model.summary() কল করলে ঠিক এই সংখ্যাটিই দেখতে পাওয়া যায়।
কেন n_h দুবার গুণ আকারে আসছে?
এখানে nh2 অংশটি এসেছে রিক্যারেন্ট ওয়েট U∗ থেকে, যা আগের হিডেন স্টেটকে (যার সাইজ nh) গেটের প্রি-অ্যাক্টিভেশনে (যার সাইজও nh) ম্যাপিং করে — অর্থাৎ এটি একটি বর্গাকার বা স্কয়ার ম্যাট্রিক্স। হিডেন সাইজ বেশি বড় হলে এই nh2 অংশটিই পুরো প্যারামিটারের সিংহভাগ দখল করে নেয়। যেমন, হিডেন সাইজ ৫১২ হলে কেবল রিক্যারেন্ট ওয়েটেই 4×512×(512+1)=1050624 টি প্যারামিটার থাকবে — যেখানে ইনপুট বা আউটপুট লেয়ারের প্যারামিটার এখনো যোগ করা হয়নি!
হাত-কলমে ভেক্টর ফরোয়ার্ড পাস
ধরা যাক nx=2, nh=2। সহজে হিসাব করার জন্য আমরা ডায়াগোনাল বা কর্ণ ওয়েট ম্যাট্রিক্স ব্যবহার করছি:
NumPy ব্যবহার করে এই ভেক্টরাইজড হিসাবটি করলে ২৫৬ বা ৫১২ সাইজের হিডেন স্টেটের জন্যও মাইক্রোসেকেন্ডে রান হয়ে যায় — কারণ এতে কেবল ৪টি ম্যাট্রিক্স গুণন এবং ৬টি এলিমেন্ট-ওয়াইজ অপারেশন জড়িত।
ব্যাকওয়ার্ড পাস (The Backward Pass): গ্রেডিয়েন্টের প্রবাহ
LSTM-এর ব্যাকওয়ার্ড পাসে মূলত BPTT ব্যবহৃত হয়, যা প্রতিটি টাইম স্টেপের গেটগুলোর মধ্য দিয়ে উল্টো দিকে গ্রেডিয়েন্ট প্রবাহিত করে।
প্রতিটি টাইম স্টেপ t-তে, উপর থেকে আসা গ্রেডিয়েন্ট ∂ht∂L-এর সাপেক্ষে গ্রেডিয়েন্টের প্রবাহ নিচে দেখানো হলো:
প্রতিটি গেট যেহেতু σ(Z_gate) আকারের, তাই ∂L/∂z_gate = (∂L/∂gate) ⊙ σ'(z_gate)। এরপর ওয়েটের গ্রেডিয়েন্ট: ∂L/∂W = ∂L/∂z_gate · concat[xₜ, h_{t-1}]ᵀ এবং ইনপুটের ওপর আসা গ্রেডিয়েন্ট: ∂L/∂concat = Wᵀ · ∂L/∂z_gate।
4
৪. আগের হিডেন স্টেট h_{t-1} এবং xₜ-তে ফেরত যাওয়া
সংযুক্ত ভেক্টর [xₜ, h_{t-1}]-এর ওপর প্রাপ্ত গ্রেডিয়েন্টটিকে ভাগ করা হয়: প্রথম nₓ অংশ যায় xₜ-তে (যা মাল্টি-লেয়ার LSTM-এর জন্য লাগে), এবং শেষ n_h অংশ যায় h_{t-1}-এ — যা পরবর্তী টাইম স্টেপ t+1 থেকে আসা গ্রেডিয়েন্টের সাথে যোগ হয়।
সেল-স্টেটের গ্রেডিয়েন্ট পথই আসল ম্যাজিক
সময়ের পেছনে বয়ে চলা সেল স্টেটের গ্রেডিয়েন্ট — ∂Ct−1∂L=∂Ct∂L⊙ft — এখানে কিন্তু কোনো ওয়েট ম্যাট্রিক্সের গুণ কিংবা tanh-এর ডেরিভেটিভের গুণ নেই, কেবল উপাদান-ভিত্তিক ফরগেট গেটের গুণ। এটিই হলো আমাদের 'constant error carousel': যতদিন fₜ ≈ ১ থাকবে, গ্রেডিয়েন্ট কোনো বাধা ছাড়াই একদম অক্ষত অবস্থায় সময়ের পেছনে প্রবাহিত হতে পারবে।
মূল বিষয়গুলো (Key Takeaways)
Key Takeaways
LSTM শেপ: xₜ হলো (nₓ,), hₜ এবং Cₜ হলো (n_h,), ওয়েট ম্যাট্রিক্স W_* হলো (n_h, nₓ), রিক্যারেন্ট ম্যাট্রিক্স U_* হলো (n_h, n_h)।
সমীকরণগুলোর প্রতিটি σ এবং tanh এলিমেন্ট-ওয়াইজ বা উপাদান-ভিত্তিক প্রয়োগ করা হয়; ⊙ হলো উপাদান-ভিত্তিক গুণফল।
মোট প্যারামিটার সংখ্যা: 4n_h(nₓ + n_h + 1) — চারটি গেটের জন্য পৃথক ওয়েট ও বায়াস।
ব্যাকওয়ার্ড পাসে, সেল-স্টেটের পেছনের গ্রেডিয়েন্ট ∂L/∂Ct−1=∂L/∂Ct⊙ft — যা কেবল উপাদান-ভিত্তিক গুণফল, কোনো ওয়েট ম্যাট্রিক্সের জটিলতা নেই — যার কারণে গ্রেডিয়েন্ট দীর্ঘ সিকোয়েন্সেও টিকে থাকে।
ইন্টারভিউ কর্নার (Interview Corner)
Quick Check
বাস্তব প্র্যাকটিসে এর ভূমিকা
মডেলের প্যারামিটার সংখ্যার এই সমীকরণটিই মূলত Keras এবং PyTorch তাদের মডেল সামারিতে দেখায়। আর কোডের ভেতরের assert স্টেটমেন্টগুলো এই শেপের নিয়মের ওপর ভিত্তি করেই তৈরি করা হয়। যখন আপনি loss.backward() কল করেন, ব্যাকগ্রাউন্ডে অটোমেটিক ডিফারেনশিয়েশন ফ্রেমওয়ার্কগুলো এই ব্যাকওয়ার্ড পাসের সমীকরণগুলোই রান করে। এই বিষয়গুলো জানা থাকলে আপনি সহজেই শেপের ভুলগুলো ঠিক করতে পারবেন, কতটুকু মেমরি লাগবে তা অনুমান করতে পারবেন এবং আপনার মডেল কেন শিখছে না তা বুঝতে পারবেন।