যারা স্র্যাচ থেকে (Multi layer Perceptron) মাল্টিলেয়ার পারসেপট্রন ও Back propagation কিভাবে কাজ করে বুঝার চেষ্টা করছে আশা করি তাদের কাজ এ দিবে এই লেখা। লেখার মধ্যে ভুল ভ্রান্তি হয়ে থাকলে অভিজ্ঞদের ঠিক করে দেয়ার জন্য উৎসাহিত করছি। সহজে বোঝার জন্য এখানে XOR এর ডাটাসেট নিব । তাহলে ইনপুট এবং আউটপুট দেখা যাক। ইনপুট এর শেষ কলাম হল বায়াস কলাম।
আমাদের নিউরাল নেটওয়ার্ক এ মোট ৩ টি লেয়ার থাকবে। একটি ইনপুট লেয়ার, মাঝখানে হিডেন লেয়ার এবং শেষ এ আউটপুট লেয়ার।
প্রথমে আমরা র্যান্ডম Weight নিব । ইনপুট লেয়ার এর সাথে হিডেন লেয়ার এর Weight গুলো কে w1 ম্যাট্রিক্স এ রাখব। হিডেন লেয়ার এর সাথে আউটপুট লেয়ার এর Weight গুলো কে w2 ম্যাট্রিক্স এ রাখব।
w1 ম্যাট্রিক্স হবে 3×2 সাইজ এর । কারন ইনপুট নোড ৩ টি এবং হিডেন নোড ২ টি।
w2 ম্যাট্রিক্স হবে 2×1 সাইজ এর । কারন হিডেন নোড ২ টি এবং আউটপুট নোড ১ টি
সবার প্রথমে আমরা Weighted Sum বের করব । Weighted Sum কে আমরা নিচের মত করে লিখতে পারি। কে আমরা Weighted Sum ধরলাম ।
এই কে পাওয়া যাবে ম্যাট্রিক্স এবং w1 ম্যাট্রিক্স এর গুন করার মাধ্যমে।
হল হিডেন লেয়ার এর মান। কিন্তু এই মান 0 এবং 1 এর মধ্যে রাখার জন্য আমরা কে সিগময়েড ফাংশন এ পাস করে বের করব। সিগময়েড ফাংশন হল
তাহলে আমরা আমাদের ফাইনাল হিডেন লেয়ার এবং এর মান পেয়ে গেলাম। সিগময়েড ফাংশন এ পাস করার কারনে সব মানগুলো 0 এবং 1 এর মধ্যেই আছে।
এরপর আমরা হিডেন লেয়ার এর মান এবং Weight ম্যাট্রিক্স w2 এর মাধ্যমে আউটপুট লেয়ার এর Weighted Sum বের করব।
এই মান 0 এবং 1 এর মধ্যে রাখার জন্য আমরা কে সিগময়েড ফাংশন এ পাস করে বের করব।
কিন্তু এটা আমাদের ফাইনাল আউটপুট নয়। আমরা এই আউটপুট থেকে এই আসল আউটপুট এর ডিফারেন্স নিয়ে এরর Error বের করব ।
তাহলে প্রথমে আমরা বের করব w2 এর weight গুলোতে কি পরিমান পরিবর্তন করলে আমাদের এরর কমে যাবে। এর যা মান পাব তা আমরা w2 থেকে বাদ দিব। এটি মূলত এর partial derivative w2 এর সাপেক্ষে। তাহলে ক্যালকুলাসের Chain Rule থেকে পাই,
এখন প্রথমে এর মান বের করব।
এরপর আমরা বের করব। তাহলে,
আগে বের করা হয়েছে
চেনা চেনা লাগছে? হ্যা HSC তে ক্যালকুলাস বই এর এই ম্যাথ টা খুব ইম্পর্টেন্ট ছিল। ভার্সিটির প্রথম সেমিষ্টার এ অনেকে করেছে। যাই হোক আগের ম্যাথ গুলো সহজ ছিল। এই ম্যাথ টা সলভ করে একটি রুল পাব যেই রুল অনেক বই/ টিউটোরিয়াল এ ডিরেক্ট দিয়ে দিয়েছে।
হল এর মান। এখন বসিয়ে দিয়ে পাই,
এটাই হল সেই সূত্র। এরপর বাকি আছে
আমরা প্রথমেই বের করেছিলাম
তাহলে আমরা Chain Rule এর সব টার্ম বের করে ফেলেছি। এখন বের করব টার্ম গুলোর মান বসিয়ে। তবে ও এলিমেন্ট ওয়াইজ গুন করব। প্রাপ্ত গুন ফল এর সাথে এর ম্যাট্রিক্স গুন করব।
হল 4×2 ম্যাট্রিক্স , হল 4×1 ম্যাট্রিক্স। ম্যাট্রিক্স গুন এর জন্য ১ম ম্যাট্রিক্স এর কলাম এবং ২য় ম্যাট্রিক্স এর সারি সমান হতে হয়।
তাই কে ট্রান্সপোজ ম্যাট্রিক্স এ কনভার্ট করে নিব। তাহলে,
এখন আমরা এর Weight আপডেট করব। থেকে বিয়োগ করে আমরা আপডেট করব। তবে দ্রুত Converge এর জন্য আমরা
কে দ্বারা গুন করে নিব।
সুতরাং প্রথম ধাপ শেষ। এবার আমাদের আরও ব্যাক এ যেতে হবে এর Weight আপডেট এর জন্য। তাহলে Chain Rule অনুসারে,
অর্থাৎ এর Weight এ কি পরিমান ডিফারেন্স আনলে আমাদের Error কমে যাবে। এখানে এর এর সাথে এর সরাসরি সম্পর্ক নাই তাই কেও Chain Rule অনুসারে ভেঙ্গে ফেলতে হবে।
এর মান আমরা আগে বের করেছি দিয়ে।
তাহলে এর মান বের করি,
কে ট্রান্সপোজ ম্যাট্রিক্স এ কনভার্ট করে এর সাথে ম্যাট্রিক্স গুন করে পাই,
সবার শেষ এর টার্ম এর ক্ষেত্রে ,
এখন এবং এর এলিমেন্ট ওয়াইজ গুন হবে যা
সবার শেষ এ এর ট্রান্সপোজ ম্যাট্রিক্স এর সাথে এর ম্যাট্রিক্স গুন হবে,
আপডেট করব এর নিয়মে,
Back propagation এর কাজ শেষ । এখন আপডেটেড Weight এবং দিয়ে আবার আগের মত এবং করে দেখব আসল আউটপুট এর কাছাকাছি কি না। সাধারন্ত একবার Back propagation করে কাছাকাছি আসবে না। প্রায় ২০০০০-৩০০০০ বারের মত Back propagation করে আমরা একবারে কাছাকছি ভ্যালু পেয়ে যাব। নিচের কোড এ Back propagation এর ইমপ্লিমেন্টেশন ঠিক একইভাবে করা হয়েছে।
আমাদের নিউরাল নেটওয়ার্ক এ মোট ৩ টি লেয়ার থাকবে। একটি ইনপুট লেয়ার, মাঝখানে হিডেন লেয়ার এবং শেষ এ আউটপুট লেয়ার।
প্রথমে আমরা র্যান্ডম Weight নিব । ইনপুট লেয়ার এর সাথে হিডেন লেয়ার এর Weight গুলো কে w1 ম্যাট্রিক্স এ রাখব। হিডেন লেয়ার এর সাথে আউটপুট লেয়ার এর Weight গুলো কে w2 ম্যাট্রিক্স এ রাখব।
w1 ম্যাট্রিক্স হবে 3×2 সাইজ এর । কারন ইনপুট নোড ৩ টি এবং হিডেন নোড ২ টি।
w2 ম্যাট্রিক্স হবে 2×1 সাইজ এর । কারন হিডেন নোড ২ টি এবং আউটপুট নোড ১ টি
সবার প্রথমে আমরা Weighted Sum বের করব । Weighted Sum কে আমরা নিচের মত করে লিখতে পারি। কে আমরা Weighted Sum ধরলাম ।
এই কে পাওয়া যাবে ম্যাট্রিক্স এবং w1 ম্যাট্রিক্স এর গুন করার মাধ্যমে।
হল হিডেন লেয়ার এর মান। কিন্তু এই মান 0 এবং 1 এর মধ্যে রাখার জন্য আমরা কে সিগময়েড ফাংশন এ পাস করে বের করব। সিগময়েড ফাংশন হল
তাহলে আমরা আমাদের ফাইনাল হিডেন লেয়ার এবং এর মান পেয়ে গেলাম। সিগময়েড ফাংশন এ পাস করার কারনে সব মানগুলো 0 এবং 1 এর মধ্যেই আছে।
এরপর আমরা হিডেন লেয়ার এর মান এবং Weight ম্যাট্রিক্স w2 এর মাধ্যমে আউটপুট লেয়ার এর Weighted Sum বের করব।
এই মান 0 এবং 1 এর মধ্যে রাখার জন্য আমরা কে সিগময়েড ফাংশন এ পাস করে বের করব।
কিন্তু এটা আমাদের ফাইনাল আউটপুট নয়। আমরা এই আউটপুট থেকে এই আসল আউটপুট এর ডিফারেন্স নিয়ে এরর Error বের করব ।
Back Propagation
এখন শুরু হবে Back Propagation । এর মানে হল আমরা যে এরর পেয়েছি সেটা কে কমিয়ে আনার জন্য আমরা বারবার আউটপুট লেয়ার থেকে ব্যাক করে w1 ওবং w2 ম্যাট্রিক্স এর Weight গুলো বার বার আপডেট করব এবং এরর ক্যালকুলেট করব। এভাবে এক সময় আমরা এরর অনেক কমিয়ে আসল আউটপুট এর মত মান প্রেডিক্ট করতে পারব।তাহলে প্রথমে আমরা বের করব w2 এর weight গুলোতে কি পরিমান পরিবর্তন করলে আমাদের এরর কমে যাবে। এর যা মান পাব তা আমরা w2 থেকে বাদ দিব। এটি মূলত এর partial derivative w2 এর সাপেক্ষে। তাহলে ক্যালকুলাসের Chain Rule থেকে পাই,
এখন প্রথমে এর মান বের করব।
এরপর আমরা বের করব। তাহলে,
আগে বের করা হয়েছে
চেনা চেনা লাগছে? হ্যা HSC তে ক্যালকুলাস বই এর এই ম্যাথ টা খুব ইম্পর্টেন্ট ছিল। ভার্সিটির প্রথম সেমিষ্টার এ অনেকে করেছে। যাই হোক আগের ম্যাথ গুলো সহজ ছিল। এই ম্যাথ টা সলভ করে একটি রুল পাব যেই রুল অনেক বই/ টিউটোরিয়াল এ ডিরেক্ট দিয়ে দিয়েছে।
হল এর মান। এখন বসিয়ে দিয়ে পাই,
এটাই হল সেই সূত্র। এরপর বাকি আছে
আমরা প্রথমেই বের করেছিলাম
তাহলে আমরা Chain Rule এর সব টার্ম বের করে ফেলেছি। এখন বের করব টার্ম গুলোর মান বসিয়ে। তবে ও এলিমেন্ট ওয়াইজ গুন করব। প্রাপ্ত গুন ফল এর সাথে এর ম্যাট্রিক্স গুন করব।
হল 4×2 ম্যাট্রিক্স , হল 4×1 ম্যাট্রিক্স। ম্যাট্রিক্স গুন এর জন্য ১ম ম্যাট্রিক্স এর কলাম এবং ২য় ম্যাট্রিক্স এর সারি সমান হতে হয়।
তাই কে ট্রান্সপোজ ম্যাট্রিক্স এ কনভার্ট করে নিব। তাহলে,
এখন আমরা এর Weight আপডেট করব। থেকে বিয়োগ করে আমরা আপডেট করব। তবে দ্রুত Converge এর জন্য আমরা
কে দ্বারা গুন করে নিব।
সুতরাং প্রথম ধাপ শেষ। এবার আমাদের আরও ব্যাক এ যেতে হবে এর Weight আপডেট এর জন্য। তাহলে Chain Rule অনুসারে,
অর্থাৎ এর Weight এ কি পরিমান ডিফারেন্স আনলে আমাদের Error কমে যাবে। এখানে এর এর সাথে এর সরাসরি সম্পর্ক নাই তাই কেও Chain Rule অনুসারে ভেঙ্গে ফেলতে হবে।
এর মান আমরা আগে বের করেছি দিয়ে।
তাহলে এর মান বের করি,
কে ট্রান্সপোজ ম্যাট্রিক্স এ কনভার্ট করে এর সাথে ম্যাট্রিক্স গুন করে পাই,
সবার শেষ এর টার্ম এর ক্ষেত্রে ,
এখন এবং এর এলিমেন্ট ওয়াইজ গুন হবে যা
সবার শেষ এ এর ট্রান্সপোজ ম্যাট্রিক্স এর সাথে এর ম্যাট্রিক্স গুন হবে,
আপডেট করব এর নিয়মে,
Back propagation এর কাজ শেষ । এখন আপডেটেড Weight এবং দিয়ে আবার আগের মত এবং করে দেখব আসল আউটপুট এর কাছাকাছি কি না। সাধারন্ত একবার Back propagation করে কাছাকাছি আসবে না। প্রায় ২০০০০-৩০০০০ বারের মত Back propagation করে আমরা একবারে কাছাকছি ভ্যালু পেয়ে যাব। নিচের কোড এ Back propagation এর ইমপ্লিমেন্টেশন ঠিক একইভাবে করা হয়েছে।
import numpy as np
X = np.array([
[0, 0, 1],
[0, 1, 1],
[1, 0, 1],
[1, 1, 1]])
y = np.array([[0],
[1],
[1],
[0]])
#Weight Initialize
w1=np.random.random((3,2))
w2=np.random.random((2,1))
#sigmoid function
def sigmoid(x, deriv=False):
if(deriv):
return x*(1-x)
else:
return (1/(1+np.exp(-x)))
#Back propagation
for epoch in range(0,30000):
eta=0.5
#Weighted Sum
z_h=np.dot(X,w1)
a_h=sigmoid(z_h)
# second weighted sum
z_o=np.dot(a_h,w2)
a_o=sigmoid(z_o)
#Error Calculate
Ea=(0.5*(np.power((a_o-y),2)))
#BackPropagation dE/dw2
#dE/da0
dEda0=(a_o-y)
#da0/dz0
da0dz0=sigmoid(a_o,deriv=True)
#dz0/dw
dz0dw=a_h
#dE/dw2
st=da0dz0*dEda0
dEdw2=np.dot(dz0dw.T,st)
#Weight update
w2=w2-(eta*dEdw2)
#hidden Layer dEdw1
#dE/dah
dEdah=np.dot(st,w2.T)
#dzh/dw
dzhdw=X
#dah/dzh
dahdzh=sigmoid(a_h,deriv=True)
fs=dEdah*dahdzh
dEdw1=np.dot(dzhdw.T,fs)
#Weight Update
w1=w1-(eta*dEdw1)
print(w1)
print(w2)
#testing final output
test_a_h=sigmoid(np.dot(X,w1));
prediction=sigmoid(np.dot(test_a_h,w2))
print(prediction)
0 comments:
Post a Comment