প্রশিক্ষণের সময় ন্যানের সাধারণ কারণ


86

আমি লক্ষ্য করেছি যে প্রশিক্ষণের সময় ঘন ঘন ঘটনাটি NANচালু হচ্ছে।

প্রায়শই মনে হয় এটি অভ্যন্তরীণ পণ্য / সম্পূর্ণরূপে সংযুক্ত বা সমঝোতার স্তরগুলিতে ওজন দ্বারা প্রবর্তিত হয়।

গ্রেডিয়েন্ট গণনাটি ফুঁকছে বলে এটি কি ঘটছে? বা এটি ওজন সূচনা করার কারণে (যদি তা হয় তবে ওজন সূচনা কেন কার্যকর হয়)? অথবা এটি সম্ভবত ইনপুট ডেটার প্রকৃতির কারণে ঘটে?

এখানে বহুল আলোচিত প্রশ্নটি কেবল: প্রশিক্ষণ চলাকালীন ন্যানদের সবচেয়ে সাধারণ কারণটি কী? এবং দ্বিতীয়ত, এটির বিরুদ্ধে লড়াই করার জন্য কিছু পদ্ধতি কী (এবং কেন তারা কাজ করে)?


আপনি কি নির্দিষ্ট ম্যাটল্যাব ফাংশন কল করছেন? এটি কি আপনার নিজের কোড?
ম্যাথু গন

4
@ ম্যাথেজগান আমি এই প্রশ্নটি মাতলাব-নির্দিষ্ট বলে মনে করি না, বরং caffeসম্পর্কিত।
শাই

উত্তর:


137

ভাল প্রশ্ন.
আমি এই ঘটনাটি বেশ কয়েকবার এসেছি। আমার পর্যবেক্ষণগুলি এখানে:


ধীরে ধীরে ধাক্কা

কারণ: বৃহত্তর গ্রেডিয়েন্টগুলি শেখার প্রক্রিয়াটিকে অফ ট্র্যাক করে ফেলেছে।

আপনার যা প্রত্যাশা করা উচিত: রানটাইম লগটি দেখে আপনার প্রতি-পুনরাবৃত্তির লোকসানের মানগুলি লক্ষ্য করা উচিত। আপনি লক্ষ্য করবেন যে ক্ষতিটি পুনরাবৃত্তি থেকে পুনরাবৃত্তির দিকে উল্লেখযোগ্যভাবে বৃদ্ধি পেতে শুরু করে , অবশেষে ক্ষতিটি ভাসমান পয়েন্ট ভেরিয়েবলের দ্বারা প্রতিনিধিত্ব করতে খুব বড় হবে এবং এটি হয়ে যাবে nan

আপনি কি করতে পারেন কি: কমান base_lrমাত্রার একটি আদেশ দ্বারা (solver.prototxt মধ্যে) (কমপক্ষে)। আপনার যদি বেশ কয়েকটি ক্ষতি স্তর রয়েছে তবে আপনার লগটি পরীক্ষা করে দেখতে হবে যে কোন স্তরটি গ্রেডিয়েন্ট ব্লো আপের জন্য দায়বদ্ধ এবং loss_weightসাধারণের পরিবর্তে সেই নির্দিষ্ট স্তরটির (ট্রেন_ওয়াল.প্রোটটেক্সটে) হ্রাস করতে পারে base_lr


খারাপ শিক্ষার হার নীতি এবং প্যারাম

কারণ: ক্যাফে একটি বৈধ শেখার হার গণনা করতে ব্যর্থ হয় এবং পায় 'inf'বা 'nan'পরিবর্তে, এই অবৈধ হারটি সমস্ত আপডেটকে গুণিত করে এবং এইভাবে সমস্ত পরামিতিগুলিকে অবৈধ করে দেয়।

আপনার যা প্রত্যাশা করা উচিত: রানটাইম লগটি দেখে আপনার দেখা উচিত যে শিক্ষার হারটি নিজেই হয়ে যায় 'nan', উদাহরণস্বরূপ:

... sgd_solver.cpp:106] Iteration 0, lr = -nan

আপনি কী করতে পারেন: আপনার 'solver.prototxt'ফাইলটিতে শিক্ষার হারকে প্রভাবিত করে সমস্ত পরামিতি ঠিক করুন।
উদাহরণস্বরূপ, আপনি যদি ব্যবহার করেন lr_policy: "poly"এবং আপনি max_iterপ্যারামিটার সংজ্ঞা দিতে ভুলে যান তবে আপনি শেষ করবেন lr = nan...
ক্যাফেতে শিক্ষার হার সম্পর্কে আরও তথ্যের জন্য, এই থ্রেডটি দেখুন


ত্রুটিযুক্ত ক্ষতি ফাংশন

কারণ: কখনও কখনও ক্ষতির স্তরগুলিতে ক্ষতির গণনাগুলি nanউপস্থিত হওয়ার কারণ হয়। উদাহরণস্বরূপ, InfogainLossঅ-নর্মালাইজড মান সহ লেয়ারকে খাওয়ানো , বাগগুলি সহ কাস্টম লস লেয়ার ব্যবহার করে etc.

আপনার যা প্রত্যাশা করা উচিত: রানটাইম লগের দিকে তাকালে আপনি সম্ভবত অস্বাভাবিক কিছু দেখতে পাবেন না: ক্ষতি ধীরে ধীরে হ্রাস পাচ্ছে এবং হঠাৎ হঠাৎ nanউপস্থিত হবে।

আপনি কী করতে পারেন: দেখুন আপনি ত্রুটিটি পুনরুত্পাদন করতে পারেন, ক্ষতি স্তরটিতে প্রিন্ট আউট যুক্ত করতে এবং ত্রুটিটি ডিবাগ করতে পারেন।

উদাহরণস্বরূপ: একবার আমি কোনও ব্যাচের লেবেল উপস্থিতির ফ্রিকোয়েন্সি দ্বারা পেনাল্টিকে সাধারণীকরণের ক্ষতি ব্যবহার করেছিলাম। এটি ঠিক তাই ঘটেছিল যে কোনও প্রশিক্ষণ লেবেল যদি ব্যাচে মোটেও হাজির না হন - লোকসানের পরিমাণ গণনা করা nan। সেক্ষেত্রে এই ত্রুটিটি এড়াতে যথেষ্ট পর্যাপ্ত বড় ব্যাচ (সেটে লেবেলের সংখ্যার সাথে সম্মতি রেখে) কাজ করা যথেষ্ট ছিল।


ত্রুটিযুক্ত ইনপুট

কারণ:nan এটিতে আপনার একটি ইনপুট রয়েছে !

আপনার কী প্রত্যাশা করা উচিত: একবার শেখার প্রক্রিয়াটি "হিট" করে এই ত্রুটিযুক্ত ইনপুট - আউটপুট হয়ে যায় nan। রানটাইম লগটি দেখে আপনি সম্ভবত অস্বাভাবিক কিছু দেখতে পাবেন না: ধীরে ধীরে লোকসান হ্রাস পাচ্ছে এবং হঠাৎ হঠাৎ করেই nanউপস্থিত হবে।

আপনি কী করতে পারেন: আপনার ইনপুট ডেটাসেটগুলি পুনরায় তৈরি করুন (lmdb / leveldn / hdf5 ...) আপনার প্রশিক্ষণ / বৈধতা সেটটিতে খারাপ চিত্র ফাইল নেই তা নিশ্চিত করুন make ডিবাগের জন্য আপনি একটি সহজ নেট তৈরি করতে পারেন যা ইনপুট স্তরটি পড়ে, তার উপরে একটি ডামি ক্ষতি রয়েছে এবং সমস্ত ইনপুটগুলি দিয়ে চলে: যদি তাদের মধ্যে কোনওটি ত্রুটিযুক্ত থাকে তবে এই ডামি নেটও তৈরি করা উচিত nan


"Pooling"স্তরে কার্নেলের আকারের চেয়ে বড় স্ট্রাইড

কোনও কারণে, পুলিংয়ের জন্য stride> নির্বাচন করা kernel_sizeফলাফলগুলি এর সাথে ফলাফল দিতে পারে nan। উদাহরণ স্বরূপ:

layer {
  name: "faulty_pooling"
  type: "Pooling"
  bottom: "x"
  top: "y"
  pooling_param {
    pool: AVE
    stride: 5
    kernel: 3
  }
}

সঙ্গে ফলাফল nanমধ্যে গুলি y


মধ্যে অক্ষমতা "BatchNorm"

এটি প্রতিবেদন করা হয়েছিল যে কয়েকটি সেটিংসের অধীনে সংখ্যার অস্থিরতার কারণে "BatchNorm"স্তর আউটপুট nanগুলি করে।
এই সমস্যাটি বিভিএলসি / ক্যাফেতে উত্থাপিত হয়েছিল এবং PR # 5136 এটি সংশোধন করার চেষ্টা করছে।


সম্প্রতি, আমি সচেতন হয়ে ওঠে debug_infoপতাকা: সেটিং debug_info: trueমধ্যে 'solver.prototxt'প্রশিক্ষণের সময় আরো ডিবাগ তথ্য (গ্রেডিয়েন্ট মাত্রার এবং অ্যাক্টিভেশন মান সহ) লগ ইন করার Caffe মুদ্রণ করতে হবে: এই তথ্য সম্পর্কে জানতে পারবেন প্রশিক্ষণ প্রক্রিয়ায় গ্রেডিয়েন্ট blowups এবং অন্যান্য সমস্যা spotting সাহায্য


ধন্যবাদ, কেউ কীভাবে এই সংখ্যাগুলি ব্যাখ্যা করে? এই সংখ্যাগুলি কি? পেস্টবিন.com/ডিএলওয়াইজিএক্সকে 5 ভি কেন লেয়ার আউটপুট প্রতি মাত্র এক নম্বর আছে !? এই সংখ্যাগুলি কীভাবে এমন হওয়া উচিত যাতে কেউ জানতে পারে যে সমস্যা আছে বা কোনও সমস্যা নেই !?
রিকা

@ হোসেইন এই পোস্টটি সম্পর্কে ঠিক ঠিক এটিই ।
শাই

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

@ সমীরশাদ আপনি কি ডাইস ক্ষতির ক্ষেত্রে এপসিলন বাড়ানোর চেষ্টা করেছেন?
শাই

হ্যা, আমি করেছিলাম. আমি স্ট্যাক-ওভারফ্লোতে পোস্টটি খুললাম এবং কিছু যুগের জন্য লোকসানের বিবর্তনটি পেস্ট করেছি। রেফারেন্সটি এখানে: স্ট্যাকওভারফ্লো.com / প্রশ্নগুলি / 62259112/…
সামরা ইরশাদ

5

আমার ক্ষেত্রে, কনভলিউশন / ডিকনভোলিউশন স্তরগুলিতে পক্ষপাত স্থাপন না করা কারণ ছিল।

সমাধান: কনভোলশন স্তর পরামিতিগুলির সাথে নিম্নলিখিতগুলি যুক্ত করুন।

বায়াস_ফিলার {প্রকার: "ধ্রুবক" মান: 0


কীভাবে ম্যাটকোভনেটে দেখবে? আমি 'বায়াসেস'.init_bias * এর মতো কিছু পেয়েছি (1,4, একক)
এইচ 612

4

এই উত্তরটি কোনও কারণ সম্পর্কে নয় nan, বরং এটি ডিবাগ করার জন্য সহায়তা করার একটি উপায় প্রস্তাব করে। আপনার এই অজগর স্তরটি থাকতে পারে:

class checkFiniteLayer(caffe.Layer):
  def setup(self, bottom, top):
    self.prefix = self.param_str
  def reshape(self, bottom, top):
    pass
  def forward(self, bottom, top):
    for i in xrange(len(bottom)):
      isbad = np.sum(1-np.isfinite(bottom[i].data[...]))
      if isbad>0:
        raise Exception("checkFiniteLayer: %s forward pass bottom %d has %.2f%% non-finite elements" %
                        (self.prefix,i,100*float(isbad)/bottom[i].count))
  def backward(self, top, propagate_down, bottom):
    for i in xrange(len(top)):
      if not propagate_down[i]:
        continue
      isf = np.sum(1-np.isfinite(top[i].diff[...]))
        if isf>0:
          raise Exception("checkFiniteLayer: %s backward pass top %d has %.2f%% non-finite elements" %
                          (self.prefix,i,100*float(isf)/top[i].count))

আপনার train_val.prototxtসন্দেহ হওয়া নির্দিষ্ট পয়েন্টগুলিতে আপনার এই স্তরটি যুক্ত করা সমস্যার কারণ হতে পারে:

layer {
  type: "Python"
  name: "check_loss"
  bottom: "fc2"
  top: "fc2"  # "in-place" layer
  python_param {
    module: "/path/to/python/file/check_finite_layer.py" # must be in $PYTHONPATH
    layer: "checkFiniteLayer"
    param_str: "prefix-check_loss" # string for printouts
  }
}


-1

আমি একটি স্পার্স অটোরকোডার তৈরি করার চেষ্টা করছিলাম এবং এতে স্পারসিটি প্ররোচিত করার জন্য এতে কয়েকটি স্তর ছিল। আমার নেট চালানোর সময়, আমি NaN এর মুখোমুখি হয়েছিলাম। কিছু স্তর মুছে ফেলার সময় (আমার ক্ষেত্রে, আমাকে আসলে 1 টি সরিয়ে ফেলতে হয়েছিল), আমি দেখতে পেলাম যে এনএএনগুলি অদৃশ্য হয়ে গেছে। সুতরাং, আমি অনুমান করি যে খুব বেশি স্বল্পতা NaN এর দিকেও ডেকে আনতে পারে (কিছু ০.০ গণনা কল করা যেতে পারে !?)


আপনি কি আরও কিছু নির্দিষ্ট হতে পারেন? আপনি কি কনফিগারেশন nanএবং স্থির কনফিগারেশন সম্পর্কে বিশদ সরবরাহ করতে পারেন ? কি ধরনের স্তর? কি পরামিতি?
শাই

4
@ শাই আমি বেশ কয়েকটি ইনার প্রোডাক্ট ব্যবহার করেছি (lr_mult 1, ক্ষয়_মল্ট 1, lr_mult 2, ক্ষয়_মল্ট 0, জ্যাভিয়ার, স্ট্যান্ড: 0.01) প্রতিটি স্তরগুলি অনুসরণ করে ReLU (শেষটি ব্যতীত)। আমি এমএনআইএসটির সাথে কাজ করছিলাম, এবং আমি যদি সঠিকভাবে মনে করি তবে আর্কিটেকচারটি ছিল 784 -> 1000 -> 500 -> 250 -> 100 -> 30 (এবং একটি প্রতিসাম্হিক ডিকোডার পর্ব); 30 টি স্তরটি অপসারণের সাথে এর আরএলইউ NaN এর অদৃশ্য হয়ে গেছে।
LKB
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.