নিউরাল নেটওয়ার্ক প্রশিক্ষণের জন্য অত্যন্ত ছোট বা NAN মানগুলি উপস্থিত হয়


328

আমি হাস্কেলে একটি নিউরাল নেটওয়ার্ক আর্কিটেকচার বাস্তবায়ন করার চেষ্টা করছি এবং এটি এমএনআইএসটিতে ব্যবহার করব।

আমি 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 কেবলমাত্র একটি ক্ষতির ফাংশন এবং এর ডেরাইভেটিভ বান্ডিল করে (আউটপুট স্তরের বদ্বীপ গণনা করার জন্য)

কোডের বাকি অংশটি গিটহাব: নিউরাল নেট ওয়ার্কে রয়েছে

সুতরাং, যদি কারও সমস্যাটির অন্তর্দৃষ্টি থাকে, বা কেবল একটি বিচক্ষণতা যাচাই করে নিন যে আমি সঠিকভাবে অ্যালগরিদমটি প্রয়োগ করছি, আমি কৃতজ্ঞ হব।


17
ধন্যবাদ, আমি এটি খতিয়ে দেখব। তবে আমি এটি স্বাভাবিক আচরণ বলে মনে করি না। আমি যতদূর জানি, আমি যা করার চেষ্টা করছি তার অন্যান্য বাস্তবায়ন (হাস্যেল বা অন্যান্য ভাষায়, সাধারণ ফিডফর্ডার পুরোপুরি সংযুক্ত নিউরাল নেটওয়ার্ক) এটি করছে বলে মনে হয় না।
চার্লস ল্যাংলোইস

17
@ চার্লস: আপনি কি অন্যান্য বাস্তবায়নের সাথে আপনার নিজস্ব নেটওয়ার্ক এবং ডেটা সেটগুলি চেষ্টা করে দেখেছেন? আমার নিজের অভিজ্ঞতায়, বিপি সহজেই দুর্গন্ধে চলে যাবে যখন এনএন সমস্যার সাথে উপযুক্ত হবে না। আপনার বিপি প্রয়োগের বিষয়ে যদি সন্দেহ থাকে তবে আপনি এর আউটপুটটিকে একটি নিখুঁত গ্রেডিয়েন্ট গণনার সাথে তুলনা করতে পারেন (অবশ্যই একটি খেলনা-আকারের এনএন এর চেয়ে বেশি) - যা বিপি থেকে ভুল হওয়া সহজ।
shinobi

4
এমএনআইএসটি সাধারণত শ্রেণিবিন্যাসের সমস্যা নয়? কেন আপনি এমইএস ব্যবহার করছেন? আপনার সফটম্যাক্স ক্রসসেন্ট্রপি ব্যবহার করা উচিত (লগইটগুলি থেকে গণনা করা হয়) না?
mdaoust

6
@ চারলেস ল্যাংলোইস, এটি আপনার সমস্যা নাও হতে পারে (আমি কোডটি পড়তে পারি না) তবে "বর্গাকার ত্রুটি" বলতে কোনও শ্রেণিবদ্ধকরণ সমস্যার জন্য উত্তল নয়, যা আটকে যাওয়ার ব্যাখ্যা দিতে পারে। ব্যবহার করুন: "logits" শুধু একটি অভিনব উপায় লগ-মতভেদ বলতে হয় ce = x_j - log(sum_i(exp(x)))হিসাব এখান থেকে তাই আপনি সূচকীয় লগ (যা প্রায়ই Nans উত্পন্ন) গ্রহণ না
mdaoust

6
অভিনব বা গৃহীত উত্তর ছাড়াই সর্বোচ্চ ভোট প্রাপ্ত প্রশ্নে (জানুয়ারী '2020) হিসাবে অভিনন্দন !
হংসসি

উত্তর:


2

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

আপনি যদি এই ফাংশনের প্লটটি দেখেন তবে আপনি দেখতে পাবেন যে এই ফাংশনের গ্রেডিয়েন্টটি প্রান্তে প্রায় 0 রয়েছে (ইনপুট মানগুলি খুব বড় বা খুব ছোট হয়ে যায় কারণ বক্ররের opeাল প্রায় সমতল হয়), সুতরাং গুণক বা বিভাজক এর মাধ্যমে ব্যাকপ্রসারণের সময় খুব বড় বা খুব কম সংখ্যক ফলাফল হয়। আপনি একাধিক স্তর পেরিয়ে যাওয়ার সময় বারবার এটি করার ফলে অ্যাক্টিভেশনগুলি শূন্য বা অনন্তের কাছে পৌঁছায়। যেহেতু ব্যাকপ্রপ প্রশিক্ষণ চলাকালীন এটি করে আপনার ওজনগুলি আপডেট করে, তাই আপনি আপনার নেটওয়ার্কে প্রচুর শূন্য বা ইনফিনটিজ নিয়ে শেষ করেন।

সমাধান: অদৃশ্য গ্রেডিয়েন্ট সমস্যা সমাধানের জন্য আপনি অনুসন্ধান করতে পারেন এমন অনেকগুলি পদ্ধতি রয়েছে তবে চেষ্টা করার একটি সহজ বিষয় আপনি অ-স্যাচুরেটিংয়ের সাথে ব্যবহার করছেন এমন অ্যাক্টিভেশন ফাংশনের ধরণটি পরিবর্তন করা। ReLU একটি জনপ্রিয় পছন্দ কারণ এটি এই নির্দিষ্ট সমস্যাটি হ্রাস করে (তবে অন্যকে পরিচয় করিয়ে দিতে পারে)।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.