Chapter 7 of 25
The XOR problem and the first AI winter
আগের চ্যাপ্টারটি বেশ দারুণ একটা জায়গায় শেষ হয়েছিল: একটি সিঙ্গেল perceptron, যাকে "চেক করো, সংশোধন করো, আবার করো" ছাড়া আর কিছুই শেখানো হয়নি, সেটিও একটি নিখুঁত বিভাজনকারী রেখা খুঁজে পেতে নিশ্চিতভাবে সক্ষম — যদি আদৌ সেরকম কোনো রেখার অস্তিত্ব থাকে। এই "যদি আদৌ থাকে" কথাটি তাড়াহুড়োয় এড়িয়ে যাওয়া খুব সহজ। কিন্তু দেখা গেল, এটিই হলো AI-এর ইতিহাসের সবচেয়ে গুরুত্বপূর্ণ একটি ফুটনোট।
১৯৬৯ সালে, Marvin Minsky এবং Seymour Papert Perceptrons নামে একটি বই প্রকাশ করেন, যা এই ফুটনোটটিকে খুব গুরুত্বের সাথে নিয়েছিল। তারা একটি তীক্ষ্ণ প্রশ্ন তুলেছিলেন: এমন কি কোনো সহজ, গুরুত্বপূর্ণ ফাংশন আছে যা একটি perceptron শিখতে পারে না, আপনি তাকে যত ডেটাই দিন বা যত সময়ই দিন না কেন? তারা এমন একটি ফাংশন পেয়েছিলেন — এবং সেটি কোনো অখ্যাত এক্সেপশনাল কেস ছিল না। এটি ছিল সেই চারটি বেসিক লজিক গেটের একটি, যা দিয়ে প্রতিটি কম্পিউটার তৈরি হয়। এই আবিষ্কারের প্রভাব এতটাই মারাত্মক ছিল যে, এর ফলে এক দশকেরও বেশি সময়ের জন্য Neural Network গবেষণার ফান্ডিং পুরোপুরি বন্ধ হয়ে যায়, যে সময়টাকে এখন প্রথম AI winter হিসেবে মনে করা হয়।
এই ঘটনাটি নিয়ে আরেকটি মজার বিদ্রূপ (irony) আছে, যা প্রায়ই বাদ পড়ে যায়: Minsky এবং Papert নিজেরাই তাদের বইয়ে স্বীকার করেছিলেন যে একাধিক লেয়ার বিশিষ্ট নেটওয়ার্ক তাত্ত্বিকভাবে XOR-এর মতো প্রবলেম সমাধান করতে পারে। তাদের আসল সমালোচনা ছিল সিঙ্গেল-লেয়ার perceptron নিয়ে, এবং সেই সময় মাল্টি-লেয়ার নেটওয়ার্ক ট্রেন করার কোনো কার্যকর অ্যালগরিদম জানা ছিল না। কিন্তু এই সূক্ষ্ম পার্থক্যটি জনপ্রিয় বিজ্ঞান লেখালেখিতে হারিয়ে যায়, আর ফলাফল হয় সামগ্রিকভাবে পুরো Neural Network গবেষণার ওপর থেকেই ফান্ডিং প্রত্যাহার। এই চ্যাপ্টারে আমরা প্রথমে ঠিক সেই মূল, সংকীর্ণ সমস্যাটি (সিঙ্গেল-লেয়ার সীমাবদ্ধতা) বুঝব, তারপর দেখব কীভাবে এই ভুল বোঝাবুঝিটি এত বড় একটি প্রভাব ফেলেছিল।
কল্পনা করুন, আপনি একটি সিকিউরিটি সিস্টেম তৈরি করছেন যা কেবল তখনই দরজা খুলবে যখন দুটি কি-কার্ডের (keycard) মধ্যে ঠিক একটি কার্ড স্ক্যান করা হবে — কখনোই শূন্যটি নয়, আবার কখনোই একসাথে দুটি নয় (একসাথে দুটি কার্ড স্ক্যান করাকে সন্দেহজনক হিসেবে ধরা হয়, কারণ এর মানে হলো কেউ হয়তো জোড় করে দুটি অনুমতি একসাথে ব্যবহার করার চেষ্টা করছে)। এটি একটি খুব ছোট, যুক্তিসঙ্গত এক্সেস-কন্ট্রোল (access-control) রুল, এবং এটিই হলো ঠিক লজিক্যাল এক্সক্লুসিভ-অর (XOR) ফাংশন।
আপনি আগের চ্যাপ্টারে AND এবং OR গেটের জন্য যে টুলটি কাজ করেছিল সেটিই হাতে তুলে নিলেন: একটি perceptron। আপনি এতে চার ধরনের কি-কার্ড কম্বিনেশন এবং তাদের সঠিক সিদ্ধান্ত (দরজা খুলবে কি না) দিয়ে দিলেন, আর লার্নিং রুলটি চালিয়ে দিলেন। কিন্তু এবার, আপনি যত সময়ই অপেক্ষা করুন না কেন, ওয়েটগুলো কখনোই স্থির হয় না। কিছু পয়েন্ট চিরকালের জন্যই ভুল থেকে যায়, আপনি তাদের যেভাবেই ধাক্কা দিন না কেন। perceptron স্রেফ এই রুলটি শিখতে অস্বীকৃতি জানায় — এবং, নিচে যেমনটা আপনি দেখতে পাবেন, এটি আপনার ট্রেনিংয়ের কোনো ভুল নয়। একটি মাত্র সরলরেখা ঠিক কতটা প্রকাশ করতে পারে, এটি হলো তার একদম চূড়ান্ত সীমা।
মনে করে দেখুন, একটি সিঙ্গেল perceptron-এর ডিসিশন বাউন্ডারি বা সিদ্ধান্ত নেওয়ার সীমানা সবসময় একটি সরলরেখা (2D বা দ্বিমাত্রিক স্পেসে) হয় — অথবা উচ্চতর ডাইমেনশনে একটি হাইপারপ্লেন হয়। এর মানে হলো, একটি সিঙ্গেল perceptron কেবল সেই প্রবলেমগুলোই সলভ করতে পারে, যেখানে আপনি একটি সোজা স্কেল দিয়ে এমন একটি দাগ টানতে পারেন, যার একপাশে সব "হ্যাঁ" পয়েন্ট এবং অন্যপাশে সব "না" পয়েন্ট থাকবে।
একটি সাধারণ গ্রিডে চারটি XOR পয়েন্ট প্লট করুন:
দুটি 1-কে দুটি 0 থেকে আলাদা করার জন্য একটি সরলরেখা টানার চেষ্টা করুন। আপনি পারবেন না — দুটি "1" পয়েন্ট স্কয়ার বা বর্গের ঠিক বিপরীত কোণায় বসে আছে, আর দুটি "0" পয়েন্টও একইভাবে উল্টো কোণায় বসে আছে, ঠিক একটি X-এর মতো। আপনি যে লাইনই টানুন না কেন, হয় একটি 0 এবং একটি 1 একই দিকে পড়বে, অথবা লাইনটি বর্গক্ষেত্রটিকে এমনভাবে ভাগ করবে যা অন্তত একটি পয়েন্টের ক্ষেত্রে ভুল হবে। এই বৈশিষ্ট্যটি — যে কোনো সরলরেখাই এই কাজটা করতে পারে না — একে বলা হয় not linearly separable (বা লিনিয়ারলি সেপারেবল নয়), এবং ঠিক এই একটা কারণেই XOR একটি perceptron-কে ভেঙে দেয়।

দুটি ক্লাস বিশিষ্ট একটি ডেটাসেটকে তখনই linearly separable বলা হয়, যদি সেখানে এমন একটি হাইপারপ্লেন (2D-তে একটি রেখা, 3D-তে একটি প্লেন বা সমতল, অথবা উচ্চতর ডাইমেনশনে এর সমতুল্য কিছু) থাকে যা এক ক্লাসের পয়েন্টগুলোকে অন্য ক্লাসের পয়েন্টগুলো থেকে নিখুঁতভাবে আলাদা করতে পারে। একটি সিঙ্গেল-লেয়ার perceptron শুধু linearly separable প্রবলেমগুলোই সলভ করতে পারে, কারণ এর ডিসিশন বাউন্ডারি জন্মগতভাবেই একটি সিঙ্গেল হাইপারপ্লেন।
লক্ষ করুন, AND এবং OR উভয়ের ক্ষেত্রেই perceptron দিব্যি কাজ করেছিল (আগের চ্যাপ্টারে দেখানো হয়েছে), কিন্তু XOR-এর ক্ষেত্রে ভেঙে পড়ে। পার্থক্যটা কোথায়? AND এবং OR-এর ক্ষেত্রে "হ্যাঁ" ক্লাসের পয়েন্টগুলো একটি নির্দিষ্ট কোণার কাছাকাছি জড়ো থাকে (AND-এর ক্ষেত্রে শুধু ওপরের-ডানের কোণা, OR-এর ক্ষেত্রে তিনটি কোণা যেগুলো একসাথে একপাশে থাকে)। কিন্তু XOR-এ "হ্যাঁ" ক্লাসের দুটি পয়েন্ট কর্ণ বরাবর (diagonally) বিপরীত কোণায় থাকে — এই বিশেষ বিন্যাসটিকেই not linearly separable বলা হয়, আর এটি perceptron-এর জন্য সবচেয়ে খারাপ সম্ভাব্য বিন্যাস। এই প্যাটার্নটি চেনা একটি গুরুত্বপূর্ণ দক্ষতা: যেকোনো নতুন প্রবলেমের ডেটা প্লট করে দেখুন, "হ্যাঁ" ক্লাসের পয়েন্টগুলো কি কোনো একটি সরল অঞ্চলে (region) জড়ো আছে, নাকি কর্ণ বরাবর ছড়িয়ে আছে?
একটি গ্রাফ দেখে "এটি আলাদা করা সম্ভব বলে মনে হচ্ছে না" বলা এক জিনিস, আর এটিকে প্রমাণ করা সম্পূর্ণ অন্য জিনিস — এবং এই প্রমাণটি Machine Learning-এর বিভিন্ন কোর্স এবং ইন্টারভিউতে সবচেয়ে বেশি জিজ্ঞেস করা একটি মৌলিক প্রশ্ন।
দাবি (Claim): এমন কোনো ওয়েট ভেক্টর এবং বায়াস নেই, যার জন্য perceptron নিখুঁতভাবে XOR ফাংশনকে ক্লাসিফাই করতে পারে।
প্রমাণ (বিরোধাভাসের মাধ্যমে / by contradiction): ধরি এমন এর অস্তিত্ব আছে। Perceptron-এর ডিসিশন রুল (, অন্যথায় ) চারটি XOR পয়েন্টের ওপর প্রয়োগ করলে আমরা চারটি অসমতা বা ইনইকুয়ালিটি (inequalities) পাই, যা একসাথে সত্য হতে হবে:
মাঝের দুটি থেকে পাই: এবং । এগুলো যোগ করলে পাই , সুতরাং । কিন্তু প্রথম অসমতা বলছে , তাই , যার মানে দাঁড়ায় । এটি সরাসরি চতুর্থ অসমতার সাথে সাংঘর্ষিক (contradicts), কারণ সেখানে বলা হয়েছে হতে হবে। সুতরাং এমন কোনো ওয়েট-এর অস্তিত্ব থাকতে পারে না।
সহজ কথায়: প্রথম তিনটি অসমতা -কে নেগেটিভ হতে বাধ্য করে, যেখানে এবং উভয়কেই অন্তত -এর সমান বা বড় (অর্থাৎ কিছুটা পজিটিভ) হতে হয়। কিন্তু এই কম্বিনেশনটি স্বয়ংক্রিয়ভাবে -কে পজিটিভ করে দেয় — যা চতুর্থ পয়েন্টের চাহিদার ঠিক উল্টো। এই চারটি শর্ত আসলে একে অপরের সাথে সাংঘর্ষিক এবং একসাথে পূরণ করা অসম্ভব।
এমনটা ভাবা খুব স্বাভাবিক যে "হয়তো এটি আরও বেশি ইপোক (epochs), আরও বেশি ডেটা, বা ছোট লার্নিং রেট দিয়ে ঠিক করা যাবে।" কিন্তু না, যাবে না। ওপরের প্রমাণটি দেখায় যে ওয়েট-এর যেকোনো সেটিং-ই হোক না কেন, তা যত চালাকি করেই বাছাই করা হোক না কেন, তা একই সাথে চারটি শর্ত পূরণ করতে পারে না। এটি হলো এর হাইপোথিসিস স্পেসের (hypothesis space) সীমাবদ্ধতা — অর্থাৎ একটি সিঙ্গেল perceptron ওয়েটের যে অবস্থায়ই থাকুক না কেন, সে সর্বোচ্চ যতগুলো ফাংশন রিপ্রেজেন্ট করতে পারে তার পুরোটাই হলো হাইপোথিসিস স্পেস — আর সেই স্পেসের মধ্যে এমন কোনো ফাংশন নেই যা XOR সলভ করতে পারে। আর্কিটেকচার বা গঠনের ভেতরেই যে সিলিং বা দেয়াল তৈরি করা আছে, তা ট্রেনিংয়ের সময় বাড়িয়ে কোনোভাবেই ভাঙা সম্ভব নয়।
"হাইপোথিসিস স্পেস" শব্দটি প্রথমবার শুনলে বেশ বিমূর্ত মনে হতে পারে, তাই এটিকে আরেকভাবে কল্পনা করা যাক। একটি সিঙ্গেল ২-ইনপুট perceptron-এর তিনটি প্যারামিটার আছে: । এই তিনটি সংখ্যার প্রতিটি সম্ভাব্য কম্বিনেশন একটি নির্দিষ্ট সরলরেখা তৈরি করে। তাই perceptron-এর হাইপোথিসিস স্পেস আসলে "সব সম্ভাব্য সরলরেখার সেট" — এই স্পেসে যত ইচ্ছা খুঁজলেও, তার মধ্যে এমন কোনো রেখা কখনোই পাওয়া যাবে না যা XOR-কে আলাদা করে, ঠিক যেমন একটি দোকানে যত ইচ্ছা খুঁজলেও যদি সেখানে কমলা রঙের জুতাই না থাকে, তবে আপনি কখনোই কমলা রঙের জুতা কিনতে পারবেন না। প্রবলেমটা আপনার খোঁজার পদ্ধতিতে না, বরং দোকানের স্টকে (এখানে, আর্কিটেকচারে)।
যে আইডিয়াটি সবকিছুকে রক্ষা করেছিল, এবং যে কারণে এই কোর্সের বাকি অংশটুকু অস্তিত্ব পেয়েছে তা হলো: যদিও XOR নিজে লিনিয়ারলি সেপারেবল নয়, এটিকে এমন দুটি ফাংশন জোড়া লাগিয়ে (combining) তৈরি করা সম্ভব, যাদের প্রত্যেকেই আলাদাভাবে লিনিয়ারলি সেপারেবল।
খেয়াল করুন:
OR এবং NAND উভয়েই পুরোপুরি লিনিয়ারলি সেপারেবল — একটি সিঙ্গেল perceptron নিজে নিজেই এর যেকোনোটি শিখতে পারে। তাই পরিকল্পনাটি হলো: দুটি আলাদা perceptron (যারা একটি "হিডেন" বা লুকায়িত লেয়ার তৈরি করে) ব্যবহার করে একসাথে OR এবং NAND ক্যালকুলেট করুন, তারপর তাদের দুটি আউটপুটকে তৃতীয় একটি perceptron-এ দিন যা AND ক্যালকুলেট করবে। ওই তৃতীয় perceptron-টি কখনোই সরাসরি raw ইনপুটগুলো (raw inputs) দেখে না — সে শুধু আগে থেকে আংশিক প্রসেস করা দুটি সিগন্যাল দেখে, আর ওই দুটিকে একসাথে মেলানো খুব সহজ একটি লিনিয়ারলি সেপারেবল কাজ।
ইনপুট (Input)
raw ইনপুট x1 এবং x2-কে একসাথে দুটি আলাদা perceptron-এ পাঠানো হয়।
হিডেন লেয়ার (Hidden layer)
একটি perceptron OR(x1, x2) ক্যালকুলেট করে; অন্যটি NAND(x1, x2) ক্যালকুলেট করে। দুটোই লিনিয়ারলি সেপারেবল, তাই দুটোই নিখুঁতভাবে ট্রেন হয়।
আউটপুট লেয়ার (Output layer)
তৃতীয় একটি perceptron হিডেন লেয়ারের দুটি আউটপুট থেকে AND ক্যালকুলেট করে।
ফলাফল (Result)
AND(OR(x1,x2), NAND(x1,x2)) হলো চারটি ইনপুট কম্বিনেশনের প্রতিটির জন্যই হুবহু XOR(x1,x2)।
OR-এর জন্য ওয়েট , NAND-এর জন্য ওয়েট , এবং আউটপুট AND নিউরনের জন্য ওয়েট ব্যবহার করে (স্টেপ অ্যাক্টিভেশন, তে থ্রেশহোল্ড) নিজেই হাতে-কলমে চারটি XOR ইনপুট কম্বিনেশন মিলিয়ে দেখুন। আপনি দেখতে পাবেন যে এই তিন-perceptron-এর নেটওয়ার্কটি হুবহু XOR ট্রুথ টেবিলের সাথে মিলে যায় — যা কোনো সিঙ্গেল perceptron কখনোই করতে পারত না।
এটিই হলো Multi-Layer Perceptron-এর জন্মবীজ: লেয়ারের পর লেয়ার সহজ ও লিনিয়ারলি-সেপারেবল বিল্ডিং ব্লকগুলোকে সাজান, আর সেগুলোর সম্মিলিত রূপ একটি সিঙ্গেল লেয়ারের চেয়ে অনেক বেশি জটিল ও নন-লিনিয়ার বাউন্ডারি রিপ্রেজেন্ট করতে পারবে। পরের চ্যাপ্টারটি একেই Multi-Layer Perceptron হিসেবে ফরমালাইজ বা সংজ্ঞায়িত করে এবং এমন কিছু তাত্ত্বিক ফলাফল সামনে আনে যা বলে দেয় এই স্ট্যাকিং (stacking) বা লেয়ার সাজানো ঠিক কতটা শক্তিশালী হতে পারে।
XOR হলো সবচেয়ে বড় সমস্যা, কিন্তু perceptron-এর দুর্বলতা শুধু এখানেই শেষ নয়:
শুধু কঠোর, বাইনারি সিদ্ধান্ত
স্টেপ অ্যাক্টিভেশন ফাংশন একটি রূঢ় 0 বা 1 আউটপুট দেয়, এতে কনফিডেন্স (confidence) বা আত্মবিশ্বাসের কোনো ব্যাপার নেই। এটি z=0 তে নন-ডিফারেনশিয়েবল (non-differentiable) এবং অন্য সব জায়গায় এর গ্রেডিয়েন্ট শূন্য (zero gradient) — যা আরও গভীর নেটওয়ার্ক ট্রেন করার জন্য প্রয়োজনীয় গ্রেডিয়েন্ট-ভিত্তিক ট্রেনিংয়ের ক্ষেত্রে একেবারেই অকেজো।
ফিচার ইন্টারঅ্যাকশন নেই
একটি সিঙ্গেল লিনিয়ার ইউনিট এমন কোনো ফাংশনকে রিপ্রেজেন্ট করতে পারে না যার জন্য কার্ভড (curved) বা নন-কনভেক্স (non-convex) ডিসিশন বাউন্ডারির প্রয়োজন হয় — XOR হলো এর সবচেয়ে সহজ উদাহরণ, তবে একটি ইনপুটের প্রভাব যখন অন্য ইনপুটের মানের ওপর নির্ভর করে, এমন যেকোনো প্রবলেমের জন্যই এটি প্রযোজ্য।
বাউন্ডারির কাছাকাছি সংবেদনশীলতা
যেহেতু বাউন্ডারিটি একটি শক্ত ও স্থির হাইপারপ্লেন, তাই যেসব পয়েন্ট এর খুব কাছাকাছি পড়ে, তারা সামান্য ইনপুট নয়েজের (noise) প্রতি খুবই সংবেদনশীল হয় — ইনপুটে খুব সামান্য একটু পরিবর্তনও প্রেডিকশন উল্টে দিতে পারে।
যদি আপনার perceptron-এর এরর কনভার্জ করার বদলে অনন্তকাল ধরে দুলতে থাকে, তবে মানুষের স্বভাবই হলো আরও বেশি ইপোক যোগ করা বা লার্নিং রেট কমানো-বাড়ানো। কিন্তু XOR-এর মতো নন-লিনিয়ারলি-সেপারেবল প্রবলেমের ক্ষেত্রে, এটি কখনোই কোনো কাজে আসে না — এটি টিউনিংয়ের সমস্যা বলে ধরে নেওয়ার আগে, ক্লাসগুলো আদৌ লিনিয়ারলি সেপারেবল কি না তা পরীক্ষা করে দেখুন।
XOR-এর সমাধান একটি সিঙ্গেল-লেয়ার perceptron-কে আরও চওড়া করা নয় — একটি লিনিয়ার লেয়ার যত বড়ই হোক না কেন, তা সবসময় একটি মাত্র সরল রেখাই কাটতে পারবে। আসল পরিবর্তনটা তখনই আসে যখন আউটপুটের আগে একটি হিডেন লেয়ার বসানো হয়, যাতে তাদের মধ্যে নন-লিনিয়ারিটি তৈরি হয়, যা পরের চ্যাপ্টারে দেখানো হয়েছে।
XOR শিখতে না পারা মানে এই নয় যে perceptron মূল্যহীন ছিল। AND, OR, NOT, এবং অসংখ্য বাস্তব-দুনিয়ার linearly-separable প্রবলেমের জন্য (যেমন সহজ স্প্যাম ফিল্টার বা ক্রেডিট স্কোরিং) perceptron এখনো একটি সম্পূর্ণ যুক্তিসঙ্গত এবং কার্যকরী মডেল। সমস্যাটা perceptron-কে ভুল কাজে ব্যবহার করা নিয়ে নয় — সমস্যাটা এই ধারণা নিয়ে যে এটি সবকিছু শিখতে পারবে।
আজকের আধুনিক প্রতিটি Neural Network — ছোট একটি ট্যাবুলার ক্লাসিফায়ার থেকে শুরু করে বড় একটি ল্যাঙ্গুয়েজ মডেল পর্যন্ত — সবকিছুই টিকে আছে ঠিক এই চ্যাপ্টারের মূল আইডিয়াটির ওপর ভর করে: লেয়ারের পর লেয়ার সহজ ও লিনিয়ারলি-সেপারেবল ইউনিটগুলোকে সাজালে তা এমন সব ফাংশন রিপ্রেজেন্ট করতে পারে যা কোনো সিঙ্গেল লেয়ার কখনোই পারত না। পরের চ্যাপ্টারটি একেই Multi-Layer Perceptron হিসেবে ফরমালাইজ বা সংজ্ঞায়িত করে এবং এমন কিছু তাত্ত্বিক ফলাফল সামনে আনে যা বলে দেয় এই স্ট্যাকিং (stacking) বা লেয়ার সাজানো ঠিক কতটা শক্তিশালী হতে পারে।