शुरुआती रोक के लिए कौन से मापदंडों का उपयोग किया जाना चाहिए?


97

मैं अपने प्रोजेक्ट के लिए केरस का उपयोग करके एक तंत्रिका नेटवर्क का प्रशिक्षण दे रहा हूं केरस ने शुरुआती रोक के लिए एक समारोह प्रदान किया है। क्या मुझे पता है कि मेरे तंत्रिका नेटवर्क को जल्दी रोकने का उपयोग करके ओवरफिटिंग से बचने के लिए कौन से मापदंडों का पालन करना चाहिए?

जवाबों:


157

जल्दी रुकना

एक बार जब आपका नुकसान बढ़ना शुरू हो जाता है (या दूसरे शब्दों में सत्यापन सटीकता कम होने लगती है) तो शुरुआती रोक मूल रूप से प्रशिक्षण को रोकती है। दस्तावेजों के अनुसार इसका उपयोग निम्नानुसार किया जाता है;

keras.callbacks.EarlyStopping(monitor='val_loss',
                              min_delta=0,
                              patience=0,
                              verbose=0, mode='auto')

मान आपके कार्यान्वयन (समस्या, बैच आकार आदि ...) पर निर्भर करता है, लेकिन आम तौर पर ओवरफिटिंग को रोकने के लिए मैं उपयोग करता हूं;

  1. monitor तर्क हानि की निगरानी करें ( तर्क को पार करने के लिए क्रॉस सत्यापन या कम से कम ट्रेन / परीक्षण सेट का उपयोग करने की आवश्यकता है) 'val_loss'
  2. min_deltaसुधार के रूप में कुछ युगों में नुकसान की मात्रा निर्धारित करना है या नहीं, इसकी एक सीमा है। यदि नुकसान का अंतर नीचे है min_delta, तो इसे बिना किसी सुधार के निर्धारित किया जाता है। जब नुकसान कम हो जाता है, तो हम इसे 0 के रूप में छोड़ना बेहतर समझते हैं।
  3. patienceतर्क यह बताने से पहले कि आपका नुकसान बढ़ना शुरू हो जाता है (सुधार करना बंद कर देता है) रुकने से पहले युगों की संख्या का प्रतिनिधित्व करता है। यह आपके कार्यान्वयन पर निर्भर करता है, यदि आप बहुत छोटे बैचों या एक बड़े सीखने की दर का उपयोग करते हैं तो आपका नुकसान जिग-ज़ैग (सटीकता अधिक शोर होगा) इतना बेहतर है कि एक बड़ा patienceतर्क सेट करें । यदि आप बड़े बैचों और एक छोटे से सीखने की दर का उपयोग करते हैं तो आपका नुकसान कम हो जाएगा, इसलिए आप एक छोटे patienceतर्क का उपयोग कर सकते हैं । किसी भी तरह से मैं इसे 2 के रूप में छोड़ दूंगा ताकि मैं मॉडल को अधिक मौका दूं।
  4. verbose क्या प्रिंट करना है, यह तय करना (डिफ़ॉल्ट) पर।
  5. modeतर्क इस बात पर निर्भर करता है कि आपकी निगरानी की गई मात्रा किस दिशा में है (क्या घटने या बढ़ने वाली है), चूंकि हम नुकसान की निगरानी करते हैं, इसलिए हम इसका उपयोग कर सकते हैं min। लेकिन चलो हमारे लिए किर्स को संभालते हैं और इसे सेट करते हैंauto

तो मैं इस तरह से कुछ का उपयोग करेगा और जल्दी रोक के साथ और बिना त्रुटि हानि की साजिश रचकर प्रयोग करूंगा।

keras.callbacks.EarlyStopping(monitor='val_loss',
                              min_delta=0,
                              patience=2,
                              verbose=0, mode='auto')

कॉलबैक कैसे काम करता है, इस पर संभावित अस्पष्टता के लिए, मैं और अधिक समझाने की कोशिश करूँगा। एक बार जब आप fit(... callbacks=[es])अपने मॉडल पर कॉल करते हैं, तो केरस कॉलबैक ऑब्जेक्ट्स को पूर्व निर्धारित कार्यों को कॉल करता है। इन कार्यों कहा जा सकता है on_train_begin, on_train_end, on_epoch_begin, on_epoch_endऔर on_batch_begin, on_batch_end। प्रारंभिक रोक कॉलबैक को प्रत्येक युग के अंत में कहा जाता है, वर्तमान एक के साथ सर्वोत्तम मॉनिटर किए गए मूल्य की तुलना करता है और अगर स्थिति पूरी हो जाती है तो रुक जाता है (सर्वोत्तम निगरानी मूल्य के अवलोकन के बाद से कितने युग अतीत हैं और क्या यह धैर्य तर्क से अधिक है, के बीच का अंतर अंतिम मान min_delta आदि से बड़ा है ..)।

जैसा कि टिप्पणियों में @BrentFaust द्वारा बताया गया है, मॉडल का प्रशिक्षण तब तक जारी रहेगा जब तक या तो प्रारंभिक शर्तें पूरी नहीं हो जाती हैं या epochsपैरामीटर (डिफ़ॉल्ट = 10) fit()संतुष्ट है। अर्ली स्टॉपिंग कॉलबैक सेट करने से मॉडल को उसके epochsपैरामीटर से परे प्रशिक्षण नहीं मिलेगा । इसलिए fit()एक बड़े epochsमूल्य के साथ कॉलिंग फ़ंक्शन को शुरुआती स्टॉपबैक कॉलबैक से अधिक लाभ होगा।


3
@AizuddinAzman नज़दीक, min_deltaयह एक सीमा है कि निगरानी मूल्य में सुधार को सुधार के रूप में निर्धारित किया जाए या नहीं। हां, अगर हम देते हैं monitor = 'val_loss'तो यह वर्तमान सत्यापन हानि और पिछले सत्यापन हानि के बीच अंतर को संदर्भित करेगा। व्यवहार में, यदि आप min_delta=0.1सत्यापन हानि में कमी देते हैं (वर्तमान - पिछले) 0.1 से छोटा तो मात्रा निर्धारित नहीं होगा, इस प्रकार प्रशिक्षण बंद हो जाएगा (यदि आपके पास है patience = 0)।
umutto

3
ध्यान दें कि callbacks=[EarlyStopping(patience=2)]कोई प्रभाव नहीं है, जब तक कि युगों को नहीं दिया जाता है model.fit(..., epochs=max_epochs)
ब्रेंट फस्ट

1
@BrentFaust मेरी समझ में भी यही है, मैंने इस धारणा पर जवाब लिखा है कि मॉडल को कम से कम 10 युगों (डिफ़ॉल्ट रूप से) के साथ प्रशिक्षित किया जा रहा है। आपकी टिप्पणी के बाद, मैंने महसूस किया है कि ऐसा कोई मामला हो सकता है कि प्रोग्रामर epoch=1एक लूप के लिए (विभिन्न उपयोग के मामलों के लिए) फिट हो रहा है जिसमें यह कॉलबैक विफल हो जाएगा। अगर मेरे जवाब में अस्पष्टता है, तो मैं इसे बेहतर तरीके से पेश करने की कोशिश करूंगा।
umutto

4
@AdmiralWen जब से मैंने उत्तर लिखा है, कोड थोड़ा बदल गया है। यदि आप केरस के नवीनतम संस्करण का उपयोग कर रहे हैं, तो आप restore_best_weightsतर्क का उपयोग कर सकते हैं (अभी तक प्रलेखन पर नहीं), जो प्रशिक्षण के बाद सर्वश्रेष्ठ भार के साथ मॉडल को लोड करता है। लेकिन, आपके उद्देश्यों के लिए मैं तर्क के ModelCheckpointसाथ कॉलबैक का उपयोग करूंगा save_best_only। आप दस्तावेज़ीकरण की जांच कर सकते हैं, यह उपयोग करने के लिए सीधे आगे है लेकिन आपको प्रशिक्षण के बाद सर्वश्रेष्ठ भार को मैन्युअल रूप से लोड करने की आवश्यकता है।
umutto

1
@umutto पुनर्स्थापना के सुझाव के लिए धन्यवाद Hello_best_weights, हालाँकि मैं इसका उपयोग करने में असमर्थ हूं, `es = EarlyStopping (मॉनिटर = 'val_acc', min_delta = 1e-4, धैर्य / patience_, verbose = 1, Restore_best_weights = True) TypeError: __init __ () को एक अप्रत्याशित कीवर्ड तर्क 'Restore_best_weights'` मिला। कोई विचार? keras 2.2.2, tf, 1.10 आपका संस्करण क्या है?
हरमोज़
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.