मुझे इस मुद्दे के बारे में यहां और यहां दो प्रश्न मिले लेकिन अभी तक कोई स्पष्ट उत्तर या स्पष्टीकरण नहीं है। मैं उसी समस्या को लागू करता हूं जहां सत्यापन त्रुटि मेरे रूपांतरण तंत्रिका नेटवर्क में प्रशिक्षण त्रुटि से कम है। इसका क्या मतलब है?
मुझे इस मुद्दे के बारे में यहां और यहां दो प्रश्न मिले लेकिन अभी तक कोई स्पष्ट उत्तर या स्पष्टीकरण नहीं है। मैं उसी समस्या को लागू करता हूं जहां सत्यापन त्रुटि मेरे रूपांतरण तंत्रिका नेटवर्क में प्रशिक्षण त्रुटि से कम है। इसका क्या मतलब है?
जवाबों:
आपकी वास्तविक कार्यप्रणाली (जैसे क्रॉस-वैधीकरण विधि, प्रदर्शन मीट्रिक, डेटा विभाजन विधि, आदि) को जाने बिना कुछ निश्चित होना मुश्किल है।
आम तौर पर हालांकि, प्रशिक्षण त्रुटि लगभग हमेशा आपकी सत्यापन त्रुटि को कम करती है । हालांकि यह सत्यापन त्रुटि के लिए प्रशिक्षण से कम होना संभव है। आप इसके दो तरीके सोच सकते हैं:
इसलिए यह महत्वपूर्ण है कि आप वास्तव में अपने मॉडल प्रशिक्षण पद्धति का मूल्यांकन करें। यदि आप प्रशिक्षण के लिए अपने डेटा को ठीक से विभाजित नहीं करते हैं, तो आपके परिणाम भ्रामक होंगे, यदि केवल गलत नहीं हैं, तो निष्कर्ष।
मुझे लगता है कि चार अलग-अलग श्रेणियों में मॉडल मूल्यांकन:
अंडरफिटिंग - मान्यता और प्रशिक्षण त्रुटि उच्च
ओवरफिटिंग - सत्यापन त्रुटि अधिक है, प्रशिक्षण त्रुटि कम है
अच्छा फिट - प्रशिक्षण त्रुटि की तुलना में कम त्रुटि, उच्चतर
अज्ञात फिट - मान्यता त्रुटि कम, प्रशिक्षण त्रुटि 'उच्च'
मैं कहता हूं कि 'अज्ञात' फिट है, क्योंकि परिणाम काउंटर सहज है कि मशीन सीखने कैसे काम करता है। एमएल का सार अज्ञात की भविष्यवाणी करना है। यदि आप अज्ञात से भविष्यवाणी करने में बेहतर हैं कि आपने क्या सीखा है, तो AFAIK प्रशिक्षण और सत्यापन के बीच का डेटा किसी न किसी तरह से अलग होना चाहिए। इसका मतलब यह हो सकता है कि आपको या तो अपने डेटा विभाजन विधि का पुनर्मूल्यांकन करने की आवश्यकता है, अधिक डेटा जोड़ने, या संभवतः अपना प्रदर्शन मीट्रिक बदल रहा है (क्या आप वास्तव में इच्छित प्रदर्शन को माप रहे हैं?)।
संपादित करें
पिछले अजगर अजगर प्रश्न के लिए ओपी के संदर्भ को संबोधित करने के लिए ।
इससे पता चलता है कि आपके पास क्रॉस-मान्यता की आवश्यकता नहीं होने के लिए पर्याप्त डेटा है और बस आपके प्रशिक्षण, सत्यापन और डेटा सबसेट का परीक्षण करना है। अब, यदि आप लेज़ेन ट्यूटोरियल को देखते हैं तो आप देख सकते हैं कि पृष्ठ के शीर्ष पर वही व्यवहार देखा जाता है। मुझे यह विश्वास करना मुश्किल होगा कि लेखक ऐसे परिणाम पोस्ट करेंगे यदि यह अजीब था, लेकिन केवल यह मानने के बजाय कि वे सही हैं, आइए आगे देखते हैं। हमारे यहां सबसे अधिक रुचि का खंड प्रशिक्षण पाश अनुभाग में है, नीचे से ऊपर आप देखेंगे कि नुकसान पैरामीटर की गणना कैसे की जाती है।
प्रशिक्षण नुकसान से अधिक गणना की जाती है पूरे प्रशिक्षण डाटासेट । इसी तरह, सत्यापन हानि की गणना पूरे सत्यापन डेटासेट पर की जाती है । प्रशिक्षण सेट आमतौर पर सत्यापन (80-20) के रूप में कम से कम 4 गुना बड़ा है। यह देखते हुए कि त्रुटि सभी नमूनों पर गणना की जाती है, आप सत्यापन सेट के नुकसान की माप लगभग 4X तक की उम्मीद कर सकते हैं। हालाँकि, आप देखेंगे कि प्रशिक्षण की हानि और सत्यापन हानि एक दूसरे के पास आ रहे हैं क्योंकि प्रशिक्षण जारी है। यह जानबूझकर किया जाता है जैसे कि आपकी प्रशिक्षण त्रुटि आपकी सत्यापन त्रुटि से कम होने लगती है, जिसे आप अपने मॉडल से अधिक करना शुरू कर देंगे !!!
मुझे उम्मीद है कि यह इन त्रुटियों को स्पष्ट करता है।
एक संभावना: यदि आप अपने नेटवर्क में ड्रॉपआउट नियमितिकरण परत का उपयोग कर रहे हैं, तो यह उचित है कि सत्यापन त्रुटि प्रशिक्षण त्रुटि से छोटी है। क्योंकि प्रशिक्षण के दौरान आमतौर पर ड्रॉपआउट सक्रिय होता है, लेकिन सत्यापन सेट पर मूल्यांकन करते समय निष्क्रिय हो जाता है। आपको बाद के मामले में एक अधिक चिकनी (आमतौर पर बेहतर अर्थ) फ़ंक्शन मिलता है।
मेरे पास @ DK के उत्तर पर टिप्पणी करने के लिए पर्याप्त अंक नहीं हैं, लेकिन यह अब केरस के प्रलेखन पर पूछे जाने वाले प्रश्न के रूप में उत्तर दिया गया है:
“प्रशिक्षण हानि परीक्षण के नुकसान से बहुत अधिक क्यों है?
एक केरस मॉडल में दो मोड होते हैं: प्रशिक्षण और परीक्षण। नियमितीकरण तंत्र, जैसे ड्रॉपआउट और एल 1 / एल 2 वजन नियमितीकरण, परीक्षण के समय बंद कर दिए जाते हैं।
इसके अलावा, प्रशिक्षण डेटा के प्रत्येक बैच पर प्रशिक्षण की हानि घाटे का औसत है। क्योंकि आपका मॉडल समय के साथ बदल रहा है, एक युग के पहले बैचों पर नुकसान आम तौर पर पिछले बैचों की तुलना में अधिक है। दूसरी ओर, एक युग के लिए परीक्षण नुकसान की गणना मॉडल का उपयोग करके की जाती है क्योंकि यह युग के अंत में होता है, जिसके परिणामस्वरूप कम नुकसान होता है। "
मेरे 2 सेंट: मुझे ड्रॉपआउट लेयर्स के बिना भी यही समस्या थी। मेरे मामले में - बैच-मानक परतें अपराधी थीं। जब मैंने उन्हें हटा दिया - प्रशिक्षण हानि सत्यापन हानि के समान हो गई। शायद, ऐसा इसलिए हुआ क्योंकि प्रशिक्षण के दौरान बैच-मान दिए गए इनपुट बैच के माध्य और विचरण का उपयोग करता है, जो कि बैच से बैच तक भिन्न हो सकता है। लेकिन मूल्यांकन के दौरान बैच-मान रनिंग माध्य और भिन्नता का उपयोग करता है, दोनों ही पूरे प्रशिक्षण के गुणों को दर्शाते हैं जो प्रशिक्षण के दौरान एकल बैच के माध्य और विचरण से बहुत बेहतर होते हैं। कम से कम, यह है कि कैसे पाइटोर्च में बैच-मान लागू किया गया है
एक और संभावना जो किसी तरह @cdeterman और @DK के उत्तर को जोड़ती है, यदि आप कुछ डेटा वृद्धि तंत्र का उपयोग कर रहे हैं। सटीक डेटा वृद्धि आमतौर पर केवल प्रशिक्षण सेट पर की जाती है और सत्यापन सेट (ड्रॉपआउट नियमितीकरण के लिए) पर नहीं होती है, और इससे प्रशिक्षण सेट में उन लोगों की तुलना में "आसान" मामलों वाले सत्यापन सेट हो सकते हैं।
@cdeterman और @DK की अच्छी व्याख्या है। मैं एक और कारण चाहूंगा - data leakage
। आपके ट्रेन-डेटा का कुछ हिस्सा परीक्षण-डेटा के साथ "बारीकी से संबंधित" है।
संभावित उदाहरण: कल्पना करें कि आपके पास 1000 कुत्तों और 1000 बिल्लियों के साथ 500 प्रति पालतू जानवर हैं (कुछ मालिक बहुत ही समान स्थितियों में अपने पालतू जानवरों की तस्वीरें लेना पसंद करते हैं), पृष्ठभूमि पर कहते हैं। इसलिए यदि आप 70/30 स्प्लिट रैंडम करते हैं, तो आपको टेस्ट डेटा में ट्रेन डेटा का डेटा लीक होगा।
सीधे शब्दों में कहें, यदि प्रशिक्षण हानि और सत्यापन हानि की गणना सही ढंग से की जाती है, तो प्रशिक्षण हानि को सत्यापन हानि से अधिक होना असंभव है। इसका कारण यह है कि बैक-प्रसार DIRECTLY प्रशिक्षण सेट पर गणना की गई त्रुटि को कम कर देता है और केवल सत्यापन सेट पर गणना की गई त्रुटि को कम करता है (गारंटी भी नहीं!)।
कुछ अतिरिक्त कारक होने चाहिए जो प्रशिक्षण के दौरान और मान्य होते समय अलग-अलग हों। ड्रॉपआउट एक अच्छा है, लेकिन दूसरों को हो सकता है। जो भी पुस्तकालय आप उपयोग कर रहे हैं, उसके प्रलेखन की जांच करना सुनिश्चित करें। मॉडल और परतें आमतौर पर डिफ़ॉल्ट सेटिंग्स हो सकती हैं, जिन पर हम आमतौर पर ध्यान नहीं देते हैं।
प्रशिक्षण त्रुटि की तुलना में कम सत्यापन ड्रॉपआउट या अन्य से जुड़े उतार-चढ़ाव के कारण हो सकता है, लेकिन अगर यह लंबे समय तक बना रहता है तो यह संकेत दे सकता है कि प्रशिक्षण और सत्यापन डेटासेट वास्तव में एक ही सांख्यिकीय पहनावा से तैयार नहीं थे। यह तब हो सकता है यदि आपके उदाहरण एक श्रृंखला से आते हैं और यदि आपने प्रशिक्षण और सत्यापन डेटासेट को ठीक से यादृच्छिक नहीं किया है।
इस समय, स्टोकेस्टिक ग्रेडिएंट आधारित विधियां लगभग हमेशा गहरी सीखने के लिए पसंद का एल्गोरिदम हैं। इसका अर्थ है कि डेटा बैचों के रूप में आता है, ग्रेडिएंट की गणना की जाती है और पैरामीटर अपडेट किए जाते हैं। इसका अर्थ यह है कि आप डेटा के नुकसान की गणना भी कर सकते हैं क्योंकि प्रत्येक बैच का चयन किया गया है। इस ढांचे के तहत, दो तरीके हैं कि कैसे नुकसान की गणना की जाती है जो मैं सोच सकता हूं कि इससे इस घटना को जन्म दे सकता है कि प्रशिक्षण त्रुटि सत्यापन त्रुटि से अधिक है। नीचे, मैं दिखाता हूं कि केरस वास्तव में, इन तरीकों से इन-सैंपल त्रुटियों की गणना करते दिखाई देते हैं।
1.) प्रशिक्षण की त्रुटि पूरे युग के दौरान औसतन होती है, बल्कि सभी एक बार युग के अंत में होती है, लेकिन सत्यापन त्रुटि केवल युग के अंत में होती है। ध्यान दें कि सत्यापन त्रुटि में पूरी तरह से अपडेट होने का लाभ है, जबकि प्रशिक्षण त्रुटि में कम अपडेट के साथ त्रुटि गणना शामिल है। बेशक, asymptotically यह प्रभाव आम तौर पर गायब हो जाना चाहिए।
2.) बैच अपडेट होने से पहले प्रशिक्षण त्रुटि की गणना की जाती है। स्टोकेस्टिक ग्रेडिएंट आधारित विधि में, कुछ शोर ढाल है। जबकि एक पहाड़ी पर चढ़ रहा है, वहाँ एक उच्च संभावना है कि सभी प्रशिक्षण नमूनों पर गणना की गई वैश्विक हानि कम हो रही है। हालांकि, जब कोई मोड के बहुत करीब पहुंच जाता है, तो आपके बैच में नमूनों के संबंध में अद्यतन दिशा नकारात्मक होगी । लेकिन जब से हम एक मोड के आसपास उछल रहे हैं, इसका मतलब है कि औसतन हमें एक ऐसी दिशा चुननी चाहिए जो नमूनों के संबंध में सकारात्मक होबैच के। अब, अगर हम दिए गए बैच में नमूनों के संबंध में अद्यतन करने वाले हैं, तो इसका मतलब है कि उन्हें संभावित रूप से कई बैच अपडेट द्वारा धक्का दिया गया है, जिसमें वे शामिल नहीं थे, अपडेट से पहले उनके नुकसान की गणना करके, यह तब है जब स्टोकेस्टिक तरीकों ने आपके डेटासेट में अन्य नमूनों के पक्ष में मापदंडों को सबसे अधिक धकेल दिया है, इस प्रकार हमें अपेक्षित नुकसान में एक छोटे से ऊपर वाला पूर्वाग्रह दे रहा है।
ध्यान दें कि asymptotically, का प्रभाव (1) चला जाता है, (2) नहीं! नीचे मैं दिखाता हूं कि केरस दोनों (1) और (2) करते दिखाई देते हैं।
(1) यह दिखाते हुए कि युग में प्रत्येक बैच पर मेट्रिक्स औसत हैं, बजाय एक बार अंत में। बहुत पहले के युग में val_accuracy के पक्ष में val_accuracy के इन-सैंपल सटीकता में बहुत बड़ा अंतर देखें। ऐसा इसलिए है क्योंकि बहुत कम बैच अपडेट के साथ कुछ इन-सैंपल एरर की गणना की जाती है।
>>> model.fit(Xtrn, Xtrn, epochs = 3, batch_size = 100,
... validation_data = (Xtst, Xtst))
Train on 46580 samples, validate on 1000 samples
Epoch 1/3
46580/46580 [==============================] - 8s 176us/sample
- loss: 0.2320 - accuracy: 0.9216
- val_loss: 0.1581 - val_accuracy: 0.9636
Epoch 2/3
46580/46580 [==============================] - 8s 165us/sample
- loss: 0.1487 - accuracy: 0.9662
- val_loss: 0.1545 - val_accuracy: 0.9677
Epoch 3/3
46580/46580 [==============================] - 8s 165us/sample
- loss: 0.1471 - accuracy: 0.9687
- val_loss: 0.1424 - val_accuracy: 0.9699
<tensorflow.python.keras.callbacks.History object at 0x17070d080>
(2) त्रुटि दिखाना प्रत्येक बैच के लिए अद्यतन करने से पहले गणना की जाती है । ध्यान दें कि युगांतर 1 के लिए, जब हम उपयोग करते हैं batch_size = nRows
(यानी, एक बैच में सभी डेटा), इन-नमूना त्रुटि epoch 1 के लिए लगभग 0.5 (यादृच्छिक अनुमान) है, फिर भी सत्यापन त्रुटि 0.82 है। इसलिए, बैच अद्यतन के पहले इन-सैंपल त्रुटि की गणना की गई थी , जबकि सत्यापन त्रुटि बैच अद्यतन के बाद गणना की गई थी ।
>>> model.fit(Xtrn, Xtrn, epochs = 3, batch_size = nRows,
... validation_data = (Xtst, Xtst))
Train on 46580 samples, validate on 1000 samples
Epoch 1/3
46580/46580 [==============================] - 9s 201us/sample
- loss: 0.7126 - accuracy: 0.5088
- val_loss: 0.5779 - val_accuracy: 0.8191
Epoch 2/3
46580/46580 [==============================] - 6s 136us/sample
- loss: 0.5770 - accuracy: 0.8211
- val_loss: 0.4940 - val_accuracy: 0.8249
Epoch 3/3
46580/46580 [==============================] - 6s 120us/sample
- loss: 0.4921 - accuracy: 0.8268
- val_loss: 0.4502 - val_accuracy: 0.8249