क्या Keras में बैच_साइज़ का परिणाम की गुणवत्ता में कोई प्रभाव पड़ता है?


38

मैं 2-3 मिलियन लेखों के साथ एक बड़े LSTM नेटवर्क को प्रशिक्षित करने और मेमोरी एरर के साथ संघर्ष कर रहा हूं (मैं AWS EC2 g2x2large का उपयोग करता हूं)।

मुझे पता चला कि इसका एक समाधान कम करना है batch_size। हालांकि, मुझे यकीन नहीं है कि यह पैरामीटर केवल मेमोरी दक्षता मुद्दों से संबंधित है या यदि यह मेरे परिणामों को प्रभावित करेगा। तथ्य की बात के रूप में, मैंने यह भी देखा कि batch_sizeउदाहरणों में इस्तेमाल आमतौर पर दो की शक्ति के रूप में होता है, जिसे मैं या तो नहीं समझता।

मुझे कोई आपत्ति नहीं है अगर मेरा नेटवर्क प्रशिक्षित होने में अधिक समय लेता है, लेकिन मैं यह जानना चाहूंगा कि क्या batch_sizeवसीयत को कम करने से मेरी भविष्यवाणियों की गुणवत्ता कम हो जाएगी।

धन्यवाद।


यह प्रश्न केरस के लिए विशिष्ट नहीं है। मुझे लगता है कि सामान्य कंस्यूस यह है कि छोटे नमूने आकार धीमी गति से अभिसरण करते हैं, लेकिन स्थानीय मिनीमा में फंसने का खतरा कम होता है
एलेक्स

मैंने ऐसे मामलों को देखा है जहां बहुत बड़े बैच आकार समान संख्या में प्रशिक्षण युगों के साथ अभिसरण को रोक सकते हैं।
कर्टिस व्हाइट

जवाबों:


43

डेढ़ साल बाद, मैं अपने जवाब पर वापस आता हूं क्योंकि मेरा पिछला जवाब गलत था।

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

बैचिंग का एक और लाभ जीपीयू कम्प्यूटेशन के लिए है, जीपीयू तंत्रिका नेटवर्क में होने वाली गणनाओं को समानांतर करने के लिए बहुत अच्छा है यदि गणना का हिस्सा समान है (उदाहरण के लिए, आपके नेटवर्क के समान वजन मैट्रिक्स पर दोहराया मैट्रिक्स गुणा)। इसका मतलब यह है कि 16 का एक बैच आकार 8 के बैच आकार की तुलना में दोगुना से कम ले जाएगा।

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

गलत, पुराने जवाब: [[नहीं, बैच_साइज औसतन आपके सीखने की गति को प्रभावित करता है, न कि सीखने की गुणवत्ता को। बैच_साइज को भी 2 की शक्तियां होने की आवश्यकता नहीं है, हालांकि मैं समझता हूं कि कुछ निश्चित पैकेज केवल 2 की शक्तियों की अनुमति देते हैं। आपको अपने बैच को अधिकतम करने की कोशिश करनी चाहिए। आप वह कर सकते हैं जो अभी भी अधिकतम गति प्राप्त करने के लिए आपके GPU की मेमोरी को फिट करता है। ।]]]]


मैं 32 नहीं खरीद सकता, लेकिन मैं 16 खर्च कर सकता हूं। हालांकि, मैंने देखा कि यह बहुत धीमा है। क्या आपको लगता है कि मुझे 16-32 के बीच कुछ मूल्यों की कोशिश करनी चाहिए या 16 के साथ रहना चाहिए?
हिपोग्लुसीडो

मैं कोशिश करूंगा और कुछ मूल्यों को समय दूंगा। प्रत्येक युग एक ही समय के आसपास होना चाहिए ताकि बहुत लंबा न हो। यह देखने की कोशिश करें कि क्या यह तेज या धीमा है या नहीं, क्योंकि यह दिलचस्पी 2 है, यह देखते हुए कि 2 की यह शक्ति GPU और / या केरस के बैकएंड पर निर्भर करती है। लेकिन मुझे लगता है कि इसे सिर्फ
ब्रिम में भरना

9
क्या आप सुनिश्चित हैं कि बैच का आकार सीखने की गुणवत्ता को प्रभावित नहीं करता है? मुझे याद है कि मैंने कुछ ब्लॉग / पत्र (?) पढ़े थे, जहाँ उन्होंने कहा था कि छोटे बैच बड़े बैचों की तुलना में नोइज़ियर ग्रेडिएंट पैदा करते हैं, लेकिन स्थानीय न्यूनतम से बाहर निकलने के लिए शोर उपयोगी हो सकता है। यह सुनिश्चित नहीं है कि यह LSTM पर लागू होता है या नहीं।
9

पूरी तरह से आश्वस्त नहीं, मेरे पास खुद का पर्याप्त अनुभव नहीं था लेकिन मैंने जो पढ़ा है। मैं ग्रेडिएंट्स को कम स्थिर होते हुए देख सकता हूं इसलिए मैं बंद हो सकता हूं।
Jan van der Vegt

2
डेढ़ साल बाद और अभी बहुत कुछ जानने योग्य है और मैं सहमत हूं। मैं अपना जवाब बदलने जा रहा हूँ
Jan van der Vegt

11

मुझे लगता है कि स्वीकृत उत्तर संभवतः गलत है। ग्रेडिएंट डिसेंट अल्गोरिथम में वेरिएंट हैं ।

  1. वेनिला ग्रैडिएंट डिसेंट : यहां ग्रैडिएंट की गणना एक ही शॉट पर सभी डेटा बिंदुओं पर की जाती है और औसत लिया जाता है। इसलिए हमारे पास ढाल का एक चिकना संस्करण है, जिसे सीखने में अधिक समय लगता है।

  2. स्टोचैस्टिक ग्रेडिएंट डिसेंट : यहां एक समय में एक-डाटा बिंदु होता है इसलिए ग्रेडिएंट आक्रामक (नॉइज ग्रेडिएंट्स) होता है इसलिए इसमें बहुत अधिक दोलन होने वाले होते हैं (हम इसे नियंत्रित करने के लिए मोमेंटम मापदंडों का उपयोग करते हैं - जैसे नेस्टरोव)। इसलिए एक मौका है कि आपके दोलन एल्गोरिथ्म को स्थानीय न्यूनतम तक नहीं पहुंचा सकते हैं। (विचलन)।

  3. मिनी बैच ग्रेडिएंट डिसेंट : जो पिछले दोनों के भत्तों को एक छोटे बैच के औसतन ले जाता है। इसलिए डब्ल्यूडब्ल्यूडी की तरह बहुत आक्रामक नहीं है और ऑनलाइन लर्निंग की अनुमति देता है जिसे वेनिला जीडी ने कभी अनुमति नहीं दी।

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

SGD ने सीखने के पैरामीटर को तय किया था इसलिए हम एडम, AdaDelta, RMS Prop आदि जैसे अन्य एडेप्टिव ऑप्टिमाइज़र शुरू करते हैं जो ग्रैजुएट्स के इतिहास के आधार पर सीखने के पैरामीटर को बदलता है।


3) को आमतौर पर मिनीबैच कहा जाता है
एलेक्स

@ एलेक्स: बदलाव को जोड़ा।
जिल जंग जू

1
मैं मानता हूं कि बैच-आकार के पैरामीटर के बारे में कोई नियम नहीं है। लेकिन यह कथन - "मिनी-बैच जितना छोटा होगा आपके मॉडल का प्रदर्शन उतना ही अच्छा होगा" - सामान्य नियम के विपरीत है। आप आम तौर पर बैच-आकार को अधिकतम करना चाहते हैं
महाशय

4

विचित्र रूप से पर्याप्त है, मैंने पाया कि केरस के साथ बड़े बैच के आकार को अभिसरण करने के लिए अधिक युगों की आवश्यकता होती है।

उदाहरण के लिए, इस स्क्रिप्ट का आउटपुट केर के एकीकरण परीक्षण पर आधारित है

epochs 15   , batch size 16   , layer type Dense: final loss 0.56, seconds 1.46
epochs 15   , batch size 160  , layer type Dense: final loss 1.27, seconds 0.30
epochs 150  , batch size 160  , layer type Dense: final loss 0.55, seconds 1.74

सम्बंधित

बहुत बड़े बैच आकार का उपयोग करने से प्रशिक्षण के दौरान आपके नेटवर्क की सटीकता पर नकारात्मक प्रभाव पड़ सकता है क्योंकि यह ढाल वंश की स्थिरता को कम करता है।

संपादित करें: अधिकांश समय, बढ़ते batch_sizeको गणना में तेजी लाने के लिए वांछित है, लेकिन ऐसा करने के लिए अन्य सरल तरीके हैं, जैसे कि dtypeतर्क के माध्यम से डेटा के छोटे प्रकार के पदचिह्न का उपयोग करना , चाहे केरस या टेंसरफ़्लो में , जैसे float32इसके बजायfloat64


बड़े बैचों के साथ (और इसलिए प्रति एपिसोड कम) आपके पास प्रति युग कम ग्रेडिएंट अपडेट होंगे। "एपोच" प्रशिक्षण के दौरान "आपके डेटा के माध्यम से एक पास" के लिए सिर्फ एमएल शब्दजाल है। यदि आप प्रशिक्षण में तेजी लाने, दीवार के समय को मापने और युगों की उपेक्षा करने की कोशिश कर रहे हैं।
एंड्रयू वैगनर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.