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

চিত্র ১: একটি সাধারণ নিউরাল নেটওয়ার্ক

এখানে আমরা দেখব কিভাবে ব্যাক-প্রপাগেসন কাজ করে । মনে করি আমাদের উপরের মতো একটা নিউরাল নেটওয়ার্ক আছে । এই নেটওয়ার্কে যথাক্রমে দুইটি ইনপুট নিউরন i1 ও i2, দুইটি আউটপুট নিউরন o1 ও o2 এবং দুইটি হিডেন নিউরন h1 ও h2 আছে। এখানে আরও লক্ষণীয় যে হিডেন নিউরন ও আউটপুট নিউরনের সাথে bias b1 ও b2 যুক্ত আছে ।

এখন আমরা আমাদের এই নেটওয়ার্ক কে কিছু ইনিশিয়াল ভ্যালু দিয়ে দিব অর্থাৎ ইনিশিয়াল ওয়েট, বায়াস, ইনপুট ও আউটপুটের ভ্যালু যার ফলে আমাদের উপরেরে নেটওয়ার্কটি দেখতে এই রকম হবে,

ভ্যালু সহ একটি নিউরাল নেটওয়ার্ক
চিত্র ২: ভ্যালু সহ একটি নিউরাল নেটওয়ার্ক

ব্যাক-প্রপাগেসনের মুল উদ্দেশই হল আমরা যে ইনিশিয়াল ওয়েট সেট করে দিলাম তার ভ্যালুকে এমন ভাবে অপটিমাইজ করা যার ফলে নিউরাল নেটওয়ার্ক সঠিক ভাবে শিখতে পারে (ভুল জিনিস যাতে করে না শেখে ) অর্থাৎ একটা নিদিষ্ট ইনপুটের সাপেক্ষে সঠিক আউটপুট পেতে পারি । আমরা এখানে সিংলে ট্রেনিং সেটের উপর কাজ করব । এইজন্য ইনিশিয়াল ইনপুট ভ্যালু 0.05 ও 0.10 এবং আউটপুটের ভ্যালু 0.01 ও 0.99 ধরে নিয়েছি ।

ব্যাক প্রপাগেসনে মূলত দুইধরনের কাজ হয়

  • Forward pass
  • Backward pass

Forward Pass

প্রথমে আমরা দেখি বর্তমানে আমাদের নেটওয়ার্ক যে অবস্থায় আছে সেই অবস্থায় কি predict করে অর্থাৎ আমরা বর্তমানে যে ওয়েট, বায়স, ইনপুট ও আউটপুট সেট করে দিয়েছি তার পরিপেক্ষিতে যে ফলাফল দেখায় সেটা আমাদের কাঙ্ক্ষিত আউটপুট o1 বা o1 এর কতখানি কাছাকাছি ।

এখন আমরা দেখি হিডেন লেয়ার নিউরনে নেট (net) ইনপুট [ নেট ইনপুট হল সবগুলো নিউরন যেগুলো হিডেন লেয়ার নিউরনের সাথে কানেক্টেড আছে তাদের সমষ্টি] কিভাবে বের করা যায় ।

\(net_{h1} = w_1 \times i_1 + w_2 \times i_2 + b_1 \times 1\)
\(net_{h1} = 0.15 \times 0.05 + 0.2 \times 0.1 + 0.35 \times 1 = 0.3775\)

এই নেট ইনপুট ব্যবহার করে আমরা নেট আউটপুট বের করব । নেট আউটপুট বের করার জন্য অনেক Activation Fucntion আছে । আমরা এখানে Logistic Function (Activation Function) ব্যবহার করে h1 এর মোট নেট আউটপুট (outh1) বের করব

\( out_{h1} = \frac{1}{1+e^{-net_{h1}}} = \frac{1}{1+e^{-0.3775}} = 0.593269992 \)

একই ভাবে outh2 হিসাব করলে পাওয়া যাবে ,

\( out_{h2} = 0.596884378 \)

এখন আমরা উপরেরে প্রসেস অনুসরণ করে out o1 ( o1 এর আউটপুট ) এবং out o2 ( o2 এর আউটপুট) বের করতে পারি । এখানে লক্ষণীয় যে, out h1, out h2, আউটপুট o1 এবং o2 এর ইনপুট হিসাবে ব্যবহার হবে ।

সুতরাং,

\( net_{o1} = w_5 \times out_{h1} + w_6 \times out_{h2} + b_2 \times 1 \)
\(net_{o1} = 0.4 \times 0.593269992 + 0.45 \times 0.596884378 + 0.6 \times 1 = 1.105905967\)
\(out_{o1} = \frac{1}{1+e^{-net_{o1}}} = \frac{1}{1+e^{-1.105905967}} = 0.75136507\)

অনুরূপভাবে,

\(out_{o2} = 0.772928465\)

Calculating Total Error

প্রত্যেক আউটপুট নিউরনের এরর হিসাব করার জন্য আমরা Squared Error Function ব্যবহার করব । এখন আমরা যদি সবগুলো নিউরনের এরর যোগ করি তাহলে মোট এরর পেয়ে যাব । মোট এরর বের করার সমীকরণ,

\( E_{total} = \sum \frac{1}{2}(target – output)^{2}\)

এখানে,

E total = মোট এরররে পরিমাণ ।
target = অরিজিনাল আউটপুট ।
output = যে আউটপুট পাওয়া গেছে ।

আমাদের নেটওয়ার্কে o1 এর target আউটপুট 0.01 কিন্তু এর নিউরাল নেটওয়ার্ক আউটপুট 0.75136507 । সুতরাং o1 এর এরর

\(E_{o1} = \frac{1}{2}(target_{o1} – out_{o1})^{2} = \frac{1}{2}(0.01 – 0.75136507)^{2} = 0.274811083 \)

অনুরূপভাবে, o2 এর এরর

\(E_{o2} = 0.023560026\)

সুতরাং আমাদের নিউরাল নেটওয়ার্কের মোট এরর,

\( E_{total} = E_{o1} + E_{o2} = 0.274811083 + 0.023560026 = 0.298371109\)

Backward Pass

backward pass হচ্ছে forward pass এর সম্পূর্ণ  বিপরীত । backward pass এ আউটপুট থেকে প্রসেস করতে করতে ইনপুট এর দিকে আসা হয় । আর এটাই মূলত back propagation । এখন আমাদের লক্ষ্য হল এই back propagation ব্যবহার করে নেটওয়ার্কের সবগুলো ওয়েট কে এমন ভাবে আপডেট করা, যার ফলে প্রকৃত আউটপুট আমাদের টার্গেট আউটপুটের প্রায় কাছাকাছি হয় অর্থাৎ প্রত্যেক নিউরনের এরর কমে যায় । সেই সাথে পুরা নেটওয়ার্কের এররও কমে যায় ।

Output layer

লক্ষ করি আউটপুট o1 এর মান w5 ও w7  এর মানের উপর নির্ভরশীল । অর্থাৎ w5 বা/এবং w7 এর মানের পরিবর্তনের ফলে আউটপুট o1 এর পরিবর্তন হবে এবং মোট এররের ও পরিবর্তন হবে । মনে করি, ওয়েট w5 এর মান কতটুকু পরিবর্তন করলে ( কমালে বা বাড়লে ) মোট এরর কতটুকু কমবে তা বের করতে হবে । অর্থাৎ w5 এর পরিবর্তন সাপেক্ষে মোট এরর এর পরিবর্তন গাণিতিক ভাবে আমরা লিখতে পারি,

\(\frac{\partial E_{total}}{\partial w_{5}}\)

\(\frac{\partial E_{total}}{\partial w_{5}}\)  কে আমরা পড়তে পারি এই ভাবে The practical derivative of Etotal with respect to w5  বা আমরা বলতে পারি The gradient with respect to w5

এখন আমরা যদি উপরের সমীকরণে চেইন রুল প্রয়োগ করি তবে আমরা লিখতে পারি,

\(\frac{\partial E_{total}}{\partial w_{5}} = \frac{\partial E_{total}}{\partial out_{o1}} \times \frac{\partial out_{o1}}{\partial net_{o1}} \times \frac{\partial net_{o1}}{\partial w_{5}}\) – – – – – – – – – – – – – -(১)

আমরা যদি ১ নং সমীকরণের ডানপাশের অংশগুলোর মান বের করতে পারি তবে আমরা \(\frac{\partial E_{total}}{\partial w_{5}}\) এর মান পেয়ে যাব । সুতরাং আমাদেরকে বের করতে হবে

প্রথমত : out o1 এর পরিবর্তনের সাপেক্ষে Etotalএর পরিবর্তন অর্থাৎ \( \frac{\partial E_{total}}{\partial out_{o1}} \)

আমরা জানি,

\(E_{total} = \frac{1}{2}(target_{o1} – out_{o1})^{2} + \frac{1}{2}(target_{o2} – out_{o2})^{2} \)
\(\frac{\partial E_{total}}{\partial out_{o1}} = 2 \times \frac{1}{2}(target_{o1} – out_{o1})^{2 – 1} \times -1 + 0 \)
\(\frac{\partial E_{total}}{\partial out_{o1}} = -(target_{o1} – out_{o1})\)
\( \frac{\partial E_{total}}{\partial out_{o1}} = -(0.01 – 0.75136507) = 0.74136507\)

দ্বিতীয়ত : নেট ইনপুট net o1 এর পরিবর্তনের সাপেক্ষে আউটপুট o1 এর পরিবর্তন । অর্থাৎ \( \frac{\partial out_{o1}}{\partial net_{o1}} \)

আমরা জানি ,

\(out_{o1} = \frac{1}{1+e^{-net_{o1}}}\)

যদি neto1 = x এবং out o1 = f(x) হয় তাহলে,

\(f(x) = \frac{1}{1+e^{-x}}\) লিখতে পারি ।

যেহেতু f(x) একটি logistic ফাংশন তাহলে x এর সাপেক্ষে f(x) এর derivative হবে,

\(\frac{\delta f(x)}{\delta x} = f(x)\{1 – f(x)\}\)

অর্থাৎ

\(\frac{\partial out_{o1}}{\partial net_{o1}} = out_{o1}(1 – out_{o1}) = 0.75136507(1 – 0.75136507 \)
\(\frac{\partial out_{o1}}{\partial net_{o1}} = 0.186815602 \)

সবশেষে : w5 এর পরিবর্তনের সাপেক্ষে নেট intput o1   এর পরিবর্তন অর্থাৎ \( \frac{\partial net_{o1}}{\partial w_{5}} \)

আমরা জানি,

\(net_{o1} = w_5 \times out_{h1} + w_6 \times out_{h2} + b_2 \times 1\)
\(\frac{\partial net_{o1}}{\partial w_{5}} = 1 \times out_{h1} \times w_5^{(1 – 1)} + 0 + 0 = out_{h1} = 0.593269992\)

এখন ১ নং সমীকরণ থেকে পাই,

\(\frac{\partial E_{total}}{\partial w_{5}} = 0.74136507 \times 0.186815602 \times 0.593269992 \)
\(\frac{\partial E_{total}}{\partial w_{5}} = 0.082167041 \)

এখন মোট এরর এর মান কমানোর জন্য আমারা ওয়েট w5 এর মান থেকে \(\frac{\partial E_{total}}{\partial w_{5}}\) এর মান বাদ দিব । তাহলে w5 এর নতুন মান পাব । এর জন্য আমরা এই সূত্র ব্যবহার করব ।

\(w_5^{+} = w_5 – \eta \times \frac{\partial E_{total}}{\partial w_{5}} = 0.4 – 0.5 \times 0.082167041 = 0.35891648\)

যেখানে,

w5 + =  w5 এর পরিবর্তনের মান ।
\(\eta\) = লার্নিং রেট ( এর মান সাধারণত ০.৫ রাখা হয় )

কোন কোন ক্ষেত্রে \(\eta\) এর পরিবর্তে \(\alpha\) বা \(\epsilon\) ব্যবহার করা হয় ।

আমরা যদি উপরের ধাপ গুল অনুসরণ করি তবে w0, w7, w8 এরও নতুন মান পেয়ে যাব । নতুন মান গুল হল ।

w0+ = 0.408666186
w7+ = 0.511301270
w8+ = 0.561370121

এখন আমাদের কে ওয়েট w1, w2, w3, w4 এর পরিবর্তিত মান বের করতে হবে । যেহেতু এইগুলোর উপর হিডেন লেয়ার h1, এবং h2 নির্ভরশীল হবে । সুতরাং  হিডেন লেয়ার ব্যবহার করেই এগুলোর পরিবর্তিত মান পাওয়া সম্ভব ।

Hidden Layer

মনে করি, w1 এর পরিবর্তন সাপেক্ষে Etotal  এর মান কমাতে চাই । তাহলে w1 এর পরিবর্তন সাপেক্ষে Etotal এর পরিবর্তিত মান হবে

\( \frac{\delta E{total}}{\delta w_1} \)

চেইন রুল ব্যবহার করে আমরা লিখতে পারি ,

\( \frac{\partial E_{total}}{\partial w_{1}} = \frac{\partial E_{total}}{\partial out_{h1}} \times \frac{\partial out_{h1}}{\partial net_{h1}} \times \frac{\partial net_{h1}}{\partial w_{1}} \) – – – – – – – – – – – – – (২)

এখন সমীকরণ ২ এর ডানপাশে প্রত্যেক অংশের মান বের করলেই \( \frac{\delta E{total}}{\delta w_1} \) এর মান পেয়ে যাব ।

প্রথমে outh1 এর পরিবর্তন সাপেক্ষে E total এর পরিবর্তন বের করতে হবে । Output Layer এর \( \frac{\delta E{total}}{\delta out{o1}} \) বের করার প্রসেস অনুসরণ করলেই হবে কিন্তু কিছুটা ব্যতিক্রম আছে । কারণ প্রত্যেক হিডেন লেয়ার নিউরন এর উপর একাধিক আউটপুট নিউরন নির্ভরশীল । সুতরাং আমরা জানি, out o1, এবং out o2 outh এর উপর নির্ভরশীল এবং E total = Eo1 + Eo2

সুতরাং

\(\frac{\partial E_{total}}{\partial out_{h1}} = \frac{\partial E_{o1}}{\partial out_{h1}} + \frac{\partial E_{o2}}{\partial out_{h1}} \)

এখানে,

\(\frac{\partial E_{o1}}{\partial out_{h1}} = \frac{\partial E_{o1}}{\partial net_{o1}} \times \frac{\partial net_{o1}}{\partial out_{h1}} \)

আমরা পূর্বের হিসাব করা মান ব্যবহার করে \( \frac{\delta E_{o1}}{\delta net_{o1}} \) এর মান বের করতে পারি ।

সুতরাং

\( \frac{\partial E_{o1}}{\partial net_{o1}} = \frac{\partial E_{o1}}{\partial out_{o1}}\times \frac{\partial out_{o1}}{\partial net_{o1}} = 0.74136507\times 0.186815602\)
\( \frac{\partial E_{o1}}{\partial net_{o1}} = 0.138498562 \)

এবং

\( net_{o1} = w_5 \times out_{h1} + w_6 \times out_{h2} + b_2 \times 1 \)
\( \frac{net_{o1}}{out_{h1}} = w_5 = 0.40 \)

সুতরাং,

\( \frac{E_{o1}}{out_{h1}} = \frac{\partial E_{o1}}{net_{o1}} \times \frac{ net_{o1}}{out_{h1}} = 0.138498562 \times 0.40 = 0.055399425 \)

একই প্রসেস অনুসরণ করে, আমরা পাই

\(\frac{E_{o2}}{out_{h1}} = -0.019049119 \)

সুতরাং,

\( \frac{\partial E_{total}}{\partial out_{h1}} = \frac{\partial E_{o1}}{\partial out_{h1}} + \frac{\partial E_{o2}}{\partial out_{h1}} = 0.055399425 + -0.019049119 = 0.036350306 \)

আমরা \( \frac{\partial E_{total}}{\partial out_{h1}} \) পেলাম । এখন আমাদের কে \(\frac{\partial out_{h1}}{\partial net_{h1}}\) এবং \(\frac{\partial net_{h1}}{\partial w}\) এর মান বের করতে হবে ।

আমরা জানি,

\(out_{h1} = \frac{1}{1+e^{-net_{h1}}}\)
\(\frac{\partial out_{h1}}{\partial net_{h1}} = out_{h1}(1 – out_{h1}) = 0.59326999(1 – 0.59326999 ) = 0.241300709\)

এখন আমরা w1 এর সাপেক্ষে মোট নেট ইনপুট h 1 এর partial derivative বের করব

\(net_{h1} = w_1 \times i_1 + w_2 \times i_2 + b_1 \times 1\)
\(\frac{\partial net_{h1}}{\partial w_1} = i_1 = 0.05\)

সবগুলো একজায়গায় করলে আমরা পাই,

\(\frac{\partial E_{total}}{\partial w_{1}} = \frac{\partial E_{total}}{\partial out_{h1}} \times \frac{\partial out_{h1}}{\partial net_{h1}} \times \frac{\partial net_{h1}}{\partial w_{1}}\)

এখন আমরা w 1 কে আপডেট করব এই ভাবে ,

\(w_1^{+} = w_1 – \eta \times \frac{\partial E_{total}}{\partial w_{1}} = 0.15 – 0.5 \times 0.000438568 = 0.149780716\)

একই প্রসেস অনুসরণ করে w2, w3, w2 হবে,

\(w_2^{+} = 0.19956143\)
\(w_3^{+} = 0.24975114\)
\(w_4^{+} = 0.29950229\)

শেষ পর্যন্ত আমরা আমাদের সবগুলো ওয়েট কে আপডেট করেছি । একদম শুরুতে ইনপুট নিউরনের মান 0.05 ও 0.10 দিয়েছিলাম । এবং সেই ক্ষেত্রে আমাদের নেটওয়ার্কের এরর ছিল 0.298371109 কিন্তু একবার বাক-প্রপাগেসন চালানর পর আমাদের এরর কমে গিয়ে হয় 0.291027924 যেটা খুবই কম। কিন্তু আমরা যদি এই প্রসেস অনেক বার রিপিট করি তবে আমাদের নেটওয়ার্কের মোট এরর অনেক কমে যাবে ।

শেষ পর্যন্ত পড়ার জন্য ধন্যবাদ ।

 

লিখেছেনঃ

  1. Abdus Salam
  2. Nurul Islam Nahid
  3. Mehadi Hasan