ऑप्टिमाइज़ेशन की गड़बड़ियों को कैसे डीबग और कम किया जा सकता है?
जवाब: अगर मॉडल को ऑप्टिमाइज़ेशन में समस्या आ रही है, तो अन्य चीज़ों को आज़माने से पहले उन्हें ठीक करना ज़रूरी है. ट्रेनिंग की असफलताओं का पता लगाना और उन्हें ठीक करना, रिसर्च का एक अहम हिस्सा है.
इमेज 4 के बारे में इन बातों पर ध्यान दें:
- चरणों में बदलाव करने से, सीखने की कम दर पर परफ़ॉर्मेंस पर कोई बुरा असर नहीं पड़ता.
- बदलती रहने की वजह से, हाई लर्निंग रेट अब अच्छी तरह से ट्रेनिंग नहीं दे पा रहे हैं.
- लर्निंग रेट के 1,000 चरणों को वॉर्मअप करने से, हिलने-डुलने की इस दर को ठीक किया जा सकता है. इससे, 0.1 की सबसे ज़्यादा लर्निंग रेट पर स्टेबल ट्रेनिंग की सुविधा मिलती है.
यह पता लगाना कि किन कामों के लिए बार-बार और काम करने की ज़रूरत है
अगर सीखने की दर बहुत ज़्यादा हो, तो वर्कलोड अस्थिर हो जाता है. अस्थिरता सिर्फ़ तब होती है, जब आपको अपनी सीखने की दर का बहुत छोटा सा इस्तेमाल करना पड़ता है. ट्रेनिंग से जुड़ी समस्याओं को कम से कम दो तरह से अलग-अलग किया जा सकता है:
- ट्रेनिंग शुरू करते समय या शुरुआत में बार-बार समस्या होना.
- ट्रेनिंग के बीच में अचानक अस्थिरता.
स्थिरता की समस्याओं का पता लगाने के लिए, एक व्यवस्थित तरीका अपनाया जा सकता है. इसके लिए, ये काम करें:
- सीखने की दर को स्वीप करें और सबसे अच्छी सीखने की दर पाएं*.
- सीखने की दर* से ठीक ऊपर के लिए, ट्रेनिंग में होने वाले नुकसान के कर्व प्लॉट करें.
- अगर सीखने की दर > lr* पर ऐप्लिकेशन को किसी भी तरह के नुकसान का पता चलता है (ट्रेनिंग के दौरान नुकसान कम नहीं होता है), तो अस्थिरता को ठीक करने से आम तौर पर ट्रेनिंग बेहतर हो जाती है.
ट्रेनिंग के दौरान, पूरी तरह से खोने वाले ग्रेडिएंट का L2 नॉर्म लॉग करें, क्योंकि बाहरी वैल्यू की वजह से ट्रेनिंग के बीच में नकली अस्थिरता हो सकती है. इससे यह पता चल सकता है कि क्लिप के ग्रेडिएंट या वेट अपडेट कितने असरदार तरीके से किए जाते हैं.
ध्यान दें: कुछ मॉडल में बहुत तेज़ी से समस्या होती है और इसके बाद रिकवरी होती है, जिससे धीमी और स्थिर ट्रेनिंग होती है. आकलन करने के सामान्य शेड्यूल, अक्सर आकलन न करने से इन समस्याओं से चूक सकते हैं!
इसकी जांच करने के लिए, lr = 2 * current best
का इस्तेमाल करके
500 चरणों को शॉर्ट फ़ॉर्म में शामिल किया जा सकता है. हालांकि, हर चरण का आकलन किया जा सकता है.
आम तौर पर होने वाली अस्थिरता के पैटर्न को ठीक करने के बारे में जानकारी
बार-बार होने वाले ऐप्लिकेशन के अक्सर इस्तेमाल न होने वाले पैटर्न को ठीक करने के लिए, यहां दिया गया तरीका अपनाएं:
- लर्निंग रेट वार्मअप लागू करें. यह शुरुआती ट्रेनिंग के बार-बार होने वाले झटकों के लिए सबसे अच्छा है.
- ग्रेडिएंट क्लिपिंग लागू करें. यह शुरुआत और ट्रेन के बीच में आने वाले दोनों के लिए अच्छा है. साथ ही, इससे कुछ खराब इनिशिएटिव को ठीक किया जा सकता है जो वॉर्मअप से नहीं होता.
- कोई नया ऑप्टिमाइज़र आज़माएं. कभी-कभी एडम अस्थिरता को संभाल सकता है जो मोमेंटम नहीं कर सकता. यह रिसर्च का एक सक्रिय क्षेत्र है.
- पक्का करें कि आप अपने मॉडल आर्किटेक्चर के लिए, सबसे सही तरीक़ों और शुरू करने के सबसे सही तरीकों का इस्तेमाल कर रहे हैं. उदाहरण दिए गए हैं. अगर मौजूदा कनेक्शन में पहले से कनेक्शन नहीं हैं, तो सामान्य कनेक्शन और नॉर्मलाइज़ेशन जोड़ें.
- अवशिष्ट से पहले, आखिरी ऑपरेशन के तौर पर सामान्य बनाएं. उदाहरण के लिए:
x + Norm(f(x))
. ध्यान दें किNorm(x + f(x))
से समस्याएं हो सकती हैं. - बचा हुआ ब्रांच 0 से शुरू करने की कोशिश करें. (देखें ReZero महज़ ज़रूरत है: बड़े पैमाने पर तेज़ी से बदलाव करना.)
- सीखने की दर कम करें. यह आखिरी उपाय है.
सीखने की दर वॉर्मअप
लर्निंग रेट वार्मअप कब लागू करना है
इमेज 7a में, हाइपर पैरामीटर ऐक्सिस प्लॉट दिखाया गया है, जो ऑप्टिमाइज़ेशन से जुड़े सिस्टम में गड़बड़ी का सामना कर रहे मॉडल को दिखाता है. ऐसा इसलिए है, क्योंकि लर्निंग रेट में किसी भी तरह के बदलाव नहीं किए जा सकते.
चित्र 7b में दिखाया गया है कि किस तरह इसकी दोबारा जाँच की जा सकती है. इसके लिए जिस मॉडल को सीखने की दर से ट्रेनिंग दी गई है वह इस पीक से 5 गुना या 10 गुना ज़्यादा है और इसके ट्रेनिंग लॉस का पता लगाया गया है. अगर उस प्लॉट में लगातार गिरावट के बाद नुकसान में अचानक बढ़ोतरी दिखती है (उदाहरण के लिए, ऊपर दी गई इमेज में ~10 हज़ार), तो हो सकता है कि मॉडल को ऑप्टिमाइज़ेशन के दौरान उतार-चढ़ाव न हो.
लर्निंग रेट वार्मअप लागू करने का तरीका
पिछली प्रोसेस का इस्तेमाल करके, unstable_base_learning_rate
को वह सीखने की दर होने दें जिस पर मॉडल
अस्थिर हो जाता है.
वॉर्मअप में लर्निंग रेट का शेड्यूल पहले से तैयार करना शामिल है. इससे, सीखने की दर 0 से स्टेबल base_learning_rate
तक बढ़ जाती है. यह दर unstable_base_learning_rate
से ज़्यादा के कम से कम एक क्रम में हो जाती है.
डिफ़ॉल्ट रूप से, base_learning_rate
का साइज़ 10 गुना
unstable_base_learning_rate
होगा. हालांकि, ध्यान दें कि 100x unstable_base_learning_rate
जैसी चीज़ों के लिए, इस पूरी प्रोसेस को फिर से लागू किया जा सकता है. खास शेड्यूल:
- वॉर्मअप_स्टेप की मदद से 0 से base_learning_rate तक रैंप अप करें.
- post_warmup_step के लिए एक तय दर पर ट्रेनिंग करें.
आपका लक्ष्य है कि warmup_steps
की ऐसी कम से कम संख्या का पता लगाया जाए जो आपको सबसे ज़्यादा लर्निंग रेट ऐक्सेस करने में मदद करती हैं. यह रेट unstable_base_learning_rate
से काफ़ी ज़्यादा है.
इसलिए, हर base_learning_rate
के लिए, आपको warmup_steps
और
post_warmup_steps
को ट्यून करना होगा. आम तौर पर, post_warmup_steps
को 2*warmup_steps
पर सेट करना बेहतर होता है.
वार्मअप को किसी मौजूदा डिके शेड्यूल से अलग तरीके से ट्यून किया जा सकता है. warmup_steps
को तीव्रता के अलग-अलग क्रम में ले जाना चाहिए. उदाहरण के लिए, उदाहरण के तौर पर दी गई स्टडी, [10, 1000, 10,000, 100,000]
को आज़मा सकती है. सबसे बड़ा सही पॉइंट, max_train_steps
के 10% से ज़्यादा नहीं होना चाहिए.
base_learning_rate
में ट्रेनिंग न देने वाला warmup_steps
तय होने के बाद, उसे बेसलाइन मॉडल पर लागू किया जाना चाहिए.
ज़रूरी है कि इस शेड्यूल से पहले, मौजूदा शेड्यूल जोड़ें. साथ ही, इस प्रयोग की बेसलाइन से तुलना करने के लिए, ऊपर बताए गए इष्टतम चेकपॉइंट चुनाव का इस्तेमाल करें. उदाहरण के लिए, अगर हमारे पास पहले 10,000 max_train_steps
और
1,000 चरणों के लिए warmup_steps
किया गया था, तो नई ट्रेनिंग प्रोसेस
कुल 11,000 चरणों तक चलनी चाहिए.
अगर अच्छी तरह काम करने वाली ट्रेनिंग के लिए लंबे warmup_steps
ज़रूरी हैं (max_train_steps
में से 5% से ज़्यादा), तो आपको max_train_steps
को बढ़ाना पड़ सकता है.
पूरे वर्कलोड के लिए कोई "सामान्य" वैल्यू नहीं होती है. कुछ मॉडल में सिर्फ़ 100 कदमों की ज़रूरत होती है, जबकि अन्य मॉडल (खास तौर पर ट्रांसफ़ॉर्मर) को 40 हज़ार से ज़्यादा चरणों की ज़रूरत हो सकती है.
ग्रेडिएंट क्लिपिंग
बड़े या बाहरी ग्रेडिएंट की समस्याएं आने पर, ग्रेडिएंट क्लिपिंग सबसे ज़्यादा काम की होती है. ग्रेडिएंट क्लिपिंग से इनमें से किसी भी समस्या का समाधान किया जा सकता है:
- शुरुआती ट्रेनिंग में होने वाले उतार-चढ़ाव (शुरुआती तौर पर बड़े ग्रेडिएंट में)
- ट्रेनिंग के बीच में अस्थिरता (ट्रेनिंग के बीच में अचानक ग्रेडिएंट में बढ़ोतरी होना).
कभी-कभी लंबी अवधि के वॉर्मअप पीरियड से कुछ गड़बड़ियां ठीक हो सकती हैं, जो क्लिपिंग से नहीं हो पातीं. ज़्यादा जानकारी के लिए, लर्निंग रेट वॉर्मअप देखें.
ャ वॉर्मअप के दौरान वीडियो क्लिप बनाने के बारे में आपका क्या ख्याल है?
क्लिप बनाने के लिए सबसे बेहतर थ्रेशोल्ड, "सामान्य" ग्रेडिएंट से थोड़ा ऊपर होते हैं.
ग्रेडिएंट क्लिपिंग कैसे की जा सकती है, इसका एक उदाहरण यहां दिया गया है:
- अगर ग्रेडिएंट $\left | g \right |$, ग्रेडिएंट क्लिपिंग थ्रेशोल्ड $\lambda$ से ज़्यादा है, तो ${g}'= \lambda \times \frac{g}{\left | g \right |}$ जहां ${g}'$ नया ग्रेडिएंट है.
ट्रेनिंग के दौरान, अनलॉक नहीं किए गए ग्रेडिएंट नॉर्म को लॉग करें. डिफ़ॉल्ट रूप से, इन्हें जनरेट करें:
- ग्रेडिएंट मानदंड बनाम चरण का प्लॉट
- सभी चरणों पर इकट्ठा किए गए ग्रेडिएंट मानदंडों का हिस्टोग्राम
ग्रेडिएंट क्लिपिंग थ्रेशोल्ड के 90वें पर्सेंटाइल के हिसाब से, ग्रेडिएंट क्लिपिंग थ्रेशोल्ड चुनें. थ्रेशोल्ड वर्कलोड पर निर्भर करता है, लेकिन 90% से शुरू करना एक अच्छी शुरुआत है. अगर 90% काम नहीं करता, तो इस थ्रेशोल्ड को पूरा किया जा सकता है.
SheerID से दर्शकों को ध्यान में रखकर वीडियो बनाने के बारे में आपकी क्या राय है?
अगर ग्रेडिएंट क्लिपिंग का इस्तेमाल करने पर भी कुछ समस्याएं बनी रहती हैं, तो ज़्यादा कोशिश करें. इसका मतलब है कि थ्रेशोल्ड को छोटा किया जा सकता है.
बहुत ज़्यादा एग्रेसिव ग्रेडिएंट क्लिपिंग, यानी कि 50% से ज़्यादा अपडेट क्लिप में शामिल होना, सीखने की दर को कम करने का एक अजीब तरीका है. अगर आपको लगता है कि बहुत ज़्यादा सख्त क्लिपिंग का इस्तेमाल किया जा रहा है, तो आपको सीखने की दर को कम करना चाहिए.
लर्निंग रेट और दूसरे ऑप्टिमाइज़ेशन पैरामीटर को हाइपर पैरामीटर क्यों कॉल करते हैं? वे किसी पिछले डिस्ट्रिब्यूशन के पैरामीटर नहीं हैं.
बायेसियन मशीन लर्निंग में "हाइपर पैरामीटर" शब्द का सटीक अर्थ है, इसलिए सीखने की दर और "हाइपर पैरामीटर" के रूप में ट्यून किए जा सकने वाले ज़्यादातर दूसरे डीप लर्निंग पैरामीटर के लिए, शब्दावली का गलत इस्तेमाल किया जाता है. हम लर्निंग रेट, आर्किटेक्चरल पैरामीटर, और डीप लर्निंग के लिए ट्यून किए जा सकने वाले अन्य चीज़ों के लिए, "मेटापैरामीटर" शब्द का इस्तेमाल करेंगे. ऐसा इसलिए, क्योंकि मेटापैरामीटर, "हाइपर पैरामीटर" शब्द के गलत इस्तेमाल से होने वाली भ्रम की स्थिति से बचाता है. इस भ्रम की संभावना खास तौर पर, बेज़ियन ऑप्टिमाइज़ेशन की चर्चा करते समय होती है, जहां प्रोबेबिलिस्टिक रिस्पॉन्स सरफ़ेस मॉडल के अपने सही हाइपर पैरामीटर होते हैं.
हालांकि, यह गुमराह करने वाला है, लेकिन डीप लर्निंग कम्यूनिटी में "हाइपर पैरामीटर" शब्द काफ़ी आम हो गया है. इसलिए, यह दस्तावेज़, बड़ी संख्या में लोगों के लिए है, जिसमें कई ऐसे लोग शामिल हैं जिन्हें शायद इस तकनीकी जानकारी के बारे में न पता हो. इसलिए, हमने इस उम्मीद से कि दूसरे से बचने की कोशिश में, इस फ़ील्ड में भ्रम की स्थिति पैदा करने वाले एक सोर्स का विकल्प चुना. हालांकि, रिसर्च पेपर को पब्लिश करते समय हम अलग विकल्प चुन सकते हैं. साथ ही, हम दूसरों को ज़्यादातर कॉन्टेक्स्ट में "मेटापैरामीटर" के इस्तेमाल को बढ़ावा देते हैं.
पुष्टि करने वाले सेट की परफ़ॉर्मेंस को सीधे बेहतर बनाने के लिए बैच के साइज़ को ट्यून क्यों नहीं किया जाना चाहिए?
ट्रेनिंग पाइपलाइन की दूसरी जानकारी में बदलाव किए बिना बैच के साइज़ में बदलाव करने से, अक्सर पुष्टि करने के सेट की परफ़ॉर्मेंस पर असर पड़ता है. हालांकि, अगर ट्रेनिंग पाइपलाइन को हर बैच साइज़ के लिए अलग से ऑप्टिमाइज़ किया जाता है, तो दो बैच साइज़ के बीच पुष्टि करने के सेट की परफ़ॉर्मेंस में अंतर आम तौर पर खत्म हो जाता है.
वे हाइपर पैरामीटर जो बैच साइज़ के साथ सबसे ज़्यादा इंटरैक्ट करते हैं, इसलिए हर बैच साइज़ के लिए अलग-अलग ट्यून करना सबसे ज़रूरी होता है. इसलिए, ये ऑप्टिमाइज़र हाइपर पैरामीटर (उदाहरण के लिए, लर्निंग रेट, मोमेंटम) और रेगुलराइज़ेशन हाइपर पैरामीटर हैं. सैंपल वैरियंस की वजह से, बैच के छोटे साइज़ से ट्रेनिंग एल्गोरिदम में ज़्यादा शोर पैदा होता है. इस शोर का असर नियमित तौर पर हो सकता है. इसलिए, बड़े बैच साइज़ में ज़्यादा फ़िटिंग होने की संभावना ज़्यादा होती है. साथ ही, इसके लिए ज़्यादा रेगुलराइज़ेशन और/या अतिरिक्त रेगुलराइज़ेशन की तकनीकों की ज़रूरत होती है. इसके अलावा, हो सकता है कि आपको बैच का साइज़ बदलते समय ट्रेनिंग के चरणों की संख्या में बदलाव करना पड़े.
इन सभी चीज़ों पर ध्यान देने के बाद, इस बात का कोई पुख्ता सबूत नहीं है कि बैच का साइज़, पुष्टि करने की प्रोसेस की सबसे अच्छी परफ़ॉर्मेंस पर असर डालता है. ज़्यादा जानकारी के लिए, Shallue et al. 2018 देखें.
सभी लोकप्रिय ऑप्टिमाइज़ेशन एल्गोरिदम के लिए अपडेट के नियम क्या हैं?
इस सेक्शन में कई लोकप्रिय ऑप्टिमाइज़ेशन एल्गोरिदम के लिए अपडेट के नियम दिए गए हैं.
स्टोकैस्टिक ग्रेडिएंट डिसेंट (एसजीडी)
\[\theta_{t+1} = \theta_{t} - \eta_t \nabla \mathcal{l}(\theta_t)\]
जहां $\eta_t$, चरण $t$ पर सीखने की दर है.
दिलचस्पी बढ़ाना
\[v_0 = 0\]
\[v_{t+1} = \gamma v_{t} + \nabla \mathcal{l}(\theta_t)\]
\[\theta_{t+1} = \theta_{t} - \eta_t v_{t+1}\]
जहां $t$ का चरण $\eta_t$ है और $\gamma$ मोमेंटम गुणांक है.
नेस्तेरोव
\[v_0 = 0\]
\[v_{t+1} = \gamma v_{t} + \nabla \mathcal{l}(\theta_t)\]
\[\theta_{t+1} = \theta_{t} - \eta_t ( \gamma v_{t+1} + \nabla \mathcal{l}(\theta_{t}) )\]
जहां $t$ का चरण $\eta_t$ है और $\gamma$ मोमेंटम गुणांक है.
RMSProp
\[v_0 = 1 \text{, } m_0 = 0\]
\[v_{t+1} = \rho v_{t} + (1 - \rho) \nabla \mathcal{l}(\theta_t)^2\]
\[m_{t+1} = \gamma m_{t} + \frac{\eta_t}{\sqrt{v_{t+1} + \epsilon}}\nabla \mathcal{l}(\theta_t)\]
\[\theta_{t+1} = \theta_{t} - m_{t+1}\]
एडम
\[m_0 = 0 \text{, } v_0 = 0\]
\[m_{t+1} = \beta_1 m_{t} + (1 - \beta_1) \nabla \mathcal{l} (\theta_t)\]
\[v_{t+1} = \beta_2 v_{t} + (1 - \beta_2) \nabla \mathcal{l}(\theta_t)^2\]
\[b_{t+1} = \frac{\sqrt{1 - \beta_2^{t+1}}}{1 - \beta_1^{t+1}}\]
\[\theta_{t+1} = \theta_{t} - \alpha_t \frac{m_{t+1}}{\sqrt{v_{t+1}} + \epsilon} b_{t+1}\]
नडम
\[m_0 = 0 \text{, } v_0 = 0\]
\[m_{t+1} = \beta_1 m_{t} + (1 - \beta_1) \nabla \mathcal{l} (\theta_t)\]
\[v_{t+1} = \beta_2 v_{t} + (1 - \beta_2) \nabla \mathcal{l} (\theta_t)^2\]
\[b_{t+1} = \frac{\sqrt{1 - \beta_2^{t+1}}}{1 - \beta_1^{t+1}}\]
\[\theta_{t+1} = \theta_{t} - \alpha_t \frac{\beta_1 m_{t+1} + (1 - \beta_1) \nabla \mathcal{l} (\theta_t)}{\sqrt{v_{t+1}} + \epsilon} b_{t+1}\]