Register Now

Login


Lost Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Login


Register Now

Welcome to Our Site. Please register to get amazing features .

নিউরনের গল্প

নিউরনের গল্প

অফিসের একটা কাজের জন্য নিউরাল নেটওয়ার্কের অনেক কিছুই পড়া লাগছে। পুরা ব্যাপারটা অনেক সুন্দর সুন্দর কিছু গণিতের সমীকরণ দিয়ে কবিতার মত লেখা আছে অনেক বইয়ে। কিন্তু সেই সব ইকুয়েশন নিয়ে কথা বলতে গেলে আমরা সেই কবিতার ভাবের মাঝে হারিয়ে যাব। কাজের কাজ কিছুই হবে না। তাই শুরু করব সহজ কিছু দিয়ে।

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

নিউরাল নেটওয়ার্ক শেখার শুরুর কাজটাই হল গিয়ে নিজে নিজে একটা ছোটখাটো নেটওয়ার্ক লিখে ফেলা। টেনসর ফ্লো নামে একটা লাইব্রেরী আছে। সেটা দিয়ে খুব সহজেই নিউরাল নেটওয়ার্ক বানিয়ে ফেলা যায়। কিন্তু সেটা দিয়ে করলে আসলে বোঝা যায় না নিউরাল নেটওয়ার্ক কিভাবে কাজ করছে।

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

নিউরাল নেটওয়ার্ক (Neural Network) কী?

আমাদের মানুষের মস্তিষ্ক ১০০ বিলিয়ন কোষ নিয়ে গঠিত। প্রত্যেকটি কোষকে নিউরন (Neuron) বলে। প্রত্যেকটা নিউরন (Neuronসিনাপ্সেস (Synapse) দিয়ে একটা আরেকটার সাথে কানেক্টড থাকে। এই নিউরনগুলোর সিনাপ্সে ইনপুট দিলে সেই ইনপুটের উপর ভিত্তি করে নিউরন ফায়ার (Fire) করে অথবা করে না। আমাদের মস্তিষ্ক এভাবেই কাজ করে। নিউরনগুলো ফায়ার করে আর আমরা চিন্তা করি।

আমরা মস্তিষ্কের নিউরনের এই মডেলটাকে (Model) আমাদের মত করে কাট ছাঁট করে নিউরালে নেটওয়ার্কের একটা প্রোগ্রাম লেখে ফেলতে পারি। বায়োলোজিকাল নিউরন অনেক কমপ্লেক্স (Complex)। আমরা ওরকম কিছু বানাতে পারব না। কিন্তু এর চেয়ে সহজ কিছু চেষ্টা করে দেখতে পারি।

আমরা নিচের প্রব্লেমটা সলভ করার জন্য একটা নিউরাল নেট ডিজাইন করব। এই টেবিলের প্রথম চারটা হল ট্রেইনিং সেট (Training Set). এই ট্রেইনিং সেটগুলো (Training Set) কাজে লাগিয়ে নিউরন নিজেকে ট্রেইন (Train) করাবে। তারপর তাকে নতুন কোন ইনপুট দিলে সে একটা নতুন আউটপুট প্রেডিক্ট (Predict) করবে।

Training Set and Test Set

আমরা উপরের ইনপুট সেটগুলোর দিকে একটু তাকিয়ে থাকলেই বুঝতে পারি। ইনপুট কলামের সবচেয়ে বামের ইনপুট যদি 1 হয় তাহলে আউটপুট 1 হবে ।তারমানে সবার শেষের সারির ইনপুটের জন্য আউটপুট 1 হবে। আমাদের মস্তিষ্ক এই ধরনের প্যাটার্ন (Pattern) খুব সহজেই চিনতে পারে কিন্তু কম্পিউটার কিভাবে চিনবে?

কম্পিউটারকে এই কাজ করাবো আমাদের ডিজাইন করা নিউরন দিয়ে।

আমরা একটা সিঙ্গেল নিউরন (Single Neuron) নিয়ে কাজ করব।যেহেতু আমাদের এই প্রব্লেমের ইনপুট তিনটা তাই এই নিউরনের ইনপুট (Input) হবে তিনটা আর আউটপুট (Output) হবে একটা।

তাহলে আমাদের মডেলটা দেখতে হবে এরকমঃ

Single neuron (3 input ,1 output)

এখন এই ইনপুটগুলোর (Input) প্রতিটার সাথে একটা ওয়েট(Weight) গুণ করব। ওয়েট জিনিসটা আবার কী?

আমরা ওয়েট বলতে কিন্তু অনেক সময় গুরুত্ব বুঝি। মাঝে মাঝে বলিনা “ওর কথার ওয়েট কম”।তার মানে হল কথার গুরুত্ব কম। নিউরনের ক্ষেত্রেও ওয়েট ব্যাপারটা অনেকটা এরকম। প্রতিটা ইনপুট লাইনের সাথে যে ওয়েটটা গুণ হয়ে আছে সেটার মান বেশি হওয়া মানে ওই ইনপুটটার গুরুত্ব বেড়ে যাওয়া। আউটপুট কী হবে সেটা নির্ভর করে কোন ইনপুট এবং ওয়েটগুলোর মানের উপর।

আমাদের সমাজেও এরকম হয়, আমাদের আশে পাশের মানুষগুলোকে আমরা একটা ওয়েট ভ্যালু বা মান দেই (কাওকে 10 এর মধ্যে 5 আবার কাওকে দেই 9) যাকে আমরা বেশি ওয়েট দেই তার কথার গুরুত্ব আমাদের কাছে বেশি। মানে তার কথা আমাদের সিদ্ধান্ত নেবার ব্যাপারে গুরুত্বপূর্ণ ভূমিকা রাখে। নিউরাল নেটের ক্ষেত্রেও এই একই ঘটনা ঘটে। যে ইনপুটের সাথে গুণ হওয়া ওয়েটের মান বেশি সে ইনপুট আউটপুট কী হবে সেটার ব্যাপারে বেশি ভূমিকা রাখে।

সবার কাছ থেকে আমরা মতামত নিই। সেই মতামত গুলো আমাদের চিন্তার সাথে যোগ করি। তারপর সেই সবগুলো মতামতের ভিত্তিতে আমারা নিজেরা আমাদের যুক্তির ভিত্তিতে সিন্ধান্ত নিই।

এই ধারণাটাই যদি আমরা নিউরাল নেটে নিয়ে আসতে চাই তাহলে কী করতে হবে?

খুব সহজ ইনপুটগুলোর মানের সাথে ওয়েটের মানের গুণফল গুলোর যোগফল নিতে হবে। এক লাইনে এত কিছু?

আসুন এই লাইনটা কী বলল একটু বোঝার চেষ্টা করি। যেহেতু আমাদের ইনপুট তিনটা তাই তিনটা ওয়েট থাকবে প্রতিটা ইনপুটের সাথে গুণ হয়ে। আমরা ব্যাপারটাকে এভাবে লিখতে পারিঃ

তাহলে ইকুয়েশনটা কী দাঁড়াবে?

এই ইকুয়েশনটাকে ম্যাট্রিক্স আকারে লেখলে হবেঃ

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

কে এই সিগময়েড ফাংশন? কেমন সে দেখতে?

তিনি দেখতে এমন …

এই ফাংশনের গ্রাফটা হবেঃ

Sigmoid function

পুরা ব্যাপারটাকে আমি যদি একসাথে দেখতে চাই তাহলে এরকম হবেঃ

Our Model

ট্রেইনিং

এখন কথা হল আমরা আমাদের নিউরনকে কিভাবে ট্রেইন করাতে পারি যাতে এর আউটপুটগুলো ঠিক হয়। আমরা আমাদের নিউরনের ওয়েট গুলোর মান পরিবর্তন করে নিউরনটাকে ট্রেইন করাবো।

তাহলে ট্রেইনিং প্রসেসটা কেমন হবে?

  • ট্রেইনিং সেট থেকে আমরা ইনপুটগুলো নিয়ে সেই ইনপুটের উপর ভিত্তি করে প্রেডিক্টেড আউটপুট পাব। (FeedForward Process)
  • তারপর আসে ইরর বের করা। এক্ষেত্রে ইরর হল নিউরনের প্রেডিক্টড আউটপুট আর আসল আউটপুটের মাঝে পার্থক্য। (Error)
  • ইররের উপর ভিত্তি করে আমরা নিউরনের ওয়েটগুলো আপডেট করব (Backpropagation)
  • উপরের তিনটা প্রসেস ১০০০০ বার করব। (Iteration)

Training

এই প্রসেসটা চলতে থাকলে নিউরনের ওয়েটগুলো (weight) এমন একটা মানে এসে থামবে, যখন নতুন কোন ইনপুটের জন্য নিউরনটা একটা সঠিক আউটপুট দিবে। শর্ত প্রযোজ্যঃ যদি নিউরনটা ঠিক মত ট্রেইন (Train) হয়।

নিউরনের আউটপুট (Neuron’s Output):

এখন কথা হল আমরা নিউরনের আউটপুটগুলো কিভাবে হিসাব করব?

থেকে পাওয়া মানকে আমরা একটা ফাংশনের মধ্যে পাঠাবো যাতে করে রেজাল্ট 0 এবং 1 এর মধ্যে থাকে। অর্থাৎ,

এই প্রসেসটাকে নরমালাইজ (Normalize) বলে। নরমালাইজ করার জন্য আমরা সিগময়েড ফাংশন (Sigmoid function) কাজে লাগাবো।

ইরর (Error ):

ট্রেইনিং সেটের আউটপুট আর প্রেডিক্টড আউটপুট এর মাঝখানের পার্থক্য হল আমাদের ইরর। ট্রেইনিং সেটে আমাদের প্রতিটা ইনপুটের একটা আউটপুট আছে। আর প্রতিটা ইটারেশনে নিউরনের একটা আউটপুট প্রেডিক্ট করে। এখন প্রেডিক্টেড আউটপুট এবং ট্রেইনিং সেটের আউটপুটের মাঝখানে পার্থক্য বেশি হলে ইরর বেশি। আর না হলে ইরর কম।

এখানে সব কিছু ম্যাট্রিক্স আকারে লেখা হয়েছে। কারণ নিউরাল নেটে সব কিছুই ম্যাট্রিক্স অপারেশন ব্যবহার করে করা হয়।

ওয়েট আপডেট (Weight Update):

এখন হুট করে আমরা একটা ইকুয়েশন (Equation) লেখে ফেলব। এই ইকুয়েশনটা কিভাবে আসল সেটা বুঝতে হলে আমাদের ক্যালকুলাসে নিয়ে একটু কথা হবে। তাই জিনিস নিয়ে পরের লেখাগুলোতে লেখব।

তাহলে ইকুয়েশনটা লেখেই ফেলি

এ কেমন সমীকরণ !!!

একটু বুঝিয়ে বলার চেষ্টা করি। আমারা নিউরনের ওয়েট আপডেট (update) করব আমাদের ইররের (Error) সমানুপাতিক হারে। মানে হল ইরর বেশি হলে ওয়েটের (Weight) পরিবর্তন বেশি করতে হবে। তাই ইররকে এখানে ইনপুটের সাথে গুন দেয়া হয়েছে। ইরর এবং ইনপুটের গুণফলের সাথে আমরা আবার সিগময়েড কার্ভের গ্র্যাডিয়েন্টকে (Gradient of Sigmoid Curve) গুণ করেছি। আবার ম্যাথ! গ্র্যাডিয়েন্ট (Gradient) নিয়ে পরে বিস্তারিত লেখব, আজকে না ।

তবে চলুন একটু বোঝার চেষ্টা করি। গ্র্যাডিয়েন্ট বলতে আমরা ঢাল (Slope) বুঝি। কোন কার্ভের (Curve) কোন একটা বিন্দুর ঢাল হল গ্র্যাডিয়েন্ট (Gradient)। এখন নিউরনের আউটপুট যদি বড় কোন পজিটিভ বা নেগেটিভ নাম্বার হয় তাহলে তার গ্র্যাডিয়েন্ট কেমন হবে?

সিগময়েড ফাংশনের গ্রাফের দিকে তাকালে আমরা দেখতে পারি x এর বড় কোন পজিটিভ বা নেগেটিভ নাম্বারের জন্য এর সিগময়েড ফাংশনের গ্র্যাডিয়েন্ট x- অক্ষের প্রায় সমান্তরাল। এক্ষেত্রে গ্র্যাডিয়েন্ট এর মান শূন্য এর খুব কাছাকাছি হবে।

আমরা নিউরনের আউটপুট বের করার জন্য সিগময়েড ফাংশন ব্যবহার করেছি। নিউরানের আউটপুট বড় কোন পজিটিভ অথবা নেগেটিভ নাম্বার হলে তার গ্র্যাডিয়েন্ট x- অক্ষের সমান্তরাল হবে। তাই গ্র্যাডিয়েন্ট এর মান 0 হবে। তার মানে আমাদেরকে আর নিউরনের ওয়েট আপডেট করতে হবে না।

অন্যভাবে বলতে গেলে আমাদের নিউরনের আউটপুট বড় পজিটিভ বা নেগেটিভ নাম্বার হলে নিউরন তার প্রেডিক্টড আউটপুটের (Predicted Output) ব্যাপারে অনেক বেশি কনফিডেন্ট (Confident)। আর যেহেতু নিউরন তার প্রেডিক্টেড আউটপুট নিয়ে কনফিডেন্ট তাই ওয়েট আপডেট করার কোন দরকার নেই।

আচ্ছা adjustment বের করার জন্য আমরা কেন ডট গুণন করলাম?

কারণটা হল ডট গুণ হল স্কেলার গুণ।

উপরের স্টেপে যে যে কাজ গুলা করলাম এইগুলো খাতায় লেখে লেখে করলে বুঝতে সুবিধা হবে।

সিগময়েড কার্ভের গ্র্যাডিয়েন্ট আমরা সিগময়েড ফাংশনকে অন্তরীকরণ (Differentiation) করলেই পাব।

তাহলে ওয়েট আপডেট করার ইকুয়েশন কী হবে?

এভাবেই ওয়েট আপডেট হতে হতে একসময় একটা অবস্থায় যায় যে ইরর খুব কম হয়। তখন আমাদের প্রেডিক্টেড আউটপুট ভালো হয়।

মোটামুটি সব কিছুতো বুঝলাম এখন চলেন পাইথনে একটা কোড লিখে ফেলি। আমরা কোনো নিউরাল নেট লাইব্রেরী ব্যবহার করব না। তবে আমাদের কাজ একটু সহজ করার জন্য Numpy Array ব্যবহার করব। কারণ নিউরাল নেটওয়ার্ক পুরাটাই হল Matrix এর খেলা। আর আমাদের এর বিভিন্ন অপারেশনগুলো অনেক সহজ করে দেয়।

আউটপুটঃ

অবশেষে, একটা নিউরাল নেটওয়ার্ক দাঁড়ালো। নতুন ইনপুটের জন্য [1, 0, 0] জন্য প্রেডিক্টেড আউটপুট হবে 0.99993704. এই মানটা ১ এর খুব কাছাকাছি। আসল উত্তরও ১। তারমানে আমরা আসল উত্তরের খুব কাছাকাছি।

সাধারণ প্রোগ্রামগুলো শিখতে পারে না। কিন্তু নিউরাল নেটওয়ার্ক এর মজা হল সে মানুষের মত শিখতে পারে। কী অসাধারণ!!! তাই না????

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

লিখতে লিখতে ক্লান্ত। কিন্তু লেখা এখনো শেষ হয়নি। বাকিটুকু অন্য একদিন।

ভালো থাকবেন।

About Ask me anything


Follow Me

Leave a reply

Captcha Click on image to update the captcha .