আমি হাস্কেলে একটি নিউরাল নেটওয়ার্ক আর্কিটেকচার বাস্তবায়ন করার চেষ্টা করছি এবং এটি এমএনআইএসটিতে ব্যবহার করব।
আমি hmatrix
লিনিয়ার বীজগণিতের জন্য প্যাকেজটি ব্যবহার করছি । আমার প্রশিক্ষণের কাঠামোটি pipes
প্যাকেজটি ব্যবহার করে নির্মিত ।
আমার কোড সংকলন করে এবং ক্রাশ হয় না। তবে সমস্যাটি হ'ল স্তর আকারের কিছু সংমিশ্রণ (বলুন, 1000), মিনিব্যাচের আকার এবং শেখার হার NaN
গণনাগুলিতে মানগুলিকে জন্ম দেয় । কিছু পরিদর্শন করার পরে, আমি দেখতে পাচ্ছি যে চূড়ান্তভাবে খুব ছোট মান (ক্রম 1e-100
) ক্রিয়াকলাপে প্রদর্শিত হয়। কিন্তু, এমনকি যখন এটি ঘটে না, প্রশিক্ষণ এখনও কার্যকর হয় না। এর ক্ষতি বা নির্ভুলতার তুলনায় কোনও উন্নতি হয়নি।
আমি আমার কোডটি যাচাই করে দেখেছি এবং যাচাই করেছিলাম এবং সমস্যার মূলটি কী হতে পারে তা নিয়ে আমি ক্ষতিতে আছি।
এখানে ব্যাকপ্রোপ্যাগেশন প্রশিক্ষণ দেওয়া হয়েছে, যা প্রতিটি স্তরের জন্য ডেল্টাকে গণনা করে:
backward lf n (out,tar) das = do
let δout = tr (derivate lf (tar, out)) -- dE/dy
deltas = scanr (\(l, a') δ ->
let w = weights l
in (tr a') * (w <> δ)) δout (zip (tail $ toList n) das)
return (deltas)
lf
ক্ষতির ফাংশনটি n
হ'ল নেটওয়ার্ক ( প্রতিটি স্তরের weight
ম্যাট্রিক্স এবং bias
ভেক্টর), out
এবং tar
নেটওয়ার্কের আসল আউটপুট এবং target
(পছন্দসই) আউটপুট এবং das
প্রতিটি স্তরের অ্যাক্টিভেশন ডেরিভেটিভস।
ব্যাচ মোডে, out
, tar
ম্যাট্রিক্স (সারি আউটপুট ভেক্টর হয়), এবং das
ম্যাট্রিক্সের একটি তালিকা রয়েছে।
এখানে আসল গ্রেডিয়েন্ট গণনা:
grad lf (n, (i,t)) = do
-- Forward propagation: compute layers outputs and activation derivatives
let (as, as') = unzip $ runLayers n i
(out) = last as
(ds) <- backward lf n (out, t) (init as') -- Compute deltas with backpropagation
let r = fromIntegral $ rows i -- Size of minibatch
let gs = zipWith (\δ a -> tr (δ <> a)) ds (i:init as) -- Gradients for weights
return $ GradBatch ((recip r .*) <$> gs, (recip r .*) <$> squeeze <$> ds)
এখানে, lf
এবং n
উপরের মত একই, i
ইনপুট, এবং t
লক্ষ্য আউটপুট (উভয় ব্যাচ আকারে, ম্যাট্রিক হিসাবে)।
squeeze
প্রতিটি সারির উপরে যোগ করে একটি ম্যাট্রিক্সকে ভেক্টরে রূপান্তরিত করে। এটি হ'ল ds
ডেল্টাসের ম্যাট্রিক্সের একটি তালিকা, যেখানে প্রতিটি কলামটি মিনিবাচের সারির জন্য ডেল্টাসের সাথে মিল রাখে। সুতরাং, পক্ষপাতদুষ্টদের গ্রেডিয়েন্টগুলি সমস্ত মিনিব্যাচের উপর ডেল্টাসের গড়। একই জিনিসটি gs
যা ওজনগুলির জন্য গ্রেডিয়েন্টগুলির সাথে সামঞ্জস্য করে।
আসল আপডেট কোডটি এখানে:
move lr (n, (i,t)) (GradBatch (gs, ds)) = do
-- Update function
let update = (\(FC w b af) g δ -> FC (w + (lr).*g) (b + (lr).*δ) af)
n' = Network.fromList $ zipWith3 update (Network.toList n) gs ds
return (n', (i,t))
lr
শিক্ষার হার। FC
এটি লেয়ার কনস্ট্রাক্টর এবং এটি লেয়ারটির af
অ্যাক্টিভেশন ফাংশন।
গ্রেডিয়েন্ট বংশদ্ভুত অ্যালগরিদম শিখার হারের জন্য একটি নেতিবাচক মান পাস করার বিষয়টি নিশ্চিত করে। গ্রেডিয়েন্ট বংশোদ্ভুতের জন্য আসল কোডটি কেবলমাত্র একটি প্যারামিটারাইজড স্টপ শর্ত সহ একটি রচনা grad
এবং একটি লুপ amove
অবশেষে, এখানে গড় বর্গ ত্রুটি ক্ষতির জন্য কোডটি এখানে রয়েছে:
mse :: (Floating a) => LossFunction a a
mse = let f (y,y') = let gamma = y'-y in gamma**2 / 2
f' (y,y') = (y'-y)
in Evaluator f f'
Evaluator
কেবলমাত্র একটি ক্ষতির ফাংশন এবং এর ডেরাইভেটিভ বান্ডিল করে (আউটপুট স্তরের বদ্বীপ গণনা করার জন্য)
কোডের বাকি অংশটি গিটহাব: নিউরাল নেট ওয়ার্কে রয়েছে ।
সুতরাং, যদি কারও সমস্যাটির অন্তর্দৃষ্টি থাকে, বা কেবল একটি বিচক্ষণতা যাচাই করে নিন যে আমি সঠিকভাবে অ্যালগরিদমটি প্রয়োগ করছি, আমি কৃতজ্ঞ হব।