प्रशिक्षण के दौरान नैन के सामान्य कारण


85

मैंने देखा है कि प्रशिक्षण के दौरान अक्सर होने वाली घटना NANको पेश किया जा रहा है।

अक्सर कई बार ऐसा लगता है कि यह इनर-प्रोडक्ट / फुल-कनेक्टेड या कनवल्शन लेयर्स में वज़न बढ़ा रहा है।

क्या ऐसा इसलिए हो रहा है क्योंकि ढाल की संगणना बह रही है? या यह वजन आरंभीकरण के कारण है (यदि हां, तो वजन आरंभीकरण का यह प्रभाव क्यों है)? या क्या यह इनपुट डेटा की प्रकृति के कारण होता है?

यहाँ अतिव्यापी प्रश्न बस है: प्रशिक्षण के दौरान नान के लिए सबसे आम कारण क्या है? और दूसरी बात, इसका मुकाबला करने के लिए कुछ तरीके क्या हैं (और वे काम क्यों करते हैं)?


क्या आप विशिष्ट MATLAB फ़ंक्शन कह रहे हैं? क्या यह सब आपका अपना कोड है?
मैथ्यू गन

2
@MatthewGun मुझे नहीं लगता कि यह सवाल मतलबी-विशिष्ट है, बल्कि इससे caffeसंबंधित है।
Shai

जवाबों:


134

अच्छा प्रश्न।
मुझे इस घटना के बारे में कई बार पता चला। यहाँ मेरी टिप्पणियों हैं:


धीरे-धीरे झटका

कारण: बड़े ग्रेडिएंट सीखने की प्रक्रिया को बंद कर देते हैं।

आपको क्या उम्मीद करनी चाहिए: रनटाइम लॉग को देखते हुए, आपको प्रति चलना नुकसान मानों को देखना चाहिए। आप ध्यान देंगे कि नुकसान की शुरुआत से पुनरावृत्ति में काफी वृद्धि होने लगती है , अंततः नुकसान एक अस्थायी बिंदु चर द्वारा प्रतिनिधित्व करने के लिए बहुत बड़ा होगा और यह बन जाएगा nan

आप क्या कर सकते हैं:base_lr (कम से कम) परिमाण के क्रम से (solver.prototxt में) घटाएं । यदि आपके पास कई नुकसान परतें हैं, तो आपको यह देखने के लिए लॉग का निरीक्षण करना चाहिए कि कौन सी परत ढाल के लिए जिम्मेदार है और loss_weightसामान्य के बजाय उस विशिष्ट परत के लिए (train_val.prototxt में) कमी करें base_lr


खराब सीखने की दर नीति और पारमेस

कारण: Caffe एक वैध सीखने दर की गणना करने में विफल रहता है और हो जाता है 'inf'या 'nan'बजाय, इस अवैध दर पलता सभी अद्यतन और इस प्रकार सभी मापदंडों अमान्य।

आपको क्या उम्मीद करनी चाहिए: रनटाइम लॉग को देखते हुए, आपको यह देखना चाहिए कि सीखने की दर स्वयं बन जाती है 'nan', उदाहरण के लिए:

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

आप क्या कर सकते हैं: अपनी 'solver.prototxt'फ़ाइल में सीखने की दर को प्रभावित करने वाले सभी मापदंडों को ठीक करें ।
उदाहरण के लिए, यदि आप उपयोग करते हैं lr_policy: "poly"और आप max_iterपैरामीटर को परिभाषित करना भूल जाते हैं , तो आप समाप्त कर देंगे lr = nan...
कैफ में सीखने की दर के बारे में अधिक जानकारी के लिए, यह धागा देखें ।


दोषपूर्ण नुकसान समारोह

कारण: कभी-कभी नुकसान परतों में नुकसान की गणना nanदिखाई देने लगती है। उदाहरण के लिए, InfogainLossगैर-सामान्यीकृत मूल्यों के साथ खिला परत , कीड़े के साथ कस्टम हानि परत का उपयोग करना, आदि।

आपको क्या उम्मीद करनी चाहिए: रनटाइम लॉग को देखते हुए आप शायद कुछ भी असामान्य नहीं देखेंगे: नुकसान धीरे-धीरे कम हो रहा है, और अचानक nanप्रकट होता है।

आप क्या कर सकते हैं: देखें कि क्या आप त्रुटि को पुन: उत्पन्न कर सकते हैं, हानि परत में प्रिंटआउट जोड़ें और त्रुटि को डीबग करें।

उदाहरण के लिए: एक बार जब मैंने एक नुकसान का उपयोग किया था जो एक बैच में लेबल घटना की आवृत्ति द्वारा जुर्माना को सामान्य करता है। यह सिर्फ इतना हुआ कि यदि प्रशिक्षण लेबल में से एक बैच में बिल्कुल भी प्रकट नहीं हुआ - नुकसान की गणना उत्पादित nanएस। उस स्थिति में, इस त्रुटि से बचने के लिए बड़े पर्याप्त बैचों (सेट में लेबल की संख्या के संबंध में) के साथ काम करना पर्याप्त था।


दोषपूर्ण इनपुट

कारण: आपके पास nanइसके साथ एक इनपुट है!

आपको क्या उम्मीद करनी चाहिए: एक बार सीखने की प्रक्रिया इस दोषपूर्ण इनपुट "हिट" के बाद - आउटपुट बन जाती है nan। रनटाइम लॉग को देखते हुए आप शायद कुछ भी असामान्य नहीं देखेंगे: नुकसान धीरे-धीरे कम हो रहा है, और अचानक nanप्रकट होता है।

आप क्या कर सकते हैं: अपने इनपुट डेटासेट (lmdb / leveldn / hdf5 ...) को फिर से बनाएं, सुनिश्चित करें कि आपके पास अपने प्रशिक्षण / सत्यापन सेट में खराब छवि फ़ाइलें नहीं हैं। डीबग के लिए आप एक साधारण नेट बना सकते हैं जो इनपुट लेयर को पढ़ता है, उसके ऊपर एक डमी लॉस होता है और सभी इनपुट्स के माध्यम से चलता है: यदि उनमें से एक दोषपूर्ण है, तो यह डमी नेट भी उत्पन्न होना चाहिए 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संख्यात्मक अस्थिरताओं के कारण उत्पादन हो सकता है ।
यह मुद्दा bvlc / caffe में उठाया गया था और PR # 5136 इसे ठीक करने का प्रयास कर रहा है।


हाल ही में, मैं के बारे में पता बन गया debug_infoझंडा: सेटिंग debug_info: trueमें 'solver.prototxt'प्रशिक्षण के दौरान अधिक डिबग जानकारी (ढाल परिमाण और सक्रियण मूल्यों सहित) लॉग इन करने के Caffe प्रिंट कर देगा: यह जानकारी कर सकते हैं प्रशिक्षण प्रक्रिया में ढाल blowups और अन्य समस्याओं खोलना में मदद


धन्यवाद, कोई उन नंबरों की व्याख्या कैसे करता है? ये नंबर क्या हैं? pastebin.com/DLYgXK5v प्रति परत उत्पादन में केवल एक संख्या क्यों है !? उन नंबरों को कैसे दिखना चाहिए ताकि किसी को पता चले कि कोई समस्या है या कोई नहीं है !?
रिका

@Hossein यह वही है जो इस पोस्ट के बारे में है।
शनि

इस उत्तर के लिए धन्यवाद। मैं एक छवि विभाजन अनुप्रयोग के लिए DICE हानि (यहां तक ​​कि एक छोटे एप्सिलॉन / चिकनाई निरंतर जोड़ने के बाद भी) के साथ एनएएन हानि प्राप्त कर रहा हूं। मेरे डेटासेट में कुछ छवियां हैं जिनकी संगत जमीनी सच्चाई है जिसमें कोई अग्रभूमि लेबल नहीं है और जब मैंने इन छवियों को प्रशिक्षण से हटा दिया, तो नुकसान स्थिर हो गया। मुझे यकीन नहीं है कि ऐसा क्यों है?
समरा इरशाद

@samrairshad क्या आपने DICE नुकसान में एप्सिलॉन को बढ़ाने की कोशिश की है?
शैई

हाँ, मैंने किया। मैंने स्टैक-ओवरफ़्लो पर पोस्ट खोला और कुछ युगों के लिए नुकसान के विकास को चिपकाया। यहाँ संदर्भ है: stackoverflow.com/questions/62259112/…
samra irshad

5

मेरे मामले में, सजा / विघटनकारी परतों में पूर्वाग्रह स्थापित नहीं करना इसका कारण था।

समाधान: कनवल्शन लेयर पैरामीटर्स में निम्नलिखित जोड़ें।

bias_filler {प्रकार: "स्थिर" मान: 0}


कैसे matconvnet में दिखेगा? मैं 'biases'.init_bias * वाले (1,4, एकल)
h612

4

यह उत्तर nans के लिए एक कारण के बारे में नहीं है , बल्कि इसे डीबग करने में मदद करने का एक तरीका प्रस्तावित करता है। आप इस अजगर परत हो सकता है:

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

Learning_rate उच्च है और इसे कम किया जाना चाहिए। RNN कोड में सटीकता नैन थी, सीखने की दर के लिए निम्न मान का चयन करता है जो इसे ठीक करता है


-1

मैं एक विरल ऑटोकेनोडर बनाने की कोशिश कर रहा था और इसमें कई परतें थीं ताकि स्पार्सिटी को प्रेरित किया जा सके। अपना नेट चलाते समय, मैंने NaN का सामना किया। कुछ परतों को हटाने पर (मेरे मामले में, मुझे वास्तव में 1 को हटाना था), मैंने पाया कि NaN गायब हो गया। तो, मुझे लगता है कि बहुत अधिक विरलता NaN के रूप में अच्छी तरह से हो सकती है (कुछ 0/0 कम्प्यूटेशंस को लागू किया जा सकता है!)


क्या आप थोड़ा और स्पष्ट कर सकते हैं? क्या आप उस कॉन्फ़िगरेशन पर विवरण प्रदान कर सकते हैं nanजो निश्चित कॉन्फ़िगरेशन और निश्चित कॉन्फ़िगरेशन था? किस प्रकार की परतें? क्या मापदंडों?
Shai

1
@ सहाई मैंने कई इनर प्रॉडक्ट (lr_mult 1, decay_mult 1, lr_mult 2, decay_mult 0, xavier, std: 0.01) परतों का उपयोग किया था, जिनमें से प्रत्येक ReLU द्वारा पीछा किया गया था (पिछले एक को छोड़कर)। मैं MNIST के साथ काम कर रहा था, और अगर मुझे सही याद है, तो आर्किटेक्चर 784 था -> 1000 -> 500 -> 250 -> 100 -> 30 (और एक सममित डिकोडर चरण); 30 परत को हटाने के साथ-साथ उसके ReLU ने NaN को गायब कर दिया।
LKB
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.