Chapter 5 of 18
The predecessor that almost worked — and exactly why it didn't
আমরা এর আগের চ্যাপ্টারে দেখেছি যে একটি সাধারণ MLP কীভাবে ভিন্ন দৈর্ঘ্যের ও ক্রম-সংবেদনশীল (order-sensitive) সিকোয়েন্স হ্যান্ডেল করতে গিয়ে ব্যর্থ হয়। একটি রিক্যারেন্ট নিউরাল নেটওয়ার্ক (Recurrent Neural Network - RNN) এই সমস্যার সমাধান করে মাত্র একটি ছোট কাঠামোগত পরিবর্তনের মাধ্যমে: একটি লুপ বা চক্র (loop)। কিন্তু এই চ্যাপ্টারে আমরা দেখবো যে, ওই লুপটি নিজেই আরেকটি বড় ও জটিল সমস্যার জন্ম দেয় — আর ঠিক সেই সমস্যাটিই হলো LSTM আবিষ্কারের মূল কারণ।
একটি MLP তার প্রতিটি ইনপুটকে সম্পূর্ণ আলাদা বা বিচ্ছিন্নভাবে প্রসেস করে। অন্যদিকে, একটি RNN এর সাথে একটি ফিডব্যাক কানেকশন (feedback connection) বা লুপ যুক্ত করে: ইনপুট প্রসেস করার পর, এটি তার প্রাপ্ত ফলাফলকে পরবর্তী টাইম স্টেপের অতিরিক্ত ইনপুট হিসেবে সামনে পাঠিয়ে দেয়।
বিষয়টি এভাবে ভাবুন: আপনি একটি বাক্যের প্রতিটি শব্দ এক এক করে পড়ছেন এবং একই সাথে আপনার মাথায় পুরো বাক্যের একটি মানসিক সারসংক্ষেপ (mental summary) ধরে রেখেছেন। প্রতিটি নতুন শব্দ পড়ার পর, আপনি আপনার মাথায় থাকা আগের সারসংক্ষেপ এবং নতুন শব্দটিকে মিলিয়ে সেই সারসংক্ষেপটিকে আপডেট করে নিচ্ছেন। এই চলমান সারসংক্ষেপটিই — যা সংকুচিত, অপরিপূর্ণ কিন্তু সামনে বয়ে চলা — হলো RNN-এর হিডেন স্টেট (hidden state) ।
নতুনরা প্রায়ই ভুল বোঝেন যে প্রতিটি টাইম স্টেপের জন্য হয়তো আলাদা আলাদা RNN সেল থাকে। কিন্তু বাস্তবে সেখানে কেবল একটি সেল থাকে যার একটিই ওয়েট সেট থাকে, এবং সেটিই প্রতি টাইম স্টেপে বারবার ব্যবহৃত হয়। "আনরোলিং (unrolling)" হলো সময়ের সাথে সাথে এর হিসাব-নিকাশ কীভাবে হচ্ছে তা সহজে কল্পনা করার একটি উপায় মাত্র, এটি কোনো আলাদা ফিজিক্যাল লেয়ার নির্দেশ করে না।
এখানে:
গাণিতিক উদাহরণ: একটি স্কেলার RNN: , , , ; ইনপুট ।
ধাপ ১:
ধাপ ২:
লক্ষ্য করুন নির্ভর করছে -এর ওপর, যা আবার নির্ভর করছে -এর ওপর — এই চেইন বা শিকলের মতো নির্ভরশীলতাই একই সাথে RNN-এর মেমরির শক্তি এবং এর সবচেয়ে বড় দুর্বলতার উৎস।
একটি RNN-কে ট্রেন করার জন্য আমরা ম্যাথ টুলকিট চ্যাপ্টারের BPTT পদ্ধতিটিই ব্যবহার করি: পুরো সিকোয়েন্সের ওপর ফরোয়ার্ড পাস রান করা, প্রতিটি স্টেপে লস হিসাব করা, এবং এরপর পেছনের দিকে হেঁটে প্রতিটি টাইম স্টেপে শেয়ার্ড বা একই ওয়েট ম্যাট্রিক্সগুলোর ওপর জমা হওয়া গ্রেডিয়েন্ট সঞ্চয় করা।
এই চ্যাপ্টারের সবচেয়ে গুরুত্বপূর্ণ অংশ হলো ভ্যানিশিং গ্রেডিয়েন্টের গাণিতিক কারণটি বোঝা, কারণ এটিই মূলত LSTM আবিষ্কারের একমাত্র কারণ।
ধরা যাক, আমরা শেষ টাইম স্টেপ -এর হিডেন স্টেট -এর ওপর ভিত্তি করে হিসাব করা লসের গ্রেডিয়েন্টটি অনেক আগের কোনো টাইম স্টেপ -এর হিডেন স্টেট -এর সাপেক্ষে বের করতে চাই। চেইন রুল অনুযায়ী:
যেখানে প্রতিটি লোকাল গ্রেডিয়েন্ট হলো:
এবং ।
এই গুণফলের প্রতিটি চেইনে দুটি সত্য একে অপরের সাথে গুন হয়ে এক ভয়াবহ সমস্যা তৈরি করে:
১. : tanh-এর ডেরিভেটিভ কখনো ১-এর বেশি হতে পারে না, এবং -এর মান বাড়ার সাথে সাথে তা খুব দ্রুত ০-এর কাছাকাছি চলে যায়। প্র্যাকটিক্যাল ক্ষেত্রে এর মান প্রায় সবসময় ১-এর চেয়ে বেশ কম থাকে। ২. হলো একটি ফিক্সড ম্যাট্রিক্স যা প্রতি স্টেপে বারবার ব্যবহৃত হয়: এর সর্বোচ্চ "টান বা স্ট্রেচিং ফ্যাক্টর" (eigenvalue) যদি ১-এর চেয়ে কম হয়, তবে বারবার গুণ করার কারণে গ্রেডিয়েন্টটি শূন্যের দিকে চলে যায়; আর ১-এর বেশি হলে তা অসীমভাবে বাড়তে থাকে।
১-এর চেয়ে সামান্য ছোট অনেকগুলো সংখ্যাকে পর পর গুণ করলে গুণফল খুব দ্রুত জ্যামিতিক হারে কমতে থাকে। যেমন: । আবার । একটি দীর্ঘ সিকোয়েন্সের ওপর দিয়ে পেছনের দিকে যাওয়ার সময় -এর ঠিক এই দশাটিই ঘটে — দূরবর্তী টাইম স্টেপের সাথে বর্তমান লসের সংযোগকারী গ্রেডিয়েন্টটি শুকিয়ে প্রায় শূন্য হয়ে যায়। ফলে নেটওয়ার্কটি কোনোভাবেই শিখতে পারে না যে "১০০ স্টেপ আগে পড়া এই শব্দটি বর্তমান লসের জন্য অত্যন্ত গুরুত্বপূর্ণ ছিল," কারণ ট্রেনিং সিগন্যালটি পৌঁছানোর আগেই বিলীন হয়ে যায়।
সংখ্যার সাহায্যে প্রমান: ধরা যাক প্রতিটি লোকাল গ্রেডিয়েন্টের মান :
| কত স্টেপ পেছনে | গ্রেডিয়েন্টের আকার (Magnitude) |
|---|---|
| ১০ | |
| ২০ | |
| ৫০ | |
| ১০০ |
১০০ স্টেপ পেছনে যেতে যেতে গ্রেডিয়েন্ট সিগন্যাল প্রায় পুরোপুরি ভ্যানিশ বা অদৃশ্য হয়ে গেছে। সমীকরণ অনুযায়ী তাত্ত্বিকভাবে তথ্য প্রবাহিত হতে পারলেও, বাস্তবে নেটওয়ার্কটি দীর্ঘস্থায়ী মেমরির সম্পর্কগুলো শিখতে ব্যর্থ হয়।
এর ঠিক উল্টো সমস্যাটি ঘটে যখন গুণফলের ফ্যাক্টরগুলো প্রতিনিয়ত ১-এর চেয়ে বড় হতে থাকে — তখন গ্রেডিয়েন্ট এক্সপোনেনশিয়ালি বড় হয়ে যায় এবং এর ফলে ওয়েটগুলো অত্যন্ত অস্থিতিশীল ও বিশাল আপডেটের সম্মুখীন হয়। ট্রেনিংয়ের মাঝে হঠাৎ করে লস (loss) NaN হয়ে যাওয়া এই সমস্যার একটি ক্লাসিক লক্ষণ।
এর সাধারণ সমাধান হলো গ্রেডিয়েন্ট ক্লিপিং (gradient clipping): ওয়েট আপডেট করার আগে, যদি গ্রেডিয়েন্ট ভেক্টরের আকার কোনো নির্দিষ্ট থ্রেশহোল্ড অতিক্রম করে, তবে তাকে জোর করে টেনে ছোট বা স্কেল ডাউন করে দেওয়া হয়। এটি এক্সপ্লোডিং গ্রেডিয়েন্টের বিরুদ্ধে বেশ কার্যকর।
ক্লিপিং কেবল কোনো বড় গ্রেডিয়েন্টকে কেটে ছোট করতে পারে। কিন্তু যে গ্রেডিয়েন্ট আগে থেকেই শূন্যের কাছাকাছি হয়ে মরে গেছে, তাকে কিন্তু এটি জাগিয়ে তুলতে পারে না — কারণ হারিয়ে যাওয়া তথ্য পুনরুদ্ধার করার মতো কোনো ম্যাজিক ক্লিপিংয়ের কাছে নেই। ভ্যানিশিং গ্রেডিয়েন্ট সমস্যার জন্য আমাদের একটি আর্কিটেকচারাল (architectural) সমাধান দরকার, কোনো গাণিতিক জোড়াতালি নয়। আর সেই আর্কিটেকচারাল সমাধানটিই হলো LSTM-এর সবচেয়ে বড় অবদান।
ভাগফলের নিয়ম (quotient rule) ব্যবহার করে -এর ডেরিভেটিভ বের করলে আমরা পাই:
যেহেতু , তাই এর ডেরিভেটিভ — এটি কখনো ১ অতিক্রম করতে পারে না এবং -এর মান বাড়ার সাথে সাথে খুব দ্রুত ০-এর কাছাকাছি চলে যায় (যাকে স্যাচুরেশন বা saturation বলে)। প্রতি অতিরিক্ত টাইম স্টেপ নেটওয়ার্কে এমন আরেকটি ফ্যাক্টর গুণ করে। তাই সিকোয়েন্স বড় হলে ভ্যানিশিং গ্রেডিয়েন্ট হওয়া প্রায় শতভাগ নিশ্চিত, যদি না আমরা এর মৌলিক গঠনে কোনো পরিবর্তন আনি।
| সীমাবদ্ধতা | কারণ | প্রভাব | সমাধান |
|---|---|---|---|
| ভ্যানিশিং গ্রেডিয়েন্ট (Vanishing gradients) | (0,1] রেঞ্জের মানগুলোর বারবার গুণফল | দীর্ঘস্থায়ী মেমরির সম্পর্ক শিখতে পারে না | LSTM আর্কিটেকচার (পরের চ্যাপ্টার) |
| এক্সপ্লোডিং গ্রেডিয়েন্ট (Exploding gradients) | ১-এর চেয়ে বড় মানের বারবার গুণফল | অস্থিতিশীল ট্রেনিং, NaN লস | গ্রেডিয়েন্ট ক্লিপিং (Gradient clipping) |
| হিডেন স্টেটের ওপর অতিরিক্ত চাপ | হিডেন স্টেট -কে একই সাথে শর্ট-টার্ম ও লং-টার্ম দুই মেমরিরই কাজ করতে হয় | কোনো মেমরিই ঠিকঠাক কাজ করে না | LSTM-এ এবং -কে আলাদা করা |
প্রতিবার যখন আপনি কাউকে বলতে শুনবেন যে "LSTM ভ্যানিশিং গ্রেডিয়েন্ট সমস্যার সমাধান করে," তখন তারা মূলত এই চ্যাপ্টারের গাণিতিক ব্যাখ্যাটিই নির্দেশ করেন — অর্থাৎ -এর জ্যামিতিক ক্ষয়। পরবর্তী চ্যাপ্টারে আমরা দেখবো কীভাবে গেটের সাহায্যে LSTM এই দীর্ঘ গুণফলের ফাঁদ থেকে নিজেকে বাঁচায়।