কম্পিউটার কিভাবে শেখে? – নিউরাল নেটওয়ার্ক

শুনতে একটু অবাক লাগার কথা যে মেশিন নিজে নিজে শিখে নিচ্ছে। আসলেও কি মেশিন শিখছে? এর জন্য জানতে হবে শেখা শব্দটার পেছনে কি হচ্ছে। কোন নিউরাল নেটওয়ার্ককে শেখানোর পদ্ধতিকে ট্রেইন বলা হয়। মডেলকে পর্যাপ্ত পরিমাণ ডেটা দিয়ে ট্রেইন করতে হয়। আর ট্রেইনের জন্য প্রতিটা ডেটাই ক্লাস/লেবেল এর নামসহ দিতে হবে।

চলুন একটা নেটওয়ার্কের গঠন আবার দেখে নেই।

উপরের চিত্রে বোঝার সুবিদ্বার্থে শুধুমাত্র একটি নিউরনের কানেকশন দেখানো হয়েছে। আপনাদের অবশ্যই মনে আছে যে প্রতিটা কানেকশন/পথে একটি করে weight দেয়া আছে(w1,w2,w3)। এই weight গুলো ফিক্সড না। একটি নিউরাল নেটওয়ার্ক মডেলকে শেখানো মানে এই weight গুলোকে অপটাইমাইজ করা। হ্যা, ঠিক ধরেছেন। এটাকে আপনি অপটিমাইজেশন প্রব্লেমও বলতে পারেন। কিন্তু কিভাবে অপটিমাইজ হবে এই weights গুলো, এটা নিতান্তই নির্ভর করে অপটিমাইজেশন ফাংশনের উপর। বেশ কিছু ধরনের অপটিমাইজেশন ফাংশন আছে। আপনি ইচ্ছামতো মডেলের সুবিদ্বার্থে যেটা ইচ্ছা ব্যবহার করতে পারেন।

আমরা বুঝলাম যে weights গুলো অপটিমাইজ করতে হবে। কিন্তু কিসের জন্য? আমাদের গোল কি? এখন আসে নতুন আরেকটা টার্মঃ loss function। লস ফাংশন আবার কি? চলুন একটা উদাহরণের সাথে বোঝার চেষ্টা করি।

ধরুন আপনি বিড়াল এবং কুকুরকে চেনার জন্য আপনার মডেলকে ট্রেইন করছেন। ট্রেইনের ডেটাতে আপনি বলে দিচ্ছেন ফিচারগুলো, এবং সাথে ক্লাসের নামও বলে দিচ্ছেন। যেহেতু এখানে মাত্র দুইটা ক্লাস আছে, সেহেতু আমাদের আউটপুট লেয়ারে নিউরন হবে দুইটা। প্রথমটা ধরি বিড়ালকে রিপ্রেজেন্ট করে এবং ২য় টা কুকুরকে। এখন একটা ইমেজের জন্য আমাদের মডেল ডিরেক্টলি বলবে না এটা কি। বরং আউটপুট নিউরন দুটি সম্ভাব্যতা বলে দিবে। ধরুন আপনি একটা বিড়ালের ইমেজ দিয়েছেন, এক্ষেত্রে আউটপুট লেয়ারের প্রথম নিউরন থেকে আউটপুট পেলেন ০.৮০ এবং দ্বিতীয় নিউরন থেকে পেলেন .২০ ।সুতরাং আপনার মডেলটি বলছে যে ইমেজটি বিড়ালের হওয়ার সম্ভাবনা ৮০% এবং কুকুর হওয়ার সম্ভাবনা ২০%।

ট্রেনিংয়ের সময় মূলত এই প্রেডিক্টেড ভ্যালুর সাথে সত্যিকারের ভ্যালু তুলনা করে error ক্যালকুলেট করা হয়। এই error ই হলো মডেলটির লস। আর এই error ক্যাল্কুলেট করা হয় যে ফাংশনের মাধ্যমে সেটাকে বলা হয় লস ফাংশন। লস যত কম হবে, আপনার মডেল তত একুরেট। যদি লস 0 হয় তাহলে আপনার মডেল ঠিকঠাক প্রেডিক্ট করছে। কোন error নেই।

এখন এই লস কে 0 তে নেয়াই হলো অপটিমাইজার অথবা অপটিমাইজেশন ফাংশনের টার্গেট। এজন্যই weights গুলোকে বারবার পরিবর্তন করে অপটিমাইজেশন ফাংশন। এমনভাবে করতে থাকে যেন লস ভ্যালু সর্বনিম্ন হয়। আর এটাই হলো কম্পিউটারের শেখার প্রধান উপায়। weights গুলো যত বেশি অপটিমাইজড, লস তত কম। আর লস যত কম, মডেল তত বেশি সঠিকভাবে প্রেডিক্ট করতে পারে। আর এই লস কমানোর জন্য একই ডেটা দিয়ে বারবার ট্রেইন করানো হয় মডেলকে। বারবার একই ডেটা এনালাইসিস করে weights গুলো অপটিমাইজ এমনভাবে করা হয় যেন লস ভ্যালু মিনিমাম হয়।

কেরাসে অনেক ধরনের অপটিমাইজার দেয়া আছে। এখন আমরা দেখব কিভাবে সেগুলো ব্যবহার করতে হয়।

from keras.models import *
from keras.layers import * 
model = Sequential()
model.add(Dense(5, input_shape=(3,), activation='relu'))
model.add(Dense(2, activation='softmax'))
model.compile(optimizer='adam', loss='mean_squared_error', metrics=['accuracy'])

উপরের কোডের শেষ লাইনে আমরা অপটিমাইজার এবং লস ফাংশনের নাম বলে দিচ্ছি। আমরা এখানে adam অপটিমাইজার ব্যবহার করছি এবং লস ফাংশন হিসেবে ‘mean_squared_error’ ব্যবহার করছি। এই লস ফাংশনটি জানার জন্য মেশিন লার্নিং জানার দরকার হয়না। আমরা ইতিমধ্যে কমবেশি এটি সম্পর্কে জানি।

পরবর্তীতে ধীরে ধীরে কিছু দরকারি অপটিমাইজার এবং লস ফাংশন সম্পর্কে আরো বিস্তারিত জানবো।


Leave a Reply

Your email address will not be published. Required fields are marked *